#! /usr/bin/perl $netsfile = shift; $plfile = shift; # ------------------------------ read placement open FILE, $plfile; while () { chop; if (/(\w+)\s+([\-\d\.]+)\s+([\-\d\.]+)\s+\:/) { $loc{$1} = "$2 $3"; } } close FILE; open FILE, $netsfile; while () { 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";