如何自己用tcl做一个小工具,在innovus里更方便的批量处理一些事情?
今天介绍在innovus里实现一个tcl脚本来做drc、connectivity、antenna等检查,并读取和分析报告,最后打印汇总的报告。
把相关指令包成一个函数里:
proc checkDrcAll {} {
clearDrc
verify_drc
verifyConnectivity
verifyProcessAntenna
}
运行verify_drc
后见目录下生成了xxx.drc.rpt
文件;运行verifyConnectivity
后见目录下生成了xxx.conn.rpt
文件;运行verifyProcessAntenna
后见目录下生成了xxx.antenna.rpt
文件。
接下来,用tcl读取报告,从中找到violation的信息。
set logFile "xxx.drc.rpt"
set LOG [open $logFile r]
while {[gets $LOG line] >= 0} {
puts $line
}
close $LOG
假设drc violation是下面的格式:
Total Violations : 20 Viols.
那么,正则应该写成 {Total\sViolations\s:\s(\d+)\sViols}
,
在while里,对每一行进行判断,一旦匹配到了violation,就输出violation的个数,
if {[regexp {Total\sViolations\s:\s(\d+)\sViols} $line mall drcVioNum]} {
puts "DRC: $drcVioNum"
}
对于connectivity violation格式:
20 total infos created
正则就应该写成:{(\d+)\stotal\sinfo\(s\)\screated}
Antenna的violation格式如下:
Total number of process antenna violations: 20.
正则可以写作:{Total\snumber\sof\sprocess\santenna\sviolations:\s(\d+)}
把读取报告、分析报告、输出报告汇总信息这个功能包在一个函数里,
getVioFromRpt {loFilee} {
}
checkDrcAll
里执行清除drc,检查drc、connectivity、Antenna,并调用上面的函数getVioFromRpt xxx.rpt
来处理和显示汇总结果
proc checkDrcAll {} {
clearDrc
verify_drc
verifyConnectivity
verifyProcessAntenna
puts "#============== checkDRC Report Begin =============="
getVioFromRpt xxx.drc.rpt
getVioFromRpt xxx.conn.rpt
getVioFromRpt xxx.antenna.rpt
puts "#============== checkDRC Report End ================"
}
source checkDrcAll.tcl
敲入checkDrcAll
来执行和显示汇总结果