# Copyright (c) 2006-2008 The Regents of The University of Michigan
# 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.

import os
import sys
from os.path import basename, exists, join as joinpath, normpath
from os.path import isdir, isfile, islink

spec_dist = os.environ.get("M5_CPU2000", "/dist/m5/cpu2000")


def copyfiles(srcdir, dstdir):
    from filecmp import cmp as filecmp
    from shutil import copyfile

    srcdir = normpath(srcdir)
    dstdir = normpath(dstdir)

    if not isdir(dstdir):
        os.mkdir(dstdir)

    for root, dirs, files in os.walk(srcdir):
        root = normpath(root)
        prefix = os.path.commonprefix([root, srcdir])

        root = root[len(prefix) :]
        if root.startswith("/"):
            root = root[1:]

        for entry in dirs:
            newdir = joinpath(dstdir, root, entry)
            if not isdir(newdir):
                os.mkdir(newdir)

        for entry in files:
            dest = normpath(joinpath(dstdir, root, entry))
            src = normpath(joinpath(srcdir, root, entry))
            if not isfile(dest) or not filecmp(src, dest):
                copyfile(src, dest)

    # some of the spec benchmarks expect to be run from one directory up.
    # just create some symlinks that solve the problem
    inlink = joinpath(dstdir, "input")
    outlink = joinpath(dstdir, "output")
    if not exists(inlink):
        os.symlink(".", inlink)
    if not exists(outlink):
        os.symlink(".", outlink)


class Benchmark(object):
    def __init__(self, isa, os, input_set):
        if not hasattr(self.__class__, "name"):
            self.name = self.__class__.__name__

        if not hasattr(self.__class__, "binary"):
            self.binary = self.name

        if not hasattr(self.__class__, "args"):
            self.args = []

        if not hasattr(self.__class__, "output"):
            self.output = "%s.out" % self.name

        if not hasattr(self.__class__, "simpoint"):
            self.simpoint = None

        try:
            func = getattr(self.__class__, input_set)
        except AttributeError:
            raise AttributeError(
                "The benchmark %s does not have the %s input set"
                % (self.name, input_set)
            )

        executable = joinpath(spec_dist, "binaries", isa, os, self.binary)
        if not isfile(executable):
            raise AttributeError("%s not found" % executable)
        self.executable = executable

        # root of tree for input & output data files
        data_dir = joinpath(spec_dist, "data", self.name)
        # optional subtree with files shared across input sets
        all_dir = joinpath(data_dir, "all")
        # dirs for input & output files for this input set
        inputs_dir = joinpath(data_dir, input_set, "input")
        outputs_dir = joinpath(data_dir, input_set, "output")
        # keep around which input set was specified
        self.input_set = input_set

        if not isdir(inputs_dir):
            raise AttributeError("%s not found" % inputs_dir)

        self.inputs_dir = [inputs_dir]
        if isdir(all_dir):
            self.inputs_dir += [joinpath(all_dir, "input")]
        if isdir(outputs_dir):
            self.outputs_dir = outputs_dir

        if not hasattr(self.__class__, "stdin"):
            self.stdin = joinpath(inputs_dir, "%s.in" % self.name)
            if not isfile(self.stdin):
                self.stdin = None

        if not hasattr(self.__class__, "stdout"):
            self.stdout = joinpath(outputs_dir, "%s.out" % self.name)
            if not isfile(self.stdout):
                self.stdout = None

        func(self, isa, os)

    def makeProcessArgs(self, **kwargs):
        # set up default args for Process object
        process_args = {}
        process_args["cmd"] = [self.name] + self.args
        process_args["executable"] = self.executable
        if self.stdin:
            process_args["input"] = self.stdin
        if self.stdout:
            process_args["output"] = self.stdout
        if self.simpoint:
            process_args["simpoint"] = self.simpoint
        # explicit keywords override defaults
        process_args.update(kwargs)

        return process_args

    def makeProcess(self, **kwargs):
        process_args = self.makeProcessArgs(**kwargs)

        # figure out working directory: use m5's outdir unless
        # overridden by Process's cwd param
        cwd = process_args.get("cwd")

        if not cwd:
            from m5 import options

            cwd = options.outdir
            process_args["cwd"] = cwd
        if not isdir(cwd):
            os.makedirs(cwd)
        # copy input files to working directory
        for d in self.inputs_dir:
            copyfiles(d, cwd)
        # generate Process object
        from m5.objects import Process

        return Process(**process_args)

    def __str__(self):
        return self.name


