在用calibre v2lvs把APR网表转CDL时是不是经常遇到下图的情况?这是CDL不区分大小写的原因。最常见的解决方法就是写脚本替换。
我们注意到log里warning非常有规律:Duplicate port/net name "xxx" found in module "xxx",这样我们可以用正则提取net和module名字。
dup = {}
for line in log:
# Warning: Duplicate port/net name "N528" found in module "frc_pat_test_1" while doing case-insensitive lookup
m = re.search(r'Duplicate\sport\/net\sname\s\"(n\d+)\"\sfound\sin\smodule\s\"(.*)\"', line)
if m:
module = m[2]
net = m[1]
dup[net] = module
把结果缓存在字典里:
dup = {
"n57": "module1",
"n59": "module1",
"n105": "module2",
"n106": "module2",
...
}
对dup里的net->module逐个处理。读入verilog网表,找到有重名的module,进行查找替换。
netlist = open('digital_top_pr_phy.v', 'r').readlines()
for net in dup:
print("process {} in {}...".format(net, dup[net]))
mark = 0
for line in netlist:
if mark == 0 and re.search(r'module\s'+ dup[net], line):
mark = 1
print("found module " + dup[net])
if mark == 1 and re.search(r'endmodule', line):
mark = 0
print("found end of module " + dup[net])
# replace
if mark == 1:
# rename net
接下来进行net重命名。在verilog网表中可能出现的几种情况:
总结下来,都有一个特点:verilog的net前后总是有空格、小括号、逗号、大括号等特殊字符,我们可以用\W来表示。
netlist[i] = re.sub(r'(\W)' + net + r'(\W)', r'\1' + net + r'_\2', line)
最后,把替换后的网表写到文件里,再用calibre v2lvs跑一下,看到下面的log就OK了。
# v2lvs log
Running /xxx/eda/mentor/calibre/pkgs/icv/pvt/v2lvs -tcl v2lvs.tcl
Info: Creating Spice Library Database ...
Info: Creating Design Database ...
Info: Converting Design ...
当然有一个环节不能遗漏:重命名的新网表要与原网表做一下LEC。
分享让工作更轻松