在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2502|回复: 4

[原创] 自动修复简单transition violation问题 tcl脚本

[复制链接]
发表于 2021-4-13 15:57:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
tcl 语言不熟练,脚本语句用的都很基础,思路简单,存在冗余之处大佬们可发表下优化方法

proc trans_fix {{top_design wrapper} {scenario sc_1p05v_125c_ff} {slack 0.00} {buff_list "BUF_X9 BUF_X16"} } {
   report_constraint -all_violators -max_transition -nosplit > ${top_design}.tran_err
    set file_hdl [open ${top_design}.tran_err r]
    set vio_list ""
    while {![eof $file_hdl]} {
      gets $file_hdl line
      set end_point [lindex $line 0]
      set rpt_scen  [lindex $line end]
      if { ![string compare $rpt_scen $scenario] && ![regexp {Scenario}  $line] && ![regexp {Total}  $line]} {
         puts "## violted  point => $line"
         lappend vio_list $line
      }   
   }
   close $file_hdl
   set wr_hdl [open ${top_design}.eco w]
   foreach vio_path  $vio_list {
      set end_point [lindex $vio_path 0]
      set rpt_slack [lindex $vio_path 3]
      set ld_flag 0
      set drv_flag 0
       set load_num 0
      set drv_cell ""
      set load_type ""
     if {$rpt_slack < $slack} {
        set rpt_name [split  ${end_point} "/"]
        set rpt_file [lindex $rpt_name end]
        puts $rpt_file
        report_net -connection  -nosplit  $end_point > ${rpt_file}.con
        set file_hdl [open ${rpt_file}.con r]
        while {![eof $file_hdl]} {
           gets $file_hdl line
           if {[regexp {Driver} [lindex $line 0]]} {
              set drv_flag 1
           }
           if {[regexp {Load}  [lindex $line 0]]} {
              set drv_flag 0
              set ld_flag 1
           }
           if {$drv_flag == 1 && ![regexp "\-.*" [lindex $line 0]] && ![regexp "Driver" [lindex $line 0]] && [string compare  "" [lindex $line 0]] } {
              set drv_pin [lindex $line 0]
              set drv_cell  [lindex $line end]
           }
           if {$ld_flag == 1 && ![regexp {\-.*} [lindex $line 0]] && ![regexp {Load}  [lindex $line 0]]  } {
              set load_pin [lindex $line 0]
              set load_type  [lindex $line 1]
              set load_num [expr $load_num + 1]
           }
           if {[regexp "BUF" $drv_cell] && [regexp "Output" $load_type]} {
              if {[expr  $slack - $rpt_slack] > 0.05} {
                   regsub "\/Y" $drv_pin "" drv_inst
                   puts $wr_hdl "size_cell $drv_inst [lindex $buff_list 1]"
                 } else {
                   regsub "\/Y" $drv_pin "" drv_inst
                   puts $wr_hdl "size_cell $drv_inst [lindex $buff_list 0]"
                 }
           } elseif {![regexp "BUF" $drv_cell] && [regexp "Output" $load_type]} {
              if {[expr  $slack - $rpt_slack] > 0.05} {
                   puts $wr_hdl "insert_buffer $load_pin [lindex $buff_list 1]"
                 } else {
                   puts $wr_hdl "insert_buffer $load_pin [lindex $buff_list 0]"
                 }               
           } elseif {[regexp "BUF" $drv_cell] && [regexp "Input" $load_type] && $load_num == 1} {
              if {[expr  $slack - $rpt_slack] > 0.05} {
                   regsub "\/Y" $drv_pin "" drv_inst
                   puts $wr_hdl "size_cell $drv_inst [lindex $buff_list 1]"
                 }  else {
                   regsub "\/Y" $drv_pin "" drv_inst
                   puts $wr_hdl "size_cell $drv_inst [lindex $buff_list 0]"
                 }
           } elseif {![regexp "BUF" $drv_cell] && [regexp "Input" $load_type] && $load_num == 1} {
              if {[expr  $slack - $rpt_slack] > 0.05} {
                   puts $wr_hdl "insert_buffer $drv_pin  [lindex $buff_list 1]"
                 } else {
                   puts $wr_hdl "insert_buffer $drv_pin  [lindex $buff_list 0]"
                 }               
           }         
        }        
      }
   }
   close $wr_hdl
}

发表于 2021-4-13 21:58:07 | 显示全部楼层
用来做练习可以,实际用的话,PT自带的 “fix_eco_drc -type max_transition ” 不是更简单直接吗?

set eco_drc_buf_list "BUFX2 BUFX3 BUFX4 BUFX5 BUFX6 BUFX8 BUFX10 BUFX12 BUFX14 BUFX16"
fix_eco_drc -type max_transition -method { size_cell insert_buffer } -verbose -buffer_list $eco_drc_buf_list
 楼主| 发表于 2021-4-14 09:17:05 | 显示全部楼层
抛砖引玉,这个方法好
发表于 2021-4-15 19:15:57 | 显示全部楼层
学习学习
发表于 2021-4-16 10:07:13 | 显示全部楼层
学习了,transition一般修第一个,后面会有改善,可以从这个角度优化一下,或者每次只修一个点??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 17:52 , Processed in 0.019703 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表