| #! /usr/bin/perl | |
| $netsfile = shift; | |
| $plfile = shift; | |
| # ------------------------------ read placement | |
| open FILE, $plfile; | |
| while (<FILE>) { | |
| chop; | |
| if (/(\w+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s+\:/) { | |
| $loc{$1} = "$2 $3"; | |
| } | |
| } | |
| close FILE; | |
| open FILE, $netsfile; | |
| while (<FILE>) { | |
| chop; | |
| $net = $2 if /NetDegree\s+\:\s+(\d+)\s+(\w+)/; | |
| if (/(\w+)\s+(\w+)\s+\:/) { | |
| $netconn{$net} .= "$1 "; | |
| $cellconn{$1} .= "$net "; | |
| } | |
| } | |
| close FILE; | |
| # ----------------------------- compute HPWL | |
| $hpwl = 0; | |
| foreach $net (keys %netconn) { | |
| @conns = split ' ',$netconn{$net}; | |
| $min_x = $min_y = 1e12; | |
| $max_x = $max_y = -1e12; | |
| foreach $cell (@conns) { | |
| if (!exists $loc{$cell}) { | |
| print "WARNING: Unknown cell location: $cell\n"; | |
| } else { | |
| ($x, $y) = split ' ',$loc{$cell}; | |
| $min_x = $x if $x < $min_x; | |
| $min_y = $y if $y < $min_y; | |
| $max_x = $x if $x > $max_x; | |
| $max_y = $y if $y > $max_y; | |
| } | |
| } | |
| if ($min_x eq 1e12 or $min_y eq 1e12 or | |
| $max_x eq -1e12 or $max_y eq -1e12) { | |
| print "WARNING: Unbounded box\n"; | |
| } else { | |
| $hpwl = $hpwl + $max_x - $min_x + $max_y - $min_y; | |
| } | |
| } | |
| print "HPWL = "; | |
| printf "%e",$hpwl; | |
| print "\n"; |