define_proc_arguments add_ip_buffer -info "Add repeater for IPs"
-define_args {
{-insts "Target IP insts" "insts" list required}
{-BOX "to core area, last location is the last inverter's location. {{x1 y1} {x2 y2} ...}" "path" list required}
{-prefix "Prefix for new insts and nets, default is IP_WZC" "prefix" string optional}
{-side "IP side, T,B,L or R" "side" string required}
}
proc add_ip_buffer {args} {
set inputs(-prefix) IP_WZC
global _IP_REPEATER_INDEX _IP_REPEATER_INDEX
parse_proc_arguments -args $args inputs
if {[info exists inputs(-start_index)]} {
set _IP_REPEATER_INDEX $inputs(-start_index)
} elseif {![info exists _IP_REPEATER_INDEX]} {
set _IP_REPEATER_INDEX 0
}
set IPname $inputs(-insts)
set distance 10
set max_distance 700
foreach ipname $IPname {
set ip [dbget [dbget top.insts.name $ipname -p1]]
set orient [dbget $ip.orient]set ipName [dbget $ip.name]set PinA [dbget $ip.instTerms.name *A[*] -p1]set netA [dbget $PinA.net]set Pinlists ""if {$netA != "0x0"} {lappend Pinlists $PinA}set PinY [dbget $ip.instTerms.name *DOUT[*] -p1]set netY [dbget $PinY.net]if {$netY != "0x0"} {lappend Pinlists $PinY}set pinss [concat $PinA $PinY]foreach pins $pinss {set pinsname [dbget $pins.name]set obj [get_property [get_pins $pinsname] dbObject]set x [dbget $obj.pt_x]set y [dbget $obj.pt_y]
puts $y
case $inputs(-side) {
T {
set y [expr $y - $distance]
}
B {
set y [expr $y + $distance]
}
L {
set x [expr $x + $distance]
}
default {
set x [expr $x - $distance]
}
}
set inv_locs [list [list $x $y]]
set loc [list $x $y]
set tot_len 0
foreach tbox1 $inputs(-BOX) {
set ll [expr abs([lindex $tbox1 0] - [lindex $loc 0]) + abs([lindex $tbox1 1] - [lindex $loc 1])]
set tot_len [expr $tot_len + $ll]
set loc $tbox1
}
set invnum [expr int(ceil($tot_len*1.0/$max_distance))] if {[expr $invnum%2]} {incr invnum} else {set invnum [expr $invnum + 2]}puts "invnum:$invnum"set invspace [format %.2f [expr $tot_len*1.0/($invnum-1)]]set loc [lindex $inv_locs 0]set nn 0for {set i 0} {$i < [llength $inputs(-BOX)]} {} {incr nnset loc_i [lindex $inputs(-BOX) $i] set dx [expr [lindex $loc_i 0] - [lindex $loc 0]] set dy [expr [lindex $loc_i 1] - [lindex $loc 1]] set l [expr abs($dx) + abs($dy)]set loc_last $loc_i set loc_last1 $loc set flag 0 set break_flag 0 while {$l < $invspace && $i < [llength $inputs(-BOX)]} {incr i if {$i == [llength $inputs(-BOX)]} {set break_flag 1 break}set loc_i [lindex $inputs(-BOX) $i]set dx [expr abs([lindex $loc_i 0] - [lindex $loc_last 0])]set dy [expr abs([lindex $loc_i 1] - [lindex $loc_last 1])]set loc_last1 $loc_last set loc_last $loc_iset l [expr $dx + $dy +$l]set flag 1 }if {$break_flag} {if {$invnum != [llength $inv_locs]} {lappend inv_locs [lindex $inputs(-BOX) end]}} elseif {$flag} {set l1 [expr $l - $dx - $dy] set l2 [expr $invspace - $l1] set dx [expr [lindex $loc_last 0] - [lindex $loc_last1 0]]set dy [expr [lindex $loc_last 1] - [lindex $loc_last1 1]]if {[expr abs($dx)] < [expr abs($dy)]} {set x [lindex $loc_last 0] if {$dy > 0} {set y [expr [lindex $loc_last1 1] + $l2] } else {set y [expr [lindex $loc_last1 1] - $l2] } } else {set y [lindex $loc_last 1] if {$dx > 0} {set x [expr [lindex $loc_last1 0] + $l2] } else {set x [expr [lindex $loc_last1 0] - $l2] }}set loc [list $x $y] lappend inv_locs $loc } else { set l2 $invspace set dx [expr [lindex $loc_i 0] - [lindex $loc 0]]set dy [expr [lindex $loc_i 1] - [lindex $loc 1]]if {[expr abs($dx)] < [expr abs($dy)]} {set x [lindex $loc_i 0]if {$dy > 0} {set y [expr [lindex $loc 1] + $l2]} else {set y [expr [lindex $loc 1] - $l2]} } else {set y [lindex $loc_i 1]if {$dx > 0} {set x [expr [lindex $loc 0] + $l2]} else {set x [expr [lindex $loc 0] - $l2]}}set loc [list $x $y]lappend inv_locs $loc}if {[llength $inv_locs] == $invnum} {}if {$l < 40 && [expr [llength $inv_locs]%2] == 0} { break}if {$nn == 100} {break}}if {[expr [llength $inv_locs] %2]} {continue}set net [lindex [dbget $obj.net.name] 0]set pin_name [file tail $pinsname]puts "$inv_locs"set inv_locs_re [lreverse $inv_locs]for {set n 0} {$n < [expr $invnum/2]} {incr n} {set input [dbget $pins.isInput] set idx1 [expr {$n * 2}]set idx2 [expr {$n * 2 + 1}]set x1 [lindex [lindex $inv_locs_re $idx1] 0]set y1 [lindex [lindex $inv_locs_re $idx1] 1]set x2 [lindex [lindex $inv_locs_re $idx2] 0]set y2 [lindex [lindex $inv_locs_re $idx2] 1]if {$input} {redirect ../scr/addipbufftcl.tcl {puts "ecoAddRepeater -term [dbGet $pins.name] -cell JLSCL6CNMV2_INV_16 -loc {$x1 $y1 $x2 $y2}"} -append} else {redirect ../scr/addipbufftcl.tcl {puts "ecoAddRepeater -term [dbGet $pins.name] -cell JLSCL6CNMV2_INV_16 -loc {$x2 $y2 $x1 $y1}"} -append}}}
}
}