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

				}
			}
		}
}

}

posted @ 2025-10-29 17:47  心随鸥鹭齐舒羽  阅读(3)  评论(0)    收藏  举报