class DefaultBenchmark(Benchmark):
    def ref(self, isa, os):
        pass

    def test(self, isa, os):
        pass

    def train(self, isa, os):
        pass


class MinneDefaultBenchmark(DefaultBenchmark):
    def smred(self, isa, os):
        pass

    def mdred(self, isa, os):
        pass

    def lgred(self, isa, os):
        pass


class ammp(MinneDefaultBenchmark):
    name = "ammp"
    number = 188
    lang = "C"
    simpoint = 108 * 100e6


class applu(MinneDefaultBenchmark):
    name = "applu"
    number = 173
    lang = "F77"
    simpoint = 2179 * 100e6


class apsi(MinneDefaultBenchmark):
    name = "apsi"
    number = 301
    lang = "F77"
    simpoint = 3408 * 100e6


class art(DefaultBenchmark):
    name = "art"
    number = 179
    lang = "C"

    def test(self, isa, os):
        self.args = [
            "-scanfile",
            "c756hel.in",
            "-trainfile1",
            "a10.img",
            "-stride",
            "2",
            "-startx",
            "134",
            "-starty",
            "220",
            "-endx",
            "139",
            "-endy",
            "225",
            "-objects",
            "1",
        ]
        self.output = "test.out"

    def train(self, isa, os):
        self.args = [
            "-scanfile",
            "c756hel.in",
            "-trainfile1",
            "a10.img",
            "-stride",
            "2",
            "-startx",
            "134",
            "-starty",
            "220",
            "-endx",
            "184",
            "-endy",
            "240",
            "-objects",
            "3",
        ]
        self.output = "train.out"

    def lgred(self, isa, os):
        self.args = [
            "-scanfile",
            "c756hel.in",
            "-trainfile1",
            "a10.img",
            "-stride",
            "5",
            "-startx",
            "134",
            "-starty",
            "220",
            "-endx",
            "184",
            "-endy",
            "240",
            "-objects",
            "1",
        ]
        self.output = "lgred.out"


class art110(art):
    def ref(self, isa, os):
        self.args = [
            "-scanfile",
            "c756hel.in",
            "-trainfile1",
            "a10.img",
            "-trainfile2",
            "hc.img",
            "-stride",
            "2",
            "-startx",
            "110",
            "-starty",
            "200",
            "-endx",
            "160",
            "-endy",
            "240",
            "-objects",
            "10",
        ]
        self.output = "ref.1.out"
        self.simpoint = 340 * 100e6


class art470(art):
    def ref(self, isa, os):
        self.args = [
            "-scanfile",
            "c756hel.in",
            "-trainfile1",
            "a10.img",
            "-trainfile2",
            "hc.img",
            "-stride",
            "2",
            "-startx",
            "470",
            "-starty",
            "140",
            "-endx",
            "520",
            "-endy",
            "180",
            "-objects",
            "10",
        ]
        self.output = "ref.2.out"
        self.simpoint = 365 * 100e6


class equake(DefaultBenchmark):
    name = "equake"
    number = 183
    lang = "C"
    simpoint = 812 * 100e6

    def lgred(self, isa, os):
        pass


class facerec(MinneDefaultBenchmark):
    name = "facerec"
    number = 187
    lang = "F"
    simpoint = 375 * 100e6


