# Copyright (c) 2012-2014, 2017-2018 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# not be construed as granting a license to any other intellectual
# property including but not limited to intellectual property relating
# to a hardware implementation of the functionality of the software
# licensed hereunder.  You may use the software subject to the license
# terms below provided that you ensure that this notice is replicated
# unmodified and in its entirety in all distributions of the software,
# modified or unmodified, in source code or in binary form.
#
# Copyright (c) 2007 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.

from m5.defines import buildEnv
from m5.params import *
from m5.proxy import *
from m5.SimObject import SimObject
from m5.objects.BaseCPU import BaseCPU
from m5.objects.DummyChecker import DummyChecker
from m5.objects.BranchPredictor import *
from m5.objects.TimingExpr import TimingExpr

from m5.objects.FuncUnit import OpClass


class MinorOpClass(SimObject):
    """Boxing of OpClass to get around build problems and provide a hook for
    future additions to OpClass checks"""

    type = "MinorOpClass"
    cxx_header = "cpu/minor/func_unit.hh"
    cxx_class = "gem5::MinorOpClass"

    opClass = Param.OpClass("op class to match")


class MinorOpClassSet(SimObject):
    """A set of matchable op classes"""

    type = "MinorOpClassSet"
    cxx_header = "cpu/minor/func_unit.hh"
    cxx_class = "gem5::MinorOpClassSet"

    opClasses = VectorParam.MinorOpClass(
        [], "op classes to be matched.  An empty list means any class"
    )


class MinorFUTiming(SimObject):
    type = "MinorFUTiming"
    cxx_header = "cpu/minor/func_unit.hh"
    cxx_class = "gem5::MinorFUTiming"

    mask = Param.UInt64(0, "mask for testing ExtMachInst")
    match = Param.UInt64(
        0,
        "match value for testing ExtMachInst:"
        " (ext_mach_inst & mask) == match",
    )
    suppress = Param.Bool(
        False, "if true, this inst. is not executed by this FU"
    )
    extraCommitLat = Param.Cycles(
        0, "extra cycles to stall commit for this inst."
    )
    extraCommitLatExpr = Param.TimingExpr(
        NULL, "extra cycles as a run-time evaluated expression"
    )
    extraAssumedLat = Param.Cycles(
        0,
        "extra cycles to add to scoreboard"
        " retire time for this insts dest registers once it leaves the"
        " functional unit.  For mem refs, if this is 0, the result's time"
        " is marked as unpredictable and no forwarding can take place.",
    )
    srcRegsRelativeLats = VectorParam.Cycles(
        "the maximum number of cycles"
        " after inst. issue that each src reg can be available for this"
        " inst. to issue"
    )
    opClasses = Param.MinorOpClassSet(
        MinorOpClassSet(),
        "op classes to be considered for this decode.  An empty set means any"
        " class",
    )
    description = Param.String(
        "", "description string of the decoding/inst class"
    )


def minorMakeOpClassSet(op_classes):
    """Make a MinorOpClassSet from a list of OpClass enum value strings"""

    def boxOpClass(op_class):
        return MinorOpClass(opClass=op_class)

    return MinorOpClassSet(opClasses=[boxOpClass(o) for o in op_classes])


class MinorFU(SimObject):
    type = "MinorFU"
    cxx_header = "cpu/minor/func_unit.hh"
    cxx_class = "gem5::MinorFU"

    opClasses = Param.MinorOpClassSet(
        MinorOpClassSet(),
        "type of operations allowed on this functional unit",
    )
    opLat = Param.Cycles(1, "latency in cycles")
    issueLat = Param.Cycles(
        1, "cycles until another instruction can be issued"
    )
    timings = VectorParam.MinorFUTiming([], "extra decoding rules")

    cantForwardFromFUIndices = VectorParam.Unsigned(
        [],
        "list of FU indices from which this FU can't receive and early"
        " (forwarded) result",
    )


class MinorFUPool(SimObject):
    type = "MinorFUPool"
    cxx_header = "cpu/minor/func_unit.hh"
    cxx_class = "gem5::MinorFUPool"

    funcUnits = VectorParam.MinorFU("functional units")


class MinorDefaultIntFU(MinorFU):
    opClasses = minorMakeOpClassSet(["IntAlu"])
    timings = [MinorFUTiming(description="Int", srcRegsRelativeLats=[2])]
    opLat = 3


