0

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の初期段階にいるので、誰かがこれについて私を助けてください.

4

0 に答える 0