class fma3d(MinneDefaultBenchmark):
    name = "fma3d"
    number = 191
    lang = "F"
    simpoint = 2541 * 100e6


class galgel(MinneDefaultBenchmark):
    name = "galgel"
    number = 178
    lang = "F"
    simpoint = 2491 * 100e6


class lucas(MinneDefaultBenchmark):
    name = "lucas"
    number = 189
    lang = "F"
    simpoint = 545 * 100e6


class mesa(Benchmark):
    name = "mesa"
    number = 177
    lang = "C"
    stdin = None

    def __set_args(self, frames):
        self.args = [
            "-frames",
            frames,
            "-meshfile",
            "%s.in" % self.name,
            "-ppmfile",
            "%s.ppm" % self.name,
        ]

    def test(self, isa, os):
        self.__set_args("10")

    def train(self, isa, os):
        self.__set_args("500")

    def ref(self, isa, os):
        self.__set_args("1000")
        self.simpoint = 1135 * 100e6

    def lgred(self, isa, os):
        self.__set_args("1")


class mgrid(MinneDefaultBenchmark):
    name = "mgrid"
    number = 172
    lang = "F77"
    simpoint = 3292 * 100e6


class sixtrack(DefaultBenchmark):
    name = "sixtrack"
    number = 200
    lang = "F77"
    simpoint = 3043 * 100e6

    def lgred(self, isa, os):
        pass


class swim(MinneDefaultBenchmark):
    name = "swim"
    number = 171
    lang = "F77"
    simpoint = 2079 * 100e6


class wupwise(DefaultBenchmark):
    name = "wupwise"
    number = 168
    lang = "F77"
    simpoint = 3237 * 100e6

    def lgred(self, isa, os):
        pass


class bzip2(DefaultBenchmark):
    name = "bzip2"
    number = 256
    lang = "C"

    def test(self, isa, os):
        self.args = ["input.random"]

    def train(self, isa, os):
        self.args = ["input.compressed"]


class bzip2_source(bzip2):
    def ref(self, isa, os):
        self.simpoint = 977 * 100e6
        self.args = ["input.source", "58"]

    def lgred(self, isa, os):
        self.args = ["input.source", "1"]


class bzip2_graphic(bzip2):
    def ref(self, isa, os):
        self.simpoint = 718 * 100e6
        self.args = ["input.graphic", "58"]

    def lgred(self, isa, os):
        self.args = ["input.graphic", "1"]


class bzip2_program(bzip2):
    def ref(self, isa, os):
        self.simpoint = 458 * 100e6
        self.args = ["input.program", "58"]

    def lgred(self, isa, os):
        self.args = ["input.program", "1"]


class crafty(MinneDefaultBenchmark):
    name = "crafty"
    number = 186
    lang = "C"
    simpoint = 774 * 100e6


class eon(MinneDefaultBenchmark):
    name = "eon"
    number = 252
    lang = "CXX"
    stdin = None


class eon_kajiya(eon):
    args = [
        "chair.control.kajiya",
        "chair.camera",
        "chair.surfaces",
        "chair.kajiya.ppm",
        "ppm",
        "pixels_out.kajiya",
    ]
    output = "kajiya_log.out"


class eon_cook(eon):
    args = [
        "chair.control.cook",
        "chair.camera",
        "chair.surfaces",
        "chair.cook.ppm",
        "ppm",
        "pixels_out.cook",
    ]
    output = "cook_log.out"


class eon_rushmeier(eon):
    args = [
        "chair.control.rushmeier",
        "chair.camera",
        "chair.surfaces",
        "chair.rushmeier.ppm",
        "ppm",
        "pixels_out.rushmeier",
    ]
    output = "rushmeier_log.out"
    simpoint = 403 * 100e6


