/*
 * Copyright (c) 1999-2005 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.
 */

/*
 * $Id$
 *
 */

// CoherenceRequestType
enumeration(CoherenceRequestType, desc="...") {
  GETX,      desc="Get eXclusive";
  GETS,      desc="Get Shared";
}

// PersistentType
enumeration(PersistentRequestType, desc="...") {
  GETX_PERSISTENT,  desc="...";
  GETS_PERSISTENT,  desc="...";
  DEACTIVATE_PERSISTENT,desc="...";
}

// CoherenceResponseType
enumeration(CoherenceResponseType, desc="...") {
  DATA_OWNER,  desc="Data";
  ACK_OWNER,  desc="data-less owner token";
  DATA_SHARED, desc="Data";
  ACK,         desc="ACKnowledgment";
  WB_TOKENS,   desc="L1 to L2 writeback";
  WB_SHARED_DATA,   desc="L1 to L2 writeback with data";
  WB_OWNED,    desc="L1 to L2 writeback with data";
  INV,         desc="L1 informing L2 of loss of all tokens";
}

// PersistentMsg
structure(PersistentMsg, desc="...", interface="Message") {
  Addr addr,             desc="Physical address for this request";
  PersistentRequestType Type,  desc="Type of starvation request";
  MachineID Requestor,            desc="Node who initiated the request";
  NetDest Destination,             desc="Destination set";
  MessageSizeType MessageSize, desc="size category of the message";
  RubyAccessMode AccessMode,    desc="user/supervisor access type";
  PrefetchBit Prefetch,         desc="Is this a prefetch request";

  bool functionalRead(Packet *pkt) {
    // No data in persistent messages
    return false;
  }

  bool functionalWrite(Packet *pkt) {
    // No data in persistent messages
    return false;
  }
}

// RequestMsg
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 Destination,             desc="Multicast destination mask";
  bool isLocal,                    desc="Is this request from a local L1";
  int RetryNum,                    desc="retry sequence number";
  MessageSizeType MessageSize, desc="size category of the message";
  RubyAccessMode AccessMode,    desc="user/supervisor access type";
  PrefetchBit Prefetch,         desc="Is this a prefetch request";

  bool functionalRead(Packet *pkt) {
    // No data in request messages
    return false;
  }

  bool functionalWrite(Packet *pkt) {
    // No data in request messages
    return false;
  }
}

// ResponseMsg
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";
  NetDest Destination,             desc="Node to whom the data is sent";
  int Tokens,                  desc="Number of tokens being transfered for this line";
  DataBlock DataBlk,           desc="data for the cache line";
  bool Dirty,                  desc="Is the data dirty (different than memory)?";
  MessageSizeType MessageSize, desc="size category of the message";

  bool functionalRead(Packet *pkt) {
    // No check being carried out on the message type. Would be added later.
    return testAndRead(addr, DataBlk, pkt);
  }

  bool functionalWrite(Packet *pkt) {
    // No check required since all messages are written.
    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 false;
  }

  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 false;
  }

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