diff-out revision 8838
17404SAli.Saidi@ARM.com#!/usr/bin/perl 210717Sandreas.hansson@arm.com# Copyright (c) 2001-2005 The Regents of The University of Michigan 37404SAli.Saidi@ARM.com# All rights reserved. 47404SAli.Saidi@ARM.com# 57404SAli.Saidi@ARM.com# Redistribution and use in source and binary forms, with or without 67404SAli.Saidi@ARM.com# modification, are permitted provided that the following conditions are 77404SAli.Saidi@ARM.com# met: redistributions of source code must retain the above copyright 87404SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer; 97404SAli.Saidi@ARM.com# redistributions in binary form must reproduce the above copyright 107404SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer in the 117404SAli.Saidi@ARM.com# documentation and/or other materials provided with the distribution; 127404SAli.Saidi@ARM.com# neither the name of the copyright holders nor the names of its 137404SAli.Saidi@ARM.com# contributors may be used to endorse or promote products derived from 147404SAli.Saidi@ARM.com# this software without specific prior written permission. 157404SAli.Saidi@ARM.com# 167404SAli.Saidi@ARM.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177404SAli.Saidi@ARM.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187404SAli.Saidi@ARM.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197404SAli.Saidi@ARM.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207404SAli.Saidi@ARM.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217404SAli.Saidi@ARM.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227404SAli.Saidi@ARM.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237404SAli.Saidi@ARM.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247404SAli.Saidi@ARM.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257404SAli.Saidi@ARM.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267404SAli.Saidi@ARM.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277404SAli.Saidi@ARM.com# 287404SAli.Saidi@ARM.com# Authors: Steve Reinhardt 297404SAli.Saidi@ARM.com 307404SAli.Saidi@ARM.com# 317404SAli.Saidi@ARM.com# This script diffs two SimpleScalar statistics output files. 327404SAli.Saidi@ARM.com# 337404SAli.Saidi@ARM.com 347404SAli.Saidi@ARM.comuse Getopt::Std; 357404SAli.Saidi@ARM.com 367404SAli.Saidi@ARM.comgetopts('adn:t:h'); 377404SAli.Saidi@ARM.com 3810037SARM gem5 Developersif ($#ARGV < 1) 397404SAli.Saidi@ARM.com{ 407404SAli.Saidi@ARM.com print "\nError: need two file arguments (<reference> <new>).\n"; 417404SAli.Saidi@ARM.com print " Options: -d = Ignore distributions\n"; 427404SAli.Saidi@ARM.com print " -a = Sort errors alphabetically (default: by percentage)\n"; 437404SAli.Saidi@ARM.com print " -h = Diff header info separately from stats\n"; 447578Sdam.sunwoo@arm.com print " -n <num> = Print top <num> errors (default 20, 0 for all)\n"; 457578Sdam.sunwoo@arm.com print " -t <num> = Ignore errors below <num> percent (default 0)\n\n"; 467404SAli.Saidi@ARM.com exit; 4710037SARM gem5 Developers} 487404SAli.Saidi@ARM.com 497404SAli.Saidi@ARM.comopen(REF, "<$ARGV[0]") or die "Error: can't open $ARGV[0].\n"; 507404SAli.Saidi@ARM.comopen(NEW, "<$ARGV[1]") or die "Error: can't open $ARGV[1].\n"; 517404SAli.Saidi@ARM.com 527404SAli.Saidi@ARM.com 537404SAli.Saidi@ARM.com# 547404SAli.Saidi@ARM.com# Things that really should be adjustable via the command line 5510873Sandreas.sandberg@arm.com# 5610873Sandreas.sandberg@arm.com 577404SAli.Saidi@ARM.com# Ignorable error (in percent) 587404SAli.Saidi@ARM.com$err_thresh = defined($opt_t) ? $opt_t : 0; 597404SAli.Saidi@ARM.com 6010037SARM gem5 Developers# Number of stats to print before omitting 617404SAli.Saidi@ARM.com$omit_count = defined($opt_n) ? $opt_n : 20; 627404SAli.Saidi@ARM.com 637404SAli.Saidi@ARM.com 647694SAli.Saidi@ARM.com# 6510037SARM gem5 Developers# First copy everything up to the simulation statistics to a pair of 6610037SARM gem5 Developers# temporary files, stripping out date-related items, and do a plain 6710037SARM gem5 Developers# diff. Any differences in the arguments are not necessarily an issue; 6810037SARM gem5 Developers# any differences in the program output should be caught by the EIO 6910037SARM gem5 Developers# mechanism if an EIO file is used. 7010037SARM gem5 Developers# 7110037SARM gem5 Developers 7210037SARM gem5 Developers# copy_header takes input filehandle and output filename 7310037SARM gem5 Developers 7410037SARM gem5 Developerssub copy_header 7510037SARM gem5 Developers{ 7610037SARM gem5 Developers my ($inhandle, $outname) = @_; 7710037SARM gem5 Developers 7810037SARM gem5 Developers open(OUTPUT, ">$outname") or die "Error: can't open $outname.\n"; 7910037SARM gem5 Developers 8010037SARM gem5 Developers while (<$inhandle>) 8110037SARM gem5 Developers { 8210037SARM gem5 Developers # strip out lines that can vary 8310037SARM gem5 Developers next if /^(command line:|M5 compiled on |M5 simulation started |M5 executing on )/; 8410037SARM gem5 Developers last if /Begin Simulation Statistics/; 8510037SARM gem5 Developers print OUTPUT; 8610037SARM gem5 Developers } 8710037SARM gem5 Developers close OUTPUT; 8810037SARM gem5 Developers} 8910037SARM gem5 Developers 9010037SARM gem5 Developersif ($opt_h) { 9110037SARM gem5 Developers 9210037SARM gem5 Developers # Diff header separately from stats 937404SAli.Saidi@ARM.com 947404SAli.Saidi@ARM.com $refheader = "/tmp/smt-test.refheader.$$"; 957404SAli.Saidi@ARM.com $newheader = "/tmp/smt-test.newheader.$$"; 967404SAli.Saidi@ARM.com 977404SAli.Saidi@ARM.com copy_header(\*REF, $refheader); 987404SAli.Saidi@ARM.com copy_header(\*NEW, $newheader); 997404SAli.Saidi@ARM.com 1007404SAli.Saidi@ARM.com print "\n===== Header and program output differences =====\n\n"; 1017436Sdam.sunwoo@arm.com 1027404SAli.Saidi@ARM.com print `diff $refheader $newheader`; 1037404SAli.Saidi@ARM.com 1047436Sdam.sunwoo@arm.com print "\n===== Statistics differences =====\n\n"; 1057436Sdam.sunwoo@arm.com} 1067436Sdam.sunwoo@arm.com 1077436Sdam.sunwoo@arm.com# 10810037SARM gem5 Developers# Now parse statistics 10910537Sandreas.hansson@arm.com# 11010037SARM gem5 Developers 11110037SARM gem5 Developers# 11210037SARM gem5 Developers# This function takes an open filehandle and returns a reference to 11310037SARM gem5 Developers# a hash containing all the statistics variables and their values. 11410037SARM gem5 Developers# 11510037SARM gem5 Developerssub parse_file 11610037SARM gem5 Developers{ 11710037SARM gem5 Developers $stathandle = shift; 11810037SARM gem5 Developers 11910037SARM gem5 Developers $in_dist = undef; 12010037SARM gem5 Developers $hashref = { }; # initialize hash for values 12110037SARM gem5 Developers 12210037SARM gem5 Developers while (<$stathandle>) 12310037SARM gem5 Developers { 12410037SARM gem5 Developers next if /^\s*$/; # skip blank lines 12510037SARM gem5 Developers last if /End Simulation Statistics/; 12610037SARM gem5 Developers 12710037SARM gem5 Developers s/ *#.*//; # strip comments 12810037SARM gem5 Developers 1297404SAli.Saidi@ARM.com if (/^Memory usage: (\d+) KBytes/) { 1307404SAli.Saidi@ARM.com $stat = 'memory usage'; 1317404SAli.Saidi@ARM.com $value = $1; 1327404SAli.Saidi@ARM.com } 1337404SAli.Saidi@ARM.com elsif ($in_dist) { 1347404SAli.Saidi@ARM.com if (/(.*)\.end_dist/) { 1357404SAli.Saidi@ARM.com # end line of distribution: clear $in_dist flag 1367404SAli.Saidi@ARM.com $in_dist = undef; 1377404SAli.Saidi@ARM.com next; 1387404SAli.Saidi@ARM.com } 1397404SAli.Saidi@ARM.com if ($opt_d) { 1407404SAli.Saidi@ARM.com next; # bail out if we are ignoring dists... 1417404SAli.Saidi@ARM.com } elsif (/(.*)\.(min|max)_value/) { 1427404SAli.Saidi@ARM.com # treat these like normal stats 1437404SAli.Saidi@ARM.com ($stat, $value) = /^(\S+)\s+(.*)/; 1447404SAli.Saidi@ARM.com } else { 1457946SGiacomo.Gabrielli@arm.com ($stat, $value) = 1467404SAli.Saidi@ARM.com /^(\S+(?:.*\S)?)\s+(\d+)\s+\d+\.\d+%/; 1477694SAli.Saidi@ARM.com $stat = $in_dist . '::' . $stat; 1487694SAli.Saidi@ARM.com } 1497694SAli.Saidi@ARM.com } 1507694SAli.Saidi@ARM.com else { 1517694SAli.Saidi@ARM.com if (/(.*)\.start_dist/) { 1527946SGiacomo.Gabrielli@arm.com # start line of distribution: set $in_dist flag 1537694SAli.Saidi@ARM.com # and save distribution name for future reference 1547694SAli.Saidi@ARM.com $in_dist = $1; 1557404SAli.Saidi@ARM.com $stat = $1; 1567404SAli.Saidi@ARM.com $value = 0; 1577404SAli.Saidi@ARM.com } 1587404SAli.Saidi@ARM.com else { 1597404SAli.Saidi@ARM.com ($stat, $value) = /^(\S+)\s+(.*)/; 1607404SAli.Saidi@ARM.com } 1617946SGiacomo.Gabrielli@arm.com } 1627404SAli.Saidi@ARM.com 1637404SAli.Saidi@ARM.com $$hashref{$stat} = $value; 1647404SAli.Saidi@ARM.com } 16510037SARM gem5 Developers 1667404SAli.Saidi@ARM.com close($stathandle); 16710037SARM gem5 Developers return $hashref; 1687404SAli.Saidi@ARM.com} 1697404SAli.Saidi@ARM.com 1707404SAli.Saidi@ARM.com 1717404SAli.Saidi@ARM.com# 1727404SAli.Saidi@ARM.com# pct_diff($old, $new) returns percent difference from $old to $new. 1737608SGene.Wu@arm.com# 1747404SAli.Saidi@ARM.comsub pct_diff 1757404SAli.Saidi@ARM.com{ 1767404SAli.Saidi@ARM.com my ($old, $new) = @_; 1777404SAli.Saidi@ARM.com return ($old == 0) ? (($new == 0) ? 0 : 9999) : 100 * ($new - $old) / $old; 1787404SAli.Saidi@ARM.com} 1797946SGiacomo.Gabrielli@arm.com 1807404SAli.Saidi@ARM.com 1817404SAli.Saidi@ARM.com# 1827404SAli.Saidi@ARM.com# Statistics to ignore: these relate to simulator performance, not 18310037SARM gem5 Developers# correctness, so don't fail on changes here. 1847404SAli.Saidi@ARM.com# 18510037SARM gem5 Developers%ignore = ( 1867404SAli.Saidi@ARM.com 'host_seconds' => 1, 1877404SAli.Saidi@ARM.com 'host_tick_rate' => 1, 1887404SAli.Saidi@ARM.com 'host_inst_rate' => 1, 1897404SAli.Saidi@ARM.com 'host_op_rate' => 1, 1907404SAli.Saidi@ARM.com 'host_mem_usage' => 1 1917946SGiacomo.Gabrielli@arm.com); 1927404SAli.Saidi@ARM.com 1937404SAli.Saidi@ARM.com# 1947436Sdam.sunwoo@arm.com# List of key statistics (always displayed) 1957436Sdam.sunwoo@arm.com# ==> list stats here WITHOUT trailing thread ID 1967436Sdam.sunwoo@arm.com# 1977436Sdam.sunwoo@arm.com@key_stat_list = ( 1987436Sdam.sunwoo@arm.com 'ipc', 1997404SAli.Saidi@ARM.com 'committedInsts', 2007404SAli.Saidi@ARM.com 'committedOps', 2017946SGiacomo.Gabrielli@arm.com 'sim_insts', 2027404SAli.Saidi@ARM.com 'sim_ops', 2037404SAli.Saidi@ARM.com 'sim_ticks', 2047436Sdam.sunwoo@arm.com 'host_inst_rate', 2057436Sdam.sunwoo@arm.com 'host_mem_usage' 2067436Sdam.sunwoo@arm.com); 2077436Sdam.sunwoo@arm.com 2087436Sdam.sunwoo@arm.com$key_stat_pattern = join('|', @key_stat_list); 2097436Sdam.sunwoo@arm.com 2107436Sdam.sunwoo@arm.com# initialize first statistics from each file 2117436Sdam.sunwoo@arm.com 2127436Sdam.sunwoo@arm.com$max_err_mag = 0; 2137436Sdam.sunwoo@arm.com 2147436Sdam.sunwoo@arm.com$refhash = parse_file(\*REF); 2157436Sdam.sunwoo@arm.com$newhash = parse_file(\*NEW); 2167436Sdam.sunwoo@arm.com 2177436Sdam.sunwoo@arm.com# The string sim-smt prints on a divide by zero 2187436Sdam.sunwoo@arm.com$divbyzero = '<err: divide by zero>'; 2197436Sdam.sunwoo@arm.com 2207436Sdam.sunwoo@arm.comforeach $stat (sort keys %$refhash) 2217436Sdam.sunwoo@arm.com{ 2227436Sdam.sunwoo@arm.com $refvalue = $$refhash{$stat}; 2237436Sdam.sunwoo@arm.com $newvalue = $$newhash{$stat}; 22410037SARM gem5 Developers 22510037SARM gem5 Developers if (!defined($newvalue)) { 22610037SARM gem5 Developers # stat missing from new file 22710037SARM gem5 Developers push @missing_stats, $stat; 22810037SARM gem5 Developers next; 22910037SARM gem5 Developers } 23010037SARM gem5 Developers 23110037SARM gem5 Developers if ($stat =~ /($key_stat_pattern)/o) { 23210037SARM gem5 Developers # key statistics: always record & display changes in these 23310037SARM gem5 Developers push @key_stats, [$stat, $refvalue, $newvalue]; 23410037SARM gem5 Developers } 23510037SARM gem5 Developers 23610037SARM gem5 Developers if ($ignore{$stat} or $refvalue eq $newvalue) { 23710037SARM gem5 Developers # stat is in "ignore" list, or hasn't changed 23810037SARM gem5 Developers } 2397404SAli.Saidi@ARM.com else { 2407404SAli.Saidi@ARM.com if ($refvalue eq $divbyzero || $newvalue eq $divbyzero) { 2417404SAli.Saidi@ARM.com # one or the other was a divide by zero: 24210037SARM gem5 Developers # no point in trying to quantify error 24310037SARM gem5 Developers print "$stat: $refvalue --> $newvalue\n"; 2447436Sdam.sunwoo@arm.com } 24510037SARM gem5 Developers else { 24610037SARM gem5 Developers $reldiff = pct_diff($refvalue, $newvalue); 2477404SAli.Saidi@ARM.com $diffmag = abs($reldiff); 2487436Sdam.sunwoo@arm.com 2497436Sdam.sunwoo@arm.com if ($diffmag > $err_thresh) { 2507436Sdam.sunwoo@arm.com push @errs, 2517436Sdam.sunwoo@arm.com [$stat, $refvalue, $newvalue, $reldiff]; 25210037SARM gem5 Developers } 25310537Sandreas.hansson@arm.com 25410037SARM gem5 Developers if ($diffmag > $max_err_mag) { 25510037SARM gem5 Developers $max_err_mag = $diffmag; 25610037SARM gem5 Developers } 25710037SARM gem5 Developers } 25810537Sandreas.hansson@arm.com } 25910537Sandreas.hansson@arm.com 26010037SARM gem5 Developers # remove from new hash so we can detect added stats 26110037SARM gem5 Developers delete $$newhash{$stat}; 26210037SARM gem5 Developers} 26310037SARM gem5 Developers 26410037SARM gem5 Developers 26510037SARM gem5 Developers# 26610037SARM gem5 Developers# All done. Print comparison summary. 26710037SARM gem5 Developers# 26810037SARM gem5 Developers 26910037SARM gem5 Developersprintf("Maximum error magnitude: %+f%%\n\n", $max_err_mag); 27010037SARM gem5 Developers 27110037SARM gem5 Developersprintf(" %-30s %10s %10s %10s %7s\n", ' ', 'Reference', 'New Value', 'Abs Diff', 'Pct Chg'); 27210037SARM gem5 Developers 27310037SARM gem5 Developersprintf("Key statistics:\n\n"); 27410037SARM gem5 Developers 27510037SARM gem5 Developersforeach $key_stat (@key_stats) 27610037SARM gem5 Developers{ 27710037SARM gem5 Developers ($statname, $refvalue, $newvalue, $reldiff) = @$key_stat; 27810037SARM gem5 Developers 27910037SARM gem5 Developers # deduce format from reference value 28010037SARM gem5 Developers $pointpos = rindex($refvalue, '.'); 28110037SARM gem5 Developers $digits = ($pointpos < 0) ? 0 :(length($refvalue) - $pointpos - 1); 28210037SARM gem5 Developers $fmt = "%10.${digits}f"; 28310037SARM gem5 Developers 28410037SARM gem5 Developers # print differing values with absolute and relative error 28510037SARM gem5 Developers printf(" %-30s $fmt $fmt $fmt %+7.2f%%\n", 28610037SARM gem5 Developers $statname, $refvalue, $newvalue, 28710037SARM gem5 Developers $newvalue - $refvalue, pct_diff($refvalue, $newvalue)); 28810037SARM gem5 Developers} 2897404SAli.Saidi@ARM.com 2907404SAli.Saidi@ARM.comprintf("\nDifferences > %d%%:\n\n", $err_thresh); 2917404SAli.Saidi@ARM.com 2927946SGiacomo.Gabrielli@arm.comif ($opt_a) { 2937404SAli.Saidi@ARM.com # leave stats sorted alphabetically, doesn't make sense to cut them off 2947404SAli.Saidi@ARM.com $omit_count = 0; 2957404SAli.Saidi@ARM.com} else { 2967404SAli.Saidi@ARM.com # sort differences by percent change 2977404SAli.Saidi@ARM.com @errs = sort { abs($$b[3]) <=> abs($$a[3]) } @errs; 2987404SAli.Saidi@ARM.com} 2997404SAli.Saidi@ARM.com 3007404SAli.Saidi@ARM.com$num_errs = 0; 3017404SAli.Saidi@ARM.com 3027404SAli.Saidi@ARM.comforeach $err (@errs) 3037404SAli.Saidi@ARM.com{ 3047404SAli.Saidi@ARM.com ($statname, $refvalue, $newvalue, $reldiff) = @$err; 3057404SAli.Saidi@ARM.com 3067404SAli.Saidi@ARM.com # deduce format from reference value 3077404SAli.Saidi@ARM.com $pointpos1 = rindex($refvalue, '.'); 30810037SARM gem5 Developers $digits1 = ($pointpos1 < 0) ? 0 :(length($refvalue) - $pointpos1 - 1); 3097404SAli.Saidi@ARM.com $pointpos2 = rindex($newvalue, '.'); 3107404SAli.Saidi@ARM.com $digits2 = ($pointpos2 < 0) ? 0 :(length($newvalue) - $pointpos2 - 1); 3117404SAli.Saidi@ARM.com $digits = ($digits1 > $digits2) ? $digits1 : $digits2; 3127404SAli.Saidi@ARM.com $fmt = "%10.${digits}f"; 3137404SAli.Saidi@ARM.com 3147404SAli.Saidi@ARM.com # print differing values with absolute and relative error 3157404SAli.Saidi@ARM.com printf(" %-30s $fmt $fmt $fmt %+7.2f%%\n", 3167404SAli.Saidi@ARM.com $statname, $refvalue, $newvalue, $newvalue - $refvalue, $reldiff); 3177404SAli.Saidi@ARM.com 3187404SAli.Saidi@ARM.com # only print top N errors 3197404SAli.Saidi@ARM.com if ($omit_count > 0 && ++$num_errs >= $omit_count) 3207404SAli.Saidi@ARM.com { 3217404SAli.Saidi@ARM.com print "[... showing top $omit_count errors only, additional errors omitted ...]\n"; 3227404SAli.Saidi@ARM.com last; 3237946SGiacomo.Gabrielli@arm.com } 3247946SGiacomo.Gabrielli@arm.com} 3257404SAli.Saidi@ARM.com 3267404SAli.Saidi@ARM.com# 3277404SAli.Saidi@ARM.com# Report missing stats 3287404SAli.Saidi@ARM.com# 3297404SAli.Saidi@ARM.com# get count 3307404SAli.Saidi@ARM.com$missing_stats = scalar(@missing_stats); 3317404SAli.Saidi@ARM.com 3327404SAli.Saidi@ARM.comif ($missing_stats) 3337694SAli.Saidi@ARM.com{ 3347694SAli.Saidi@ARM.com print "\nMissing $missing_stats reference statistics:\n\n"; 3357694SAli.Saidi@ARM.com foreach $stat (@missing_stats) 3367694SAli.Saidi@ARM.com { 3377694SAli.Saidi@ARM.com# print "\t$stat\n"; 3387694SAli.Saidi@ARM.com printf " %-50s ", $stat; 3397694SAli.Saidi@ARM.com print "$$refhash{$stat}\n"; 3407694SAli.Saidi@ARM.com } 3417694SAli.Saidi@ARM.com} 3427436Sdam.sunwoo@arm.com 3437436Sdam.sunwoo@arm.com# 3447436Sdam.sunwoo@arm.com# Any stats left in newhash are added since the reference file 3457436Sdam.sunwoo@arm.com# 3467436Sdam.sunwoo@arm.com 3477436Sdam.sunwoo@arm.com@added_stats = keys %$newhash; 3487436Sdam.sunwoo@arm.com 3497436Sdam.sunwoo@arm.com# get count 3507436Sdam.sunwoo@arm.com$added_stats = scalar(@added_stats); 3517436Sdam.sunwoo@arm.com 3527436Sdam.sunwoo@arm.comif ($added_stats) 3537436Sdam.sunwoo@arm.com{ 3547436Sdam.sunwoo@arm.com print "\nFound $added_stats new statistics:\n\n"; 3557436Sdam.sunwoo@arm.com foreach $stat (sort @added_stats) 3567436Sdam.sunwoo@arm.com { 3577436Sdam.sunwoo@arm.com# print "\t$stat\n"; 3587436Sdam.sunwoo@arm.com printf " %-50s ", $stat; 3597436Sdam.sunwoo@arm.com print "$$newhash{$stat}\n"; 3607436Sdam.sunwoo@arm.com } 3617436Sdam.sunwoo@arm.com} 3627436Sdam.sunwoo@arm.com 3637404SAli.Saidi@ARM.comcleanup(); 3647404SAli.Saidi@ARM.com# Exit code is 0 if all stats are found (with no extras) & no stats error, 1 otherwise 36510324SCurtis.Dunham@arm.com$status = ($missing_stats == 0 && $added_stats == 0 && $max_err_mag == 0.0) ? 0 : 1; 36610324SCurtis.Dunham@arm.comexit $status; 36710324SCurtis.Dunham@arm.com 36810324SCurtis.Dunham@arm.comsub cleanup 36910324SCurtis.Dunham@arm.com{ 37010324SCurtis.Dunham@arm.com unlink($refheader) if ($refheader); 37110324SCurtis.Dunham@arm.com unlink($newheader) if ($newheader); 37210324SCurtis.Dunham@arm.com} 37310037SARM gem5 Developers