// Copyright (c) 2006-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.

////////////////////////////////////////////////////////////////////
//
// Mem utility templates and functions
//

// This template provides the execute functions for a load
def template LoadExecute {{
        Fault %(class_name)s::execute(ExecContext *xc,
                Trace::InstRecord *traceData) const
        {
            Fault fault = NoFault;
            Addr EA;
            %(op_decl)s;
            %(op_rd)s;
            %(ea_code)s;
            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
            %(fault_check)s;
            if (fault == NoFault) {
                %(EA_trunc)s
                fault = readMemAtomicBE(xc, traceData, EA, Mem, %(asi_val)s);
            }
            if (fault == NoFault) {
                %(code)s;
            }
            if (fault == NoFault) {
                // Write the resulting state to the execution context
                %(op_wb)s;
            }

            return fault;
        }
}};

def template LoadInitiateAcc {{
        Fault %(class_name)s::initiateAcc(ExecContext * xc,
                Trace::InstRecord * traceData) const
        {
            Fault fault = NoFault;
            Addr EA;
            %(op_decl)s;
            %(op_rd)s;
            %(ea_code)s;
            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
            %(fault_check)s;
            if (fault == NoFault) {
                %(EA_trunc)s
                fault = initiateMemRead(xc, traceData, EA, Mem, %(asi_val)s);
            }
            return fault;
        }
}};

def template LoadCompleteAcc {{
        Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext * xc,
                Trace::InstRecord * traceData) const
        {
            Fault fault = NoFault;
            %(op_decl)s;
            %(op_rd)s;
            getMemBE(pkt, Mem, traceData);
            %(code)s;
            if (fault == NoFault) {
                %(op_wb)s;
            }
            return fault;
        }
}};

// This template provides the execute functions for a store
def template StoreExecute {{
        Fault %(class_name)s::execute(ExecContext *xc,
                Trace::InstRecord *traceData) const
        {
            Fault fault = NoFault;
            // This is to support the conditional store in cas instructions.
            // It should be optomized out in all the others
            bool storeCond = true;
            Addr EA;
            %(op_decl)s;
            %(op_rd)s;
            %(ea_code)s;
            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
            %(fault_check)s;
            if (fault == NoFault) {
                %(code)s;
            }
            if (storeCond && fault == NoFault) {
                %(EA_trunc)s
                fault = writeMemAtomicBE(
                        xc, traceData, Mem, EA, %(asi_val)s, 0);
            }
            if (fault == NoFault) {
                // Write the resulting state to the execution context
                %(op_wb)s;
            }

            return fault;
        }
}};

def template StoreInitiateAcc {{
        Fault %(class_name)s::initiateAcc(ExecContext * xc,
                Trace::InstRecord * traceData) const
        {
            Fault fault = NoFault;
            bool storeCond = true;
            Addr EA;
            %(op_decl)s;

            %(op_rd)s;
            %(ea_code)s;
            DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA);
            %(fault_check)s;
            if (fault == NoFault) {
                %(code)s;
            }
            if (storeCond && fault == NoFault) {
                %(EA_trunc)s
                fault = writeMemTimingBE(
                        xc, traceData, Mem, EA, %(asi_val)s, 0);
            }
            return fault;
        }
}};

def template StoreCompleteAcc {{
        Fault %(class_name)s::completeAcc(PacketPtr, ExecContext * xc,
                Trace::InstRecord * traceData) const
        {
            return NoFault;
        }
}};

// Here are some code snippets which check for various fault conditions
let {{
    LoadFuncs = [LoadExecute, LoadInitiateAcc, LoadCompleteAcc]
    StoreFuncs = [StoreExecute, StoreInitiateAcc, StoreCompleteAcc]

    # The LSB can be zero, since it's really the MSB in doubles and quads
    # and we're dealing with doubles
    BlockAlignmentFaultCheck = '''
        if (RD & 0xe)
            fault = std::make_shared<IllegalInstruction>();
        else if (EA & 0x3f)
            fault = std::make_shared<MemAddressNotAligned>();
    '''
    TwinAlignmentFaultCheck = '''
        if (RD & 0x1)
            fault = std::make_shared<IllegalInstruction>();
        else if (EA & 0xf)
            fault = std::make_shared<MemAddressNotAligned>();
    '''
    # XXX Need to take care of pstate.hpriv as well. The lower ASIs
    # are split into ones that are available in priv and hpriv, and
    # those that are only available in hpriv
    AlternateASIPrivFaultCheck = '''
        if ((!Pstate.priv && !Hpstate.hpriv &&
             !asiIsUnPriv((ASI)EXT_ASI)) ||
            (!Hpstate.hpriv && asiIsHPriv((ASI)EXT_ASI)))
            fault = std::make_shared<PrivilegedAction>();
        else if (asiIsAsIfUser((ASI)EXT_ASI) && !Pstate.priv)
            fault = std::make_shared<PrivilegedAction>();
    '''

    TruncateEA = '''
        if (!FullSystem) {
            EA = Pstate.am ? EA<31:0> : EA;
        }
    '''
}};

// A simple function to generate the name of the macro op of a certain
// instruction at a certain micropc
let {{
    def makeMicroName(name, microPc):
            return name + "::" + name + "_" + str(microPc)
}};

// This function properly generates the execute functions for one of the
// templates above. This is needed because in one case, ea computation,
// fault checks and the actual code all occur in the same function,
// and in the other they're distributed across two. Also note that for
// execute functions, the name of the base class doesn't matter.
let {{
    def doSplitExecute(execute, name, Name, asi, opt_flags, microParam):
        microParam["asi_val"] = asi;
        iop = InstObjParams(name, Name, '', microParam, opt_flags)
        (execf, initf, compf) = execute
        return execf.subst(iop) + initf.subst(iop) + compf.subst(iop)


    def doDualSplitExecute(code, postacc_code, eaRegCode, eaImmCode, execute,
            faultCode, nameReg, nameImm, NameReg, NameImm, asi, opt_flags):
        executeCode = ''
        for (eaCode, name, Name) in (
                (eaRegCode, nameReg, NameReg),
                (eaImmCode, nameImm, NameImm)):
            microParams = {"code": code, "postacc_code" : postacc_code,
                "ea_code": eaCode, "fault_check": faultCode,
                "EA_trunc" : TruncateEA}
            executeCode += doSplitExecute(execute, name, Name,
                    asi, opt_flags, microParams)
        return executeCode
}};
