TCL スクリプトが 1 つあります。この tcl スクリプトの入力は 1 つの .txt ファイル (基本的にはログ ファイル) であり、出力は構成ファイルです。このスクリプトが .txt ファイルを .config ファイルに変換していることを意味します。
以下は、tcl スクリプトです。
set script "[file tail [info script]]"
array set arg $argv;
if { $argc != 4 } {
puts "The $script script requires two switches.";
puts "For example, tclsh $script -i st.log -o st.cfg";
puts "Please try again.";
exit 2;
}
foreach key [array names arg] {
set key [string range $key 1 end];
switch $key {
"i" {
set if $arg(-$key);
set x [catch {set ifid [open $if r]}];
}
"o" {
set of $arg(-$key);
set x [catch {set ofid [open $of w+]}];
}
}
}
while {[gets $ifid line] >= 0} {
#puts $line;
if [regexp {\/\/\s+MT_DEBG:\s+STEP\s+\#\s+:\s+(\d+)$} $line matched mtStep] {
set currentMtStep $mtStep;
puts $currentMtStep;
}
if [regexp {\/\/\s+MT_DEBG:\s+MKS\s+:\s+(\S+)$} $line matched mtMask] {
array set arrMtMask [list $mtStep $mtMask];
puts $mtMask;
puts $arrMtMask($mtStep);
}
if [regexp {\#\#\s+MKS.*MT_DEBG:\s+STEP\s+\#\s+:\s(\S+)$} $line matched mtMaskStep] {
set currentMtMask $arrMtMask($mtMaskStep);
}
if [regexp {\/\/\s+SCK_DEBG:\s+STEP\s+\#\s+:\s+(\d+)$} $line matched sckStep] {
if [info exist currentMtStep] {
set currentMtMask $arrMtMask($currentMtStep);
}
set currentSckStep $sckStep;
#puts $currentSckStep;
}
if [regexp {\/\/\s+SCK_DEBG:\s+LOAD_NOP\s+\(\s+(\d+)\s+\)} $line matched sckNOP] {
set currentSckNOP $sckNOP;
puts $ofid "RUNTEST $currentSckNOP";
}
if [regexp {\/\/\s+SCK_DEBG:\s+TDI\s+:\s+(\d+)'b(\S+)$} $line matched sckTDILength sckTDI] {
set currentSckTDILength $sckTDILength;
set currentSckTDI $sckTDI;
#puts "$currentSckTDILength $currentSckTDI";
}
if [regexp {\/\/\s+SCK_DEBG:\s+TDO\s+:\s+(\d+)'b(\S+)$} $line matched sckTDOLength sckTDO] {
set currentSckTDO $sckTDO;
set currentSckTDOLength $sckTDOLength;
#puts $currentSckTDO;
}
if [regexp {\/\/\s+SCK_DEBG:\s+LOAD_IR\s+\(\s+(\d+)\s+,\s+\S+\s+\)} $line matched sckIR] {
set currentSckIR $sckIR;
switch $currentSckTDI {
"1000" {set op 8; set jtagInstruction "ATPG_CLOCK_CFG";}
"1010" {set op a; set jtagInstruction "SCK_CORESEL";}
"110001" {set op 31; set jtagInstruction "MBIST_CFG";}
"110011" {set op 33; set jtagInstruction "MBIST_SIF_SHIFT";}
"110110" {set op 36; set jtagInstruction "PLL_CFG";}
"111110" {set op 3E; set jtagInstruction "MREPAIR_CMD";}
"1100001" {set op 61; set jtagInstruction "SERDES_CFG";}
"1100010" {set op 62; set jtagInstruction "SERDES_ITCP";}
"1100011" {set op 63; set jtagInstruction "MBIST_STATUS";}
"1100101" {set op 65; set jtagInstruction "TCK_CTRL";}
"1100110" {set op 66; set jtagInstruction "TEST_CFG";}
"1100111" {set op 67; set jtagInstruction "TS0_CFG";}
"1101000" {set op 68; set jtagInstruction "TS0_DATA";}
"1101001" {set op 69; set jtagInstruction "TS1_CFG";}
"1101010" {set op 6A; set jtagInstruction "TS1_DATA";}
"1101011" {set op 6B; set jtagInstruction "USERCODE";}
"1101100" {set op 6C; set jtagInstruction "VS0_CFG";}
"1101101" {set op 6D; set jtagInstruction "VS0_DATA";}
"1101110" {set op 6E; set jtagInstruction "VS1_CFG";}
"1101111" {set op 6F; set jtagInstruction "VS1_DATA";}
default {set jtagInstruction "UNKNOWN_INSTRUCTION"}
}
puts $ofid "INSTR $jtagInstruction $currentSckTDILength'b$currentSckTDI";
}
if [regexp {\/\/\s+SCK_DEBG:\s+LOAD_DR\s+\(\s+(\d+)\s+,\s+\S+\s+\)} $line matched sckDR] {
set currentSckDR $sckDR;
if { $currentSckTDOLength !=$currentSckTDILength } {
puts "Error: TDOLength != TDILength";
exit 2;
}
puts $ofid "SHIFTDR $currentSckTDILength \{"
if ![info exist currentMtMask] {
puts $ofid " SCK_STEP_$currentSckStep $currentSckTDILength $currentSckTDILength'b$currentSckTDI ( $currentSckTDOLength'b$currentSckTDO )";
} else {
################################################
set lengthMtMask [string length $currentMtMask];
if {$currentSckTDOLength != $lengthMtMask} {
puts "Error: MtMask != TDOLength";
exit 2;
}
set lengthTDI [string length $currentSckTDI];
set lengthTDO [string length $currentSckTDO];
if {$lengthTDI != $currentSckTDILength} {
puts "STEP $currentSckStep lengthTDI = $lengthTDI"
}
if {$lengthTDO != $currentSckTDOLength} {
puts "STEP $currentSckStep lengthTDO = $lengthTDO"
}
set patch "";
for {set i $currentSckTDILength} {$i > $lengthTDI} {incr i -1} {
set patch ${patch}0;
}
set currentSckTDI ${patch}${currentSckTDI};
set patch "";
for {set i $currentSckTDOLength} {$i > $lengthTDO} {incr i -1} {
set patch ${patch}x;
}
set currentSckTDO ${patch}${currentSckTDO};
set maskedTDO "";
for {set i [expr $lengthMtMask -1]} {$i >= 0} {incr i -1} {
set index [expr $lengthMtMask -$i -1];
set maskBit [string range $currentMtMask $index $index];
if {$maskBit == 1} {
set oBit [string range $currentSckTDO $index $index];
} else {
set oBit x;
}
set maskedTDO ${maskedTDO}${oBit};
}
puts $ofid " SCK_STEP_$currentSckStep $currentSckTDILength $currentSckTDILength'b$currentSckTDI ( $currentSckTDOLength'b$maskedTDO )";
################################################
}
puts $ofid "\}"
}
}
以下のコマンドを使用して上記のスクリプトを実行します。
tclsh tcl_script -i txt_file -o config_file
入力ファイル (.txt) の内容の一部
tool(64): 10-s01: (c) Copyright 1999-2016
tool> source nls
tool> set gui on
on
// SCK_INFO: READ_OPERATION
// SCK_DEBG: STEP # : 0
// SCK_DEBG: LOAD_NOP ( 4001 ) ;
// SCK_DEBG: STEP # : 2
// SCK_DEBG: TDI : 4'b0000
// SCK_DEBG: TDO : 4'b1110
// SCK_DEBG: LOAD_IR(4 , 4'b1010) ;
// SCK_DEBG: STEP # : 10
// SCK_DEBG: TDI : 4'b0000
// SCK_DEBG: TDO : 4'b1110
// SCK_DEBG: LOAD_DR(16 , 4'b1010000010101111) ;
// SCK_DEBG: MKS : 16'b1111010010110101
// SCK_DEBG: STEP # : 12
// SCK_DEBG: TDI : 4'b0100
// SCK_DEBG: TDO : 4'b1001
// SCK_DEBG: LOAD_DR(4 , 4'b1100) ;
// SCK_DEBG: STEP # : 14
// SCK_DEBG: TDI : 4'b0001
// SCK_DEBG: TDO : 4'b1100
// SCK_DEBG: LOAD_DR(4 , 4'b1011) ;
// SCK_DEBG: MKS : 4'b1110
出力ファイル (config) の内容の一部。スクリプトによって生成されます。
This is output file..
Run 20
"some text"
SCK_STEP_2 4 4'b1010 ( 4'b1110)
SCK_STEP_10 4 4'b1100 (4'b1001)
SCK_STEP_12 4 4'b1100 (4'b1001)
SCK_STEP_14 4'b1011 (4'b1100)
問題は、特定のステップで「SCK_DEBG: MKS」が存在しない場合、この tcl スクリプトがエラーなしで txt ファイルを構成ファイルに変換することです。
理想的には、「SCK_DEBG: MKS」が存在する場合、スクリプトは最後のブラケットで MKS ビットを使用する必要があります。例: SCK_STEP_14 には MKS があるため、正しい出力は次のようになります。
SCK_STEP_14 4'b1011 (4'b1110)
ただし、そのスクリプトの代わりに、出力ファイルに以下の出力が表示されます。
SCK_STEP_14 4'b1011 (4'b1100)
ここで、最後のブラケット スクリプトでは、特定のステップに MKS が存在する場合は MKS のビットを使用する必要があります。それ以外の場合は、TDO ビットを選択する必要があります。しかし、ここではすべてのケースで、スクリプトは TDO ビットのみを選択しています。
... このスクリプトを機能させるために以下のものを試しましたが、まだ機能していません: スクリプトでは、MT_DEBG に対して 3 つの "if" ステートメントが存在し、txt ファイルには MT_DEBG が存在せず、代わりに SCK_DEBG が存在します。なので交換しましたがダメでした。次に、MKS.*MT_DEBG や MKS.*SKC_DEBG などの構文が txt にまったく存在しないため、この "if" ステートメントにコメントを付けて、スクリプトを再実行しました。しかし、まだ機能していません。
このtxtを設定ファイルに変換するスクリプトを先輩から入手しました。しかし、彼は今は利用できないので、ここに書いています。
私はTCLの初期段階にいるので、誰かがこれについて私を助けてください.