| #! /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"; |