文字列の操作 - 2023.2 日本語

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

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

-return_string オプションを使用すると、report_* コマンドの出力を stdout ではなく Tcl 文字列として返すことができます。文字列は Tcl 変数に代入したり、解析または処理できます。

set rpt [report_timing -return_string]

文字列を変数に代入すると、文字列を処理するさまざまな Tcl コマンドを使用できます。

append string [arg1 arg2 ... argN]
指定した argsstring の最後に追加します。
format formatString [arg1 arg2 ... argN]
formatString テンプレートで指定したフォーマットの形式で文字列が返されます。テンプレートは、sprintf で使用されるように % 変換指示子を使用して指定する必要があります。追加の引数 args は、フォーマットされた文字列内で置換する値を指定します。
reg exp [switches] exp string
正規表現 exp がすべてまたは string の一部に一致する場合は 1、それ以外の場合は 0 を返します。-nocase オプションを指定すると、大文字/小文字は区別されません。
string match pattern string
glob patternstring に一致する場合は 1 を返し、一致しない場合は 0 を返します。
scan string formatString [ varName1 varName2 ...]
指定した string から varName 変数に値を抽出し、sscanf ビヘイビアーのように % 変換指定子を使用して formatString を適用します。varNames を指定しない場合は、scan が値のリストを stdout に返します。
string range string first last
first から last までの文字インデックスで指定される string 文字からの文字の範囲を返します。
string compare string1 string2
2 つの文字列の辞書式順序による比較を実行し、string1string2 より前に来る場合は -1、同じ場合は 0、string1string2 より後に来る場合は 1 を返します。
string last string1 string2
string1 の最後に出現した string2 の文字インデックスを返します。string1string2 が見つからなかった場合は -1 を返します。
string length string
string の文字数を返します。

次の例では、report_timing を使用して $report コマンドの結果を -return_string Tcl 変数に代入し、各パスの始点、終点、パス グループ、およびパス タイプを抽出して、最後にそのパスのサマリを Tcl コンソールに出力しています。

# Capture return string of timing report, and assign variables
set report [report_timing -return_string -max_paths 10]
set startPoint {}
set endPoint {}
set pathGroup {}
set pathType {}
# Write the header for string output
puts [format " %-12s %-12s %-20s -> %-20s" "Path Type" "Path Group" "Start Point" "End Point"]
puts [format " %-12s %-12s %-20s -> %-20s" "---------" "----------" "-----------" "---------"]
# Split the return string into multiple lines to allow line by line processing
foreach line [split $report \n] {
if {[regexp -nocase -- {^\s*Source:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - startPoint]} {
} elseif {[regexp -nocase -- {^\s*Destination:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - endPoint]} {
} elseif {[regexp -nocase -- {^\s*Path Group:\s*([^[:blank:]]+)\s*$} $line - pathGroup]} {
} elseif {[regexp -nocase -- {^\s*Path Type:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - pathType]} {
puts [format " %-12s %-12s %-20s -> %-20s" $pathType $pathGroup $startPoint $endPoint]
}
}

次は、このコードの出力例です。

Path Type Path Group Start Point -> End Point
--------- ---------- ----------- -> ---------
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[0]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[10]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[11]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[12]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[13]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[14]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[15]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[16]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[17]
Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[18]