用于打印行范围和创建变量的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