class gap(DefaultBenchmark):
    name = "gap"
    number = 254
    lang = "C"

    def __set_args(self, size):
        self.args = ["-l", "./", "-q", "-m", size]

    def test(self, isa, os):
        self.__set_args("64M")

    def train(self, isa, os):
        self.__set_args("128M")

    def ref(self, isa, os):
        self.__set_args("192M")
        self.simpoint = 674 * 100e6

    def lgred(self, isa, os):
        self.__set_args("64M")

    def mdred(self, isa, os):
        self.__set_args("64M")

    def smred(self, isa, os):
        self.__set_args("64M")


class gcc(DefaultBenchmark):
    name = "gcc"
    number = 176
    lang = "C"

    def test(self, isa, os):
        self.args = ["cccp.i", "-o", "cccp.s"]

    def train(self, isa, os):
        self.args = ["cp-decl.i", "-o", "cp-decl.s"]

    def smred(self, isa, os):
        self.args = ["c-iterate.i", "-o", "c-iterate.s"]

    def mdred(self, isa, os):
        self.args = ["rdlanal.i", "-o", "rdlanal.s"]

    def lgred(self, isa, os):
        self.args = ["cp-decl.i", "-o", "cp-decl.s"]


class gcc_166(gcc):
    def ref(self, isa, os):
        self.simpoint = 389 * 100e6
        self.args = ["166.i", "-o", "166.s"]


class gcc_200(gcc):
    def ref(self, isa, os):
        self.simpoint = 736 * 100e6
        self.args = ["200.i", "-o", "200.s"]


class gcc_expr(gcc):
    def ref(self, isa, os):
        self.simpoint = 36 * 100e6
        self.args = ["expr.i", "-o", "expr.s"]


class gcc_integrate(gcc):
    def ref(self, isa, os):
        self.simpoint = 4 * 100e6
        self.args = ["integrate.i", "-o", "integrate.s"]


class gcc_scilab(gcc):
    def ref(self, isa, os):
        self.simpoint = 207 * 100e6
        self.args = ["scilab.i", "-o", "scilab.s"]


class gzip(DefaultBenchmark):
    name = "gzip"
    number = 164
    lang = "C"

    def test(self, isa, os):
        self.args = ["input.compressed", "2"]

    def train(self, isa, os):
        self.args = ["input.combined", "32"]


class gzip_source(gzip):
    def ref(self, isa, os):
        self.simpoint = 334 * 100e6
        self.args = ["input.source", "1"]

    def smred(self, isa, os):
        self.args = ["input.source", "1"]

    def mdred(self, isa, os):
        self.args = ["input.source", "1"]

    def lgred(self, isa, os):
        self.args = ["input.source", "1"]


class gzip_log(gzip):
    def ref(self, isa, os):
        self.simpoint = 265 * 100e6
        self.args = ["input.log", "60"]

    def smred(self, isa, os):
        self.args = ["input.log", "1"]

    def mdred(self, isa, os):
        self.args = ["input.log", "1"]

    def lgred(self, isa, os):
        self.args = ["input.log", "1"]


class gzip_graphic(gzip):
    def ref(self, isa, os):
        self.simpoint = 653 * 100e6
        self.args = ["input.graphic", "60"]

    def smred(self, isa, os):
        self.args = ["input.graphic", "1"]

    def mdred(self, isa, os):
        self.args = ["input.graphic", "1"]

    def lgred(self, isa, os):
        self.args = ["input.graphic", "1"]


class gzip_random(gzip):
    def ref(self, isa, os):
        self.simpoint = 623 * 100e6
        self.args = ["input.random", "60"]

    def smred(self, isa, os):
        self.args = ["input.random", "1"]

    def mdred(self, isa, os):
        self.args = ["input.random", "1"]

    def lgred(self, isa, os):
        self.args = ["input.random", "1"]


