innovus auto_fix_short.tcl
思路:
读取 verify_drc 生成的 short 报告;
提取短路两端坐标;
用 ecoRoute -fix_drc -selected_nets 或 手动拆线 + reroute;
若仍失败,再尝试 ecoAddRepeater 断线、ecoChangeCell 降驱动 等 fallback 策略。
##############################################################################
# auto_fix_short.tcl
# 用法:source auto_fix_short.tcl
# 功能:自动读取 DRC short 列表并尝试修复
############################################################################### ----------------------------------------------------------
# 0. 参数:可改
# ----------------------------------------------------------
set drc_rpt "innovus.drc.rpt" ;# 默认 DRC 报告名
set max_iter 3 ;# 最多迭代修几次
set dbg 1 ;# 1=打印调试信息# ----------------------------------------------------------
# 1. 跑 DRC 并产生报告
# ----------------------------------------------------------
proc run_drc {} {global drc_rptclearDrcverify_drc -report $drc_rpt -limit 10000
}# ----------------------------------------------------------
# 2. 从报告里抓 short 信息
# 典型行: SHORT M1 (100.00 200.00) (105.00 205.00) ...
# ----------------------------------------------------------
proc parse_shorts {rpt} {set shorts {}if {![file exists $rpt]} {puts "ERROR: $rpt not found!"return $shorts}set fp [open $rpt r]while {[gets $fp line] >= 0} {if {[regexp {^SHORT\s+(\S+)\s+\(([^)]+)\)\s+\(([^)]+)\)} $line -> layer p1 p2]} {lappend shorts [list $layer $p1 $p2]}}close $fpreturn $shorts
}# ----------------------------------------------------------
# 3. 根据坐标找对应 net
# ----------------------------------------------------------
proc nets_at_point {x y layer} {set shapes [get_shapes -within [list $x $y $x $y] -filter "layer==$layer"]set nets [lsort -unique [get_nets -of $shapes]]return $nets
}# ----------------------------------------------------------
# 4. 主修复循环
# ----------------------------------------------------------
proc auto_fix_short {} {global max_iter drc_rpt dbgfor {set i 1} {$i <= $max_iter} {incr i} {puts "Iteration $i ..."run_drcset shorts [parse_shorts $drc_rpt]set n_short [llength $shorts]if {$n_short == 0} {puts "SUCCESS: no shorts left!"return 1}puts "Found $n_short shorts"foreach short $shorts {lassign $short layer p1 p2lassign [split $p1] x1 y1lassign [split $p2] x2 y2set net1 [lindex [nets_at_point $x1 $y1 $layer] 0]set net2 [lindex [nets_at_point $x2 $y2 $layer] 0]if {$dbg} {puts "SHORT $layer: $net1 vs $net2"}# ---------------- 4-a 拆线 + reroute ----------------if {[llength $net1] && [llength $net2]} {# 先取消这两条 net 的 routeecoDeleteRoute -nets [list $net1 $net2]# 再重新绕线ecoRoute -fix_drc -selected_nets [list $net1 $net2]}}# 可选 fallback:若仍 short,插入 buffer 降驱动# ecoAddRepeater ... }puts "WARNING: still have shorts after $max_iter iterations"return 0
}##############################################################################
# 5. 直接执行
##############################################################################
auto_fix_short
脚本会自动:
verify_drc → 生成 innovus.drc.rpt
解析出所有 SHORT 行
每对短路 net 执行 ecoDeleteRoute + ecoRoute -fix_drc
最多迭代 3 次(可调 max_iter)
若全部 clean,则 SUCCESS 退出;否则打印剩余违例坐标,可人工再干预。
🔧 进阶玩法
只修某层:在 parse_shorts 里加 -filter “layer==M2”
改为插 buffer 断线:把 ecoDeleteRoute 换成
ecoAddRepeater -net net1−cellBUFX1−loc"net1 -cell BUF_X1 -loc "net1−cellBUFX1−loc"x1 $y1"
GUI 调试:运行后 violationBrowser 查看剩余 short。