add_ip_buffer——路径
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 0
for {set i 0} {$i < [llength $inputs(-BOX)]} {} {
incr nn
set 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_i
set 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
}
}
}
}
}

浙公网安备 33010602011771号