我有一个TCL脚本。这个tcl脚本的输入是一个.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的初始阶段时,请有人帮助我。