ファイルへのアクセス - 2023.2 日本語

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

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

ファイル システムにファイルを記述すると、ファイルを処理するさまざまな Tcl コマンドを使用できます。ファイル パス、ファイル名、ファイル拡張子など、ファイルの要素を抽出できます。ファイルに関する情報を調べる次のようなコマンドもあります。

file exists <filename>
filename が存在し、その場所の読み取り権限がある場合は 1、それ以外の場合は 0 を返します。ファイルが既に存在しているかどうかを調べるのに使用します。
file type <filename>
filedirectorycharacterSpecialblockSpecialfifolink、または 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 モードは、開いたファイルの読み取り権および書き込み権を指定します。一般的なアクセス モードは次のとおりです。
r
読み出し専用。ファイルが存在している必要があり、作成されません。アクセス モードを指定しない場合、これがデフォルトです。
w
書き込み専用。ファイルが存在しない場合は、作成されます。データはファイルの冒頭から記述され、既存のファイルの内容は切り捨てられるか、上書きされます。
a
追加専用。ファイルが存在しない場合は、作成されます。データはファイルの末尾に記述され、既存のファイルの内容に追加されます。
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 コマンドのデフォルトの fileIdstdout です。
close fileId
開いているファイル チャネル fileId を閉じます。Tcl スクリプトで開いたファイルは必ず閉じてください。そうしないと、Vivado アプリケーションでメモリ リークやその他の問題が発生する可能性があります。

次の例では、ファイルを読み出しアクセス モードで開き、ファイル ハンドルを $FH に代入して、1 つの操作でファイルの内容を読み出して $content に代入し、その内容を Tcl リストに分割しています。完了したら、ファイルを閉じます。

注記: パフォーマンスおよびメモリの面から、サイズの大きいファイルを 1 回の操作で読み出すことはお勧めしません。

次の例では、ファイル全体を一度に読み出してから結果を解析するのではなく、ファイルを 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

上記の例では、ファイルを書き込みモードで開いています。読み出しモードとは異なり、書き込みモードではファイルが存在していない場合は作成され、ファイルが存在している場合は上書きされます。既存のファイルの最後に新しい内容を追加するには、ファイルを追加モードで開く必要があります。