我做了一点阅读并实现了管道符号|匹配时可以像“或”逻辑一样使用。我已经尝试将其合并到我的以下代码中,但它不能用于执行regexp之后的一些文本处理(请参阅文件格式下面的代码段代码)。首先,这是我的文件类型(芯片设计中使用的.lib)
pin (d) {
direction : input;
nextstate_type : data;
related_ground_pin : vss;
related_power_pin : vcc;
max_transition : 0.4;
capacitance : 0.000719782;
rise_capacitance : 0.000719782;
rise_capacitance_range (0.000462301, 0.000719782);
fall_capacitance : 0.000569233;
fall_capacitance_range (0.000459043, 0.000569233);
timing () {
related_pin : "clk";
timing_type : setup_rising;
rise_constraint (constraint_template_5X5) {
index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
index_3 ("0.084, 0.84, 3.36, 8.4, 13.44") ;
values ( \
"5.1,1.2,1.3,1.4,1.5", \
"9.1,2.2,2.3,2.4,2.5", \
"3.1,3.2,3.3,3.4,3.5", \
"4.1,4.2,4.3,4.4,4.5", \
"5.1,5.2,5.3,5.4,5.5", \
"6.1,6.2,6.3,6.4,6.5", \
"7.1,7.2,7.3,7.4,7.5", \
"8.1,8.2,8.3,8.4,8.5", \
"9.1,9.2,9.3,9.4,9.5", \
"10.1,10.2,10.3,10.4,10.5", \
"11.1,11.2,11.3,11.4,11.5", \
"12.1,12.2,12.3,12.4,12.5", \
"13.1,13.2,13.3,13.4,13.5", \
"14.1,14.2,14.3,14.4,14.5", \
"15.1,15.2,15.3,15.4,15.5", \
"16.1,16.2,16.3,16.4,16.5", \
"17.1,17.2,17.3,17.4,17.5", \
"18.1,18.2,18.3,18.4,18.5", \
"19.1,19.2,19.3,19.4,19.5", \
"20.1,20.2,20.3,20.4,20.5", \
"21.1,21.2,21.3,21.4,21.5", \
"22.1,22.2,22.3,22.4,22.5", \
"23.1,23.2,23.3,23.4,23.5", \
"24.1,24.2,24.3,24.4,24.5", \
"25.1,25.2,25.3,25.4,25.5", \
);
}
fall_constraint (constraint_template_5X5) {
index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
index_3 ("0.084, 0.84, 3.36, 8.4, 13.44") ;
values ( \
"1.1,1.2,1.3,1.4,1.5", \
"2.1,2.2,2.3,2.4,2.5", \
"3.1,3.2,3.3,3.4,3.5", \
"4.1,4.2,4.3,4.4,4.5", \
"5.1,5.2,5.3,5.4,5.5", \
"6.1,6.2,6.3,6.4,6.5", \
"7.1,7.2,7.3,7.4,7.5", \
"8.1,8.2,8.3,8.4,8.5", \
"9.1,9.2,9.3,9.4,9.5", \
"10.1,10.2,10.3,10.4,10.5", \
"11.1,11.2,11.3,11.4,11.5", \
"12.1,12.2,12.3,12.4,12.5", \
"13.1,13.2,13.3,13.4,13.5", \
"14.1,14.2,14.3,14.4,14.5", \
"15.1,15.2,15.3,15.4,15.5", \
"16.1,16.2,16.3,16.4,16.5", \
"17.1,17.2,17.3,17.4,17.5", \
"18.1,18.2,18.3,18.4,18.5", \
"19.1,19.2,19.3,19.4,19.5", \
"20.1,20.2,20.3,20.4,20.5", \
"21.1,21.2,21.3,21.4,21.5", \
"22.1,22.2,22.3,22.4,22.5", \
"23.1,23.2,23.3,23.4,23.5", \
"24.1,24.2,24.3,24.4,24.5", \
"25.1,25.2,25.3,25.4,25.5", \
);
}
}
}
好的,所以我必须进行一些文本处理(由Brad Lanam帮助 - SO的用户),其操作如下。这段代码的目的是将正确类型的约束(在我的.lib中)归零以进行文本处理。
set inFile [open "C:/Tcl/official/ref.lib" r]
set inval false
set foundValues 0
set found_setup 0
set found_fall 0
set extract1 0
set extract2 0
set DETECT_END_SYNTAX {\);}
while { [gets $inFile line] >= 0 } {
if { [regexp {setup_rising;} $line] } { set found_setup 1 }
if { [regexp {hold_rising;} $line] } { set found_setup 0 }
if { $found_setup } {
if { [regexp {rise_constraint|fall_constraint} $line] } { set found_fall 1 }
if { $found_fall } {
if {[regexp {values} $line]} {
set foundValues 1
}
if {$foundValues} {
if { [regexp $DETECT_END_SYNTAX $line] } {
if { $inval } {
set inval false
set foundValues 0
set found_fall 0
}
}
}
}
}
}
# { Do text processing after this }
但是
if { [regexp {rise_constraint|fall_constraint} $line] }
# Does NOT work
匹配rise_constraint
或fall_constraint
以执行某些regsub
命令。我的代码只会在写出的修改后的文件中处理rise_constraint
的值。我需要更改两种约束类型的值。我在正则表达式中做错了吗?谢谢!
我应该这样做:
if { [regexp {rise_constraint} $line] } { set found_fall 1 }
if { [regexp {fall_constraint} $line] } { set found_fall 1 }
而不是:
if { [regexp {rise_constraint|fall_constraint} $line] } { set found_fall 1 }
注意:found_fall
实际上甚至会找到rise_constraint
值,它只是一个变量。
参考:tcl text processing - rearrange values in rows and columns based on user defined value
答案 0 :(得分:0)
if { [regexp {rise_constraints|fall_constraint} $line] }
不起作用,因为行中没有rise_constraints
。 rise_constraint
没有s
。
另外,请尝试下次更好地缩进代码。