我正在尝试为Synopsys Design Compiler编写一些自动化脚本,但我遇到以下情况的麻烦:
我看到有逻辑绑定网具有以下名称:
dc_shell> all_connected foo_top/foo/foo_pin
{foo_top/*Logic0*}
在我的脚本中,我想检测哪些引脚连接到逻辑绑定:
set connected_nets [find net [all_connected $pin]]
foreach_in_collection net $connected_nets {
if {[regexp {.*Logic0.*} [get_object_name $net]] } {
# skip this pin because it is tied to logic 0
continue
}
}
此匹配永远不会成功。它适用于所有其他引脚和网络,但在绑定时失败。
我觉得它与名称中用*指定了绑定网这一事实有关,但我不知道如何处理它。
我能做些什么来克服这个并能够检测到这些绑扎网?
由于
答案 0 :(得分:2)
如果您尝试调用regexp {.*Logic0.*} {foo_top/*Logic0*}
,您将获得1,因此不匹配失败。似乎命令get_object_name
没有返回您期望的内容。
作为旁注,正则表达式{.*Logic0.*}
等同于正则表达式{Logic0}
,用于确定模式的存在。除非您添加某种锚,例如^
或$
,否则正则表达式匹配会在您提供的表达式的任一端添加隐含的.*
。
另一方面,在捕获匹配项时,变体不等效:
set fbb foobarbaz
set pat1 bar
set pat2 {.*bar.*}
if {[regexp -- $pat1 $fbb] == [regexp -- $pat2 $fbb]} {puts "the same"}
# => the same
set cap1 [regexp -inline -- $pat1 $fbb]
set cap2 [regexp -inline -- $pat2 $fbb]
if {$cap1 ne $cap2} {puts "not the same: $cap1 vs $cap2"}
# => not the same: bar vs foobarbaz
答案 1 :(得分:1)
使用正则表达式匹配字符串*Logic0*
不是太难。它确实需要一点小心,因为*
是正则表达式元字符,RE引号字符是\
,它也是一个Tcl元字符。我们正在谈论其中一个
regexp "\\*Logic0\\*" [get_object_name $net]
regexp {\*Logic0\*} [get_object_name $net]
# Magic prefix. ONLY for matching where the rest is literal!
regexp "***=*Logic0*" [get_object_name $net]
总的来说,我会这样做:
regexp {\*Logic0\*} [get_object_name $net]
因为在适应处理更多不同的名称时更容易(可能{\*Logic\d+\*}
,*Logic1*
和*Logic42*
也匹配?)