オブジェクトのリストの処理 - 2023.2 日本語

Vivado Design Suite ユーザー ガイド: Tcl スクリプト機能の使用 (UG894)

Document ID
UG894
Release Date
2023-11-17
Version
2023.2 日本語

get_* コマンドを使用すると、返されたオブジェクトは標準の Tcl リストと同様で、同じように機能しますが、Vivado Design Suite ではオブジェクトの 1 つのクラスのコンテナー (セル、ネット、ピン、ポートなど) が返され、標準の Tcl リストとは異なります。ただし、このコンテナーは通常、標準の Tcl リストと同様で、同じよう機能します。オブジェクトのコンテナーは Vivado Design Suite で自動的に処理されるので、ユーザーが意識する必要はありません。たとえば、標準 Tcl コマンド llength をオブジェクトのコンテナーに対して使用し (get_cells の結果など)、通常の Tcl リストでの場合と同様に、コンテナーに含まれるエレメントの数を取得できます。

Vivado Design Suite のリストを処理するビルトインの Tcl コマンドは、オブジェクトおよびオブジェクトのコンテナーを完全にサポートするため拡張されています。たとえば、lsortlappendlindex、および llength は、オブジェクトの NAME プロパティに基づいてコンテナーを制御するよう拡張されています。これらのコマンドは、オブジェクトのコンテナーが渡された場合、オブジェクトのコンテナーを返します。たとえば、lsort は、get_cells で取得したセルのコンテナーを、オブジェクトの階層名に基づいて並べ替えます。

Vivado 内の lindex インプリメンテーションにより、非イテラブルのオブジェクトが返されます。foreach コマンドと共に使用した場合、反復子では文字列記述のみが使用され、オブジェクトは使用されません。ループ内では Tcl 変数 slr は文字列となるため、次のようなエラーが発生する可能性があります。
foreach slr [lindex [get_slrs] 0] { 
  report_property $slr
}
=> ERROR: [Common 17-58] 'SLR0' is not a valid first class Tcl object.
lindex を使用する反復処理には 2 つの方法があります。エレメントを明示的に Tcl リストに変換する、または lindex の代わりに lrange コマンドを使する方法です。次に例を示します。
foreach slr [list [lindex [get_slrs] 0]] { 
  report_property $slr
}

foreach slr [lrange [get_slrs] 0 end] { 
  report_property $slr
}

lappend を使用するなどしてコンテナーにオブジェクトを追加できますが、現在コンテナーに含まれるオブジェクトと同じタイプのオブジェクトしか追加できません。リストに異なるタイプのオブジェクトや文字列を追加しようとすると、Tcl エラーが返されます。

次の例では、Vivado のコンテナーを降順に並べ替え、puts コマンドと foreach ループを使用して、オブジェクトを 1 行に 1 つずつ表示しています。

foreach X [lsort -decreasing [get_cells]] {puts $X}
wbArbEngine
usb_vbus_pad_1_i_IBUF_inst
usb_vbus_pad_0_i_IBUF_inst
usbEngine1
usbEngine0
...
注記: lappend コマンドは Tcl コンソールでサポートされますが、read_xdc コマンドで読み込む XDC 制約ファイルではサポートされません。ただし、lappend コマンドで取得したリストを read_xdc コマンドと互換性を持たせるように変換できます。次のようなコードがあるとします。
set myClocks {}
lappend myClocks [get_clocks CLK1]
lappend myClocks [get_clocks CLK2]
lappend myClocks [get_clocks CLK3]

Tcl 変数 myClocks を、read_xdc コマンドと互換性を持たせるようにするには、次のようにします。

set myClocks [list [get_clocks CLK1] \
                       [get_clocks CLK2] \
                       [get_clocks CLK3] \
                ]