#!/usr/bin/env python2.7

# 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
