| |
| proc route_via {net nodes} { |
| set net [get_nets $net] |
| set fixed_route [get_nodes -of_objects [get_site_pins -filter {DIRECTION == OUT} -of_objects $net]] |
| lappend nodes [get_nodes -of_objects [get_site_pins -filter {DIRECTION == IN} -of_objects $net]] |
| |
| puts "" |
| puts "Routing net $net:" |
| |
| foreach to_node $nodes { |
| set to_node [get_nodes -of_objects [get_wires $to_node]] |
| set from_node [lindex $fixed_route end] |
| set route [find_routing_path -quiet -from $from_node -to $to_node] |
| if {$route == ""} { |
| puts " $from_node -> $to_node: no route found - assuming direct PIP" |
| lappend fixed_route $to_node |
| } { |
| puts " $from_node -> $to_node: $route" |
| set fixed_route [concat $fixed_route [lrange $route 1 end]] |
| } |
| set_property -quiet FIXED_ROUTE $fixed_route $net |
| } |
| |
| set_property -quiet FIXED_ROUTE $fixed_route $net |
| puts "" |
| } |
| |
| proc tile_wire_pairs {tile1 tile2} { |
| set tile1 [get_tiles $tile1] |
| set tile2 [get_tiles $tile2] |
| |
| foreach wire1 [lsort [get_wires -of_objects $tile1]] { |
| set wire2 [get_wires -quiet -filter "TILE_NAME == $tile2" -of_objects [get_nodes -quiet -of_objects $wire1]] |
| if {$wire2 != ""} {puts "$wire1 $wire2"} |
| } |
| } |
| |
| proc randsample_list {num lst} { |
| set rlst {} |
| for {set i 0} {$i<$num} {incr i} { |
| set j [expr {int(rand()*[llength $lst])}] |
| lappend rlst [lindex $lst $j] |
| set lst [lreplace $lst $j $j] |
| } |
| return $rlst |
| } |
| |
| proc randplace_pblock {num pblock} { |
| set sites [randsample_list $num [get_sites -filter {SITE_TYPE == SLICEL || SITE_TYPE == SLICEM} -of_objects [get_pblocks $pblock]]] |
| set cells [randsample_list $num [get_cells -hierarchical -filter "PBLOCK == [get_pblocks $pblock] && REF_NAME == LUT6"]] |
| for {set i 0} {$i<$num} {incr i} { |
| set site [lindex $sites $i] |
| set cell [lindex $cells $i] |
| set_property LOC $site $cell |
| } |
| } |
| |
| proc roi_tiles {} { |
| return [get_tiles -filter "GRID_POINT_X >= $::env(XRAY_ROI_GRID_X1) && \ |
| GRID_POINT_X < $::env(XRAY_ROI_GRID_X2) && \ |
| GRID_POINT_Y >= $::env(XRAY_ROI_GRID_Y1) && \ |
| GRID_POINT_Y < $::env(XRAY_ROI_GRID_Y2)"] |
| } |
| |
| proc pblock_tiles {pblock} { |
| set clb_tiles [get_tiles -of_objects [get_sites -of_objects [get_pblocks $pblock]]] |
| set int_tiles [get_tiles [regsub -all {CLBL[LM]} $clb_tiles INT]] |
| return [get_tiles "$clb_tiles $int_tiles"] |
| } |
| |
| proc lintersect {lst1 lst2} { |
| set rlst {} |
| foreach el $lst1 { |
| set idx [lsearch $lst2 $el] |
| if {$idx >= 0} {lappend rlst $el} |
| } |
| return $rlst |
| } |
| |
| proc putl {lst} { |
| foreach line $lst {puts $line} |
| } |
| |