用于打印行范围和创建变量的TCL脚本
嗨,我有一个如下所述的代码用于打印行范围和创建变量的TCL脚本,tcl,Tcl,嗨,我有一个如下所述的代码 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
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" \/\/]
我想要两份清单
$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个独立变量
mbist_hsm_p::mbist_out_hsm_t mbist_out_hsm;
mbist_hsm_p::mbist_in_hsm_t mbist_in_hsm;
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;
我要找的两份名单
$input和$output使用这样的短输入文件,将整个文件读入一个变量要容易得多。对于所描述的任务,我认为
字符串优先
比字符串匹配
更好
所以我会这样做:
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
proc findrange{data start{stop;}{
#找到起始模式
set x1[字符串第一个$start$数据]
如果{$x1<0}{
#找不到模式
返回
}
#跳过模式
增量x1[字符串长度$start]
#找到起始位置后的结束模式
设置x2[字符串第一个$stop$数据$x1]
如果{$x2<0}{
#当找不到结束模式时,返回剩余的数据
返回[字符串范围$data$x1 end]
}否则{
#返回起始和结束模式之间的文本
返回[字符串范围$data$x1[expr{$x2-1}]]
}
}
设置chan[打开“mod1.v”]
设置代码[读取$chan]
收盘价$chan
设置[打开“output.file.txt”“w”]
输出$out[findrange$代码输入]
输出$out[findrange$代码输出]
结清美元
您的输入和所需输入之间的空白处有一些变化
您指定的输出。但是,您没有指出这种转换的规则,它们也不明显。所以,我暂时忽略了这一点。你解决这个问题的两次尝试在我看来完全一样。非常感谢,我已经尝试过了,我正在尝试更多的代码,但是那里有一些问题。你完全改变了问题!现在我的答案不再有意义了。如果您有后续问题,不要替换现有问题,只需创建一个新问题。
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