-filter および -regexp オプションの使用 - 2022.1 日本語

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

Document ID
UG894
Release Date
2022-06-08
Version
2022.1 日本語

Vivado Design Suite では、get_* コマンドを使用してオブジェクトのサブセットを選択する方法が複数あります。-hierarchical オプションと組み合わせて -filter オプションや -regexp オプションを使用することもできます。

次の表に、コマンドで指定したパターンに対する -hierarchical/-filter/-regexp オプションの効果を示します。

get_* [-hierarchical] [-filter] [-regexp] pattern
表 1. -hierarchical/-filter/-regexp オプションの影響
-hierarchical -filter -regexp 結果
      Pattern は現在の階層レベル (current_instance) にあるオブジェクトのローカル名と比較されます。
あり     Pattern は現在の階層レベル (current_instance) およびその下位にあるオブジェクトのローカル名と比較されます。
  あり   Pattern は現在の階層レベル (current_instance) にあるオブジェクトに適用されるフィルター式となります。NAME プロパティがオブジェクトの完全な階層名と比較されます。
  Pattern は現在の階層レベル (current_instance) およびその下位にあるオブジェクトに適用されるフィルター式となります。NAME プロパティがオブジェクトの完全な階層名と比較されます。
    あり Pattern は正規表現として現在の階層レベル (current_instance) にあるオブジェクトのローカル名と比較されます。
  Pattern は正規表現として現在の階層レベル (current_instance) およびその下位にあるオブジェクトのローカル名と比較されます。
  Pattern は現在の階層レベル (current_instance) にあるオブジェクトに適用されるフィルター式となります。NAME プロパティがオブジェクトの完全な階層名と比較されます。フィルター式は、正規表現として適用されます。
Pattern は現在の階層レベル (current_instance) およびその下位にあるオブジェクトに適用されるフィルター式となります。NAME プロパティがオブジェクトの完全な階層名と比較されます。フィルター式は、正規表現として適用されます。
注記: オブジェクトのローカル名は、現在の階層レベル (current_instance) からの名前の一部です。親階層から継承された部分の名前は含まれません。
注記: デザインの一部がフラット化されている場合、フラット化されたレベルに含まれるオブジェクトのローカル名には階層区切り文字が含まれます。この場合、名前のこの部分の階層区切り文字は、区切り文字としてはなく、リテラル文字として扱われます。
注記: -filter オプションはフィルター式を指定し、式内のパターン比較はグローバル条件式のフォーマットに従います。フィルター式ではオブジェクトのプロパティに基づく文字列の比較が実行され、必要に応じて複雑なものにできます。フィルター式に NAME プロパティを使用すると、文字列比較にオブジェクトのローカル名ではなく完全な階層名が使用されます。ただし、現在の階層レベル (current_instance) に含まれるオブジェクトのみが検索されます。-hierarchical-filter と共に使用すると、現在の階層レベルおよびその下位にあるオブジェクトに対してフィルター処理が実行されます。-regexp-filter と共に使用すると、フィルター式内のパターン比較は正規表現に従います。
注記: -regexp は、コマンドに指定された検索パターンが正規表現であることを示します。* . [ ] + などの一部の文字は正規表現では特別な意味を持つので、注意が必要です。正規表現でこれらの文字をリテラルとして使用する場合は、エスケープ処理する必要があります。

文字列比較では大文字と小文字が区別され、常に検索文字列の冒頭および末尾にアンカーされています。検索文字列のサブ文字列を比較する場合は、正規表現を使用するかどうかによって、次の構文を使用します。

  • 正規表現を使用する場合 (-regexp のみ): .*<substring>.*
  • パターンがグローバル条件式のフォーマットに従う場合 (その他のオプション): *<substring>*

次に、cpu_hdl に基づく例を示します。このプロジェクトは Vivado IDE の Getting Started ページで [Open Example Project] リンクをクリックして開くことができます。

  • 現在のインスタンスを fftEngine/fftInst/ingressLoop[7].ingressFifo に変更:
    vivado% current_instance fftEngine/fftInst/ingressLoop[7].ingressFifo
    fftEngine/fftInst/ingressLoop[7].ingressFifo
  • 現在のインスタンスの下にあるすべてのセルを取得 (階層セルは 1 つのみ):
    vivado% get_cells
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo
    vivado% get_cells -hier
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo 
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.two_rd_addr_reg
    [8]_i_1__29 … (154 other cells)
  • 現在のインスタンスおよびその下位にあるセルのローカル名には、ingressLoop は含まれません。文字列 ingressLoop は親セルから継承されたものであり、完全な階層名の一部です。
    vivado% get_cells *ingressLoop*
    WARNING: [Vivado 12-180] No cells matched '*ingressLoop*'.
    vivado% get_cells *ingressLoop* -hier
    WARNING: [Vivado 12-180] No cells matched '*ingressLoop*'.
  • -filter オプションを使用すると、NAME プロパティは完全な階層名と一致します。
    vivado% get_cells -filter {NAME =~ *ingressLoop*}
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo
    vivado% get_cells -filter {NAME =~ *ingressLoop*} -hier
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo 
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.two_rd_addr_reg
    [8]_i_1__29 … (154 other cells)
  • *reg[*]* パターンに一致するセルを検索:
    vivado% get_cells *reg[*]*
    WARNING: [Vivado 12-180] No cells matched '*reg[*]*'.
    vivado% get_cells *reg[*]* -hier
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_
    i_1__15 … (109 other cells)
    vivado% get_cells -hier -regexp {.*reg\[.*\].*}
    fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_
    i_1__15 … (109 other cells)
    vivado% get_cells -hier -regexp {.*reg[.*].*}
    WARNING: [Vivado 12-180] No cells matched '.*reg[.*].*'.

最後のクエリ get_cells -hier -regexp {.*reg[.*].*} で一致するセルがないのは、角かっこ [] がエスケープ処理されていないため、セル名のリテラル文字としてではなく、正規表現の特殊文字として扱われているからです。

フィルター式で値の範囲を指定する必要がある場合は、-regexp に加えて -filter オプションを使用する必要があります。たとえば、次のコードでは *reg[0]* から *reg[16]* までのセルのみが取得されます。この正規表現は .*reg\[[0-9]\].* または .*reg\[1[0-6]\].* に一致するものを検索します。

expanse="page">vivado% get_cells -hierarchical -regexp -filter {NAME =~ ".*reg\[([0-9]||1[0-6])\].*"}

次の例では、どちらのコマンドも、CLB*X*Y* に一致するタイルで、CLB*X1Y* から CLB*X16Y* (X が 1 ~ 16) を除くものが返されます。

expanse="page">vivado% get_tiles -regexp -filter {NAME !~ "CLB.*X([1][0-6]|[0-9])Y.*" && TYPE=~ "CLB.*"}
expanse="page">vivado% get_tiles -regexp -filter {NAME !~ "CLB.*X1[0-6]Y.*" && NAME !~ "CLB.*X[1-9]Y.*" && 
      TYPE=~ "CLB.*"}