Quartus® II Tcl サブバージョン・リビジョン・ナンバーの取得

このサンプルスクリプトは、プロジェクトのバージョン管理ソフトウェアのバージョンナンバーにアクセスする方法を示します。FPGA デザインでコンパイルされるデザインファイルにバージョンナンバーを書き込むことができます。デザインロジックを追加することで、FPGA からバージョン番号を通知できます。この情報は、特に複数のプログラミング・ファイルを切り替えて使用している場合、デバッグ時に非常に役立ちます。どのバージョンのデザインが FPGA 上で動作しているかは、FPGA 内のバージョンナンバーから簡単に知ることができます。

この例では、プロジェクトのサブバージョン・リビジョン・ナンバーを使用します。指定したファイルの情報の取得には、svn info コマンドが使用されます。svn info コマンドは、ワーキングコピー内の項目に関する情報を出力し、以下のような形式でリビジョンナンバーを記載して行に含めます。

Revision: <リビジョン番号>

この例では、2 つのプロシージャーで svn info コマンドを実行し、その出力を解析してリビジョンナンバーを取得します。get_subversion_revision プロシージャーが svn info コマンドを開始します。svn info コマンドで使用するファイル名を指定してプロシージャーを呼び出します。コマンドを実行できなかった場合、プロシージャーはエラーを返します。そうでない場合、プロシージャーは何も返さず、特定のグローバル変数を設定します。svn info コマンドがタイムアウトした場合、グローバル変数 done の値は -1 になります。リビジョンナンバーが見つかった場合、グローバル変数 done1 となり、リビジョンナンバーはグローバル変数 revision_number に入ります。リビジョンナンバーは、この例のようにメッセージ内に表示したり、デザインファイルに書き込んだりできます。

get_version_info プロシージャーは、コマンド出力を 1 行ずつ解析するヘルパー・プロシージャーです。これには、リビジョンナンバー行にマッチしてリビジョンナンバーを抽出する正規表現が含まれます。

proc get_subversion_revision { file_name } { global done # svn info コマンドが完了するまでの # 最大待ち時間 (秒) set timeout_seconds 30 # svn info コマンドをファイル名を指定して実行します set cmd "svn info ${file_name}" # バージョン情報の取得を試みます。 # コマンドが実行できない場合は、エラーを返します。 # それ以外の場合は、コマンドの出力を処理するファイルイベントを設定します。 if { [catch {open "|$cmd"} input] } { return -code error $input } else { fileevent $input readable [list get_revision_info $input ] # リポジトリーがダウンしてもプロセスがハングしないように、 # タイムアウトを設定します。 set timeout [after [ expr { $timeout_seconds * 1000 } ] \ [list set done -1] ] # リビジョンナンバーが見つかるか、 # 操作がタイムアウトするまで続行しません。いすれにしてもタイムアウトをキャンセルします。 vwait done after cancel $timeout } } proc get_revision_info { inp } { global done revision_number if { [eof $inp] } { catch {close $inp} set done 1 } elseif { $done } { gets $inp line } else { gets $inp line # 正規表現を使って、リビジョンナンバーのある行に # マッチさせます。 if { [regexp {^Revision:\s+(\d+)\s*$} $line match revision_number] } { set done 1 } } } set done 0 set revision_number "" # 通常、ファイル名はプロジェクト・ファイルです .qpf set file_name [lindex $quartus(args) 0] if { [catch { get_subversion_revision $file_name } msg] } { post_message -type critical_warning "Couldn't run command to get\ revision number. $msg" } else { if { -1 == $done } { post_message -type critical_warning "Timeout getting revision number." } elseif { [string equal "" $revision_number] } { post_message -type critical_warning \ "Couldn't find revision number in output of svn info $file_name." } else { post_message "Revision for $file_name is $revision_number" } }

システムのコマンドプロンプトで、以下のコマンドを使ってスクリプトを実行できます (スクリプトが svn_revision.tcl いう名前のファイルにあると仮定します)。

quartus_sh -t svn_revision.tcl myproject.qpf

このスクリプトは、次のようなメッセージを生成してリビジョンを示します。

Info: Revision for myproject.qpf is 417

この例のように、グローバル変数 revision_number にリビジョンナンバーを入れてメッセージを表示したり、デザインファイルに書き込んだりできます。