get_*
コマンドを使用すると、返されたオブジェクトは標準の Tcl リストと同様で、同じように機能しますが、Vivado Design Suite ではオブジェクトの 1 つのクラスのコンテナー (セル、ネット、ピン、ポートなど) が返され、標準の Tcl リストとは異なります。ただし、このコンテナーは通常、標準の Tcl リストと同様で、同じよう機能します。オブジェクトのコンテナーは Vivado Design Suite で自動的に処理されるので、ユーザーが意識する必要はありません。たとえば、標準 Tcl コマンド llength
をオブジェクトのコンテナーに対して使用し (get_cells
の結果など)、通常の Tcl リストでの場合と同様に、コンテナーに含まれるエレメントの数を取得できます。
Vivado Design Suite のリストを処理するビルトインの Tcl コマンドは、オブジェクトおよびオブジェクトのコンテナーを完全にサポートするため拡張されています。たとえば、lsort
、lappend
、lindex
、および llength
は、オブジェクトの NAME プロパティに基づいてコンテナーを制御するよう拡張されています。これらのコマンドは、オブジェクトのコンテナーが渡された場合、オブジェクトのコンテナーを返します。たとえば、lsort
は、get_cells
で取得したセルのコンテナーを、オブジェクトの階層名に基づいて並べ替えます。
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] \
]