class MinorDefaultIntMulFU(MinorFU):
    opClasses = minorMakeOpClassSet(["IntMult"])
    timings = [MinorFUTiming(description="Mul", srcRegsRelativeLats=[0])]
    opLat = 3


class MinorDefaultIntDivFU(MinorFU):
    opClasses = minorMakeOpClassSet(["IntDiv"])
    issueLat = 9
    opLat = 9


class MinorDefaultFloatSimdFU(MinorFU):
    opClasses = minorMakeOpClassSet(
        [
            "FloatAdd",
            "FloatCmp",
            "FloatCvt",
            "FloatMisc",
            "FloatMult",
            "FloatMultAcc",
            "FloatDiv",
            "FloatSqrt",
            "SimdAdd",
            "SimdAddAcc",
            "SimdAlu",
            "SimdCmp",
            "SimdCvt",
            "SimdMisc",
            "SimdMult",
            "SimdMultAcc",
            "SimdShift",
            "SimdShiftAcc",
            "SimdDiv",
            "SimdSqrt",
            "SimdFloatAdd",
            "SimdFloatAlu",
            "SimdFloatCmp",
            "SimdFloatCvt",
            "SimdFloatDiv",
            "SimdFloatMisc",
            "SimdFloatMult",
            "SimdFloatMultAcc",
            "SimdFloatSqrt",
            "SimdReduceAdd",
            "SimdReduceAlu",
            "SimdReduceCmp",
            "SimdFloatReduceAdd",
            "SimdFloatReduceCmp",
            "SimdAes",
            "SimdAesMix",
            "SimdSha1Hash",
            "SimdSha1Hash2",
            "SimdSha256Hash",
            "SimdSha256Hash2",
            "SimdShaSigma2",
            "SimdShaSigma3",
            "Matrix",
            "MatrixMov",
            "MatrixOP",
        ]
    )

    timings = [MinorFUTiming(description="FloatSimd", srcRegsRelativeLats=[2])]
    opLat = 6


class MinorDefaultPredFU(MinorFU):
    opClasses = minorMakeOpClassSet(["SimdPredAlu"])
    timings = [MinorFUTiming(description="Pred", srcRegsRelativeLats=[2])]
    opLat = 3


class MinorDefaultMemFU(MinorFU):
    opClasses = minorMakeOpClassSet(
        ["MemRead", "MemWrite", "FloatMemRead", "FloatMemWrite"]
    )
    timings = [
        MinorFUTiming(
            description="Mem", srcRegsRelativeLats=[1], extraAssumedLat=2
        )
    ]
    opLat = 1


class MinorDefaultMiscFU(MinorFU):
    opClasses = minorMakeOpClassSet(["IprAccess", "InstPrefetch"])
    opLat = 1


class MinorDefaultFUPool(MinorFUPool):
    funcUnits = [
        MinorDefaultIntFU(),
        MinorDefaultIntFU(),
        MinorDefaultIntMulFU(),
        MinorDefaultIntDivFU(),
        MinorDefaultFloatSimdFU(),
        MinorDefaultPredFU(),
        MinorDefaultMemFU(),
        MinorDefaultMiscFU(),
    ]


class ThreadPolicy(Enum):
    vals = ["SingleThreaded", "RoundRobin", "Random"]


