在innovus里实现一个自定义命令来检查drc、connectivity、antenna等,并显示汇总报告
专栏:iLoveIC Dec. 19, 2023, 6:44 p.m. 67 阅读
如何自己做一个小工具,可以innovus里批量处理一些事情?今天介绍在innovus里实现一个自定义命令来检查drc、connectivity、antenna等,并显示汇总报告。

如何自己用tcl做一个小工具,在innovus里更方便的批量处理一些事情?

今天介绍在innovus里实现一个tcl脚本来做drc、connectivity、antenna等检查,并读取和分析报告,最后打印汇总的报告。

做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的信息。

先来看怎样用tcl打开和关闭文件

set logFile "xxx.drc.rpt"
set LOG [open $logFile r]
while {[gets $LOG line] >= 0} {
	puts $line
}
close $LOG

用正则匹配包含violation的行

假设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} {
}

把getVioFromRpt函数加到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 ================"
}

在innovus里使用

  1. source checkDrcAll.tcl

  2. 敲入checkDrcAll来执行和显示汇总结果

感谢阅读,更多文章点击这里:【专栏:iLoveIC】