TCL脚本打印行范围并创建变量

问题描述 投票:0回答:1

嗨,我有如下所述的代码


module abcd( a , b , c ,da , fa, na , ta , ma , ra ,
              ta, la , pa );

input a , b, da ,fa , na , ta , ma; 
output c , ra ,ta , 
          la ,pa ;
wire a , b , da , fa ,na ,
        ta , ma;


// MBIST Structures
mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;

// HMS 
kkkks ;

jsskks;

endmodule 

需要采用“ MBIST结构”和“ //”之间的范围,并且将第一行作为输入变量,将第二行作为输出变量。

例如,我正在尝试以下规定的代码



proc findrange {data start {stop ;}} {
    # Find the starting pattern
    set x1 [string first $start $data]
    if {$x1 < 0} {
        # Pattern not found
        return
    }
    # Skip the pattern
    incr x1 [string length $start]
    # Find the ending pattern after the starting position
    set x2 [string first $stop $data $x1]
    if {$x2 < 0} {
        # Return the remainder of the data when no ending pattern is found
        return [string range $data $x1 end]
    } else {
        # Return the text between the starting and ending patterns
        return [string range $data $x1 [expr {$x2 - 1}]]
    }
}


set chan [open "mode.v"]
set code [read $chan]
close $chan

set var4 [ findrange $code "MBIST Structures" \/\/]

echo $ var4正在打印这些变量


mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;

我想有两个列表

$input should be "mbist_hsm_p::mbist_out_hsm_t         mbist_out_hsm;"
$output should be "mbist_hsm_p::mbist_in_hsm_t          mbist_in_hsm;"

如何从var4变量中创建这些变量

[当我尝试打印$ var4变量时,它正在打印4个独立变量

foreach p $var4 {
echo $p
}



mbist_hsm_p::mbist_out_hsm_t
mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t
mbist_in_hsm;
Rather it should be " mbist_hsm_p::mbist_out_hsm_t mbist_out_hsm;"
and other one should be "mbist_hsm_p::mbist_in_hsm_t mbist_in_hsm;"

我正在寻找两个列表$ input和$ output

tcl
1个回答
0
投票

使用这样的简短输入文件,将整个文件读入变量要容易得多。对于所描述的任务,我认为string firststring match是更好的选择。

所以这就是我要做的:

proc findrange {data start {stop ;}} {
    # Find the starting pattern
    set x1 [string first $start $data]
    if {$x1 < 0} {
        # Pattern not found
        return
    }
    # Skip the pattern
    incr x1 [string length $start]
    # Find the ending pattern after the starting position
    set x2 [string first $stop $data $x1]
    if {$x2 < 0} {
        # Return the remainder of the data when no ending pattern is found
        return [string range $data $x1 end]
    } else {
        # Return the text between the starting and ending patterns
        return [string range $data $x1 [expr {$x2 - 1}]]
    }
}

set chan [open "mod1.v"]
set code [read $chan]
close $chan

set out [open "output.file.txt" "w"]
puts $out [findrange $code input]
puts $out [findrange $code output]
close $out

您的输入和所需的空白之间有一些变化您指定的输出。但是您没有指出转换的规则,而且这些规则并不明显。因此,我暂时忽略了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.