summaryrefslogtreecommitdiff
path: root/ext/mcpat/regression/regression.py
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mcpat/regression/regression.py')
-rwxr-xr-xext/mcpat/regression/regression.py241
1 files changed, 241 insertions, 0 deletions
diff --git a/ext/mcpat/regression/regression.py b/ext/mcpat/regression/regression.py
new file mode 100755
index 000000000..aabfec75d
--- /dev/null
+++ b/ext/mcpat/regression/regression.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""
+SYNOPSIS
+
+ ./regression/regression.py ./regression/
+
+DESCRIPTION
+
+ Runs regression tester for McPAT.
+ This tester can compile and runs McPAT on the input contained in the
+ specified directory, and then compares the output to that of a prior run in
+ order to ensure that specific power and area calculations do not change.
+
+AUTHORS
+
+ Joel Hestness <hestness@cs.wisc.edu> (while interning at AMD)
+ Yasuko Eckert <yasuko.eckert@amd.com>
+"""
+
+import os
+import sys
+import optparse
+import re
+
+################################
+# Global Variables
+################################
+
+global mcpat_binary
+mcpat_binary = "../../build/mcpat/mcpat"
+global optionsparser
+
+################################
+# Global Functions
+################################
+
+def run_test(testdir):
+ test_passed = True
+ testfiles = os.listdir(testdir)
+ for testfile in testfiles:
+ # For each power_region file, run McPAT on it and check the
+ # output created against the regression
+ if re.match("power_region.*\.xml$", testfile):
+ # Get the region index of the test
+ fileparts = testfile.split(".")
+ region_index = fileparts[0][12:]
+ regression_test = os.path.join(testdir, testfile)
+ regression_output = os.path.join(
+ testdir, "region%s.out" % region_index)
+ regression_correct = os.path.join(
+ testdir, "region%s.out.ref" % region_index)
+ print "Running test: %s..." % regression_test
+ # Run McPAT on the input
+ os.system(
+ "%s -infile %s -print_level 10 > %s" %
+ (mcpat_binary, regression_test, regression_output) )
+ if os.path.exists(regression_correct):
+ diff = os.popen(
+ "diff %s %s" % (regression_output, regression_correct),
+ "r").read()
+ if diff != "":
+ print "WARN: Differences found in %s" % regression_output
+ if options.verbose:
+ print diff
+ test_passed = False
+ else:
+ print "WARN: Regression test not set up: %s..." % regression_test
+ print "WARN: Not able to verify test"
+ test_passed = False
+
+ if options.cleanup:
+ if options.verbose:
+ print "WARN: Cleaning (deleting) regression output file: "\
+ "%s" % regression_output
+ os.system("rm -f %s" % regression_output)
+
+ if test_passed:
+ print "PASSED: %s\n\n" % testdir
+ else:
+ print "FAILED: %s\n\n" % testdir
+
+def has_power_region_files(testdir):
+ files = os.listdir(testdir)
+ for file in files:
+ if "power_region" in file and ".xml" in file:
+ return True
+
+def is_valid_test_directory(testdir):
+ valid_regression = True
+ power_region_file_found = False
+
+ files = os.listdir(testdir)
+ for file in files:
+ if "power_region" in file and ".xml" in file:
+ power_region_file_found = True
+ fileparts = file.split(".")
+ region_index = fileparts[0][12:]
+ regression_output = os.path.join(
+ testdir, "region%s.out.ref" % region_index)
+ if os.path.exists(regression_output):
+ if options.verbose:
+ print "Valid regression test: %s/%s" % (testdir, file)
+ else:
+ valid_regression = False
+
+ return valid_regression and power_region_file_found
+
+################################
+# Execute here
+################################
+
+optionsparser = optparse.OptionParser(
+ formatter = optparse.TitledHelpFormatter(),
+ usage = globals()['__doc__'])
+optionsparser.add_option(
+ "-b", "--build", action = "store_true", default = False,
+ help = "Build McPAT before running tests")
+optionsparser.add_option(
+ "-c", "--cleanup", action = "store_true", default = False,
+ help = "Clean up the specified regression directory")
+optionsparser.add_option(
+ "-f", "--force", action = "store_true", default = False,
+ help = "Force run regression even if directory isn't set up")
+optionsparser.add_option(
+ "-m", "--maketest", action = "store_true", default = False,
+ help = "Set up the specified test directory")
+optionsparser.add_option(
+ "-v", "--verbose", action = "store_true", default = False,
+ help = "Print verbose output")
+(options, args) = optionsparser.parse_args()
+
+if not os.path.exists(mcpat_binary) and not options.build:
+ print "ERROR: McPAT binary does not exist: %s" % mcpat_binary
+ exit(0)
+
+if options.build:
+ print "Building McPAT..."
+ bin_dir = os.path.dirname(mcpat_binary)
+ directory = os.path.join(bin_dir, "../../ext/mcpat")
+ build_output = os.popen(
+ "cd %s; make clean; make -j 8 dbg 2>&1" % directory).read()
+ if "error" in build_output.lower():
+ print "Error during build: %s" % build_output
+ exit(0)
+
+if len(args) < 1:
+ print "ERROR: Must specify regressions directory"
+ exit(0)
+
+# check params
+rootdir = args[0];
+if not os.path.exists(rootdir):
+ print "ERROR: Regressions directory does not exist: %s" % rootdir
+ exit(0)
+
+if options.maketest:
+ # The specified rootdir must exist since we got here
+ # Check if directory has tests
+ list = os.listdir(rootdir)
+ found_test = False
+ for file in list:
+ if "power_region" in file and "out" not in file and "ref" not in file:
+ found_test = True
+ # Prepare to run the test in order to set it up
+ fileparts = file.split(".")
+ region_index = fileparts[0][12:]
+ regression_test = os.path.join(rootdir, file)
+ regression_output = os.path.join(
+ rootdir, "region%s.out.ref" % region_index)
+ if os.path.exists(regression_output):
+ print "WARN: Overwriting old regression output: " \
+ "%s" % regression_output
+ # Run the test to set it up
+ print "Writing new regression output..."
+ os.system(
+ "%s -infile %s -print_level 10 > %s" %
+ (mcpat_binary, regression_test, regression_output))
+
+ if not found_test:
+ print "ERROR: Invalid test directory: %s" % rootdir
+ print "ERROR: Must contain XML file power_region*.xml"
+
+ exit(0)
+
+found_test = False
+if has_power_region_files(rootdir):
+ found_test = True
+ if is_valid_test_directory(rootdir) or options.force:
+ run_test(rootdir)
+ else:
+ print "WARN: Regression directory is not set up: %s" % rootdir
+else:
+ folders = os.listdir(rootdir)
+ folders.sort()
+ for folder in folders:
+ testdir = os.path.join(rootdir, folder)
+ if os.path.isdir(testdir):
+ if has_power_region_files(testdir):
+ found_test = True
+ if is_valid_test_directory(testdir):
+ run_test(testdir)
+ else:
+ if options.force:
+ print "WARN: Regression directory is not set up: " \
+ "%s" % testdir
+ print "WARN: Running test anyway: %s..." % testdir
+ run_test(testdir)
+ else:
+ print "Regression directory is not set up: %s" % testdir
+ else:
+ print "Not a valid test directory: %s" % testdir
+
+if not found_test:
+ print "No valid regressions found in %s" % rootdir