Quartus® II Tcl の例: プロジェクトを開く

author-image

投稿者:

ほぼすべての Quartus II Tcl スクリプトが、プロジェクトを開きます。プロジェクトを開くにはさまざまな方法があります。このページではプロジェクトを開くコードサンプルを紹介します。

実行時にプロジェクト名やリビジョン名がコマンドライン引数としてスクリプトに渡されるようにスクリプトを書くと便利です。これにより、異なるプロジェクトでもスクリプトを容易に再利用できます。Quartus II ソフトウェアに含まれる cmdline Tcl パッケージを使用すると、コマンドライン引数をスクリプトに簡単に渡すことができます。

ここでは、コマンドライン引数で指定したプロジェクト名とリビジョン名でプロジェクトを開くコードの例を示します。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

project_open $opts(project) -revision $opts(revision)

DOS またはシェルプロンプトで、以下のようにそのコードを含むスクリプトを実行できます。

quartus_sh -t script.tcl -project top -revision first

サンプルコードの改良

チェックや改良を加えるために、サンプルコードを修正する方法はさまざまあります。

シンプルなエラーチェック

project_open コマンドは、指定されたプロジェクトが存在しない場合、エラーを発生させます。この例のように、project_exists コマンドを使って、開く前にそれが存在するかどうかを確認します。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { ![project_exists $opts(project)] } {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

project_open $opts(project) -revision $opts(revision)

未指定のリビジョン名の処理

コマンドライン引数にリビジョン名が指定されていない場合、対応できるようにサンプルコードを変更することもできます。以下のコード例のいくつかは、プロジェクトに複数のリビジョンが存在する場合にのみ、リビジョン名を指定する必要があります。それ以外のコード例では、プロジェクトに複数のリビジョンが存在する場合でも、特定のデフォルトリビジョンを自動的に開くことができます。

Quartus II Tcl コマンド project_open は、-revision プションでリビジョン名が指定されていない場合、指定されたプロジェクトと同じ名前のリビジョンをデフォルトで開きます。この例では、project_open コマンドのデフォルトの機能を示します。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    project_open $opts(project) -revision $opts(project)
} else {
    project_open $opts(project) -revision $opts(revision)
}

以下のコード例を使ってこの動作をさまざまな方法で変更し、スクリプト実行時の時間を節約できます。これらの例では、コマンドライン引数にリビジョン名が指定されていない場合を判定し、さらに他の方法を使って project_open コマンドの -revision オプションで使用するリビジョン名を判定しています。

あるリビジョン名をデフォルトにする

コマンドライン引数にリビジョン名が指定されていない場合、以下のコードを使用してリビジョンが 1 つだけのプロジェクトを開くことができます。通常、リビジョンが 1 つのプロジェクトは、リビジョン名とプロジェクト名が同じですが、常にそうだとは限りません。project_open コマンドを -revision オプションを付けずに使用すると、プロジェクトのリビジョン名とプロジェクト名が一致しない場合にエラーが発生します。

この例では、get_project_revisions コマンドを使って、指定したプロジェクトのすべてのリビジョンのリストを取得します。リビジョンが 1 つだけの場合 (リスト長が 1)、スクリプトはそのリビジョン名を使ってプロジェクトを開きます。リビジョン名のリストを使用すると、リビジョン名がプロジェクト名と異なっていても、プロジェクトを確実に開くことができます。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
    } else {
        post_message -type error \
            "More than one revision in project \
            $opts(project)."
        exit
    }
}

project_open $opts(project) -revision $opts(revision)

現在のリビジョンをデフォルトにする

コマンドライン引数にリビジョン名を指定しない場合、次のコードを使用してプロジェクトを開き、現在のリビジョンをデフォルトにできます。現在のリビジョンとは、前回プロジェクトを閉じるまで作業したリビジョンのことです。リビジョンが 1 つのプロジェクトの場合、そのリビジョンが常に現在のリビジョンになります。この例では、get_current_revision コマンドを使って、指定したプロジェクトの現在のリビジョン名を取得します。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    set opts(revision) [get_current_revision $opts(project)]
}

project_open $opts(project) -revision $opts(revision)

リビジョン名の出力

プロジェクトに複数のリビジョンが存在するのに、リビジョンの指定がなく、リビジョン名を必要とする場合は、リビジョン名の一覧をします。コマンドライン引数にリビジョン名が指定されておらず、プロジェクトに複数のリビジョンが存在する場合、次のコードを使用してすべてのリビジョンを出力できます。この例では、get_project_revisions コマンドを使って、プロジェクトの全リビジョンのリストを取得しています。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { [string equal "" $opts(revision)] } {
    post_message "You did not specify a revision name.
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
        post_message "There is one revision $opts(revision)"
    } else {
        post_message "These revisions exist in the project:"
        foreach revision $revisions {
            post_message "$revision"
        }
        exit
    }
}

project_open $opts(project) -revision $opts(revision)

組み合わせ例

以下の例で、前述の改良点のいくつかを組み合わせる方法を示します。

例 1

次のシンプルな例では、指定したプロジェクトが存在することを確認しています。コマンドライン引数にリビジョン名が指定されていない場合は、現在のリビジョンを開きます。それ以外の場合は、コマンドライン引数で指定されたリビジョン名のプロジェクトを開きます。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if {[project_exists $opts(project)]} {
    if {[string equal "" $opts(revision)]} {
        project_open $opts(project) -revision \
            [get_current_revision $opts(project)]
    } else {
        project_open $opts(project) -revision $opts(revision)
    }
} else {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

Quartus II ソフトウェアのバージョン 4.1 (::quartus::project パッケージのバージョン 3.0) 以降では、project_open コマンドで -current_revision オプションがサポートされています。Quartus II ソフトウェアのバージョン 4.1 以降を使用している場合、上記スクリプト内の以下のコマンド

project_open $opts(project) -revision \
            [get_current_revision $opts(project)]

を次のコマンドで置き換えることができます

project_open $opts(project) -current_revision

例 2

以下の例では、上記で説明したいくつかの改良点を組み合わせています。指定されたプロジェクトが存在するかどうかを確認し、リビジョンが 1 つしかない場合はそれを開きます。複数のリビジョンが存在する場合は、リビジョンのリストを出力して終了します。

package require cmdline
set options {\
    { "project.arg" "" "Project name" } \
    { "revision.arg" "" "Revision name" }
}
array set opts [::cmdline::getoptions quartus(args) $options]

if { ![project_exists $opts(project)] } {
    post_message -type error "Project $opts(project) does not exist"
    exit
}

if { [string equal "" $opts(revision)] } {
    post_message "You did not specify a revision name.
    set revisions [get_project_revisions $opts(project)]
    if { 1 == [llength $revisions] } {
        set opts(revision) [lindex $revisions 0]
        post_message "There is one revision $opts(revision)"
    } else {
        post_message "These revisions exist in the project:"
        foreach revision $revisions {
            post_message "$revision"
        }
        exit
    }
}

project_open $opts(project) -revision $opts(revision)