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