1#!/usr/bin/perl 2# Copyright (c) 2001-2005 The Regents of The University of Michigan 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions are 7# met: redistributions of source code must retain the above copyright 8# notice, this list of conditions and the following disclaimer; --- 22 unchanged lines hidden (view full) --- 31# This script diffs two SimpleScalar statistics output files. 32# 33 34use Getopt::Std; 35 36# 37# -t thresh sets threshold for ignoring differences (in %) 38# -p sorts differences by % chg (default is alphabetic) |
39# -d ignores all distributions 40# 41 42getopts('dfn:pt:h'); 43 44if ($#ARGV < 1) 45{ 46 print "\nError: need two file arguments (<reference> <new>).\n"; 47 print " Options: -d = Ignore distributions\n"; |
48 print " -p = Sort errors by percentage\n"; 49 print " -h = Diff header info separately from stats\n"; 50 print " -n <num> = Print top <num> errors (default 20)\n"; 51 print " -t <num> = Error threshold in percent (default 1)\n\n"; 52 die -1; 53} 54 55open(REF, "<$ARGV[0]") or die "Error: can't open $ARGV[0].\n"; --- 67 unchanged lines hidden (view full) --- 123 $stathandle = shift; 124 125 $in_dist = undef; 126 $hashref = { }; # initialize hash for values 127 128 while (<$stathandle>) 129 { 130 next if /^\s*$/; # skip blank lines |
131 last if /End Simulation Statistics/; 132 133 s/ *#.*//; # strip comments 134 135 if (/^Memory usage: (\d+) KBytes/) { 136 $stat = 'memory usage'; 137 $value = $1; 138 } 139 elsif ($in_dist) { |
140 if (/(.*)\.end_dist/) { 141 # end line of distribution: clear $in_dist flag 142 $in_dist = undef; 143 next; |
144 } |
145 if ($opt_d) { 146 next; # bail out if we are ignoring dists... 147 } elsif (/(.*)\.(min|max)_value/) { 148 # treat these like normal stats 149 ($stat, $value) = /^(\S+)\s+(.*)/; 150 } else { 151 ($stat, $value) = 152 /^(\S+(?:.*\S)?)\s+(\d+)\s+\d+\.\d+%/; 153 $stat = $in_dist . '::' . $stat; |
154 } 155 } 156 else { 157 if (/(.*)\.start_dist/) { 158 # start line of distribution: set $in_dist flag 159 # and save distribution name for future reference 160 $in_dist = $1; 161 $stat = $1; 162 $value = 0; 163 } |
164 else { 165 ($stat, $value) = /^(\S+)\s+(.*)/; 166 } 167 } 168 169 $$hashref{$stat} = $value; 170 } 171 --- 149 unchanged lines hidden (view full) --- 321 if (++$num_errs >= $omit_count) 322 { 323 print "[... additional errors omitted ...]\n"; 324 last; 325 } 326} 327 328# |
329# Report missing stats 330# |
331# get count 332$missing_stats = scalar(@missing_stats); 333 334if ($missing_stats) 335{ 336 print "\nMissing $missing_stats reference statistics:\n\n"; 337 foreach $stat (@missing_stats) 338 { --- 4 unchanged lines hidden (view full) --- 343} 344 345# 346# Any stats left in newhash are added since the reference file 347# 348 349@added_stats = keys %$newhash; 350 |
351# get count 352$added_stats = scalar(@added_stats); 353 354if ($added_stats) 355{ 356 print "\nFound $added_stats new statistics:\n\n"; 357 foreach $stat (sort @added_stats) 358 { 359# print "\t$stat\n"; 360 printf " %-50s ", $stat; 361 print "$$newhash{$stat}\n"; 362 } 363} 364 365cleanup(); |
366# Exit code is 0 if all stats are found (with no extras) & no stats error, 1 otherwise 367$status = ($missing_stats == 0 && $added_stats == 0 && $max_err_mag == 0.0) ? 0 : 1; |
368exit $status; 369 370sub cleanup 371{ 372 unlink($refheader) if ($refheader); 373 unlink($newheader) if ($newheader); 374} |