class gzip_program(gzip):
    def ref(self, isa, os):
        self.simpoint = 1189 * 100e6
        self.args = ["input.program", "60"]

    def smred(self, isa, os):
        self.args = ["input.program", "1"]

    def mdred(self, isa, os):
        self.args = ["input.program", "1"]

    def lgred(self, isa, os):
        self.args = ["input.program", "1"]


class mcf(MinneDefaultBenchmark):
    name = "mcf"
    number = 181
    lang = "C"
    args = ["mcf.in"]
    simpoint = 553 * 100e6


class parser(MinneDefaultBenchmark):
    name = "parser"
    number = 197
    lang = "C"
    args = ["2.1.dict", "-batch"]
    simpoint = 1146 * 100e6


class perlbmk(DefaultBenchmark):
    name = "perlbmk"
    number = 253
    lang = "C"

    def test(self, isa, os):
        self.args = ["-I.", "-I", "lib", "test.pl"]
        self.stdin = "test.in"


class perlbmk_diffmail(perlbmk):
    def ref(self, isa, os):
        self.simpoint = 141 * 100e6
        self.args = [
            "-I",
            "lib",
            "diffmail.pl",
            "2",
            "550",
            "15",
            "24",
            "23",
            "100",
        ]

    def train(self, isa, os):
        self.args = [
            "-I",
            "lib",
            "diffmail.pl",
            "2",
            "350",
            "15",
            "24",
            "23",
            "150",
        ]


class perlbmk_scrabbl(perlbmk):
    def train(self, isa, os):
        self.args = ["-I.", "-I", "lib", "scrabbl.pl"]
        self.stdin = "scrabbl.in"


class perlbmk_makerand(perlbmk):
    def ref(self, isa, os):
        self.simpoint = 11 * 100e6
        self.args = ["-I", "lib", "makerand.pl"]

    def lgred(self, isa, os):
        self.args = ["-I.", "-I", "lib", "lgred.makerand.pl"]

    def mdred(self, isa, os):
        self.args = ["-I.", "-I", "lib", "mdred.makerand.pl"]

    def smred(self, isa, os):
        self.args = ["-I.", "-I", "lib", "smred.makerand.pl"]


class perlbmk_perfect(perlbmk):
    def ref(self, isa, os):
        self.simpoint = 5 * 100e6
        self.args = ["-I", "lib", "perfect.pl", "b", "3", "m", "4"]

    def train(self, isa, os):
        self.args = ["-I", "lib", "perfect.pl", "b", "3"]


class perlbmk_splitmail1(perlbmk):
    def ref(self, isa, os):
        self.simpoint = 405 * 100e6
        self.args = [
            "-I",
            "lib",
            "splitmail.pl",
            "850",
            "5",
            "19",
            "18",
            "1500",
        ]


class perlbmk_splitmail2(perlbmk):
    def ref(self, isa, os):
        self.args = [
            "-I",
            "lib",
            "splitmail.pl",
            "704",
            "12",
            "26",
            "16",
            "836",
        ]


class perlbmk_splitmail3(perlbmk):
    def ref(self, isa, os):
        self.args = [
            "-I",
            "lib",
            "splitmail.pl",
            "535",
            "13",
            "25",
            "24",
            "1091",
        ]


class perlbmk_splitmail4(perlbmk):
    def ref(self, isa, os):
        self.args = [
            "-I",
            "lib",
            "splitmail.pl",
            "957",
            "12",
            "23",
            "26",
            "1014",
        ]


class twolf(Benchmark):
    name = "twolf"
    number = 300
    lang = "C"
    stdin = None

    def test(self, isa, os):
        self.args = ["test"]

    def train(self, isa, os):
        self.args = ["train"]

    def ref(self, isa, os):
        self.simpoint = 1066 * 100e6
        self.args = ["ref"]

    def smred(self, isa, os):
        self.args = ["smred"]

    def mdred(self, isa, os):
        self.args = ["mdred"]

    def lgred(self, isa, os):
        self.args = ["lgred"]


