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

machine(MachineType:L2Cache, "Token protocol")
: CacheMemory * L2cache;
  Cycles response_latency := 2;
  Cycles request_latency := 2;

  // L2 BANK QUEUES
  // From local bank of L2 cache TO the network
  MessageBuffer * L1RequestFromL2Cache, network="To", virtual_network="0",
        vnet_type="request";  // this L2 bank -> a local L1
  MessageBuffer * GlobalRequestFromL2Cache, network="To", virtual_network="1",
        vnet_type="request";  // this L2 bank -> mod-directory
  MessageBuffer * responseFromL2Cache, network="To", virtual_network="2",
        vnet_type="response";  // this L2 bank -> a local L1 || mod-directory

  // FROM the network to this local bank of L2 cache
  MessageBuffer * L1RequestToL2Cache, network="From", virtual_network="0",
        vnet_type="request";  // a local L1 -> this L2 bank, Lets try this???
  MessageBuffer * GlobalRequestToL2Cache, network="From", virtual_network="1",
        vnet_type="request";  // mod-directory -> this L2 bank
  MessageBuffer * responseToL2Cache, network="From", virtual_network="2",
        vnet_type="response";  // a local L1 || mod-directory -> this L2 bank

  MessageBuffer * triggerQueue;
{
  // STATES
  state_declaration(State, desc="L2 Cache states", default="L2Cache_State_I") {

    // Stable states
    NP, AccessPermission:Invalid, desc="Not Present";
    I, AccessPermission:Invalid, desc="Invalid";
    ILS, AccessPermission:Invalid, desc="Idle/NP, but local sharers exist";
    ILX, AccessPermission:Invalid, desc="Idle/NP, but local exclusive exists";
    ILO, AccessPermission:Invalid, desc="Idle/NP, but local owner exists";
    ILOX, AccessPermission:Invalid, desc="Idle/NP, but local owner exists and chip is exclusive";
    ILOS, AccessPermission:Invalid, desc="Idle/NP, but local owner exists and local sharers as well";
    ILOSX, AccessPermission:Invalid, desc="Idle/NP, but local owner exists, local sharers exist, chip is exclusive ";
    S, AccessPermission:Read_Only, desc="Shared, no local sharers";
    O, AccessPermission:Read_Only, desc="Owned, no local sharers";
    OLS, AccessPermission:Read_Only, desc="Owned with local sharers";
    OLSX, AccessPermission:Read_Only, desc="Owned with local sharers, chip is exclusive";
    SLS, AccessPermission:Read_Only, desc="Shared with local sharers";
    M, AccessPermission:Read_Write, desc="Modified";

    // Transient States

    IFGX, AccessPermission:Busy, desc="Blocked, forwarded global GETX to local owner/exclusive.  No other on-chip invs needed";
    IFGS, AccessPermission:Busy, desc="Blocked, forwarded global GETS to local owner";
    ISFGS, AccessPermission:Busy, desc="Blocked, forwarded global GETS to local owner, local sharers exist";
    // UNUSED
    IFGXX, AccessPermission:Busy, desc="Blocked, forwarded global GETX to local owner but may need acks from other sharers";
    OFGX, AccessPermission:Busy, desc="Blocked, forwarded global GETX to owner and got data but may need acks";

    OLSF, AccessPermission:Busy, desc="Blocked, got Fwd_GETX with local sharers, waiting for local inv acks";

    // writebacks
    ILOW, AccessPermission:Busy, desc="local WB request, was ILO";
    ILOXW, AccessPermission:Busy, desc="local WB request, was ILOX";
    ILOSW, AccessPermission:Busy, desc="local WB request, was ILOS";
    ILOSXW, AccessPermission:Busy, desc="local WB request, was ILOSX";
    SLSW, AccessPermission:Busy, desc="local WB request, was SLS";
    OLSW, AccessPermission:Busy, desc="local WB request, was OLS";
    ILSW, AccessPermission:Busy, desc="local WB request, was ILS";
    IW, AccessPermission:Busy, desc="local WB request from only sharer, was ILS";
    OW, AccessPermission:Busy, desc="local WB request from only sharer, was OLS";
    SW, AccessPermission:Busy, desc="local WB request from only sharer, was SLS";
    OXW, AccessPermission:Busy, desc="local WB request from only sharer, was OLSX";
    OLSXW, AccessPermission:Busy, desc="local WB request from sharer, was OLSX";
    ILXW, AccessPermission:Busy, desc="local WB request, was ILX";

    IFLS, AccessPermission:Busy, desc="Blocked, forwarded local GETS to _some_ local sharer";
    IFLO, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner";
    IFLOX, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner but chip is exclusive";
    IFLOXX, AccessPermission:Busy, desc="Blocked, forwarded local GETX to local owner/exclusive, chip is exclusive";
    IFLOSX, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner w/ other sharers, chip is exclusive";
    IFLXO, AccessPermission:Busy, desc="Blocked, forwarded local GETX to local owner with other sharers, chip is exclusive";

    IGS, AccessPermission:Busy, desc="Semi-blocked, issued local GETS to directory";
    IGM, AccessPermission:Busy, desc="Blocked, issued local GETX to directory. Need global acks and data";
    IGMLS, AccessPermission:Busy, desc="Blocked, issued local GETX to directory but may need to INV local sharers";
    IGMO, AccessPermission:Busy, desc="Blocked, have data for local GETX but need all acks";
    IGMIO, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner with possible local sharer, may need to INV";
    OGMIO, AccessPermission:Busy, desc="Blocked, issued local GETX, was owner, may need to INV";
    IGMIOF, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner, waiting for global acks, got Fwd_GETX";
    IGMIOFS, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner, waiting for global acks, got Fwd_GETS";
    OGMIOF, AccessPermission:Busy, desc="Blocked, issued local GETX, was owner, waiting for global acks, got Fwd_GETX";

    II, AccessPermission:Busy, desc="Blocked, handling invalidations";
    MM, AccessPermission:Busy, desc="Blocked, was M satisfying local GETX";
    SS, AccessPermission:Busy, desc="Blocked, was S satisfying local GETS";
    OO, AccessPermission:Busy, desc="Blocked, was O satisfying local GETS";
    OLSS, AccessPermission:Busy, desc="Blocked, satisfying local GETS";
    OLSXS, AccessPermission:Busy, desc="Blocked, satisfying local GETS";
    SLSS, AccessPermission:Busy, desc="Blocked, satisfying local GETS";

    OI, AccessPermission:Busy, desc="Blocked, doing writeback, was O";
    MI, AccessPermission:Busy, desc="Blocked, doing writeback, was M";
    MII, AccessPermission:Busy, desc="Blocked, doing writeback, was M, got Fwd_GETX";
    OLSI, AccessPermission:Busy, desc="Blocked, doing writeback, was OLS";
    ILSI, AccessPermission:Busy, desc="Blocked, doing writeback, was OLS got Fwd_GETX";

    // DMA blocking states
    ILOSD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack";
    ILOSXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack";
    ILOD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack";
    ILXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack";
    ILOXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack";
  }

  // EVENTS
  enumeration(Event, desc="Cache events") {

    // Requests
    L1_GETS,             desc="local L1 GETS request";
    L1_GETX,             desc="local L1 GETX request";
    L1_PUTO,             desc="local owner wants to writeback";
    L1_PUTX,             desc="local exclusive wants to writeback";
    L1_PUTS_only,             desc="only local sharer wants to writeback";
    L1_PUTS,             desc="local sharer wants to writeback";
    Fwd_GETX,      desc="A GetX from another processor";
    Fwd_GETS,      desc="A GetS from another processor";
    Fwd_DMA,      desc="A request from DMA";
    Own_GETX,      desc="A GetX from this node";
    Inv,           desc="Invalidations from the directory";

    // Responses
    IntAck,             desc="Received an ack message";
    ExtAck,             desc="Received an ack message";
    All_Acks,         desc="Received all ack messages";
    Data,            desc="Received a data message, responder has a shared copy";
    Data_Exclusive,  desc="Received a data message";
    L1_WBCLEANDATA,       desc="Writeback from L1, with data";
    L1_WBDIRTYDATA,       desc="Writeback from L1, with data";

    Writeback_Ack,   desc="Writeback O.K. from directory";
    Writeback_Nack,  desc="Writeback not O.K. from directory";

    Unblock,         desc="Local L1 is telling L2 dir to unblock";
    Exclusive_Unblock,         desc="Local L1 is telling L2 dir to unblock";

    DmaAck,          desc="DMA ack from local L1";
    // events initiated by this L2
    L2_Replacement,     desc="L2 Replacement", format="!r";

  }

  // TYPES

  // CacheEntry
  structure(Entry, desc="...", interface="AbstractCacheEntry") {
    State CacheState,        desc="cache state";
    NetDest Sharers,            desc="Set of the internal processors that want the block in shared state";
    MachineID Owner,    desc="ID of the L1 cache to forward the block to once we get a response";
    bool OwnerValid, default="false", desc="true if Owner means something";
    bool Dirty,              desc="Is the data dirty (different than memory)?";
    DataBlock DataBlk,       desc="data for the block";
  }


  structure(DirEntry, desc="...", interface="AbstractEntry") {
    NetDest Sharers,            desc="Set of the internal processors that want the block in shared state";
    MachineID Owner,   desc="ID of the L1 cache to forward the block to once we get a response";
    bool OwnerValid, default="false", desc="true if Owner means something";
    State DirState,        desc="directory state";
  }

  // TBE fields
  structure(TBE, desc="...") {
    Addr addr,                      desc="Physical address for this TBE";
    State TBEState,                       desc="Transient state";
    Addr PC,                           desc="Program counter of request";
    DataBlock DataBlk,                    desc="Buffer for the data block";
    bool Dirty,              desc="Is the data dirty (different than memory)?";

    int NumExtPendingAcks, default="0",      desc="Number of global acks/data messages waiting for";
    int NumIntPendingAcks, default="0",      desc="Number of global acks/data messages waiting for";
    int Fwd_GETX_ExtAcks, default="0",                 desc="Number of acks that requestor will need";
    int Local_GETX_IntAcks, default="0",                 desc="Number of acks that requestor will need";

    NetDest L1_GetS_IDs,            desc="Set of the internal processors that want the block in shared state";
    MachineID L1_GetX_ID,          desc="ID of the L1 cache to forward the block to once we get a response";
    NetDest Fwd_GetS_IDs,            desc="Set of the internal processors that want the block in shared state";
    MachineID Fwd_GetX_ID,          desc="ID of the L1 cache to forward the block to once we get a response";
  }

  structure(TBETable, external = "yes") {
    TBE lookup(Addr);
    void allocate(Addr);
    void deallocate(Addr);
    bool isPresent(Addr);
  }

  structure(PerfectCacheMemory, external = "yes") {
    void allocate(Addr);
    void deallocate(Addr);
    DirEntry lookup(Addr);
    bool isTagPresent(Addr);
  }

  TBETable TBEs, template="<L2Cache_TBE>", constructor="m_number_of_TBEs";
  PerfectCacheMemory localDirectory, template="<L2Cache_DirEntry>";

  Tick clockEdge();
  Tick cyclesToTicks(Cycles c);
  void set_cache_entry(AbstractCacheEntry b);
  void unset_cache_entry();
  void set_tbe(TBE b);
  void unset_tbe();
  MachineID mapAddressToMachine(Addr addr, MachineType mtype);
  void wakeUpAllBuffers(Addr a);

  Entry getCacheEntry(Addr address), return_by_pointer="yes" {
    return static_cast(Entry, "pointer", L2cache[address]);
  }

  bool isDirTagPresent(Addr addr) {
    return (localDirectory.isTagPresent(addr) );
  }

  DirEntry getDirEntry(Addr address), return_by_pointer="yes" {
    return localDirectory.lookup(address);
  }

  bool isOnlySharer(Entry cache_entry, Addr addr, MachineID shar_id) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      if (cache_entry.Sharers.count() > 1) {
        return false;
      }
      else if (cache_entry.Sharers.count() == 1) {
        if (cache_entry.Sharers.isElement(shar_id)) {
          return true;
        }
        else {
          return false;  // something happened which should cause this PUTS to be nacked
        }
        return true;
      }
      else {
        return false;
      }
    }
    else if (localDirectory.isTagPresent(addr)){
      DirEntry dir_entry := getDirEntry(addr);
      if (dir_entry.Sharers.count() > 1) {
        return false;
      }
      else if (dir_entry.Sharers.count() == 1) {
        if (dir_entry.Sharers.isElement(shar_id)) {
          return true;
        }
        else {
          return false;  // something happened which should cause this PUTS to be nacked
        }
      }
      else {
        return false;
      }
    }
    else {
      // shouldn't happen unless L1 issues PUTS before unblock received
      return false;
    }
  }

  void copyCacheStateToDir(Entry cache_entry, Addr addr) {
    assert(localDirectory.isTagPresent(addr) == false);
    assert(is_valid(cache_entry));
    localDirectory.allocate(addr);
    DirEntry dir_entry := getDirEntry(addr);
    dir_entry.DirState := cache_entry.CacheState;
    dir_entry.Sharers := cache_entry.Sharers;
    dir_entry.Owner := cache_entry.Owner;
    dir_entry.OwnerValid := cache_entry.OwnerValid;

  }

  void copyDirToCache(Entry cache_entry, Addr addr) {
    assert(is_valid(cache_entry));
    DirEntry dir_entry := getDirEntry(addr);
    cache_entry.Sharers := dir_entry.Sharers;
    cache_entry.Owner := dir_entry.Owner;
    cache_entry.OwnerValid := dir_entry.OwnerValid;
  }


  void recordLocalSharerInDir(Entry cache_entry, Addr addr, MachineID shar_id) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      cache_entry.Sharers.add(shar_id);
    }
    else {
      if (localDirectory.isTagPresent(addr) == false) {
        localDirectory.allocate(addr);
        DirEntry dir_entry := getDirEntry(addr);
        dir_entry.Sharers.clear();
        dir_entry.OwnerValid := false;
      }
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.Sharers.add(shar_id);
    }
  }

  void recordNewLocalExclusiveInDir(Entry cache_entry, Addr addr, MachineID exc_id) {

    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      cache_entry.Sharers.clear();
      cache_entry.OwnerValid := true;
      cache_entry.Owner := exc_id;
    }
    else {
      if (localDirectory.isTagPresent(addr) == false) {
        localDirectory.allocate(addr);
      }
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.Sharers.clear();
      dir_entry.OwnerValid := true;
      dir_entry.Owner := exc_id;
    }
  }

  void removeAllLocalSharersFromDir(Entry cache_entry, Addr addr) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      cache_entry.Sharers.clear();
      cache_entry.OwnerValid := false;
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.Sharers.clear();
      dir_entry.OwnerValid := false;
    }
  }

  void removeSharerFromDir(Entry cache_entry, Addr addr, MachineID sender) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      cache_entry.Sharers.remove(sender);
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.Sharers.remove(sender);
    }
  }

  void removeOwnerFromDir(Entry cache_entry, Addr addr, MachineID sender) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      cache_entry.OwnerValid := false;
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.OwnerValid := false;
    }
  }

  bool isLocalSharer(Entry cache_entry, Addr addr, MachineID shar_id) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      return cache_entry.Sharers.isElement(shar_id);
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.Sharers.isElement(shar_id);
    }
  }

  NetDest getLocalSharers(Entry cache_entry, Addr addr) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      return cache_entry.Sharers;
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.Sharers;
    }
  }

  MachineID getLocalOwner(Entry cache_entry, Addr addr) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      return cache_entry.Owner;
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.Owner;
    }
  }

  int countLocalSharers(Entry cache_entry, Addr addr) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      return cache_entry.Sharers.count();
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.Sharers.count();
    }
  }

  bool isLocalOwnerValid(Entry cache_entry, Addr addr) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      return cache_entry.OwnerValid;
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.OwnerValid;
    }
  }

  int countLocalSharersExceptRequestor(Entry cache_entry, Addr addr, MachineID requestor) {
    if (is_valid(cache_entry)) {
      assert (localDirectory.isTagPresent(addr) == false);
      if (cache_entry.Sharers.isElement(requestor)) {
        return ( cache_entry.Sharers.count() - 1 );
      }
      else {
        return cache_entry.Sharers.count();
      }
    }
    else {
      DirEntry dir_entry := getDirEntry(addr);
      if (dir_entry.Sharers.isElement(requestor)) {
        return ( dir_entry.Sharers.count() - 1 );
      }
      else {
        return dir_entry.Sharers.count();
      }
    }
  }

  State getState(TBE tbe, Entry cache_entry, Addr addr) {

    if (is_valid(tbe)) {
      return tbe.TBEState;
    } else if (is_valid(cache_entry)) {
      return cache_entry.CacheState;
    } else if (isDirTagPresent(addr)) {
      DirEntry dir_entry := getDirEntry(addr);
      return dir_entry.DirState;
    } else {
      return State:NP;
    }
  }

  std::string getCoherenceRequestTypeStr(CoherenceRequestType type) {
    return CoherenceRequestType_to_string(type);
  }

  void setState(TBE tbe, Entry cache_entry, Addr addr, State state) {
    assert((localDirectory.isTagPresent(addr) && L2cache.isTagPresent(addr)) == false);

    if (is_valid(tbe)) {
      tbe.TBEState := state;
    }

    if (
         (state == State:M) ||
         (state == State:O) ||
         (state == State:S) ||
         (state == State:OLS) ||
         (state == State:SLS) ||
         (state == State:OLSX) ||
         (state == State:SLS)
       ) {
       assert(is_valid(cache_entry));
    }
    else if (
         (state == State:ILS) ||
         (state == State:ILX) ||
         (state == State:ILO) ||
         (state == State:ILOX) ||
         (state == State:ILOS) ||
         (state == State:ILOSX)
       ) {
       // assert(isCacheTagPresent(addr) == false);
    }

    if (is_valid(cache_entry)) {
      if ( ((cache_entry.CacheState != State:M) && (state == State:M)) ||
           ((cache_entry.CacheState != State:S) && (state == State:S)) ||
           ((cache_entry.CacheState != State:O) && (state == State:O)) ) {
        cache_entry.CacheState := state;
        // disable Coherence Checker for now
        // sequencer.checkCoherence(addr);
      }
      else {
        cache_entry.CacheState := state;
      }
    }
    else if (localDirectory.isTagPresent(addr)) {
      DirEntry dir_entry := getDirEntry(addr);
      dir_entry.DirState := state;
    }
  }

  AccessPermission getAccessPermission(Addr addr) {
    TBE tbe := TBEs[addr];
    if(is_valid(tbe)) {
      DPRINTF(RubySlicc, "%s\n", L2Cache_State_to_permission(tbe.TBEState));
      return L2Cache_State_to_permission(tbe.TBEState);
    }

    Entry cache_entry := getCacheEntry(addr);
    if(is_valid(cache_entry)) {
      DPRINTF(RubySlicc, "%s\n", L2Cache_State_to_permission(cache_entry.CacheState));
      return L2Cache_State_to_permission(cache_entry.CacheState);
    }

    DPRINTF(RubySlicc, "AccessPermission_NotPresent\n");
    return AccessPermission:NotPresent;
  }

  void setAccessPermission(Entry cache_entry, Addr addr, State state) {
    if (is_valid(cache_entry)) {
      cache_entry.changePermission(L2Cache_State_to_permission(state));
    }
  }

  void functionalRead(Addr addr, Packet *pkt) {
    TBE tbe := TBEs[addr];
    if(is_valid(tbe)) {
      testAndRead(addr, tbe.DataBlk, pkt);
    } else {
      testAndRead(addr, getCacheEntry(addr).DataBlk, pkt);
    }
  }

  int functionalWrite(Addr addr, Packet *pkt) {
    int num_functional_writes := 0;

    TBE tbe := TBEs[addr];
    if(is_valid(tbe)) {
      num_functional_writes := num_functional_writes +
        testAndWrite(addr, tbe.DataBlk, pkt);
      return num_functional_writes;
    }

    num_functional_writes := num_functional_writes +
        testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt);
    return num_functional_writes;
  }

  out_port(globalRequestNetwork_out, RequestMsg, GlobalRequestFromL2Cache);
  out_port(localRequestNetwork_out, RequestMsg, L1RequestFromL2Cache);
  out_port(responseNetwork_out, ResponseMsg, responseFromL2Cache);

  out_port(triggerQueue_out, TriggerMsg, triggerQueue);


  // ** IN_PORTS **

  // Trigger Queue
  in_port(triggerQueue_in, TriggerMsg, triggerQueue, rank=3) {
    if (triggerQueue_in.isReady(clockEdge())) {
      peek(triggerQueue_in, TriggerMsg) {
        if (in_msg.Type == TriggerType:ALL_ACKS) {
          trigger(Event:All_Acks, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  // Response Network
  in_port(responseNetwork_in, ResponseMsg, responseToL2Cache, rank=2) {
    if (responseNetwork_in.isReady(clockEdge())) {
      peek(responseNetwork_in, ResponseMsg) {
        assert(in_msg.Destination.isElement(machineID));
        if (in_msg.Type == CoherenceResponseType:ACK) {
          if (in_msg.SenderMachine == MachineType:L2Cache) {
            trigger(Event:ExtAck, in_msg.addr,
                    getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
          }
          else {
            trigger(Event:IntAck, in_msg.addr,
                    getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
          }
        } else if (in_msg.Type == CoherenceResponseType:DATA) {
          trigger(Event:Data, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) {
          trigger(Event:Data_Exclusive, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:UNBLOCK) {
          DPRINTF(RubySlicc, "Received Unblock from L1 addr: %x\n", in_msg.addr);
          trigger(Event:Unblock, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:UNBLOCK_EXCLUSIVE) {
          trigger(Event:Exclusive_Unblock, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:WB_ACK) {
          trigger(Event:Writeback_Ack, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:WB_NACK) {
          trigger(Event:Writeback_Nack, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceResponseType:DMA_ACK) {
          trigger(Event:DmaAck, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else {
          error("Unexpected message");
        }
      }
    }
  }


  // Request Network
  in_port(requestNetwork_in, RequestMsg, GlobalRequestToL2Cache, rank=1) {
    if (requestNetwork_in.isReady(clockEdge())) {
      peek(requestNetwork_in, RequestMsg) {
        if (in_msg.Type == CoherenceRequestType:GETX || in_msg.Type == CoherenceRequestType:DMA_WRITE) {
          if (in_msg.Requestor == machineID) {
            trigger(Event:Own_GETX, in_msg.addr,
                    getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
          } else {
            trigger(Event:Fwd_GETX, in_msg.addr,
                    getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
          }
        } else if (in_msg.Type == CoherenceRequestType:GETS) {
          trigger(Event:Fwd_GETS, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if(in_msg.Type == CoherenceRequestType:DMA_READ) {
          trigger(Event:Fwd_DMA, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceRequestType:INV) {
          trigger(Event:Inv, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  in_port(L1requestNetwork_in, RequestMsg, L1RequestToL2Cache, rank=0) {
    if (L1requestNetwork_in.isReady(clockEdge())) {
      peek(L1requestNetwork_in, RequestMsg) {
        assert(in_msg.Destination.isElement(machineID));
        if (in_msg.Type == CoherenceRequestType:GETX) {
          trigger(Event:L1_GETX, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceRequestType:GETS) {
            trigger(Event:L1_GETS, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceRequestType:PUTO) {
          trigger(Event:L1_PUTO, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceRequestType:PUTX) {
          trigger(Event:L1_PUTX, in_msg.addr,
                  getCacheEntry(in_msg.addr), TBEs[in_msg.addr]);
        } else if (in_msg.Type == CoherenceRequestType:PUTS) {
          Entry cache_entry := getCacheEntry(in_msg.addr);
          if (isOnlySharer(cache_entry, in_msg.addr, in_msg.Requestor)) {
            trigger(Event:L1_PUTS_only, in_msg.addr,
                    cache_entry, TBEs[in_msg.addr]);
          }
          else {
            trigger(Event:L1_PUTS, in_msg.addr,
                    cache_entry, TBEs[in_msg.addr]);
          }
        } else if (in_msg.Type == CoherenceRequestType:WRITEBACK_DIRTY_DATA) {
          Entry cache_entry := getCacheEntry(in_msg.addr);
          if (is_invalid(cache_entry) &&
                   L2cache.cacheAvail(in_msg.addr) == false) {
            trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
                    getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
                    TBEs[L2cache.cacheProbe(in_msg.addr)]);
          }
          else {
            trigger(Event:L1_WBDIRTYDATA, in_msg.addr,
                    cache_entry, TBEs[in_msg.addr]);
          }
        } else if (in_msg.Type == CoherenceRequestType:WRITEBACK_CLEAN_DATA) {
          Entry cache_entry := getCacheEntry(in_msg.addr);
          if (is_invalid(cache_entry) &&
                   L2cache.cacheAvail(in_msg.addr) == false) {
            trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr),
                    getCacheEntry(L2cache.cacheProbe(in_msg.addr)),
                    TBEs[L2cache.cacheProbe(in_msg.addr)]);
          }
          else {
            trigger(Event:L1_WBCLEANDATA, in_msg.addr,
                    cache_entry, TBEs[in_msg.addr]);
          }
        } else {
          error("Unexpected message");
        }
      }
    }
  }


  // ACTIONS

  action(a_issueGETS, "a", desc="issue local request globally") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue(globalRequestNetwork_out, RequestMsg, request_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:GETS;
        out_msg.RequestorMachine := MachineType:L2Cache;
        out_msg.Requestor := machineID;
        out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
        out_msg.MessageSize := MessageSizeType:Request_Control;
      }
    }
  }

  action(a_issueGETX, "\a", desc="issue local request globally") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue(globalRequestNetwork_out, RequestMsg, request_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:GETX;
        out_msg.RequestorMachine := MachineType:L2Cache;
        out_msg.Requestor := machineID;
        out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
        out_msg.MessageSize := MessageSizeType:Request_Control;
      }
    }
  }

  action(b_issuePUTX, "b", desc="Issue PUTX") {
    enqueue(globalRequestNetwork_out, RequestMsg, request_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:PUTX;
      out_msg.RequestorMachine := MachineType:L2Cache;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  action(b_issuePUTO, "\b", desc="Issue PUTO") {
    enqueue(globalRequestNetwork_out, RequestMsg, request_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:PUTO;
      out_msg.Requestor := machineID;
      out_msg.RequestorMachine := MachineType:L2Cache;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  /* PUTO, but local sharers exist */
  action(b_issuePUTO_ls, "\bb", desc="Issue PUTO") {
    enqueue(globalRequestNetwork_out, RequestMsg, request_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:PUTO_SHARERS;
      out_msg.Requestor := machineID;
      out_msg.RequestorMachine := MachineType:L2Cache;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  action(c_sendDataFromTBEToL1GETS, "c", desc="Send data from TBE to L1 requestors in TBE") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.addNetDest(tbe.L1_GetS_IDs);
      out_msg.DataBlk := tbe.DataBlk;
      // out_msg.Dirty := tbe.Dirty;
      // shared data should be clean
      out_msg.Dirty := false;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, tbe.DataBlk);
  }

  action(c_sendDataFromTBEToL1GETX, "\c", desc="Send data from TBE to L1 requestors in TBE") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.add(tbe.L1_GetX_ID);
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      out_msg.Acks := tbe.Local_GETX_IntAcks;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, tbe.DataBlk);
  }

  action(c_sendExclusiveDataFromTBEToL1GETS, "\cc", desc="Send data from TBE to L1 requestors in TBE") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.addNetDest(tbe.L1_GetS_IDs);
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
  }

  action(c_sendDataFromTBEToFwdGETX, "cc", desc="Send data from TBE to external GETX") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.add(tbe.Fwd_GetX_ID);
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      out_msg.Acks := tbe.Fwd_GETX_ExtAcks;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
  }

  action(cd_sendDataFromTBEToFwdDma, "cd", desc="Send data from TBE to external GETX") {
    assert(is_valid(tbe));
    peek(requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := tbe.DataBlk;
        // out_msg.Dirty := tbe.Dirty;
        // shared data should be clean
        out_msg.Dirty := false;
        out_msg.Acks := tbe.Fwd_GETX_ExtAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, tbe.DataBlk);
  }

  action(c_sendDataFromTBEToFwdGETS, "ccc", desc="Send data from TBE to external GETX") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.addNetDest(tbe.Fwd_GetS_IDs);
      out_msg.DataBlk := tbe.DataBlk;
      // out_msg.Dirty := tbe.Dirty;
      // shared data should be clean
      out_msg.Dirty := false;
      out_msg.Acks := tbe.Fwd_GETX_ExtAcks;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, tbe.DataBlk);
  }

  action(c_sendExclusiveDataFromTBEToFwdGETS, "\ccc", desc="Send data from TBE to external GETX") {
    assert(is_valid(tbe));
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.addNetDest(tbe.Fwd_GetS_IDs);
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      out_msg.Acks := tbe.Fwd_GETX_ExtAcks;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, tbe.DataBlk);
  }

  action(d_sendDataToL1GETS, "d", desc="Send data directly to L1 requestor") {
    assert(is_valid(cache_entry));
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        // out_msg.Dirty := cache_entry.Dirty;
        // shared data should be clean
        out_msg.Dirty := false;
        out_msg.MessageSize := MessageSizeType:ResponseL2hit_Data;
      }
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
  }

  action(d_sendDataToL1GETX, "\d", desc="Send data and a token from TBE to L1 requestor") {
    assert(is_valid(cache_entry));
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        out_msg.MessageSize := MessageSizeType:ResponseL2hit_Data;
        out_msg.Acks := tbe.Local_GETX_IntAcks;
      }
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
  }

  action(dd_sendDataToFwdGETX, "dd", desc="send data") {
    assert(is_valid(cache_entry));
    peek(requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.Acks := in_msg.Acks;
      }
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
  }


  action(dd_sendDataToFwdGETS, "\dd", desc="send data") {
    assert(is_valid(cache_entry));
    peek(requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        // out_msg.Dirty := cache_entry.Dirty;
        // shared data should be clean
        out_msg.Dirty := false;
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
    DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
  }

  action(dd_sendExclusiveDataToFwdGETS, "\d\d", desc="send data") {
    assert(is_valid(cache_entry));
    peek(requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
  }

  action(e_sendAck, "e", desc="Send ack with the tokens we've collected thus far.") {
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:ACK;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;

      out_msg.Destination.add( tbe.Fwd_GetX_ID);
      out_msg.Acks := 0 - 1;
      out_msg.MessageSize := MessageSizeType:Response_Control;
    }
  }

  action(e_sendAckToL1Requestor, "\e", desc="Send ack with the tokens we've collected thus far.") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:ACK;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.Acks := 0 - 1;
        out_msg.MessageSize := MessageSizeType:Response_Control;
      }
    }
  }

  action(e_sendAckToL1RequestorFromTBE, "eee", desc="Send ack with the tokens we've collected thus far.") {
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:ACK;
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.Destination.add(tbe.L1_GetX_ID);
      out_msg.Acks := 0 - 1;
      out_msg.MessageSize := MessageSizeType:Response_Control;
    }
  }

  action(ee_sendLocalInv, "\ee", desc="Send local invalidates") {
    assert(is_valid(tbe));
    tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address);
    DPRINTF(RubySlicc, "Address: %#x, Local Sharers: %s, Pending Acks: %d\n",
            address, getLocalSharers(cache_entry, address),
            tbe.NumIntPendingAcks);
    if (isLocalOwnerValid(cache_entry, address)) {
      tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + 1;
      DPRINTF(RubySlicc, "%s\n", getLocalOwner(cache_entry, address));
    }

    enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:INV;
      out_msg.Requestor := machineID;
      out_msg.RequestorMachine := MachineType:L2Cache;
      out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address));
      if (isLocalOwnerValid(cache_entry, address))
      {
        out_msg.Destination.add(getLocalOwner(cache_entry, address));
      }
      out_msg.MessageSize := MessageSizeType:Invalidate_Control;
    }
  }

  action(ee_sendLocalInvSharersOnly, "\eee", desc="Send local invalidates to sharers if they exist") {

    // assert(countLocalSharers(address)  > 0);
    assert(is_valid(tbe));
    tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address);

    if (countLocalSharers(cache_entry, address) > 0) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:INV;
        out_msg.Requestor := machineID;
        out_msg.RequestorMachine := MachineType:L2Cache;
        out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address));
        out_msg.MessageSize := MessageSizeType:Invalidate_Control;
      }
    }
  }

  action(ee_addLocalIntAck, "e\ee", desc="add a local ack to wait for") {
    assert(is_valid(tbe));
    tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + 1;
  }

  action(ee_issueLocalInvExceptL1Requestor, "\eeee", desc="Send local invalidates to sharers if they exist") {
      peek(L1requestNetwork_in, RequestMsg) {

//         assert(countLocalSharers(address) > 0);
        if (countLocalSharers(cache_entry, address) == 0) {
          tbe.NumIntPendingAcks := 0;
        }
        else {

          if (isLocalSharer(cache_entry, address, in_msg.Requestor)) {
            tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address) - 1;
          }
          else {
            tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address);
          }

          enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
            out_msg.addr := address;
            out_msg.Type := CoherenceRequestType:INV;
            out_msg.Requestor := in_msg.Requestor;
            out_msg.RequestorMachine := MachineType:L1Cache;
            out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address));
            out_msg.Destination.remove(in_msg.Requestor);
            out_msg.MessageSize := MessageSizeType:Invalidate_Control;
          }
        }
      }
  }

  action(ee_issueLocalInvExceptL1RequestorInTBE, "\eeeeee", desc="Send local invalidates to sharers if they exist") {
    assert(is_valid(tbe));
    if (countLocalSharers(cache_entry, address) == 0) {
      tbe.NumIntPendingAcks := 0;
    }
    else {
      if (isLocalSharer(cache_entry, address, tbe.L1_GetX_ID)) {
        tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address) - 1;
      }
      else {
        tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address);
      }
    }
    enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:INV;
        out_msg.Requestor := tbe.L1_GetX_ID;
        out_msg.RequestorMachine := MachineType:L1Cache;
        out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address));
        out_msg.Destination.remove(tbe.L1_GetX_ID);
        out_msg.MessageSize := MessageSizeType:Invalidate_Control;
    }
  }


  action(f_sendUnblock, "f", desc="Send unblock to global directory") {
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:UNBLOCK;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }


  action(f_sendExclusiveUnblock, "\f", desc="Send unblock to global directory") {
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:UNBLOCK_EXCLUSIVE;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }


  action(g_recordLocalSharer, "g", desc="Record new local sharer from unblock message") {
    peek(responseNetwork_in, ResponseMsg) {
      recordLocalSharerInDir(cache_entry, in_msg.addr, in_msg.Sender);
    }
  }

  action(g_recordLocalExclusive, "\g", desc="Record new local exclusive sharer from unblock message") {
    peek(responseNetwork_in, ResponseMsg) {
      recordNewLocalExclusiveInDir(cache_entry, address, in_msg.Sender);
    }
  }

  action(gg_clearLocalSharers, "gg", desc="Clear local sharers") {
    removeAllLocalSharersFromDir(cache_entry, address);
  }

  action(gg_clearSharerFromL1Response, "\gg", desc="Clear sharer from L1 response queue") {
    peek(responseNetwork_in, ResponseMsg) {
      removeSharerFromDir(cache_entry, in_msg.addr, in_msg.Sender);
    }
  }

  action(gg_clearSharerFromL1Request, "clsl1r", desc="Clear sharer from L1 request queue") {
    peek(L1requestNetwork_in, RequestMsg) {
      removeSharerFromDir(cache_entry, in_msg.addr, in_msg.Requestor);
    }
  }

  action(gg_clearOwnerFromL1Request, "clol1r", desc="Clear owner from L1 request queue") {
    peek(L1requestNetwork_in, RequestMsg) {
      removeOwnerFromDir(cache_entry, in_msg.addr, in_msg.Requestor);
    }
  }

  action(h_countLocalSharersExceptRequestor, "h", desc="counts number of acks needed for L1 GETX") {
    peek(L1requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.Local_GETX_IntAcks := countLocalSharersExceptRequestor(cache_entry, address, in_msg.Requestor);
    }
  }

  action(h_clearIntAcks, "\h", desc="clear IntAcks") {
    assert(is_valid(tbe));
    tbe.Local_GETX_IntAcks := 0;
  }

  action(hh_countLocalSharersExceptL1GETXRequestorInTBE, "hh", desc="counts number of acks needed for L1 GETX") {
    assert(is_valid(tbe));
    tbe.Local_GETX_IntAcks := countLocalSharersExceptRequestor(cache_entry, address, tbe.L1_GetX_ID);
  }

  action(i_copyDataToTBE, "\i", desc="Copy data from response queue to TBE") {
    peek(responseNetwork_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.DataBlk := in_msg.DataBlk;
      tbe.Dirty := in_msg.Dirty;
      APPEND_TRANSITION_COMMENT(in_msg.Sender);
    }
  }

  action(i_allocateTBE, "i", desc="Allocate TBE for internal/external request(isPrefetch=0, number of invalidates=0)") {
    check_allocate(TBEs);
    TBEs.allocate(address);
    set_tbe(TBEs[address]);
    if(is_valid(cache_entry)) {
      tbe.DataBlk := cache_entry.DataBlk;
      tbe.Dirty := cache_entry.Dirty;
    }
    tbe.NumIntPendingAcks := 0;  // default value
    tbe.NumExtPendingAcks := 0;  // default value
    tbe.Fwd_GetS_IDs.clear();
    tbe.L1_GetS_IDs.clear();
  }



  action(j_forwardGlobalRequestToLocalOwner, "j", desc="Forward external request to local owner") {
    peek(requestNetwork_in, RequestMsg) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := in_msg.Type;
        out_msg.Requestor := machineID;
        out_msg.RequestorMachine := MachineType:L2Cache;
        out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr));
        out_msg.Type := in_msg.Type;
        out_msg.MessageSize := MessageSizeType:Forwarded_Control;
        out_msg.Acks := 0 - 1;
      }
    }
  }

  action(jd_forwardDmaRequestToLocalOwner, "jd", desc="Forward dma request to local owner") {
    peek(requestNetwork_in, RequestMsg) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := in_msg.Type;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.RequestorMachine := in_msg.RequestorMachine;
        out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr));
        out_msg.Type := in_msg.Type;
        out_msg.MessageSize := MessageSizeType:Forwarded_Control;
        out_msg.Acks := 0 - 1;
      }
    }
  }


  action(k_forwardLocalGETSToLocalSharer, "k", desc="Forward local request to local sharer/owner") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceRequestType:GETS;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.RequestorMachine := MachineType:L1Cache;
        // should randomize this so one node doesn't get abused more than others
        DirEntry dir_entry := getDirEntry(in_msg.addr);
        out_msg.Destination.add(dir_entry.Sharers.smallestElement(MachineType:L1Cache));
        out_msg.MessageSize := MessageSizeType:Forwarded_Control;
      }
    }
  }

  action(k_forwardLocalGETXToLocalOwner, "\k", desc="Forward local request to local owner") {
    enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:GETX;
      out_msg.Requestor := tbe.L1_GetX_ID;
      out_msg.RequestorMachine := MachineType:L1Cache;
      DirEntry dir_entry := getDirEntry(address);
      out_msg.Destination.add(dir_entry.Owner);
      out_msg.MessageSize := MessageSizeType:Forwarded_Control;
      out_msg.Acks := 1 + tbe.Local_GETX_IntAcks;
    }
  }

  // same as previous except that it assumes to TBE is present to get number of acks
  action(kk_forwardLocalGETXToLocalExclusive, "kk", desc="Forward local request to local owner") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceRequestType:GETX;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.RequestorMachine := MachineType:L1Cache;
        out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr));
        out_msg.MessageSize := MessageSizeType:Forwarded_Control;
        out_msg.Acks := 1;
      }
    }
  }

  action(kk_forwardLocalGETSToLocalOwner, "\kk", desc="Forward local request to local owner") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( localRequestNetwork_out, RequestMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceRequestType:GETS;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.RequestorMachine := MachineType:L1Cache;
        out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr));
        out_msg.MessageSize := MessageSizeType:Forwarded_Control;
      }
    }
  }


  action(l_writebackAckNeedData, "l", desc="Send writeback ack to L1 requesting data") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( responseNetwork_out, ResponseMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceResponseType:WB_ACK_DATA;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(l_writebackAckDropData, "\l", desc="Send writeback ack to L1 indicating to drop data") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( responseNetwork_out, ResponseMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceResponseType:WB_ACK;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(ll_writebackNack, "\ll", desc="Send writeback nack to L1") {
    peek(L1requestNetwork_in, RequestMsg) {
      enqueue( responseNetwork_out, ResponseMsg, response_latency ) {
        out_msg.addr := in_msg.addr;
        out_msg.Type := CoherenceResponseType:WB_NACK;
        out_msg.Sender := machineID;
        out_msg.SenderMachine := MachineType:L2Cache;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(m_popRequestQueue, "m", desc="Pop request queue.") {
    requestNetwork_in.dequeue(clockEdge());
  }

  action(m_decrementNumberOfMessagesInt, "\m", desc="Decrement the number of messages for which we're waiting") {
    peek(responseNetwork_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + in_msg.Acks;
    }
  }

  action(m_decrementNumberOfMessagesExt, "\mmm", desc="Decrement the number of messages for which we're waiting") {
    peek(responseNetwork_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.NumExtPendingAcks := tbe.NumExtPendingAcks - in_msg.Acks;
    }
  }

  action(mm_decrementNumberOfMessagesExt, "\mm", desc="Decrement the number of messages for which we're waiting") {
    peek(requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.NumExtPendingAcks := tbe.NumExtPendingAcks - in_msg.Acks;
    }
  }

  action(n_popResponseQueue, "n", desc="Pop response queue") {
    responseNetwork_in.dequeue(clockEdge());
  }

  action(n_popTriggerQueue, "\n", desc="Pop trigger queue.") {
    triggerQueue_in.dequeue(clockEdge());
  }

  action(o_popL1RequestQueue, "o", desc="Pop L1 request queue.") {
    L1requestNetwork_in.dequeue(clockEdge());
  }


  action(o_checkForIntCompletion, "\o", desc="Check if we have received all the messages required for completion") {
    assert(is_valid(tbe));
    if (tbe.NumIntPendingAcks == 0) {
      enqueue(triggerQueue_out, TriggerMsg) {
        out_msg.addr := address;
        out_msg.Type := TriggerType:ALL_ACKS;
      }
    }
  }

  action(o_checkForExtCompletion, "\oo", desc="Check if we have received all the messages required for completion") {
    assert(is_valid(tbe));
    if (tbe.NumExtPendingAcks == 0) {
      enqueue(triggerQueue_out, TriggerMsg) {
        out_msg.addr := address;
        out_msg.Type := TriggerType:ALL_ACKS;
      }
    }
  }


  action( qq_sendDataFromTBEToMemory, "qq", desc="Send data from TBE to directory") {
    enqueue(globalRequestNetwork_out, RequestMsg, response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Requestor := machineID;
      out_msg.RequestorMachine := MachineType:L2Cache;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      if (tbe.Dirty) {
        out_msg.Type := CoherenceRequestType:WRITEBACK_DIRTY_DATA;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Writeback_Data;
      } else {
         out_msg.Type := CoherenceRequestType:WRITEBACK_CLEAN_ACK;
        // NOTE: in a real system this would not send data.  We send
        // data here only so we can check it at the memory
         out_msg.DataBlk := tbe.DataBlk;
         out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action( r_setMRU, "\rrr", desc="manually set the MRU bit for cache line" ) {
    if(is_valid(cache_entry)) {
      L2cache.setMRU(address);
    }
  }

  action( s_recordGetXL1ID, "ss", desc="record local GETX requestor") {
    peek(L1requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.L1_GetX_ID := in_msg.Requestor;
    }
  }

  action(s_deallocateTBE, "s", desc="Deallocate external TBE") {
    TBEs.deallocate(address);
    unset_tbe();
  }

  action( s_recordGetSL1ID, "\ss", desc="record local GETS requestor") {
    peek(L1requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.L1_GetS_IDs.add(in_msg.Requestor);
    }
  }

  action(t_recordFwdXID, "t", desc="record global GETX requestor") {
    peek(requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.Fwd_GetX_ID := in_msg.Requestor;
      tbe.Fwd_GETX_ExtAcks := in_msg.Acks;
    }
  }

  action(t_recordFwdSID, "\t", desc="record global GETS requestor") {
    peek(requestNetwork_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.Fwd_GetS_IDs.clear();
      tbe.Fwd_GetS_IDs.add(in_msg.Requestor);
    }
  }


  action(u_writeCleanDataToCache, "wCd", desc="Write clean data to cache") {
    peek(L1requestNetwork_in, RequestMsg) {
      assert(is_valid(cache_entry));
      cache_entry.DataBlk := in_msg.DataBlk;
      DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
      assert(cache_entry.Dirty == false);
    }
  }

  action(u_writeDirtyDataToCache, "wDd", desc="Write dirty data to cache") {
    peek(L1requestNetwork_in, RequestMsg) {
      assert(is_valid(cache_entry));
      cache_entry.DataBlk := in_msg.DataBlk;
      DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n",
            address, cache_entry.DataBlk);
      cache_entry.Dirty := true;
    }
  }

  action(vv_allocateL2CacheBlock, "\v", desc="Set L2 cache tag equal to tag of block B.") {
    set_cache_entry(L2cache.allocate(address, new Entry));
  }

  action(rr_deallocateL2CacheBlock, "\r", desc="Deallocate L2 cache block.  Sets the cache to not present, allowing a replacement in parallel with a fetch.") {
    L2cache.deallocate(address);
    unset_cache_entry();
  }


  action(w_assertIncomingDataAndCacheDataMatch, "w", desc="Assert that the incoming data and the data in the cache match") {
    peek(responseNetwork_in, ResponseMsg) {
      assert(is_valid(cache_entry));
      assert(cache_entry.DataBlk == in_msg.DataBlk);
    }
  }

  action(uu_profileMiss, "\um", desc="Profile the demand miss") {
      ++L2cache.demand_misses;
  }

  action(uu_profileHit, "\uh", desc="Profile the demand hit") {
      ++L2cache.demand_hits;
  }

  action(y_copyCacheStateToDir, "y", desc="Copy cache state to directory state") {
    copyCacheStateToDir(cache_entry, address);
  }

  action(y_copyDirToCacheAndRemove, "/y", desc="Copy dir state to cache and remove") {
    copyDirToCache(cache_entry, address);
    localDirectory.deallocate(address);
  }

  action(zz_recycleGlobalRequestQueue, "\zglb", desc="Send the head of the mandatory queue to the back of the queue.") {
    peek(requestNetwork_in, RequestMsg) {
      APPEND_TRANSITION_COMMENT(in_msg.Requestor);
    }
    requestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(zz_recycleL1RequestQueue, "\zl1", desc="Send the head of the mandatory queue to the back of the queue.") {
    peek(L1requestNetwork_in, RequestMsg) {
      APPEND_TRANSITION_COMMENT(in_msg.Requestor);
    }
    L1requestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(zz_recycleResponseQueue, "\z\z", desc="Send the head of the mandatory queue to the back of the queue.") {
    peek(responseNetwork_in, ResponseMsg) {
      APPEND_TRANSITION_COMMENT(in_msg.Sender);
    }
    responseNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(st_stallAndWaitL1RequestQueue, "st", desc="Stall and wait on the address") {
    stall_and_wait(L1requestNetwork_in, address);
  }

  action(wa_wakeUpDependents, "wa", desc="Wake up any requests waiting for this address") {
    wakeUpAllBuffers(address);
  }

  action(da_sendDmaAckUnblock, "da", desc="Send dma ack to global directory") {
    enqueue(responseNetwork_out, ResponseMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:DMA_ACK;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Sender := machineID;
      out_msg.SenderMachine := MachineType:L2Cache;
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }



  //*****************************************************
  // TRANSITIONS
  //*****************************************************

  transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_PUTO, L1_PUTS, L1_PUTS_only, L1_PUTX}) {
    st_stallAndWaitL1RequestQueue;
  }

  transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_GETX, L1_GETS}) {
    st_stallAndWaitL1RequestQueue;
  }

  transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, ILXW, OW, SW, OXW, OLSXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS,  IGS, IGM, IGMLS, IGMO, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, L2_Replacement) {
    zz_recycleL1RequestQueue;
  }

  transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, IGS, IGM, MM, SS, OO, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Fwd_GETX, Fwd_GETS, Fwd_DMA}) {
    zz_recycleGlobalRequestQueue;
  }

  transition({OGMIO, IGMIO, IGMO}, Fwd_DMA) {
    zz_recycleGlobalRequestQueue;
  }

  transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, MM, SS, OO, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Inv}) {
    zz_recycleGlobalRequestQueue;
  }

  transition({IGM, IGS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Own_GETX}) {
    zz_recycleGlobalRequestQueue;
  }

  // must happened because we forwarded GETX to local exclusive trying to do wb
  transition({I, M, O, ILS, ILOX, OLS, OLSX, SLS, S}, L1_PUTX) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition({M}, {L1_PUTS, L1_PUTO} ) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition({ILS, OLSX}, L1_PUTO){
    ll_writebackNack;
    o_popL1RequestQueue;
  }

// happened if we forwarded GETS to exclusive who tried to do writeback
//  ?? should we just Nack these instead?  Could be a bugs here
  transition(ILO, L1_PUTX, ILOW) {
     l_writebackAckNeedData;
     o_popL1RequestQueue;
  }

  // this can happen if we forwarded a L1_GETX to exclusiver after it issued a PUTX
  transition(ILOS, L1_PUTX, ILOSW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  transition(ILOSX, L1_PUTX, ILOSXW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  // must happened because we got Inv when L1 attempted PUTS
  transition(I, L1_PUTS) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition(I, L1_PUTO) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  // FORWARDED REQUESTS

  transition({ILO, ILX, ILOX}, Fwd_GETS, IFGS) {
    i_allocateTBE;
    t_recordFwdSID;
    j_forwardGlobalRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition({ILOS, ILOSX}, Fwd_GETS, ISFGS) {
    i_allocateTBE;
    t_recordFwdSID;
    j_forwardGlobalRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILOS, Fwd_DMA, ILOSD) {
    i_allocateTBE;
    jd_forwardDmaRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILOSD, DmaAck, ILOS) {
    s_deallocateTBE;
    da_sendDmaAckUnblock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSX, Fwd_DMA, ILOSXD) {
    i_allocateTBE;
    t_recordFwdSID;
    jd_forwardDmaRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILOSXD, DmaAck, ILOSX) {
    s_deallocateTBE;
    da_sendDmaAckUnblock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILO, Fwd_DMA, ILOD) {
    i_allocateTBE;
    t_recordFwdSID;
    jd_forwardDmaRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILOD, DmaAck, ILO) {
    s_deallocateTBE;
    da_sendDmaAckUnblock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILX, Fwd_DMA, ILXD) {
    i_allocateTBE;
    t_recordFwdSID;
    jd_forwardDmaRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILXD, DmaAck, ILX) {
    s_deallocateTBE;
    da_sendDmaAckUnblock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILOX, Fwd_DMA, ILOXD) {
    i_allocateTBE;
    t_recordFwdSID;
    jd_forwardDmaRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(ILOXD, DmaAck, ILOX) {
    s_deallocateTBE;
    da_sendDmaAckUnblock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition({ILOS, ILOSX, ILO, ILX, ILOX, ILXW}, Data) {
    i_copyDataToTBE;
    c_sendDataFromTBEToFwdGETS;
    s_deallocateTBE;
    n_popResponseQueue;
  }

  transition(IFGS, Data, ILO) {
    i_copyDataToTBE;
    c_sendDataFromTBEToFwdGETS;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ISFGS, Data, ILOS) {
    i_copyDataToTBE;
    c_sendDataFromTBEToFwdGETS;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IFGS, Data_Exclusive, I) {
    i_copyDataToTBE;
    c_sendExclusiveDataFromTBEToFwdGETS;
    gg_clearLocalSharers;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  transition({ILX, ILO, ILOX}, Fwd_GETX, IFGX) {
    i_allocateTBE;
    t_recordFwdXID;
    j_forwardGlobalRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(IFGX, {Data_Exclusive, Data}, I) {
    i_copyDataToTBE;
    c_sendDataFromTBEToFwdGETX;
    gg_clearLocalSharers;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition({ILOSX, ILOS}, Fwd_GETX, IFGXX) {
    i_allocateTBE;
    t_recordFwdXID;
    j_forwardGlobalRequestToLocalOwner;
    ee_sendLocalInvSharersOnly;
    ee_addLocalIntAck;
    m_popRequestQueue;
  }


  transition(IFGXX, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(IFGXX, Data_Exclusive) {
    i_copyDataToTBE;
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(IFGXX, All_Acks, I) {
    c_sendDataFromTBEToFwdGETX;
    gg_clearLocalSharers;
    s_deallocateTBE;
    n_popTriggerQueue;
    wa_wakeUpDependents;
  }


  // transition({O, OX}, Fwd_GETX, I) {
  transition(O, Fwd_GETX, I) {
    dd_sendDataToFwdGETX;
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    m_popRequestQueue;
  }

  transition({O, OLS}, Fwd_GETS) {
    dd_sendDataToFwdGETS;
    m_popRequestQueue;
  }

  transition({O, OLS}, Fwd_DMA) {
    dd_sendDataToFwdGETS;
    da_sendDmaAckUnblock;
    m_popRequestQueue;
  }

  // transition({OLSX, OX}, Fwd_GETS, O) {
  transition(OLSX, Fwd_GETS, OLS) {
    dd_sendDataToFwdGETS;
    m_popRequestQueue;
  }

  transition(OLSX, Fwd_DMA) {
    dd_sendDataToFwdGETS;
    da_sendDmaAckUnblock;
    m_popRequestQueue;
  }

  transition(M, Fwd_GETX, I) {
    dd_sendDataToFwdGETX;
    rr_deallocateL2CacheBlock;
    m_popRequestQueue;
  }

  // MAKE THIS THE SAME POLICY FOR NOW

  // transition(M, Fwd_GETS, O) {
  //   dd_sendDataToFwdGETS;
  //   m_popRequestQueue;
  // }

  transition(M, Fwd_GETS, I) {
     dd_sendExclusiveDataToFwdGETS;
     rr_deallocateL2CacheBlock;
     m_popRequestQueue;
  }

  transition(M, Fwd_DMA) {
     dd_sendExclusiveDataToFwdGETS;
     da_sendDmaAckUnblock;
     m_popRequestQueue;
  }

  transition({OLS, OLSX}, Fwd_GETX, OLSF) {
    i_allocateTBE;
    t_recordFwdXID;
    ee_sendLocalInv;
    m_popRequestQueue;
  }

  transition(OLSF, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(OLSF, All_Acks, I) {
    c_sendDataFromTBEToFwdGETX;
    gg_clearLocalSharers;
    s_deallocateTBE;
    rr_deallocateL2CacheBlock;
    n_popTriggerQueue;
    wa_wakeUpDependents;
  }



  // INVALIDATIONS FROM GLOBAL DIRECTORY

  transition({IGM, IGS}, Inv) {
    t_recordFwdXID;
    e_sendAck;
    m_popRequestQueue;
  }

  transition({I,NP}, Inv) {
    i_allocateTBE;
    t_recordFwdXID;
    e_sendAck;
    s_deallocateTBE;
    m_popRequestQueue;
  }

  // NEED INV for S state

  transition({ILS, ILO, ILX}, Inv, II) {
    i_allocateTBE;
    t_recordFwdXID;
    ee_sendLocalInv;
    gg_clearLocalSharers;
    m_popRequestQueue;
  }

  transition(SLS, Inv, II) {
    i_allocateTBE;
    t_recordFwdXID;
    ee_sendLocalInv;
    rr_deallocateL2CacheBlock;
    m_popRequestQueue;
  }

  transition(II, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(II, All_Acks, I) {
    e_sendAck;
    s_deallocateTBE;
    n_popTriggerQueue;
    wa_wakeUpDependents;
  }

  transition(S, Inv, I) {
    i_allocateTBE;
    t_recordFwdXID;
    e_sendAck;
    s_deallocateTBE;
    rr_deallocateL2CacheBlock;
    m_popRequestQueue;
  }


  // LOCAL REQUESTS SATISFIED LOCALLY

  transition(OLSX, L1_GETX, IFLOX) {
    i_allocateTBE;
    s_recordGetXL1ID;
    // count number of INVs needed that doesn't include requestor
    h_countLocalSharersExceptRequestor;
    // issue INVs to everyone except requestor
    ee_issueLocalInvExceptL1Requestor;
    d_sendDataToL1GETX
    y_copyCacheStateToDir;
    r_setMRU;
    rr_deallocateL2CacheBlock;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(IFLOX, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OLSX, L1_GETS, OLSXS) {
    d_sendDataToL1GETS;
    r_setMRU;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(OLSXS, Unblock, OLSX) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  // after this, can't get Fwd_GETX
  transition(IGMO, Own_GETX) {
    mm_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    m_popRequestQueue;

  }


  transition(ILX, L1_GETS, IFLOXX) {
    kk_forwardLocalGETSToLocalOwner;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(ILOSX, L1_GETS, IFLOSX) {
    kk_forwardLocalGETSToLocalOwner;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition({ILOS, ILO}, L1_GETS, IFLO) {
    kk_forwardLocalGETSToLocalOwner;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(ILS, L1_GETS, IFLS) {
    k_forwardLocalGETSToLocalSharer;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition({ILX, ILOX}, L1_GETX, IFLOXX) {
    kk_forwardLocalGETXToLocalExclusive;
    e_sendAckToL1Requestor;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(ILOX, L1_GETS, IFLOX) {
    kk_forwardLocalGETSToLocalOwner;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(IFLOX, Unblock, ILOSX) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IFLS, Unblock, ILS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IFLOXX, Unblock, ILOSX) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IFLOSX, Unblock, ILOSX) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition({IFLOSX, IFLOXX}, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IFLO, Unblock, ILOS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  transition(ILOSX, L1_GETX, IFLXO) {
    i_allocateTBE;
    s_recordGetXL1ID;
    h_countLocalSharersExceptRequestor;
    ee_issueLocalInvExceptL1Requestor;
    k_forwardLocalGETXToLocalOwner;
    e_sendAckToL1RequestorFromTBE;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(IFLXO, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  // LOCAL REQUESTS THAT MUST ISSUE

  transition(NP, {L1_PUTS, L1_PUTX, L1_PUTO}) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition({NP, I}, L1_GETS, IGS) {
    i_allocateTBE;
    s_recordGetSL1ID;
    a_issueGETS;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition({NP, I}, L1_GETX, IGM) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(S, L1_GETX, IGM) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    y_copyCacheStateToDir;
    r_setMRU;
    rr_deallocateL2CacheBlock;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(ILS, L1_GETX, IGMLS) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    // count number of INVs (just sharers?) needed that doesn't include requestor
    h_countLocalSharersExceptRequestor;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(IGMLS, Inv) {
    t_recordFwdXID;
    ee_sendLocalInv;
    m_popRequestQueue;
  }

  transition(IGMLS, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(IGMLS, All_Acks, IGM) {
    gg_clearLocalSharers;
    h_clearIntAcks;
    e_sendAck;
    n_popTriggerQueue;
  }

  // transition(IGMLS, ExtAck, IGMO) {
  transition(IGMLS, ExtAck) {
    m_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    n_popResponseQueue;
  }

  transition(IGMLS, {Data, Data_Exclusive}, IGMO) {
    ee_issueLocalInvExceptL1RequestorInTBE;
    i_copyDataToTBE;
    m_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    n_popResponseQueue;
  }


  transition(ILOS, L1_GETX, IGMIO) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  // new exclusive happened while sharer attempted writeback
  transition(ILX, {L1_PUTS, L1_PUTS_only, L1_PUTO}) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition(S, L1_PUTS) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition(OLS, L1_GETX, OGMIO) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    h_countLocalSharersExceptRequestor;
    // COPY DATA FROM CACHE TO TBE (happens during i_allocateTBE)
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(OGMIO, Fwd_GETS) {
    t_recordFwdSID;
    c_sendDataFromTBEToFwdGETS;
    m_popRequestQueue;
  }

  transition(ILO, L1_GETX, IGMIO) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    // the following, of course, returns 0 sharers but do anyways for consistency
    h_countLocalSharersExceptRequestor;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition({ILO, ILOX}, L1_PUTS) {
    ll_writebackNack;
    o_popL1RequestQueue;
  }

  transition(IGMIO, Fwd_GETX, IGMIOF) {
    t_recordFwdXID;
    j_forwardGlobalRequestToLocalOwner;
    ee_sendLocalInvSharersOnly;
    ee_addLocalIntAck;
    m_popRequestQueue;
  }

  transition(IGMIO, Fwd_GETS, IGMIOFS) {
    t_recordFwdSID;
    j_forwardGlobalRequestToLocalOwner;
    m_popRequestQueue;
  }

  transition(IGMIOFS, Data, IGMIO) {
    i_copyDataToTBE;
    c_sendDataFromTBEToFwdGETS;
    n_popResponseQueue;
  }

  transition(OGMIO, Fwd_GETX, OGMIOF) {
    t_recordFwdXID;
    ee_sendLocalInvSharersOnly;
    m_popRequestQueue;
  }

  transition(OGMIOF, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(OGMIOF, All_Acks, IGM) {
    gg_clearLocalSharers;
    hh_countLocalSharersExceptL1GETXRequestorInTBE;
    c_sendDataFromTBEToFwdGETX;
    n_popTriggerQueue;
  }

  transition(IGMIOF, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(IGMIOF, Data_Exclusive) {
    i_copyDataToTBE;
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(IGMIOF, All_Acks, IGM) {
    gg_clearLocalSharers;
    c_sendDataFromTBEToFwdGETX;
    n_popTriggerQueue;
  }

  transition(IGMIO, All_Acks, IGMO) {
    hh_countLocalSharersExceptL1GETXRequestorInTBE;
    ee_issueLocalInvExceptL1RequestorInTBE;
    k_forwardLocalGETXToLocalOwner;
    e_sendAckToL1RequestorFromTBE;
    n_popTriggerQueue;
  }

  transition(OGMIO, All_Acks, IGMO) {
    ee_issueLocalInvExceptL1RequestorInTBE;
    c_sendDataFromTBEToL1GETX;
    n_popTriggerQueue;
  }

  transition({IGMIO, OGMIO}, Own_GETX) {
    mm_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    m_popRequestQueue;

  }

  transition(IGM, {Data, Data_Exclusive}, IGMO) {
    i_copyDataToTBE;
    m_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    n_popResponseQueue;
  }

  transition({IGM, IGMIO, OGMIO}, ExtAck) {
    m_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    n_popResponseQueue;
  }

  transition(IGMO, ExtAck) {
    m_decrementNumberOfMessagesExt;
    o_checkForExtCompletion;
    n_popResponseQueue;
  }

  transition(IGS, Data) {
    i_copyDataToTBE;
    m_decrementNumberOfMessagesExt;
    c_sendDataFromTBEToL1GETS;
    n_popResponseQueue;
  }

  transition(IGS, Data_Exclusive) {
    i_copyDataToTBE;
    m_decrementNumberOfMessagesExt;
    c_sendExclusiveDataFromTBEToL1GETS;
    n_popResponseQueue;
  }

  transition(IGS, Unblock, ILS) {
    g_recordLocalSharer;
    f_sendUnblock;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IGS, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    f_sendExclusiveUnblock;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IGMO, All_Acks) {
    c_sendDataFromTBEToL1GETX;
    n_popTriggerQueue;
  }

  transition(IGMO, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    f_sendExclusiveUnblock;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  transition(SLS, L1_GETX, IGMLS) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    // count number of INVs needed that doesn't include requestor
    h_countLocalSharersExceptRequestor;
    // issue INVs to everyone except requestor
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    uu_profileMiss;
    o_popL1RequestQueue;

  }

  transition(SLS, L1_GETS, SLSS ) {
    d_sendDataToL1GETS;
    r_setMRU;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(SLSS, Unblock, SLS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  transition(O, L1_GETX, IGMO) {
    i_allocateTBE;
    s_recordGetXL1ID;
    a_issueGETX;
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    uu_profileMiss;
    o_popL1RequestQueue;
  }

  transition(OLS, L1_GETS, OLSS) {
    d_sendDataToL1GETS;
    r_setMRU;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(OLSS, Unblock, OLS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(IGMO, Fwd_GETX, IGM) {
    t_recordFwdXID;
    c_sendDataFromTBEToFwdGETX;
    m_popRequestQueue;

  }

  transition(IGMO, Fwd_GETS) {
    t_recordFwdSID;
    c_sendDataFromTBEToFwdGETS;
    m_popRequestQueue;
  }


  // LOCAL REQUESTS SATISFIED DIRECTLY BY L2

  transition(M, L1_GETX, MM) {
    i_allocateTBE;
    // should count 0 of course
    h_countLocalSharersExceptRequestor;
    d_sendDataToL1GETX;
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    s_deallocateTBE;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(MM, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(M, L1_GETS, OO) {
    i_allocateTBE;
    // should count 0 of course
    h_countLocalSharersExceptRequestor;
    d_sendDataToL1GETX;
    r_setMRU;
    s_deallocateTBE;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(S, L1_GETS, SS) {
    d_sendDataToL1GETS;
    r_setMRU;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(SS, Unblock, SLS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(O, L1_GETS, OO) {
    d_sendDataToL1GETS;
    r_setMRU;
    uu_profileHit;
    o_popL1RequestQueue;
  }

  transition(OO, Unblock, OLS) {
    g_recordLocalSharer;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OO, Exclusive_Unblock, ILX) {
    g_recordLocalExclusive
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  // L1 WRITEBACKS
  transition(ILO, L1_PUTO, ILOW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  transition(ILOX, L1_PUTO, ILOXW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }


  transition(ILOS, L1_PUTO, ILOSW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  transition(ILOSX, L1_PUTO, ILOSXW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }


  // hmmm...keep data or drop.  Just drop for now
  transition(ILOS, L1_PUTS_only, ILOW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(ILSW, Unblock, ILS) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILOW, Unblock, ILO) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSX, L1_PUTS_only, ILOXW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(ILOXW, Unblock, ILOX) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  // hmmm...keep data or drop.  Just drop for now
  transition(ILOS, L1_PUTS, ILOSW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(ILOSX, L1_PUTS, ILOSXW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(ILOSW, Unblock, ILOS) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSXW, Unblock, ILOSX) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(SLS, L1_PUTS, SLSW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(SLS, L1_PUTS_only, SW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(SW, {Unblock}, S) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OLS, L1_PUTS, OLSW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(ILS, L1_PUTS, ILSW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  transition(ILS, L1_PUTS_only, IW) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

   transition(OLS, L1_PUTS_only, OW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(OLSX, L1_PUTS_only, OXW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(OLSX, L1_PUTS, OLSXW) {
    l_writebackAckDropData;
    o_popL1RequestQueue;
  }

  transition(OLSXW, {Unblock}, OLSX) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OW, {Unblock}, O) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OXW, {Unblock}, M) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILX, L1_PUTX, ILXW ) {
    l_writebackAckNeedData;
    o_popL1RequestQueue;
  }

  transition(ILXW, L1_WBDIRTYDATA, M) {
    gg_clearLocalSharers;
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    u_writeDirtyDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  // clean writeback
  transition(ILXW, L1_WBCLEANDATA, M) {
    gg_clearLocalSharers;
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    u_writeCleanDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILXW, Unblock, ILX) {
    // writeback canceled because L1 invalidated
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILSW, L1_WBCLEANDATA, SLS) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    u_writeCleanDataToCache;
    gg_clearSharerFromL1Request;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(IW, L1_WBCLEANDATA, S) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    u_writeCleanDataToCache;
    gg_clearSharerFromL1Request;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  // Owner can have dirty data
  transition(ILOW, L1_WBDIRTYDATA, O) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeDirtyDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOW, L1_WBCLEANDATA, O) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeCleanDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOXW, L1_WBDIRTYDATA, M) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeDirtyDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOXW, L1_WBCLEANDATA, M) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeCleanDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSW, L1_WBDIRTYDATA, OLS) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeDirtyDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSW, L1_WBCLEANDATA, OLS) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeCleanDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSXW, L1_WBDIRTYDATA, OLSX) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeDirtyDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(ILOSXW, L1_WBCLEANDATA, OLSX) {
    vv_allocateL2CacheBlock;
    y_copyDirToCacheAndRemove;
    gg_clearOwnerFromL1Request;
    u_writeCleanDataToCache;
    o_popL1RequestQueue;
    wa_wakeUpDependents;
  }

  transition(SLSW, {Unblock}, SLS) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OLSW, {Unblock}, OLS) {
    gg_clearSharerFromL1Response;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }


  // L2 WRITEBACKS
  transition({I, S}, L2_Replacement, I) {
    rr_deallocateL2CacheBlock;
  }

  transition(ILS, L2_Replacement) {
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
  }

  transition(ILX, L2_Replacement )  {
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
  }

  transition({ILO, ILOS}, L2_Replacement )  {
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
  }

  transition(SLS, L2_Replacement, ILS) {
    y_copyCacheStateToDir;
    rr_deallocateL2CacheBlock;
  }

  transition({OLS, OLSX}, L2_Replacement, OLSI) {
    y_copyCacheStateToDir;
    b_issuePUTO_ls;
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
  }


  transition(O, L2_Replacement, OI) {
    b_issuePUTO;
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
  }

  transition(M, L2_Replacement, MI) {
    b_issuePUTX;
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
  }

  transition(OLSI, Fwd_GETX, ILSI) {
    t_recordFwdXID;
    ee_sendLocalInv;
    m_popRequestQueue;
  }

  transition(ILSI, IntAck) {
    m_decrementNumberOfMessagesInt;
    o_checkForIntCompletion;
    n_popResponseQueue;
  }

  transition(ILSI, All_Acks, MII) {
    gg_clearLocalSharers;
    c_sendDataFromTBEToFwdGETX;
    n_popTriggerQueue;
  }

  transition(OLSI, Fwd_GETS) {
    t_recordFwdSID;
    c_sendDataFromTBEToFwdGETS;
    m_popRequestQueue;
  }

  transition({MI, OI}, Fwd_GETS, OI) {
    t_recordFwdSID;
    c_sendDataFromTBEToFwdGETS;
    m_popRequestQueue;
  }

  transition({MI, OI}, Fwd_DMA, OI) {
    cd_sendDataFromTBEToFwdDma;
    da_sendDmaAckUnblock;
    m_popRequestQueue;
  }

  transition(OLSI, Fwd_DMA) {
    cd_sendDataFromTBEToFwdDma;
    da_sendDmaAckUnblock;
    m_popRequestQueue;
  }

  transition({MI, OI}, Fwd_GETX, MII) {
    t_recordFwdXID;
    c_sendDataFromTBEToFwdGETX;
    m_popRequestQueue;
  }

  transition({MI, OI}, Writeback_Ack, I) {
    qq_sendDataFromTBEToMemory;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(MII, Writeback_Nack, I) {
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(OI, Writeback_Nack) {
    b_issuePUTO;
    n_popResponseQueue;
  }

  transition(OLSI, Writeback_Ack, ILS) {
    qq_sendDataFromTBEToMemory;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(MII, Writeback_Ack, I) {
    f_sendUnblock;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }

  transition(ILSI, Writeback_Ack, ILS) {
    f_sendUnblock;
    s_deallocateTBE;
    n_popResponseQueue;
    wa_wakeUpDependents;
  }
}
