/*
 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
 * 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.
 *
 * AMD's contributions to the MOESI hammer protocol do not constitute an
 * endorsement of its similarity to any AMD products.
 */

// CoherenceRequestType
enumeration(CoherenceRequestType, desc="...") {
  GETX,      desc="Get eXclusive";
  GETS,      desc="Get Shared";
  MERGED_GETS, desc="Get Shared";
  PUT,       desc="Put Ownership";
  WB_ACK,    desc="Writeback ack";
  WB_NACK,   desc="Writeback neg. ack";
  PUTF,      desc="PUT on a Flush";
  GETF,      desc="Issue exclusive for Flushing";
  BLOCK_ACK, desc="Dir Block ack";
  INV,       desc="Invalidate";
}

// CoherenceResponseType
enumeration(CoherenceResponseType, desc="...") {
  ACK,                desc="ACKnowledgment, responder does not have a copy";
  ACK_SHARED,         desc="ACKnowledgment, responder has a shared copy";
  DATA,               desc="Data, responder does not have a copy";
  DATA_SHARED,        desc="Data, responder has a shared copy";
  DATA_EXCLUSIVE,     desc="Data, responder was exclusive, gave us a copy, and they went to invalid";
  WB_CLEAN,           desc="Clean writeback";
  WB_DIRTY,           desc="Dirty writeback";
  WB_EXCLUSIVE_CLEAN, desc="Clean writeback of exclusive data";
  WB_EXCLUSIVE_DIRTY, desc="Dirty writeback of exclusive data";
  UNBLOCK,            desc="Unblock for writeback";
  UNBLOCKS,            desc="Unblock now in S";
  UNBLOCKM,            desc="Unblock now in M/O/E";
  NULL,               desc="Null value";
}

// TriggerType
enumeration(TriggerType, desc="...") {
  L2_to_L1,            desc="L2 to L1 transfer";
  ALL_ACKS,            desc="See corresponding event";
  ALL_ACKS_OWNER_EXISTS,desc="See corresponding event";
  ALL_ACKS_NO_SHARERS, desc="See corresponding event";
  ALL_UNBLOCKS,        desc="all unblockS received";
}

// TriggerMsg
structure(TriggerMsg, desc="...", interface="Message") {
  Addr addr,             desc="Physical address for this request";
  TriggerType Type,            desc="Type of trigger";

  bool functionalRead(Packet *pkt) {
    // Trigger messages do not hold any data!
    return false;
  }

  bool functionalWrite(Packet *pkt) {
    // Trigger messages do not hold any data!
    return false;
  }
}

// RequestMsg (and also forwarded requests)
structure(RequestMsg, desc="...", interface="Message") {
  Addr addr,             desc="Physical address for this request";
  CoherenceRequestType Type,   desc="Type of request (GetS, GetX, PutX, etc)";
  MachineID Requestor,            desc="Node who initiated the request";
  NetDest MergedRequestors,    desc="Merge set of read requestors";
  NetDest Destination,             desc="Multicast destination mask";
  MessageSizeType MessageSize, desc="size category of the message";
  bool DirectedProbe, default="false", desc="probe filter directed probe";

  Cycles InitialRequestTime, default="Cycles(0)",
        desc="time the initial requests was sent from the L1Cache";
  Cycles ForwardRequestTime, default="Cycles(0)",
        desc="time the dir forwarded the request";
  int SilentAcks, default="0", desc="silent acks from the full-bit directory";

  bool functionalRead(Packet *pkt) {
    // Request messages do not hold any data
    return false;
  }

  bool functionalWrite(Packet *pkt) {
    // Request messages do not hold any data
    return false;
  }
}

// ResponseMsg (and also unblock requests)
structure(ResponseMsg, desc="...", interface="Message") {
  Addr addr,             desc="Physical address for this request";
  CoherenceResponseType Type,  desc="Type of response (Ack, Data, etc)";
  MachineID Sender,               desc="Node who sent the data";
  MachineID CurOwner,      desc="current owner of the block, used for UnblockS responses";
  NetDest Destination,             desc="Node to whom the data is sent";
  DataBlock DataBlk,           desc="data for the cache line";
  bool Dirty,                  desc="Is the data dirty (different than memory)?";
  int Acks, default="0",    desc="How many messages this counts as";
  MessageSizeType MessageSize, desc="size category of the message";

  Cycles InitialRequestTime, default="Cycles(0)",
        desc="time the initial requests was sent from the L1Cache";
  Cycles ForwardRequestTime, default="Cycles(0)",
        desc="time the dir forwarded the request";
  int SilentAcks, default="0", desc="silent acks from the full-bit directory";

  bool functionalRead(Packet *pkt) {
    // The check below ensures that data is read only from messages that
    // actually hold data.
    if (Type == CoherenceResponseType:DATA ||
        Type == CoherenceResponseType:DATA_SHARED ||
        Type == CoherenceResponseType:DATA_EXCLUSIVE ||
        Type == CoherenceResponseType:WB_DIRTY ||
        Type == CoherenceResponseType:WB_EXCLUSIVE_DIRTY) {
        return testAndRead(addr, DataBlk, pkt);
    }

    return false;
  }

  bool functionalWrite(Packet *pkt) {
    // Message type does not matter since all messages are written.
    // If a protocol reads data from a packet that is not supposed
    // to hold the data, then the fault lies with the protocol.
    return testAndWrite(addr, DataBlk, pkt);
  }
}

enumeration(DMARequestType, desc="...", default="DMARequestType_NULL") {
  READ,          desc="Memory Read";
  WRITE,         desc="Memory Write";
  NULL,          desc="Invalid";
}

enumeration(DMAResponseType, desc="...", default="DMAResponseType_NULL") {
  DATA,          desc="DATA read";
  ACK,           desc="ACK write";
  NULL,          desc="Invalid";
}

structure(DMARequestMsg, desc="...", interface="Message") {
  DMARequestType Type,       desc="Request type (read/write)";
  Addr PhysicalAddress,   desc="Physical address for this request";
  Addr LineAddress,       desc="Line address for this request";
  MachineID Requestor,            desc="Node who initiated the request";
  NetDest Destination,       desc="Destination";
  DataBlock DataBlk,         desc="DataBlk attached to this request";
  int Len,                   desc="The length of the request";
  MessageSizeType MessageSize, desc="size category of the message";

  bool functionalRead(Packet *pkt) {
    return testAndRead(LineAddress, DataBlk, pkt);
  }

  bool functionalWrite(Packet *pkt) {
    return testAndWrite(LineAddress, DataBlk, pkt);
  }
}

structure(DMAResponseMsg, desc="...", interface="Message") {
  DMAResponseType Type,      desc="Response type (DATA/ACK)";
  Addr PhysicalAddress,   desc="Physical address for this request";
  Addr LineAddress,       desc="Line address for this request";
  NetDest Destination,       desc="Destination";
  DataBlock DataBlk,         desc="DataBlk attached to this request";
  MessageSizeType MessageSize, desc="size category of the message";

  bool functionalRead(Packet *pkt) {
    return testAndRead(LineAddress, DataBlk, pkt);
  }

  bool functionalWrite(Packet *pkt) {
    return testAndWrite(LineAddress, DataBlk, pkt);
  }
}