class vortex(Benchmark):
    name = "vortex"
    number = 255
    lang = "C"
    stdin = None

    def __init__(self, isa, os, input_set):
        if isa in ("arm", "thumb", "aarch64"):
            self.endian = "lendian"
        elif isa == "sparc" or isa == "sparc32":
            self.endian = "bendian"
        else:
            raise AttributeError("unknown ISA %s" % isa)

        super(vortex, self).__init__(isa, os, input_set)

    def test(self, isa, os):
        self.args = ["%s.raw" % self.endian]
        self.output = "vortex.out"

    def train(self, isa, os):
        self.args = ["%s.raw" % self.endian]
        self.output = "vortex.out"

    def smred(self, isa, os):
        self.args = ["%s.raw" % self.endian]
        self.output = "vortex.out"

    def mdred(self, isa, os):
        self.args = ["%s.raw" % self.endian]
        self.output = "vortex.out"

    def lgred(self, isa, os):
        self.args = ["%s.raw" % self.endian]
        self.output = "vortex.out"


class vortex1(vortex):
    def ref(self, isa, os):
        self.args = ["%s1.raw" % self.endian]
        self.output = "vortex1.out"
        self.simpoint = 271 * 100e6


class vortex2(vortex):
    def ref(self, isa, os):
        self.simpoint = 1024 * 100e6
        self.args = ["%s2.raw" % self.endian]
        self.output = "vortex2.out"


class vortex3(vortex):
    def ref(self, isa, os):
        self.simpoint = 564 * 100e6
        self.args = ["%s3.raw" % self.endian]
        self.output = "vortex3.out"


class vpr(MinneDefaultBenchmark):
    name = "vpr"
    number = 175
    lang = "C"


# not sure about vpr minnespec place.in
class vpr_place(vpr):
    args = [
        "net.in",
        "arch.in",
        "place.out",
        "dum.out",
        "-nodisp",
        "-place_only",
        "-init_t",
        "5",
        "-exit_t",
        "0.005",
        "-alpha_t",
        "0.9412",
        "-inner_num",
        "2",
    ]
    output = "place_log.out"


class vpr_route(vpr):
    simpoint = 476 * 100e6
    args = [
        "net.in",
        "arch.in",
        "place.in",
        "route.out",
        "-nodisp",
        "-route_only",
        "-route_chan_width",
        "15",
        "-pres_fac_mult",
        "2",
        "-acc_fac",
        "1",
        "-first_iter_pres_fac",
        "4",
        "-initial_pres_fac",
        "8",
    ]
    output = "route_log.out"


all = [
    ammp,
    applu,
    apsi,
    art,
    art110,
    art470,
    equake,
    facerec,
    fma3d,
    galgel,
    lucas,
    mesa,
    mgrid,
    sixtrack,
    swim,
    wupwise,
    bzip2_source,
    bzip2_graphic,
    bzip2_program,
    crafty,
    eon_kajiya,
    eon_cook,
    eon_rushmeier,
    gap,
    gcc_166,
    gcc_200,
    gcc_expr,
    gcc_integrate,
    gcc_scilab,
    gzip_source,
    gzip_log,
    gzip_graphic,
    gzip_random,
    gzip_program,
    mcf,
    parser,
    perlbmk_diffmail,
    perlbmk_makerand,
    perlbmk_perfect,
    perlbmk_splitmail1,
    perlbmk_splitmail2,
    perlbmk_splitmail3,
    perlbmk_splitmail4,
    twolf,
    vortex1,
    vortex2,
    vortex3,
    vpr_place,
    vpr_route,
]

__all__ = [x.__name__ for x in all]

if __name__ == "__main__":
    from pprint import pprint

    for bench in all:
        for input_set in "ref", "test", "train":
            print("class: %s" % bench.__name__)
            x = bench("x86", "linux", input_set)
            print("%s: %s" % (x, input_set))
            pprint(x.makeProcessArgs())
            print()