class BaseMinorCPU(BaseCPU):
    type = "BaseMinorCPU"
    cxx_header = "cpu/minor/cpu.hh"
    cxx_class = "gem5::MinorCPU"

    @classmethod
    def memory_mode(cls):
        return "timing"

    @classmethod
    def require_caches(cls):
        return True

    @classmethod
    def support_take_over(cls):
        return True

    threadPolicy = Param.ThreadPolicy("RoundRobin", "Thread scheduling policy")
    fetch1FetchLimit = Param.Unsigned(
        1, "Number of line fetches allowable in flight at once"
    )
    fetch1LineSnapWidth = Param.Unsigned(
        0,
        "Fetch1 'line' fetch snap size in bytes"
        " (0 means use system cache line size)",
    )
    fetch1LineWidth = Param.Unsigned(
        0,
        "Fetch1 maximum fetch size in bytes (0 means use system cache"
        " line size)",
    )
    fetch1ToFetch2ForwardDelay = Param.Cycles(
        1, "Forward cycle delay from Fetch1 to Fetch2 (1 means next cycle)"
    )
    fetch1ToFetch2BackwardDelay = Param.Cycles(
        1,
        "Backward cycle delay from Fetch2 to Fetch1 for branch prediction"
        " signalling (0 means in the same cycle, 1 mean the next cycle)",
    )

    fetch2InputBufferSize = Param.Unsigned(
        2, "Size of input buffer to Fetch2 in cycles-worth of insts."
    )
    fetch2ToDecodeForwardDelay = Param.Cycles(
        1, "Forward cycle delay from Fetch2 to Decode (1 means next cycle)"
    )
    fetch2CycleInput = Param.Bool(
        True,
        "Allow Fetch2 to cross input lines to generate full output each"
        " cycle",
    )

    decodeInputBufferSize = Param.Unsigned(
        3, "Size of input buffer to Decode in cycles-worth of insts."
    )
    decodeToExecuteForwardDelay = Param.Cycles(
        1, "Forward cycle delay from Decode to Execute (1 means next cycle)"
    )
    decodeInputWidth = Param.Unsigned(
        2,
        "Width (in instructions) of input to Decode (and implicitly"
        " Decode's own width)",
    )
    decodeCycleInput = Param.Bool(
        True,
        "Allow Decode to pack instructions from more than one input cycle"
        " to fill its output each cycle",
    )

    executeInputWidth = Param.Unsigned(
        2, "Width (in instructions) of input to Execute"
    )
    executeCycleInput = Param.Bool(
        True,
        "Allow Execute to use instructions from more than one input cycle"
        " each cycle",
    )
    executeIssueLimit = Param.Unsigned(
        2, "Number of issuable instructions in Execute each cycle"
    )
    executeMemoryIssueLimit = Param.Unsigned(
        1, "Number of issuable memory instructions in Execute each cycle"
    )
    executeCommitLimit = Param.Unsigned(
        2, "Number of committable instructions in Execute each cycle"
    )
    executeMemoryCommitLimit = Param.Unsigned(
        1, "Number of committable memory references in Execute each cycle"
    )
    executeInputBufferSize = Param.Unsigned(
        7, "Size of input buffer to Execute in cycles-worth of insts."
    )
    executeMemoryWidth = Param.Unsigned(
        0,
        "Width (and snap) in bytes of the data memory interface. (0 mean use"
        " the system cacheLineSize)",
    )
    executeMaxAccessesInMemory = Param.Unsigned(
        2,
        "Maximum number of concurrent accesses allowed to the memory system"
        " from the dcache port",
    )
    executeLSQMaxStoreBufferStoresPerCycle = Param.Unsigned(
        2, "Maximum number of stores that the store buffer can issue per cycle"
    )
    executeLSQRequestsQueueSize = Param.Unsigned(
        1, "Size of LSQ requests queue (address translation queue)"
    )
    executeLSQTransfersQueueSize = Param.Unsigned(
        2, "Size of LSQ transfers queue (memory transaction queue)"
    )
    executeLSQStoreBufferSize = Param.Unsigned(5, "Size of LSQ store buffer")
    executeBranchDelay = Param.Cycles(
        1,
        "Delay from Execute deciding to branch and Fetch1 reacting"
        " (1 means next cycle)",
    )

    executeFuncUnits = Param.MinorFUPool(
        MinorDefaultFUPool(), "FUlines for this processor"
    )

    executeSetTraceTimeOnCommit = Param.Bool(
        True, "Set inst. trace times to be commit times"
    )
    executeSetTraceTimeOnIssue = Param.Bool(
        False, "Set inst. trace times to be issue times"
    )

    executeAllowEarlyMemoryIssue = Param.Bool(
        True,
        "Allow mem refs to be issued to the LSQ before reaching the head of"
        " the in flight insts queue",
    )

    enableIdling = Param.Bool(
        True, "Enable cycle skipping when the processor is idle\n"
    )

    branchPred = Param.BranchPredictor(
        TournamentBP(numThreads=Parent.numThreads), "Branch Predictor"
    )

    def addCheckerCpu(self):
        print("Checker not yet supported by MinorCPU")
        exit(1)
