DC的TCL:非标准分层名称的正则表达式匹配

时间:2014-05-18 21:36:31

标签: regex tcl

我正在尝试为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
     }
}

此匹配永远不会成功。它适用于所有其他引脚和网络,但在绑定时失败。

我觉得它与名称中用*指定了绑定网这一事实有关,但我不知道如何处理它。

我能做些什么来克服这个并能够检测到这些绑扎网?

由于

2 个答案:

答案 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*也匹配?)