ファイル システムにファイルを記述すると、ファイルを処理するさまざまな Tcl コマンドを使用できます。ファイル パス、ファイル名、ファイル拡張子など、ファイルの要素を抽出できます。ファイルに関する情報を調べる次のようなコマンドもあります。
-
file exists
<filename>
-
filename
が存在し、その場所の読み取り権限がある場合は 1、それ以外の場合は 0 を返します。ファイルが既に存在しているかどうかを調べるのに使用します。 -
file type
<filename>
-
file
、directory
、characterSpecial
、blockSpecial
、fifo
、link
、またはsocket
のいずれかの値を持つ filename のタイプを示す文字列を返します。
-
file dirname
<filename>
-
fileName
のディレクトリ構造を最後のスラッシュを含めずに返します。 -
file rootname
<filename>
-
filename
すべての文字を最後のピリオドを含めずに返します。 -
file tail
<filename>
- 最後のスラッシュより後の
filename
の文字すべてを返します。 -
file extension
<filename>
- 最後のピリオド以降の
filename
のすべての文字を最後のピリオドを含めて返します。
次に、Tcl コマンドのいくつかの例を示します。
set filePath {C:/Data/carry_chain.txt}
file dirname $filePath ; # Returns C:/Data
file tail $filePath ; # Returns carry_chain.txt
file extension $filePath ; # Returns .txt
Vivado ツールが report_*
コマンドまたは write_*
コマンドでファイルを作成したら、Tcl スクリプトでファイルを開いて、その内容を読み出したり、追加の内容を記述したりできます。ファイルを開いたり閉じたり、ファイルの読み出しまたは書き込みを実行するには、次の Tcl コマンドを使用できます。
-
open
<filename>
[
access
] [
perms
]
-
filename
を開き、ファイルにアクセスするのに使用したファイル ハンドルまたはfileID
を返します。必要に応じてファイル ハンドルを参照できるようにするため、fileID
を Tcl 変数に代入するのが一般的です。新しいファイルの権限は、perms
とプロセス umask の組み合わせで設定します。access
モードは、開いたファイルの読み取り権および書き込み権を指定します。一般的なアクセス モードは次のとおりです。 -
read [-nonewline]
fileId
-
fileId
から残りすべてのバイトを読み出し、オプションで最後の文字が改行\n
の場合はその最後の文字を破棄します。ファイルを開いた直後にこの形式を使用すると、read
コマンドでファイル全体が一度に読み出されます。 -
read
fileId
numBytes
-
fileId
から指定したバイト数numBytes
を読み出します。この形式は、ファイルのブロックをファイルの最後まで読み出す場合に使用します。 -
eof
fileId
-
fileId
で EOF (End Of File) が発生した場合は 1、それ以外の場合は 0 を返します。 -
gets
fileId
[
varName
]
-
fileId
から次の行を読み出します。改行文字は破棄されます。$varName
を指定した場合は行の文字列をその変数に代入し、それ以外の場合は文字列をコマンド シェルに返します。次に、gets
コマンドの異なる形式を示します。gets $fileHandle Append line 4 of file. gets $fileHandle line 28 puts $line Append line 5 of file. set line [gets $fileHandle] Append line 6 of file. puts $line Append line 6 of file.
上記の例では、
$fileHandle
がファイルを開いたときに返されるファイル ハンドルです。最初の例はgets
の単純な形式で、出力を代入する Tcl 変数は指定していません。この場合、出力はstdout
に返されます。2 番目の例では出力を$line
という変数に代入しており、gets
コマンドで読み出された文字数 28 が返されます。注記:gets
コマンドの戻り値を Tcl 変数に代入できますが、コマンドの形式によって、ファイルの内容または gets コマンドで読み出された文字数が代入されます。 -
puts [-nonewline] [
fileId
]
string
- 指定した
fileId
に文字列を書き込みます。オプションで、改行文字\n
を省くこともできます。puts
コマンドのデフォルトのfileId
はstdout
です。 -
close
fileId
- 開いているファイル チャネル
fileId
を閉じます。Tcl スクリプトで開いたファイルは必ず閉じてください。そうしないと、Vivado アプリケーションでメモリ リークやその他の問題が発生する可能性があります。
次の例では、ファイルを読み出しアクセス モードで開き、ファイル ハンドルを $FH
に代入して、1 つの操作でファイルの内容を読み出して $content
に代入し、その内容を Tcl リストに分割しています。完了したら、ファイルを閉じます。
次の例では、ファイル全体を一度に読み出してから結果を解析するのではなく、ファイルを 1 行ずつ最後まで読み出し、stdout
に行数と行の内容を出力しています。完了したら、ファイルを閉じます。
set FH [open C:/Data/carry_chains.txt r]
set i 1
while {![eof $FH]} {
# Read a line from the file, and assign it to the $line variable
set line [gets $FH]
puts "Line $i: $line"
incr i
}
close $FHset FH [open C:/Data/carry_chains.txt r]
set content [read $FH]; # The entire file content is saved to $content
foreach line [split $content \n] {
# The current line is saved inside $line variable
puts $line
}
close $FH
次の例では、デザインのすべての I/O ポートをその方向と共に名前順に並べ替えて、ファイル ports.rpt
に書き込んでいます。
set FH [open C:/Data/ports.rpt w]
foreach port [lsort [get_ports *]] {
puts $FH [format "%-18s %-4s" $port [get_property DIRECTION $port]]
}
close $FH
上記の例では、ファイルを書き込みモードで開いています。読み出しモードとは異なり、書き込みモードではファイルが存在していない場合は作成され、ファイルが存在している場合は上書きされます。既存のファイルの最後に新しい内容を追加するには、ファイルを追加モードで開く必要があります。