/*
 * Copyright (c) 2012-2015 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * For use for simulation and test purposes only
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. 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.
 *
 * 3. Neither the name of the copyright holder 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 HOLDER 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:TCCdir, "AMD read-for-ownership directory for TCC (aka GPU L2)")
:  CacheMemory * directory;
  // Convention: wire buffers are prefixed with "w_" for clarity
  WireBuffer * w_reqToTCCDir;
  WireBuffer * w_respToTCCDir;
  WireBuffer * w_TCCUnblockToTCCDir;
  WireBuffer * w_reqToTCC;
  WireBuffer * w_probeToTCC;
  WireBuffer * w_respToTCC;
  int TCC_select_num_bits;
  Cycles response_latency := 5;
  Cycles directory_latency := 6;
  Cycles issue_latency := 120;

  // From the TCPs or SQCs
  MessageBuffer * requestFromTCP, network="From", virtual_network="1", vnet_type="request";
  MessageBuffer * responseFromTCP, network="From", virtual_network="3", vnet_type="response";
  MessageBuffer * unblockFromTCP, network="From", virtual_network="5", vnet_type="unblock";

  // To the Cores. TCC deals only with TCPs/SQCs. CP cores do not communicate directly with TCC.
  MessageBuffer * probeToCore, network="To", virtual_network="1", vnet_type="request";
  MessageBuffer * responseToCore, network="To", virtual_network="3", vnet_type="response";

  // From the NB
  MessageBuffer * probeFromNB, network="From", virtual_network="0", vnet_type="request";
  MessageBuffer * responseFromNB, network="From", virtual_network="2", vnet_type="response";
  // To the NB
  MessageBuffer * requestToNB, network="To", virtual_network="0", vnet_type="request";
  MessageBuffer * responseToNB, network="To", virtual_network="2", vnet_type="response";
  MessageBuffer * unblockToNB, network="To", virtual_network="4", vnet_type="unblock";

  MessageBuffer * triggerQueue, random="false";
{
  // STATES
  state_declaration(State, desc="Directory states", default="TCCdir_State_I") {
    // Base states
    I, AccessPermission:Invalid, desc="Invalid";
    S, AccessPermission:Invalid, desc="Shared";
    E, AccessPermission:Invalid, desc="Shared";
    O, AccessPermission:Invalid, desc="Owner";
    M, AccessPermission:Invalid, desc="Modified";

    CP_I, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to invalid";
    B_I, AccessPermission:Invalid, desc="Blocked, need not send data after acks are in, going to invalid";
    CP_O, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to owned";
    CP_S, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to shared";
    CP_OM, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to O_M";
    CP_SM, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to S_M";
    CP_ISM, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to I_M";
    CP_IOM, AccessPermission:Invalid, desc="Blocked, must send data after acks are in, going to I_M";
    CP_OSIW, AccessPermission:Invalid, desc="Blocked, must send data after acks+CancelWB are in, going to I_C";


    // Transient states and busy states used for handling side (TCC-facing) interactions
    BW_S, AccessPermission:Invalid, desc="Blocked, Awaiting TCC unblock";
    BW_E, AccessPermission:Invalid, desc="Blocked, Awaiting TCC unblock";
    BW_O, AccessPermission:Invalid, desc="Blocked, Awaiting TCC unblock";
    BW_M, AccessPermission:Invalid, desc="Blocked, Awaiting TCC unblock";

    // Transient states and busy states used for handling upward (TCP-facing) interactions
    I_M, AccessPermission:Invalid, desc="Invalid, issued RdBlkM, have not seen response yet";
    I_ES, AccessPermission:Invalid, desc="Invalid, issued RdBlk, have not seen response yet";
    I_S, AccessPermission:Invalid, desc="Invalid, issued RdBlkS, have not seen response yet";
    BBS_S, AccessPermission:Invalid, desc="Blocked, going from S to S";
    BBO_O, AccessPermission:Invalid, desc="Blocked, going from O to O";
    BBM_M, AccessPermission:Invalid, desc="Blocked, going from M to M, waiting for data to forward";
    BBM_O, AccessPermission:Invalid, desc="Blocked, going from M to O, waiting for data to forward";
    BB_M, AccessPermission:Invalid, desc="Blocked, going from M to M, waiting for unblock";
    BB_O, AccessPermission:Invalid, desc="Blocked, going from M to O, waiting for unblock";
    BB_OO, AccessPermission:Invalid, desc="Blocked, going from O to O (adding sharers), waiting for unblock";
    BB_S, AccessPermission:Invalid, desc="Blocked, going to S, waiting for (possible multiple) unblock(s)";
    BBS_M, AccessPermission:Invalid, desc="Blocked, going from S or O to M";
    BBO_M, AccessPermission:Invalid, desc="Blocked, going from S or O to M";
    BBS_UM, AccessPermission:Invalid, desc="Blocked, going from S or O to M via upgrade";
    BBO_UM, AccessPermission:Invalid, desc="Blocked, going from S or O to M via upgrade";
    S_M, AccessPermission:Invalid, desc="Shared, issued CtoD, have not seen response yet";
    O_M, AccessPermission:Invalid, desc="Shared, issued CtoD, have not seen response yet";

    //
    BBB_S, AccessPermission:Invalid, desc="Blocked, going to S after core unblock";
    BBB_M, AccessPermission:Invalid, desc="Blocked, going to M after core unblock";
    BBB_E, AccessPermission:Invalid, desc="Blocked, going to E after core unblock";

    VES_I, AccessPermission:Invalid, desc="TCC replacement, waiting for clean WB ack";
    VM_I, AccessPermission:Invalid, desc="TCC replacement, waiting for dirty WB ack";
    VO_I, AccessPermission:Invalid, desc="TCC replacement, waiting for dirty WB ack";
    VO_S, AccessPermission:Invalid, desc="TCC owner replacement, waiting for dirty WB ack";

    ES_I, AccessPermission:Invalid, desc="L1 replacement, waiting for clean WB ack";
    MO_I, AccessPermission:Invalid, desc="L1 replacement, waiting for dirty WB ack";

    I_C, AccessPermission:Invalid, desc="Invalid, waiting for WBAck from NB for canceled WB";
    I_W, AccessPermission:Invalid, desc="Invalid, waiting for WBAck from NB; canceled WB raced with directory invalidation";

    // Recall States
    BRWD_I, AccessPermission:Invalid, desc="Recalling, waiting for WBAck and Probe Data responses";
    BRW_I, AccessPermission:Read_Write, desc="Recalling, waiting for WBAck";
    BRD_I, AccessPermission:Invalid, desc="Recalling, waiting for Probe Data responses";

  }

 enumeration(RequestType, desc="To communicate stats from transitions to recordStats") {
    DataArrayRead,    desc="Read the data array";
    DataArrayWrite,   desc="Write the data array";
    TagArrayRead,     desc="Read the data array";
    TagArrayWrite,    desc="Write the data array";
  }



  // EVENTS
  enumeration(Event, desc="TCC Directory Events") {
    // Upward facing events (TCCdir w.r.t. TCP/SQC and TCC behaves like NBdir behaves with TCP/SQC and L3

    // Directory Recall
    Recall,              desc="directory cache is full";
    // CPU requests
    CPUWrite,           desc="Initial req from core, sent to TCC";
    NoCPUWrite,           desc="Initial req from core, but non-exclusive clean data; can be discarded";
    CPUWriteCancel,           desc="Initial req from core, sent to TCC";

    // Requests from the TCPs
    RdBlk,                  desc="RdBlk event";
    RdBlkM,                 desc="RdBlkM event";
    RdBlkS,                 desc="RdBlkS event";
    CtoD,                   desc="Change to Dirty request";

    // TCC writebacks
    VicDirty,           desc="...";
    VicDirtyLast,           desc="...";
    VicClean,           desc="...";
    NoVic,           desc="...";
    StaleVic,           desc="...";
    CancelWB,           desc="TCC got invalidating probe, canceled WB";

    // Probe Responses from TCP/SQCs
    CPUPrbResp,     desc="Probe response from TCP/SQC";
    TCCPrbResp,     desc="Probe response from TCC";

    ProbeAcksComplete,	desc="All acks received";
    ProbeAcksCompleteReissue,	desc="All acks received, changing CtoD to reissue";

    CoreUnblock,		desc="unblock from TCP/SQC";
    LastCoreUnblock,		desc="Last unblock from TCP/SQC";
    TCCUnblock,			desc="unblock from TCC (current owner)";
    TCCUnblock_Sharer,  desc="unblock from TCC (a sharer, not owner)";
    TCCUnblock_NotValid,desc="unblock from TCC (not valid...caused by stale writebacks)";

    // Downward facing events

    // NB initiated
    NB_AckS,        desc="NB Ack to TCC Request";
    NB_AckE,        desc="NB Ack to TCC Request";
    NB_AckM,        desc="NB Ack to TCC Request";
    NB_AckCtoD,     desc="NB Ack to TCC Request";
    NB_AckWB,       desc="NB Ack for clean WB";


    // Incoming Probes from NB
    PrbInvData,         desc="Invalidating probe, return dirty data";
    PrbInv,             desc="Invalidating probe, no need to return data";
    PrbShrData,         desc="Downgrading probe, return data";
  }


  // TYPES

  // Entry for directory
  structure(Entry, desc="...", interface='AbstractCacheEntry') {
    State CacheState,          desc="Cache state (Cache of directory entries)";
    DataBlock DataBlk,             desc="data for the block";
    NetDest Sharers,                   desc="Sharers for this block";
    NetDest Owner,                     desc="Owner of this block";
    NetDest MergedSharers,             desc="Read sharers who are merged on a request";
    int WaitingUnblocks,           desc="Number of acks we're waiting for";
  }

  structure(TBE, desc="...") {
    State TBEState,    desc="Transient state";
    DataBlock DataBlk, desc="DataBlk";
    bool Dirty,        desc="Is the data dirty?";
    MachineID Requestor, desc="requestor";
    int NumPendingAcks,        desc="num acks expected";
    MachineID OriginalRequestor,        desc="Original Requestor";
    MachineID UntransferredOwner,    desc = "Untransferred owner for an upgrade transaction";
    bool UntransferredOwnerExists,    desc = "1 if Untransferred owner exists for an upgrade transaction";
    bool Cached,        desc="data hit in Cache";
    bool Shared,	desc="victim hit by shared probe";
    bool Upgrade,	desc="An upgrade request in progress";
    bool CtoD,	desc="Saved sysack info";
    CoherenceState CohState, desc="Saved sysack info";
    MessageSizeType MessageSize, desc="Saved sysack info";
    MachineID Sender, desc="sender";
  }

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

  // ** OBJECTS **
  TBETable TBEs, template="<TCCdir_TBE>", constructor="m_number_of_TBEs";
  int TCC_select_low_bit, default="RubySystem::getBlockSizeBits()";
  NetDest TCC_dir_subtree;
  NetDest temp;

  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);

  bool presentOrAvail(Addr addr) {
    return directory.isTagPresent(addr) || directory.cacheAvail(addr);
  }

  Entry getCacheEntry(Addr addr), return_by_pointer="yes" {
    return static_cast(Entry, "pointer", directory.lookup(addr));
  }

  DataBlock getDataBlock(Addr addr), return_by_ref="yes" {
    TBE tbe := TBEs.lookup(addr);
    if(is_valid(tbe)) {
      return tbe.DataBlk;
    } else {
      assert(false);
      return getCacheEntry(addr).DataBlk;
    }
  }

  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;
    }
    return State:I;
  }

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

 AccessPermission getAccessPermission(Addr addr) {
    TBE tbe := TBEs.lookup(addr);
    if(is_valid(tbe)) {
      return TCCdir_State_to_permission(tbe.TBEState);
    }

    Entry cache_entry := getCacheEntry(addr);
    if(is_valid(cache_entry)) {
      return TCCdir_State_to_permission(cache_entry.CacheState);
    }

    return AccessPermission:NotPresent;
  }

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

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

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

    num_functional_writes := num_functional_writes + functionalMemoryWrite(pkt);
    return num_functional_writes;
  }

  void setState(TBE tbe, Entry cache_entry, Addr addr, State state) {
    if (is_valid(tbe)) {
      tbe.TBEState := state;
    }

    if (is_valid(cache_entry)) {
      cache_entry.CacheState := state;

      if (state == State:S) {
        assert(cache_entry.Owner.count() == 0);
      }

      if (state == State:O) {
        assert(cache_entry.Owner.count() == 1);
        assert(cache_entry.Sharers.isSuperset(cache_entry.Owner) == false);
      }

      if (state == State:M) {
        assert(cache_entry.Owner.count() == 1);
        assert(cache_entry.Sharers.count() == 0);
      }

      if (state == State:E) {
        assert(cache_entry.Owner.count() == 0);
        assert(cache_entry.Sharers.count() == 1);
      }
    }
  }



 void recordRequestType(RequestType request_type, Addr addr) {
    if (request_type == RequestType:DataArrayRead) {
        directory.recordRequestType(CacheRequestType:DataArrayRead, addr);
    } else if (request_type == RequestType:DataArrayWrite) {
        directory.recordRequestType(CacheRequestType:DataArrayWrite, addr);
    } else if (request_type == RequestType:TagArrayRead) {
        directory.recordRequestType(CacheRequestType:TagArrayRead, addr);
    } else if (request_type == RequestType:TagArrayWrite) {
        directory.recordRequestType(CacheRequestType:TagArrayWrite, addr);
    }
  }

  bool checkResourceAvailable(RequestType request_type, Addr addr) {
    if (request_type == RequestType:DataArrayRead) {
      return directory.checkResourceAvailable(CacheResourceType:DataArray, addr);
    } else if (request_type == RequestType:DataArrayWrite) {
      return directory.checkResourceAvailable(CacheResourceType:DataArray, addr);
    } else if (request_type == RequestType:TagArrayRead) {
      return directory.checkResourceAvailable(CacheResourceType:TagArray, addr);
    } else if (request_type == RequestType:TagArrayWrite) {
      return directory.checkResourceAvailable(CacheResourceType:TagArray, addr);
    } else {
      error("Invalid RequestType type in checkResourceAvailable");
      return true;
    }
  }

  // ** OUT_PORTS **

  // Three classes of ports
  // Class 1: downward facing network links to NB
  out_port(requestToNB_out, CPURequestMsg, requestToNB);
  out_port(responseToNB_out, ResponseMsg, responseToNB);
  out_port(unblockToNB_out, UnblockMsg, unblockToNB);


  // Class 2: upward facing ports to GPU cores
  out_port(probeToCore_out, TDProbeRequestMsg, probeToCore);
  out_port(responseToCore_out, ResponseMsg, responseToCore);

  // Class 3: sideward facing ports (on "wirebuffer" links) to TCC
  out_port(w_requestTCC_out, CPURequestMsg, w_reqToTCC);
  out_port(w_probeTCC_out, NBProbeRequestMsg, w_probeToTCC);
  out_port(w_respTCC_out, ResponseMsg, w_respToTCC);


  // local trigger port
  out_port(triggerQueue_out, TriggerMsg, triggerQueue);

  //
  // request queue going to NB
  //

  // ** IN_PORTS **

  // Trigger Queue
  in_port(triggerQueue_in, TriggerMsg, triggerQueue, rank=8) {
    if (triggerQueue_in.isReady(clockEdge())) {
      peek(triggerQueue_in, TriggerMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        assert(is_valid(tbe));
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if ((in_msg.Type == TriggerType:AcksComplete) && (tbe.Upgrade == false))  {
          trigger(Event:ProbeAcksComplete, in_msg.addr, cache_entry, tbe);
        } else if ((in_msg.Type == TriggerType:AcksComplete) && (tbe.Upgrade == true))  {
          trigger(Event:ProbeAcksCompleteReissue, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }

  // Unblock Networks (TCCdir can receive unblocks from TCC, TCPs)
  // Port on first (of three) wire buffers from TCC
  in_port(w_TCCUnblock_in, UnblockMsg, w_TCCUnblockToTCCDir, rank=7) {
    if (w_TCCUnblock_in.isReady(clockEdge())) {
      peek(w_TCCUnblock_in, UnblockMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if (in_msg.currentOwner) {
            trigger(Event:TCCUnblock, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.valid) {
            trigger(Event:TCCUnblock_Sharer, in_msg.addr, cache_entry, tbe);
        } else {
            trigger(Event:TCCUnblock_NotValid, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }

  in_port(unblockNetwork_in, UnblockMsg, unblockFromTCP, rank=6) {
    if (unblockNetwork_in.isReady(clockEdge())) {
      peek(unblockNetwork_in, UnblockMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if(cache_entry.WaitingUnblocks == 1) {
          trigger(Event:LastCoreUnblock, in_msg.addr, cache_entry, tbe);
        }
        else {
          trigger(Event:CoreUnblock, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }


  //Responses from TCC, and Cores
  // Port on second (of three) wire buffers from TCC
  in_port(w_TCCResponse_in, ResponseMsg, w_respToTCCDir, rank=5) {
    if (w_TCCResponse_in.isReady(clockEdge())) {
      peek(w_TCCResponse_in, ResponseMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if (in_msg.Type == CoherenceResponseType:CPUPrbResp) {
          trigger(Event:TCCPrbResp, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }

  in_port(responseNetwork_in, ResponseMsg, responseFromTCP, rank=4) {
    if (responseNetwork_in.isReady(clockEdge())) {
      peek(responseNetwork_in, ResponseMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if (in_msg.Type == CoherenceResponseType:CPUPrbResp) {
          trigger(Event:CPUPrbResp, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }


  // Port on third (of three) wire buffers from TCC
  in_port(w_TCCRequest_in, CPURequestMsg, w_reqToTCCDir, rank=3) {
      if(w_TCCRequest_in.isReady(clockEdge())) {
          peek(w_TCCRequest_in, CPURequestMsg) {
              TBE tbe := TBEs.lookup(in_msg.addr);
              Entry cache_entry := getCacheEntry(in_msg.addr);
              if (in_msg.Type == CoherenceRequestType:WrCancel) {
                  trigger(Event:CancelWB, in_msg.addr, cache_entry, tbe);
              } else if (in_msg.Type == CoherenceRequestType:VicDirty) {
                  if (is_valid(cache_entry) && cache_entry.Owner.isElement(in_msg.Requestor)) {
                      // if modified, or owner with no other sharers
                      if ((cache_entry.CacheState == State:M) || (cache_entry.Sharers.count() == 0)) {
                          assert(cache_entry.Owner.count()==1);
                          trigger(Event:VicDirtyLast, in_msg.addr, cache_entry, tbe);
                      } else {
                          trigger(Event:VicDirty, in_msg.addr, cache_entry, tbe);
                      }
                  } else {
                      trigger(Event:StaleVic, in_msg.addr, cache_entry, tbe);
                  }
              } else {
                  if (in_msg.Type == CoherenceRequestType:VicClean) {
                      if (is_valid(cache_entry) && cache_entry.Sharers.isElement(in_msg.Requestor)) {
                          if (cache_entry.Sharers.count() == 1) {
                              // Last copy, victimize to L3
                              trigger(Event:VicClean, in_msg.addr, cache_entry, tbe);
                          } else {
                              // Either not the last copy or stall. No need to victimmize
                              // remove sharer from sharer list
                              assert(cache_entry.Sharers.count() > 1);
                              trigger(Event:NoVic, in_msg.addr, cache_entry, tbe);
                          }
                      } else {
                          trigger(Event:StaleVic, in_msg.addr, cache_entry, tbe);
                      }
                  }
              }
          }
      }
    }

  in_port(responseFromNB_in, ResponseMsg, responseFromNB, rank=2) {
    if (responseFromNB_in.isReady(clockEdge())) {
      peek(responseFromNB_in, ResponseMsg, block_on="addr") {

        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if (in_msg.Type == CoherenceResponseType:NBSysResp) {
          if (in_msg.State == CoherenceState:Modified) {
            if (in_msg.CtoD) {
              trigger(Event:NB_AckCtoD, in_msg.addr, cache_entry, tbe);
            } else {
              trigger(Event:NB_AckM, in_msg.addr, cache_entry, tbe);
            }
          } else if (in_msg.State == CoherenceState:Shared) {
            trigger(Event:NB_AckS, in_msg.addr, cache_entry, tbe);
          } else if (in_msg.State == CoherenceState:Exclusive) {
            trigger(Event:NB_AckE, in_msg.addr, cache_entry, tbe);
          }
        } else if (in_msg.Type == CoherenceResponseType:NBSysWBAck) {
          trigger(Event:NB_AckWB, in_msg.addr, cache_entry, tbe);
        } else {
          error("Unexpected Response Message to Core");
        }
      }
    }
  }

  // Finally handling incoming requests (from TCP) and probes (from NB).

  in_port(probeNetwork_in, NBProbeRequestMsg, probeFromNB, rank=1) {
    if (probeNetwork_in.isReady(clockEdge())) {
      peek(probeNetwork_in, NBProbeRequestMsg) {
        DPRINTF(RubySlicc, "%s\n", in_msg);
        DPRINTF(RubySlicc, "machineID: %s\n", machineID);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        TBE tbe := TBEs.lookup(in_msg.addr);

        if (in_msg.Type == ProbeRequestType:PrbInv) {
          if (in_msg.ReturnData) {
            trigger(Event:PrbInvData, in_msg.addr, cache_entry, tbe);
          } else {
            trigger(Event:PrbInv, in_msg.addr, cache_entry, tbe);
          }
        } else if (in_msg.Type == ProbeRequestType:PrbDowngrade) {
          assert(in_msg.ReturnData);
          trigger(Event:PrbShrData, in_msg.addr, cache_entry, tbe);
        }
      }
    }
  }


  in_port(coreRequestNetwork_in, CPURequestMsg, requestFromTCP, rank=0) {
    if (coreRequestNetwork_in.isReady(clockEdge())) {
      peek(coreRequestNetwork_in, CPURequestMsg) {
        TBE tbe := TBEs.lookup(in_msg.addr);
        Entry cache_entry := getCacheEntry(in_msg.addr);
        if (presentOrAvail(in_msg.addr)) {
          if (in_msg.Type == CoherenceRequestType:VicDirty) {
            trigger(Event:CPUWrite, in_msg.addr, cache_entry, tbe);
          } else if (in_msg.Type == CoherenceRequestType:VicClean) {
              if (is_valid(cache_entry) && cache_entry.Owner.isElement(in_msg.Requestor)) {
                  trigger(Event:CPUWrite, in_msg.addr, cache_entry, tbe);
              } else if(is_valid(cache_entry) && (cache_entry.Sharers.count() + cache_entry.Owner.count() ) >1) {
                  trigger(Event:NoCPUWrite, in_msg.addr, cache_entry, tbe);
              } else {
                  trigger(Event:CPUWrite, in_msg.addr, cache_entry, tbe);
              }
          } else if (in_msg.Type == CoherenceRequestType:RdBlk) {
            trigger(Event:RdBlk, in_msg.addr, cache_entry, tbe);
          } else if (in_msg.Type == CoherenceRequestType:RdBlkS) {
            trigger(Event:RdBlkS, in_msg.addr, cache_entry, tbe);
          } else if (in_msg.Type == CoherenceRequestType:RdBlkM) {
            trigger(Event:RdBlkM, in_msg.addr, cache_entry, tbe);
          } else if (in_msg.Type == CoherenceRequestType:WrCancel) {
            trigger(Event:CPUWriteCancel, in_msg.addr, cache_entry, tbe);
          }
        } else {
          // All requests require a directory entry
          Addr victim := directory.cacheProbe(in_msg.addr);
          trigger(Event:Recall, victim, getCacheEntry(victim), TBEs.lookup(victim));
        }
      }
    }
  }




  // Actions

  //Downward facing actions

  action(c_clearOwner, "c", desc="Clear the owner field") {
    cache_entry.Owner.clear();
  }

  action(rS_removeRequesterFromSharers, "rS", desc="Remove unblocker from sharer list") {
    peek(unblockNetwork_in, UnblockMsg) {
      cache_entry.Sharers.remove(in_msg.Sender);
    }
  }

  action(rT_removeTCCFromSharers, "rT", desc="Remove  TCC from sharer list") {
    peek(w_TCCRequest_in, CPURequestMsg) {
      cache_entry.Sharers.remove(in_msg.Requestor);
    }
  }

  action(rO_removeOriginalRequestorFromSharers, "rO", desc="Remove replacing core from sharer list") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      cache_entry.Sharers.remove(in_msg.Requestor);
    }
  }

  action(rC_removeCoreFromSharers, "rC", desc="Remove replacing core from sharer list") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      cache_entry.Sharers.remove(in_msg.Requestor);
    }
  }

  action(rCo_removeCoreFromOwner, "rCo", desc="Remove replacing core from sharer list") {
    // Note that under some cases this action will try to remove a stale owner
    peek(coreRequestNetwork_in, CPURequestMsg) {
      cache_entry.Owner.remove(in_msg.Requestor);
    }
  }

  action(rR_removeResponderFromSharers, "rR", desc="Remove responder from sharer list") {
    peek(responseNetwork_in, ResponseMsg) {
      cache_entry.Sharers.remove(in_msg.Sender);
    }
  }

  action(nC_sendNullWBAckToCore, "nC", desc = "send a null WB Ack to release core") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysWBNack;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := in_msg.MessageSize;
      }
   }
  }

  action(nT_sendNullWBAckToTCC, "nT", desc = "send a null WB Ack to release TCC") {
    peek(w_TCCRequest_in, CPURequestMsg) {
      enqueue(w_respTCC_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysWBAck;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := in_msg.MessageSize;
      }
    }
  }

  action(eto_moveExSharerToOwner, "eto", desc="move the current exclusive sharer to owner") {
      assert(cache_entry.Sharers.count() == 1);
      assert(cache_entry.Owner.count() == 0);
      cache_entry.Owner := cache_entry.Sharers;
      cache_entry.Sharers.clear();
      APPEND_TRANSITION_COMMENT(" new owner ");
      APPEND_TRANSITION_COMMENT(cache_entry.Owner);
  }

  action(aT_addTCCToSharers, "aT", desc="Add TCC to sharer list") {
    peek(w_TCCUnblock_in, UnblockMsg) {
      cache_entry.Sharers.add(in_msg.Sender);
    }
  }

  action(as_addToSharers, "as", desc="Add unblocker to sharer list") {
    peek(unblockNetwork_in, UnblockMsg) {
      cache_entry.Sharers.add(in_msg.Sender);
    }
  }

  action(c_moveOwnerToSharer, "cc", desc="Move owner to sharers") {
    cache_entry.Sharers.addNetDest(cache_entry.Owner);
    cache_entry.Owner.clear();
  }

  action(cc_clearSharers, "\c", desc="Clear the sharers field") {
    cache_entry.Sharers.clear();
  }

  action(e_ownerIsUnblocker, "e", desc="The owner is now the unblocker") {
    peek(unblockNetwork_in, UnblockMsg) {
      cache_entry.Owner.clear();
      cache_entry.Owner.add(in_msg.Sender);
      APPEND_TRANSITION_COMMENT(" tcp_ub owner ");
      APPEND_TRANSITION_COMMENT(cache_entry.Owner);
    }
  }

  action(eT_ownerIsUnblocker, "eT", desc="TCC (unblocker) is now owner") {
    peek(w_TCCUnblock_in, UnblockMsg) {
      cache_entry.Owner.clear();
      cache_entry.Owner.add(in_msg.Sender);
      APPEND_TRANSITION_COMMENT(" tcc_ub owner ");
      APPEND_TRANSITION_COMMENT(cache_entry.Owner);
    }
  }

  action(ctr_copyTCCResponseToTBE, "ctr", desc="Copy TCC probe response data to TBE") {
    peek(w_TCCResponse_in, ResponseMsg) {
      // Overwrite data if tbe does not hold dirty data. Stop once it is dirty.
      if(tbe.Dirty == false) {
        tbe.DataBlk := in_msg.DataBlk;
        tbe.Dirty := in_msg.Dirty;
        tbe.Sender := in_msg.Sender;
      }
      DPRINTF(RubySlicc, "%s\n", (tbe.DataBlk));
    }
  }

  action(ccr_copyCoreResponseToTBE, "ccr", desc="Copy core probe response data to TBE") {
    peek(responseNetwork_in, ResponseMsg) {
      // Overwrite data if tbe does not hold dirty data. Stop once it is dirty.
      if(tbe.Dirty == false) {
          tbe.DataBlk := in_msg.DataBlk;
          tbe.Dirty := in_msg.Dirty;

          if(tbe.Sender == machineID) {
              tbe.Sender := in_msg.Sender;
          }
      }
      DPRINTF(RubySlicc, "%s\n", (tbe.DataBlk));
    }
  }

  action(cd_clearDirtyBitTBE, "cd", desc="Clear Dirty bit in TBE") {
      tbe.Dirty := false;
  }

  action(n_issueRdBlk, "n-", desc="Issue RdBlk") {
    enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:RdBlk;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
    }
  }

  action(nS_issueRdBlkS, "nS", desc="Issue RdBlkS") {
    enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:RdBlkS;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
    }
  }

  action(nM_issueRdBlkM, "nM", desc="Issue RdBlkM") {
    enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:RdBlkM;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
    }
  }

  action(rU_rememberUpgrade, "rU", desc="Remember that this was an upgrade") {
      tbe.Upgrade := true;
  }

  action(ruo_rememberUntransferredOwner, "ruo", desc="Remember the untransferred owner") {
    peek(responseNetwork_in, ResponseMsg) {
      if(in_msg.UntransferredOwner == true) {
        tbe.UntransferredOwner := in_msg.Sender;
        tbe.UntransferredOwnerExists := true;
      }
      DPRINTF(RubySlicc, "%s\n", (in_msg));
    }
  }

  action(ruoT_rememberUntransferredOwnerTCC, "ruoT", desc="Remember the untransferred owner") {
    peek(w_TCCResponse_in, ResponseMsg) {
      if(in_msg.UntransferredOwner == true) {
        tbe.UntransferredOwner := in_msg.Sender;
        tbe.UntransferredOwnerExists := true;
      }
      DPRINTF(RubySlicc, "%s\n", (in_msg));
    }
  }

 action(vd_victim, "vd", desc="Victimize M/O Data") {
   enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
     out_msg.addr := address;
     out_msg.Requestor := machineID;
     out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
     out_msg.MessageSize := MessageSizeType:Request_Control;
     out_msg.Type := CoherenceRequestType:VicDirty;
     if (cache_entry.CacheState == State:O) {
       out_msg.Shared := true;
     } else {
       out_msg.Shared := false;
     }
     out_msg.Dirty := true;
   }
 }

  action(vc_victim, "vc", desc="Victimize E/S Data") {
    enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
      out_msg.Type := CoherenceRequestType:VicClean;
      if (cache_entry.CacheState == State:S) {
        out_msg.Shared := true;
      } else {
        out_msg.Shared := false;
      }
      out_msg.Dirty := false;
    }
  }


  action(sT_sendRequestToTCC, "sT", desc="send request to TCC") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      enqueue(w_requestTCC_out, CPURequestMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := in_msg.Type;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.DataBlk := in_msg.DataBlk;
        out_msg.Destination.add(mapAddressToRange(address,MachineType:TCC,
                                TCC_select_low_bit, TCC_select_num_bits));
        out_msg.Shared := in_msg.Shared;
        out_msg.MessageSize := in_msg.MessageSize;
      }
      APPEND_TRANSITION_COMMENT(" requestor ");
      APPEND_TRANSITION_COMMENT(in_msg.Requestor);

    }
  }


  action(sc_probeShrCoreData, "sc", desc="probe shared cores, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);

    temp := cache_entry.Sharers;
    temp.addNetDest(cache_entry.Owner);
    if (temp.isElement(tcc)) {
        temp.remove(tcc);
    }
    if (temp.count() > 0) {
      enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := ProbeRequestType:PrbDowngrade;
        out_msg.ReturnData := true;
        out_msg.MessageSize := MessageSizeType:Control;
        out_msg.Destination := temp;
        tbe.NumPendingAcks := temp.count();
        if(cache_entry.CacheState == State:M) {
            assert(tbe.NumPendingAcks == 1);
        }
        DPRINTF(RubySlicc, "%s\n", (out_msg));
      }
    }
  }

  action(ls2_probeShrL2Data, "ls2", desc="local probe downgrade L2, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if ((cache_entry.Sharers.isElement(tcc)) || (cache_entry.Owner.isElement(tcc))) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
          out_msg.addr := address;
          out_msg.Type := ProbeRequestType:PrbDowngrade;
          out_msg.ReturnData := true;
          out_msg.MessageSize := MessageSizeType:Control;
          out_msg.Destination.add(tcc);
          tbe.NumPendingAcks := tbe.NumPendingAcks + 1;
          DPRINTF(RubySlicc, "%s\n", out_msg);

      }
    }
  }

  action(s2_probeShrL2Data, "s2", desc="probe shared L2, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if ((cache_entry.Sharers.isElement(tcc)) || (cache_entry.Owner.isElement(tcc))) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
          out_msg.addr := address;
          out_msg.Type := ProbeRequestType:PrbDowngrade;
          out_msg.ReturnData := true;
          out_msg.MessageSize := MessageSizeType:Control;
          out_msg.Destination.add(tcc);
          tbe.NumPendingAcks := tbe.NumPendingAcks + 1;
          DPRINTF(RubySlicc, "%s\n", out_msg);

      }
    }
  }

  action(ldc_probeInvCoreData, "ldc", desc="local probe  to inv cores, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    peek(coreRequestNetwork_in, CPURequestMsg) {
        NetDest dest:= cache_entry.Sharers;
        dest.addNetDest(cache_entry.Owner);
        if(dest.isElement(tcc)){
         dest.remove(tcc);
        }
        dest.remove(in_msg.Requestor);
        tbe.NumPendingAcks := dest.count();
        if (dest.count()>0){
        enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := ProbeRequestType:PrbInv;
        out_msg.ReturnData := true;
        out_msg.MessageSize := MessageSizeType:Control;

        out_msg.Destination.addNetDest(dest);
        if(cache_entry.CacheState == State:M) {
		assert(tbe.NumPendingAcks == 1);
        }

        DPRINTF(RubySlicc, "%s\n", (out_msg));
       }
      }
    }
  }

  action(ld2_probeInvL2Data, "ld2", desc="local probe inv L2, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if ((cache_entry.Sharers.isElement(tcc)) || (cache_entry.Owner.isElement(tcc))) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
          out_msg.addr := address;
          out_msg.Type := ProbeRequestType:PrbInv;
          out_msg.ReturnData := true;
          out_msg.MessageSize := MessageSizeType:Control;
          out_msg.Destination.add(tcc);
          tbe.NumPendingAcks := tbe.NumPendingAcks + 1;
          DPRINTF(RubySlicc, "%s\n", out_msg);

      }
    }
  }

  action(dc_probeInvCoreData, "dc", desc="probe  inv cores + TCC, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
      out_msg.addr := address;
      out_msg.Type := ProbeRequestType:PrbInv;
      out_msg.ReturnData := true;
      out_msg.MessageSize := MessageSizeType:Control;

      out_msg.Destination.addNetDest(cache_entry.Sharers);
      out_msg.Destination.addNetDest(cache_entry.Owner);
      tbe.NumPendingAcks := cache_entry.Sharers.count() + cache_entry.Owner.count();
      if(cache_entry.CacheState == State:M) {
	  assert(tbe.NumPendingAcks == 1);
      }
      if (out_msg.Destination.isElement(tcc)) {
          out_msg.Destination.remove(tcc);
          tbe.NumPendingAcks := tbe.NumPendingAcks - 1;
      }

      DPRINTF(RubySlicc, "%s\n", (out_msg));
    }
  }

  action(d2_probeInvL2Data, "d2", desc="probe inv L2, return data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if ((cache_entry.Sharers.isElement(tcc)) || (cache_entry.Owner.isElement(tcc))) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
          out_msg.addr := address;
          out_msg.Type := ProbeRequestType:PrbInv;
          out_msg.ReturnData := true;
          out_msg.MessageSize := MessageSizeType:Control;
          out_msg.Destination.add(tcc);
          tbe.NumPendingAcks := tbe.NumPendingAcks + 1;
          DPRINTF(RubySlicc, "%s\n", out_msg);

      }
    }
  }

  action(lpc_probeInvCore, "lpc", desc="local probe inv cores, no data") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      TCC_dir_subtree.broadcast(MachineType:TCP);
      TCC_dir_subtree.broadcast(MachineType:SQC);

      temp := cache_entry.Sharers;
      temp := temp.OR(cache_entry.Owner);
      TCC_dir_subtree := TCC_dir_subtree.AND(temp);
      tbe.NumPendingAcks := TCC_dir_subtree.count();
      if(cache_entry.CacheState == State:M) {
	   assert(tbe.NumPendingAcks == 1);
      }
      if(TCC_dir_subtree.isElement(in_msg.Requestor)) {
         TCC_dir_subtree.remove(in_msg.Requestor);
         tbe.NumPendingAcks := tbe.NumPendingAcks - 1;
      }

      if(TCC_dir_subtree.count() > 0) {
         enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
           out_msg.addr := address;
           out_msg.Type := ProbeRequestType:PrbInv;
           out_msg.ReturnData := false;
           out_msg.MessageSize := MessageSizeType:Control;
           out_msg.localCtoD := true;

           out_msg.Destination.addNetDest(TCC_dir_subtree);

           DPRINTF(RubySlicc, "%s\n", (out_msg));
         }
       }
    }
  }

  action(ipc_probeInvCore, "ipc", desc="probe inv cores, no data") {
    TCC_dir_subtree.broadcast(MachineType:TCP);
    TCC_dir_subtree.broadcast(MachineType:SQC);

    temp := cache_entry.Sharers;
    temp := temp.OR(cache_entry.Owner);
    TCC_dir_subtree := TCC_dir_subtree.AND(temp);
    tbe.NumPendingAcks := TCC_dir_subtree.count();
    if(TCC_dir_subtree.count() > 0) {

      enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := ProbeRequestType:PrbInv;
        out_msg.ReturnData := false;
        out_msg.MessageSize := MessageSizeType:Control;

        out_msg.Destination.addNetDest(TCC_dir_subtree);
        if(cache_entry.CacheState == State:M) {
          assert(tbe.NumPendingAcks == 1);
        }

        DPRINTF(RubySlicc, "%s\n", (out_msg));
      }
    }
  }

  action(i2_probeInvL2, "i2", desc="probe inv L2, no data") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if ((cache_entry.Sharers.isElement(tcc)) || (cache_entry.Owner.isElement(tcc))) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
          tbe.NumPendingAcks := tbe.NumPendingAcks + 1;
          out_msg.addr := address;
          out_msg.Type := ProbeRequestType:PrbInv;
          out_msg.ReturnData := false;
          out_msg.MessageSize := MessageSizeType:Control;
          out_msg.Destination.add(tcc);
          DPRINTF(RubySlicc, "%s\n", out_msg);

      }
    }
  }

  action(pi_sendProbeResponseInv, "pi", desc="send probe ack inv, no data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUPrbResp;  // TCC, L3  respond in same way to probes
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Dirty := false;
      out_msg.Hit := false;
      out_msg.Ntsl := true;
      out_msg.State := CoherenceState:NA;
      out_msg.MessageSize := MessageSizeType:Response_Control;
    }
  }

  action(pim_sendProbeResponseInvMs, "pim", desc="send probe ack inv, no data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUPrbResp;  // L3 and TCC respond in same way to probes
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Dirty := false;
      out_msg.Ntsl := true;
      out_msg.Hit := false;
      out_msg.State := CoherenceState:NA;
      out_msg.MessageSize := MessageSizeType:Response_Control;
    }
  }

  action(prm_sendProbeResponseMiss, "prm", desc="send probe ack PrbShrData, no data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUPrbResp;  // L3 and TCC respond in same way to probes
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Dirty := false;  // only true if sending back data i think
      out_msg.Hit := false;
      out_msg.Ntsl := false;
      out_msg.State := CoherenceState:NA;
      out_msg.MessageSize := MessageSizeType:Response_Control;
    }
  }



  action(pd_sendProbeResponseData, "pd", desc="send probe ack, with data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      assert(is_valid(cache_entry) || is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUPrbResp;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.DataBlk := getDataBlock(address);
      if (is_valid(tbe)) {
        out_msg.Dirty := tbe.Dirty;
      }
      out_msg.Hit := true;
      out_msg.State := CoherenceState:NA;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
  }


  action(pdm_sendProbeResponseDataMs, "pdm", desc="send probe ack, with data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      assert(is_valid(cache_entry) || is_valid(tbe));
      assert(is_valid(cache_entry));
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUPrbResp;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.DataBlk := getDataBlock(address);
      if (is_valid(tbe)) {
        out_msg.Dirty := tbe.Dirty;
      }
      out_msg.Hit := true;
      out_msg.State := CoherenceState:NA;
      out_msg.MessageSize := MessageSizeType:Response_Data;
    }
  }

  action(mc_cancelWB, "mc", desc="send writeback cancel to NB directory") {
    enqueue(requestToNB_out, CPURequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:WrCancel;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Requestor := machineID;
      out_msg.MessageSize := MessageSizeType:Request_Control;
    }
  }

 action(sCS_sendCollectiveResponseS, "sCS", desc="send shared response to all merged TCP/SQC") {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysResp;
        out_msg.Sender := tbe.Sender;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.CtoD := false;
        out_msg.State := CoherenceState:Shared;
        out_msg.Destination.addNetDest(cache_entry.MergedSharers);
        out_msg.Shared := tbe.Shared;
        out_msg.Dirty := tbe.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg);
      }
  }

 action(sS_sendResponseS, "sS", desc="send shared response to TCP/SQC") {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysResp;
        out_msg.Sender := tbe.Sender;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.CtoD := false;
        out_msg.State := CoherenceState:Shared;
        out_msg.Destination.add(tbe.OriginalRequestor);
        out_msg.Shared := tbe.Shared;
        out_msg.Dirty := tbe.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg);
      }
  }

 action(sM_sendResponseM, "sM", desc="send response to TCP/SQC") {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysResp;
        out_msg.Sender := tbe.Sender;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.CtoD := false;
        out_msg.State := CoherenceState:Modified;
        out_msg.Destination.add(tbe.OriginalRequestor);
        out_msg.Shared := tbe.Shared;
        out_msg.Dirty := tbe.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg);
      }
  }



 action(fw2_forwardWBAck, "fw2", desc="forward WBAck to TCC") {
    peek(responseFromNB_in, ResponseMsg) {
      if(tbe.OriginalRequestor != machineID) {
        enqueue(w_respTCC_out, ResponseMsg, 1) {
          out_msg.addr := address;
          out_msg.Type := CoherenceResponseType:TDSysWBAck;
          out_msg.Sender := machineID;
          //out_msg.DataBlk := tbe.DataBlk;
          out_msg.Destination.add(tbe.OriginalRequestor);
          out_msg.MessageSize := in_msg.MessageSize;
        }
      }
    }
  }

 action(sa_saveSysAck, "sa", desc="Save SysAck ") {
    peek(responseFromNB_in, ResponseMsg) {
        tbe.Dirty := in_msg.Dirty;
        if (tbe.Dirty == false) {
           tbe.DataBlk := in_msg.DataBlk;
        }
        else {
           tbe.DataBlk := tbe.DataBlk;
        }
        tbe.CtoD := in_msg.CtoD;
        tbe.CohState := in_msg.State;
        tbe.Shared := in_msg.Shared;
        tbe.MessageSize := in_msg.MessageSize;
    }
  }

 action(fsa_forwardSavedAck, "fsa", desc="forward saved SysAck to TCP or SQC") {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysResp;
        out_msg.Sender := machineID;
        if (tbe.Dirty == false) {
           out_msg.DataBlk := tbe.DataBlk;
        }
        else {
           out_msg.DataBlk := tbe.DataBlk;
        }
        out_msg.CtoD := tbe.CtoD;
        out_msg.State := tbe.CohState;
        out_msg.Destination.add(tbe.OriginalRequestor);
        out_msg.Shared := tbe.Shared;
        out_msg.MessageSize := tbe.MessageSize;
        out_msg.Dirty := tbe.Dirty;
        out_msg.Sender := tbe.Sender;
      }
  }

 action(fa_forwardSysAck, "fa", desc="forward SysAck to TCP or SQC") {
    peek(responseFromNB_in, ResponseMsg) {
      enqueue(responseToCore_out, ResponseMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:TDSysResp;
        out_msg.Sender := machineID;
        if (tbe.Dirty == false) {
           out_msg.DataBlk := in_msg.DataBlk;
           tbe.Sender := machineID;
        }
        else {
           out_msg.DataBlk := tbe.DataBlk;
        }
        out_msg.CtoD := in_msg.CtoD;
        out_msg.State := in_msg.State;
        out_msg.Destination.add(tbe.OriginalRequestor);
        out_msg.Shared := in_msg.Shared;
        out_msg.MessageSize := in_msg.MessageSize;
        out_msg.Dirty := in_msg.Dirty;
        out_msg.Sender := tbe.Sender;
        DPRINTF(RubySlicc, "%s\n", (out_msg.DataBlk));
      }
    }
  }

 action(pso_probeSharedDataOwner, "pso", desc="probe shared data at owner") {
    MachineID tcc := mapAddressToRange(address,MachineType:TCC,
                                       TCC_select_low_bit, TCC_select_num_bits);
    if (cache_entry.Owner.isElement(tcc)) {
      enqueue(w_probeTCC_out, TDProbeRequestMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := ProbeRequestType:PrbDowngrade;
        out_msg.ReturnData := true;
        out_msg.MessageSize := MessageSizeType:Control;
        out_msg.Destination.add(tcc);
        DPRINTF(RubySlicc, "%s\n", out_msg);
      }
    }
    else { // i.e., owner is a core
      enqueue(probeToCore_out, TDProbeRequestMsg, response_latency) {
        out_msg.addr := address;
        out_msg.Type := ProbeRequestType:PrbDowngrade;
        out_msg.ReturnData := true;
        out_msg.MessageSize := MessageSizeType:Control;
        out_msg.Destination.addNetDest(cache_entry.Owner);
        DPRINTF(RubySlicc, "%s\n", out_msg);
      }
    }
    tbe.NumPendingAcks := 1;
  }

  action(i_popIncomingRequestQueue, "i", desc="Pop incoming request queue") {
    coreRequestNetwork_in.dequeue(clockEdge());
  }

  action(j_popIncomingUnblockQueue, "j", desc="Pop incoming unblock queue") {
    unblockNetwork_in.dequeue(clockEdge());
  }

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

  action(pp_popProbeQueue, "pp", desc="Pop incoming probe queue") {
    probeNetwork_in.dequeue(clockEdge());
  }

  action(pR_popResponseFromNBQueue, "pR", desc="Pop incoming Response queue From NB") {
    responseFromNB_in.dequeue(clockEdge());
  }

  action(pt_popTriggerQueue, "pt", desc="pop trigger queue") {
    triggerQueue_in.dequeue(clockEdge());
  }

  action(pl_popTCCRequestQueue, "pl", desc="pop TCC request queue") {
    w_TCCRequest_in.dequeue(clockEdge());
  }

  action(plr_popTCCResponseQueue, "plr", desc="pop TCC response queue") {
    w_TCCResponse_in.dequeue(clockEdge());
  }

  action(plu_popTCCUnblockQueue, "plu", desc="pop TCC unblock queue") {
    w_TCCUnblock_in.dequeue(clockEdge());
  }


  action(m_addUnlockerToSharers, "m", desc="Add the unlocker to the sharer list") {
    peek(unblockNetwork_in, UnblockMsg) {
      cache_entry.Sharers.add(in_msg.Sender);
      cache_entry.MergedSharers.remove(in_msg.Sender);
      assert(cache_entry.WaitingUnblocks >= 0);
      cache_entry.WaitingUnblocks := cache_entry.WaitingUnblocks - 1;
    }
  }

  action(q_addOutstandingMergedSharer, "q", desc="Increment outstanding requests") {
    peek(coreRequestNetwork_in, CPURequestMsg) {
      cache_entry.MergedSharers.add(in_msg.Requestor);
      cache_entry.WaitingUnblocks := cache_entry.WaitingUnblocks + 1;
    }
  }

  action(uu_sendUnblock, "uu", desc="state changed, unblock") {
    enqueue(unblockToNB_out, UnblockMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
      DPRINTF(RubySlicc, "%s\n", out_msg);
    }
  }

  action(zz_recycleRequest, "\z", desc="Recycle the request queue") {
    coreRequestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(yy_recycleTCCRequestQueue, "yy", desc="recycle yy request queue") {
    w_TCCRequest_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(xz_recycleResponseQueue, "xz", desc="recycle response queue") {
    responseNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(xx_recycleTCCResponseQueue, "xx", desc="recycle TCC response queue") {
    w_TCCResponse_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(vv_recycleTCCUnblockQueue, "vv", desc="Recycle the probe request queue") {
    w_TCCUnblock_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(xy_recycleUnblockQueue, "xy", desc="Recycle the probe request queue") {
    w_TCCUnblock_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(ww_recycleProbeRequest, "ww", desc="Recycle the probe request queue") {
    probeNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
  }

  action(x_decrementAcks, "x", desc="decrement Acks pending") {
    tbe.NumPendingAcks := tbe.NumPendingAcks - 1;
  }

  action(o_checkForAckCompletion, "o", desc="check for ack completion") {
    if (tbe.NumPendingAcks == 0) {
      enqueue(triggerQueue_out, TriggerMsg, 1) {
        out_msg.addr := address;
        out_msg.Type := TriggerType:AcksComplete;
      }
    }
    APPEND_TRANSITION_COMMENT(" tbe acks ");
    APPEND_TRANSITION_COMMENT(tbe.NumPendingAcks);
  }

  action(tp_allocateTBE, "tp", desc="allocate TBE Entry for upward transactions") {
    check_allocate(TBEs);
    peek(probeNetwork_in, NBProbeRequestMsg) {
      TBEs.allocate(address);
      set_tbe(TBEs.lookup(address));
      tbe.Dirty := false;
      tbe.NumPendingAcks := 0;
      tbe.UntransferredOwnerExists := false;
    }
  }

  action(tv_allocateTBE, "tv", desc="allocate TBE Entry for TCC transactions") {
      check_allocate(TBEs);
    peek(w_TCCRequest_in, CPURequestMsg) {
      TBEs.allocate(address);
      set_tbe(TBEs.lookup(address));
      tbe.DataBlk := in_msg.DataBlk; // Data only for WBs
      tbe.Dirty := false;
      tbe.OriginalRequestor := in_msg.Requestor;
      tbe.NumPendingAcks := 0;
      tbe.UntransferredOwnerExists := false;
    }
  }

  action(t_allocateTBE, "t", desc="allocate TBE Entry") {
      check_allocate(TBEs);//check whether resources are full
    peek(coreRequestNetwork_in, CPURequestMsg) {
      TBEs.allocate(address);
      set_tbe(TBEs.lookup(address));
      tbe.DataBlk := cache_entry.DataBlk; // Data only for WBs
      tbe.Dirty := false;
      tbe.Upgrade := false;
      tbe.OriginalRequestor := in_msg.Requestor;
      tbe.NumPendingAcks := 0;
      tbe.UntransferredOwnerExists := false;
      tbe.Sender := machineID;
    }
  }

  action(tr_allocateTBE, "tr", desc="allocate TBE Entry for recall") {
      check_allocate(TBEs);//check whether resources are full
      TBEs.allocate(address);
      set_tbe(TBEs.lookup(address));
      tbe.DataBlk := cache_entry.DataBlk; // Data only for WBs
      tbe.Dirty := false;
      tbe.Upgrade := false;
      tbe.OriginalRequestor := machineID; //Recall request, Self initiated
      tbe.NumPendingAcks := 0;
      tbe.UntransferredOwnerExists := false;
  }

  action(dt_deallocateTBE, "dt", desc="Deallocate TBE entry") {
    TBEs.deallocate(address);
    unset_tbe();
  }


  action(d_allocateDir, "d", desc="allocate Directory Cache") {
    if (is_invalid(cache_entry)) {
      set_cache_entry(directory.allocate(address, new Entry));
    }
  }

  action(dd_deallocateDir, "dd", desc="deallocate Directory Cache") {
    if (is_valid(cache_entry)) {
        directory.deallocate(address);
    }
    unset_cache_entry();
  }

  action(ss_sendStaleNotification, "ss", desc="stale data; nothing to writeback") {
     enqueue(responseToNB_out, ResponseMsg, issue_latency) {
         out_msg.addr := address;
         out_msg.Type := CoherenceResponseType:StaleNotif;
         out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
         out_msg.Sender := machineID;
         out_msg.MessageSize := MessageSizeType:Response_Control;
     }
  }

  action(wb_data, "wb", desc="write back data") {
    enqueue(responseToNB_out, ResponseMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:CPUData;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      if (tbe.Shared) {
        out_msg.NbReqShared := true;
      } else {
        out_msg.NbReqShared := false;
      }
      out_msg.State := CoherenceState:Shared; // faux info
      out_msg.MessageSize := MessageSizeType:Writeback_Data;
      DPRINTF(RubySlicc, "%s\n", out_msg);
    }
  }

  action(sf_setSharedFlip, "sf", desc="hit by shared probe, status may be different") {
    assert(is_valid(tbe));
    tbe.Shared := true;
  }

  action(y_writeDataToTBE, "y", desc="write Probe Data to TBE") {
    peek(responseNetwork_in, ResponseMsg) {
      if (!tbe.Dirty || in_msg.Dirty) {
        tbe.DataBlk := in_msg.DataBlk;
        tbe.Dirty := in_msg.Dirty;
      }
      if (in_msg.Hit) {
        tbe.Cached := true;
      }
    }
  }

  action(ty_writeTCCDataToTBE, "ty", desc="write TCC Probe Data to TBE") {
    peek(w_TCCResponse_in, ResponseMsg) {
      if (!tbe.Dirty || in_msg.Dirty) {
        tbe.DataBlk := in_msg.DataBlk;
        tbe.Dirty := in_msg.Dirty;
      }
      if (in_msg.Hit) {
        tbe.Cached := true;
      }
    }
  }


  action(ut_updateTag, "ut", desc="update Tag (i.e. set MRU)") {
    directory.setMRU(address);
  }

  // TRANSITIONS

  // Handling TCP/SQC requests (similar to how NB dir handles TCC events with some changes to account for stateful directory).


  // transitions from base
  transition(I, RdBlk, I_ES){TagArrayRead} {
    d_allocateDir;
    t_allocateTBE;
    n_issueRdBlk;
    i_popIncomingRequestQueue;
  }

  transition(I, RdBlkS, I_S){TagArrayRead} {
    d_allocateDir;
    t_allocateTBE;
    nS_issueRdBlkS;
    i_popIncomingRequestQueue;
  }


  transition(I_S, NB_AckS, BBB_S) {
    fa_forwardSysAck;
    pR_popResponseFromNBQueue;
  }

  transition(I_ES, NB_AckS, BBB_S) {
    fa_forwardSysAck;
    pR_popResponseFromNBQueue;
  }

 transition(I_ES, NB_AckE, BBB_E) {
    fa_forwardSysAck;
    pR_popResponseFromNBQueue;
  }

  transition({S_M, O_M}, {NB_AckCtoD,NB_AckM}, BBB_M) {
    fa_forwardSysAck;
    pR_popResponseFromNBQueue;
  }

  transition(I_M, NB_AckM, BBB_M) {
    fa_forwardSysAck;
    pR_popResponseFromNBQueue;
  }

  transition(BBB_M, CoreUnblock, M){TagArrayWrite} {
    c_clearOwner;
    cc_clearSharers;
    e_ownerIsUnblocker;
    uu_sendUnblock;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition(BBB_S, CoreUnblock, S){TagArrayWrite}  {
    as_addToSharers;
    uu_sendUnblock;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition(BBB_E, CoreUnblock, E){TagArrayWrite}  {
    as_addToSharers;
    uu_sendUnblock;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }


  transition(I, RdBlkM, I_M){TagArrayRead}  {
    d_allocateDir;
    t_allocateTBE;
    nM_issueRdBlkM;
    i_popIncomingRequestQueue;
  }

  //
  transition(S, {RdBlk, RdBlkS}, BBS_S){TagArrayRead} {
    t_allocateTBE;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    q_addOutstandingMergedSharer;
    i_popIncomingRequestQueue;
  }
  // Merging of read sharing into a single request
  transition(BBS_S, {RdBlk, RdBlkS}) {
    q_addOutstandingMergedSharer;
    i_popIncomingRequestQueue;
  }
  // Wait for probe acks to be complete
  transition(BBS_S, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBS_S, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  // Window for merging complete with this transition
  // Send responses to all outstanding
  transition(BBS_S, ProbeAcksComplete, BB_S) {
    sCS_sendCollectiveResponseS;
    pt_popTriggerQueue;
  }

  transition(BB_S, CoreUnblock, BB_S) {
    m_addUnlockerToSharers;
    j_popIncomingUnblockQueue;
  }

  transition(BB_S, LastCoreUnblock, S) {
    m_addUnlockerToSharers;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition(O, {RdBlk, RdBlkS}, BBO_O){TagArrayRead} {
    t_allocateTBE;
    pso_probeSharedDataOwner;
    q_addOutstandingMergedSharer;
    i_popIncomingRequestQueue;
  }
  // Merging of read sharing into a single request
  transition(BBO_O, {RdBlk, RdBlkS}) {
    q_addOutstandingMergedSharer;
    i_popIncomingRequestQueue;
  }

  // Wait for probe acks to be complete
  transition(BBO_O, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBO_O, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  // Window for merging complete with this transition
  // Send responses to all outstanding
  transition(BBO_O, ProbeAcksComplete, BB_OO) {
    sCS_sendCollectiveResponseS;
    pt_popTriggerQueue;
  }

  transition(BB_OO, CoreUnblock) {
    m_addUnlockerToSharers;
    j_popIncomingUnblockQueue;
  }

  transition(BB_OO, LastCoreUnblock, O){TagArrayWrite} {
    m_addUnlockerToSharers;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition(S, CPUWrite, BW_S){TagArrayRead} {
    t_allocateTBE;
    rC_removeCoreFromSharers;
    sT_sendRequestToTCC;
    i_popIncomingRequestQueue;
  }

  transition(E, CPUWrite, BW_E){TagArrayRead} {
    t_allocateTBE;
    rC_removeCoreFromSharers;
    sT_sendRequestToTCC;
    i_popIncomingRequestQueue;
  }

  transition(O, CPUWrite, BW_O){TagArrayRead} {
    t_allocateTBE;
    rCo_removeCoreFromOwner;
    rC_removeCoreFromSharers;
    sT_sendRequestToTCC;
    i_popIncomingRequestQueue;
  }

  transition(M, CPUWrite, BW_M){TagArrayRead} {
    t_allocateTBE;
    rCo_removeCoreFromOwner;
    rC_removeCoreFromSharers;
    sT_sendRequestToTCC;
    i_popIncomingRequestQueue;
  }

  transition(BW_S, TCCUnblock_Sharer, S){TagArrayWrite} {
    aT_addTCCToSharers;
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_S, TCCUnblock_NotValid, S){TagArrayWrite} {
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_E, TCCUnblock, E){TagArrayWrite} {
    cc_clearSharers;
    aT_addTCCToSharers;
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_E, TCCUnblock_NotValid, E) {
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_M, TCCUnblock, M) {
    c_clearOwner;
    cc_clearSharers;
    eT_ownerIsUnblocker;
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_M, TCCUnblock_NotValid, M) {
    // Note this transition should only be executed if we received a stale wb
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_O, TCCUnblock, O) {
    c_clearOwner;
    eT_ownerIsUnblocker;
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition(BW_O, TCCUnblock_NotValid, O) {
    // Note this transition should only be executed if we received a stale wb
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  // We lost the owner likely do to an invalidation racing with a 'O' wb
  transition(BW_O, TCCUnblock_Sharer, S) {
    c_clearOwner;
    aT_addTCCToSharers;
    dt_deallocateTBE;
    plu_popTCCUnblockQueue;
  }

  transition({BW_M, BW_S, BW_E, BW_O}, {PrbInv,PrbInvData,PrbShrData}) {
    ww_recycleProbeRequest;
  }

  transition(BRWD_I, {PrbInvData, PrbInv, PrbShrData}) {
    ww_recycleProbeRequest;
  }

  // Three step process: locally invalidate others, issue CtoD, wait for NB_AckCtoD
  transition(S, CtoD, BBS_UM) {TagArrayRead} {
    t_allocateTBE;
    lpc_probeInvCore;
    i2_probeInvL2;
    o_checkForAckCompletion;
    i_popIncomingRequestQueue;
  }

  transition(BBS_UM, CPUPrbResp, BBS_UM) {
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBS_UM, TCCPrbResp) {
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BBS_UM, ProbeAcksComplete, S_M) {
    rU_rememberUpgrade;
    nM_issueRdBlkM;
    pt_popTriggerQueue;
  }

  // Three step process: locally invalidate others, issue CtoD, wait for NB_AckCtoD
  transition(O, CtoD, BBO_UM){TagArrayRead} {
    t_allocateTBE;
    lpc_probeInvCore;
    i2_probeInvL2;
    o_checkForAckCompletion;
    i_popIncomingRequestQueue;
  }

  transition(BBO_UM, CPUPrbResp, BBO_UM) {
    ruo_rememberUntransferredOwner;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBO_UM, TCCPrbResp) {
    ruoT_rememberUntransferredOwnerTCC;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BBO_UM, ProbeAcksComplete, O_M) {
    rU_rememberUpgrade;
    nM_issueRdBlkM;
    pt_popTriggerQueue;
  }

  transition({S,E}, RdBlkM, BBS_M){TagArrayWrite} {
    t_allocateTBE;
    ldc_probeInvCoreData;
    ld2_probeInvL2Data;
    o_checkForAckCompletion;
    i_popIncomingRequestQueue;
  }

  transition(BBS_M, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    rR_removeResponderFromSharers;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBS_M, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BBS_M, ProbeAcksComplete, S_M) {
    nM_issueRdBlkM;
    pt_popTriggerQueue;
  }

  transition(O, RdBlkM, BBO_M){TagArrayRead} {
    t_allocateTBE;
    ldc_probeInvCoreData;
    ld2_probeInvL2Data;
    o_checkForAckCompletion;
    i_popIncomingRequestQueue;
  }

  transition(BBO_M, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    rR_removeResponderFromSharers;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(BBO_M, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BBO_M, ProbeAcksComplete, O_M) {
    nM_issueRdBlkM;
    pt_popTriggerQueue;
  }

  //
  transition(M, RdBlkM, BBM_M){TagArrayRead} {
    t_allocateTBE;
    ldc_probeInvCoreData;
    ld2_probeInvL2Data;
    i_popIncomingRequestQueue;
  }

  transition(BBM_M, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  // TCP recalled block before receiving probe
  transition({BBM_M, BBS_M, BBO_M}, {CPUWrite,NoCPUWrite}) {
    zz_recycleRequest;
  }

  transition(BBM_M, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BBM_M, ProbeAcksComplete, BB_M) {
    sM_sendResponseM;
    pt_popTriggerQueue;
  }

  transition(BB_M, CoreUnblock, M){TagArrayWrite} {
    e_ownerIsUnblocker;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition(M, {RdBlkS, RdBlk}, BBM_O){TagArrayRead} {
    t_allocateTBE;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    i_popIncomingRequestQueue;
  }

  transition(E, {RdBlkS, RdBlk}, BBM_O){TagArrayRead} {
    t_allocateTBE;
    eto_moveExSharerToOwner;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    i_popIncomingRequestQueue;
  }

  transition(BBM_O, CPUPrbResp) {
    ccr_copyCoreResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  transition(BBM_O, TCCPrbResp) {
    ctr_copyTCCResponseToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  transition(BBM_O, ProbeAcksComplete, BB_O) {
    sS_sendResponseS;
    pt_popTriggerQueue;
  }

  transition(BB_O, CoreUnblock, O){TagArrayWrite} {
    as_addToSharers;
    dt_deallocateTBE;
    j_popIncomingUnblockQueue;
  }

  transition({BBO_O, BBM_M, BBS_S, BBM_O, BB_M, BB_O, BB_S, BBO_UM, BBS_UM, BBS_M, BBO_M, BB_OO}, {PrbInvData, PrbInv,PrbShrData}) {
    ww_recycleProbeRequest;
  }

  transition({BBM_O, BBS_S, CP_S, CP_O, CP_SM, CP_OM, BBO_O}, {CPUWrite,NoCPUWrite}) {
    zz_recycleRequest;
  }

  // stale CtoD raced with external invalidation
  transition({I, CP_I, B_I, CP_IOM, CP_ISM, CP_OSIW, BRWD_I, BRW_I, BRD_I}, CtoD) {
    i_popIncomingRequestQueue;
  }

  // stale CtoD raced with internal RdBlkM
  transition({BBM_M, BBS_M, BBO_M, BBB_M, BBS_UM, BBO_UM}, CtoD) {
    i_popIncomingRequestQueue;
  }

  transition({E, M}, CtoD) {
    i_popIncomingRequestQueue;
  }


  // TCC-directory has sent out (And potentially received acks for) probes.
  // TCP/SQC replacement (known to be stale subsequent) are popped off.
  transition({BBO_UM, BBS_UM}, {CPUWrite,NoCPUWrite}) {
    nC_sendNullWBAckToCore;
    i_popIncomingRequestQueue;
  }

  transition(S_M, {NoCPUWrite, CPUWrite}) {
    zz_recycleRequest;
  }

  transition(O_M, {NoCPUWrite, CPUWrite}) {
    zz_recycleRequest;
  }


  transition({BBM_M, BBS_M, BBO_M, BBO_UM, BBS_UM}, {VicDirty, VicClean, VicDirtyLast, NoVic}) {
    nT_sendNullWBAckToTCC;
    pl_popTCCRequestQueue;
  }

  transition({CP_S, CP_O, CP_OM, CP_SM}, {VicDirty, VicClean, VicDirtyLast, CancelWB, NoVic}) {
    yy_recycleTCCRequestQueue;
  }

  // However, when TCCdir has sent out PrbSharedData, one cannot ignore.
  transition({BBS_S, BBO_O, BBM_O, S_M, O_M, BBB_M, BBB_S, BBB_E}, {VicDirty, VicClean, VicDirtyLast,CancelWB}) {
    yy_recycleTCCRequestQueue;
  }

  transition({BW_S,BW_E,BW_O, BW_M}, {VicDirty, VicClean, VicDirtyLast, NoVic}) {
    yy_recycleTCCRequestQueue;
  }

  transition({BW_S,BW_E,BW_O, BW_M}, CancelWB) {
   nT_sendNullWBAckToTCC;
   pl_popTCCRequestQueue;
  }


  /// recycle if waiting for unblocks.
  transition({BB_M,BB_O,BB_S,BB_OO}, {VicDirty, VicClean, VicDirtyLast,NoVic,CancelWB}) {
    yy_recycleTCCRequestQueue;
  }

  transition({BBS_S, BBO_O}, NoVic) {
   rT_removeTCCFromSharers;
   nT_sendNullWBAckToTCC;
   pl_popTCCRequestQueue;
  }

  // stale. Pop message and send dummy ack.
  transition({I_S, I_ES, I_M}, {VicDirty, VicClean, VicDirtyLast, NoVic}) {
    nT_sendNullWBAckToTCC;
    pl_popTCCRequestQueue;
  }

  transition(M,  VicDirtyLast, VM_I){TagArrayRead} {
    tv_allocateTBE;
    vd_victim;
    pl_popTCCRequestQueue;
  }

  transition(E,  VicDirty, VM_I){TagArrayRead} {
    tv_allocateTBE;
    vd_victim;
    pl_popTCCRequestQueue;
  }

  transition(O, VicDirty, VO_S){TagArrayRead} {
    tv_allocateTBE;
    vd_victim;
    pl_popTCCRequestQueue;
  }

  transition(O, {VicDirtyLast, VicClean}, VO_I){TagArrayRead} {
    tv_allocateTBE;
    vd_victim;
    pl_popTCCRequestQueue;
  }

  transition({E, S}, VicClean, VES_I){TagArrayRead} {
    tv_allocateTBE;
    vc_victim;
    pl_popTCCRequestQueue;
  }

  transition({O, S}, NoVic){TagArrayRead} {
    rT_removeTCCFromSharers;
    nT_sendNullWBAckToTCC;
    pl_popTCCRequestQueue;
  }

  transition({O,S}, NoCPUWrite){TagArrayRead} {
    rC_removeCoreFromSharers;
    nC_sendNullWBAckToCore;
    i_popIncomingRequestQueue;
  }

  transition({M,E}, NoCPUWrite){TagArrayRead} {
    rC_removeCoreFromSharers;
    nC_sendNullWBAckToCore;
    i_popIncomingRequestQueue;
  }

  // This can only happen if it is  race. (TCCdir sent out probes which caused this cancel in the first place.)
  transition({VM_I, VES_I, VO_I}, CancelWB) {
    pl_popTCCRequestQueue;
  }

  transition({VM_I, VES_I, VO_I}, NB_AckWB, I){TagArrayWrite} {
    c_clearOwner;
    cc_clearSharers;
    wb_data;
    fw2_forwardWBAck;
    dt_deallocateTBE;
    dd_deallocateDir;
    pR_popResponseFromNBQueue;
  }

  transition(VO_S, NB_AckWB, S){TagArrayWrite}  {
    c_clearOwner;
    wb_data;
    fw2_forwardWBAck;
    dt_deallocateTBE;
    pR_popResponseFromNBQueue;
  }

  transition(I_C, NB_AckWB, I){TagArrayWrite}  {
    c_clearOwner;
    cc_clearSharers;
    ss_sendStaleNotification;
    fw2_forwardWBAck;
    dt_deallocateTBE;
    dd_deallocateDir;
    pR_popResponseFromNBQueue;
  }

  transition(I_W, NB_AckWB, I) {
    ss_sendStaleNotification;
    dt_deallocateTBE;
    dd_deallocateDir;
    pR_popResponseFromNBQueue;
  }



  // Do not handle replacements, reads of any kind or writebacks from transients; recycle
  transition({I_M, I_ES, I_S, MO_I, ES_I, S_M, O_M, VES_I, VO_I, VO_S, VM_I, I_C, I_W}, {RdBlkS,RdBlkM,RdBlk,CtoD}) {
    zz_recycleRequest;
  }

  transition( VO_S, NoCPUWrite) {
    zz_recycleRequest;
  }

  transition({BW_M, BW_S, BW_O, BW_E}, {RdBlkS,RdBlkM,RdBlk,CtoD,NoCPUWrite, CPUWrite}) {
    zz_recycleRequest;
  }

  transition({BBB_M, BBB_S, BBB_E, BB_O, BB_M, BB_S, BB_OO}, { RdBlk, RdBlkS, RdBlkM, CPUWrite, NoCPUWrite}) {
    zz_recycleRequest;
  }

  transition({BBB_S, BBB_E, BB_O, BB_S, BB_OO}, { CtoD}) {
    zz_recycleRequest;
  }

  transition({BBS_UM, BBO_UM, BBM_M, BBM_O, BBS_M, BBO_M}, { RdBlk, RdBlkS, RdBlkM}) {
    zz_recycleRequest;
  }

  transition(BBM_O, CtoD) {
    zz_recycleRequest;
  }

  transition({BBS_S, BBO_O}, {RdBlkM, CtoD}) {
    zz_recycleRequest;
  }

  transition({B_I, CP_I, CP_S, CP_O, CP_OM, CP_SM, CP_IOM, CP_ISM, CP_OSIW, BRWD_I, BRW_I, BRD_I}, {RdBlk, RdBlkS, RdBlkM}) {
    zz_recycleRequest;
  }

  transition({CP_O, CP_S, CP_OM}, CtoD) {
    zz_recycleRequest;
  }

  // Ignore replacement related messages after probe got in.
  transition({CP_I, B_I, CP_IOM, CP_ISM, CP_OSIW, BRWD_I, BRW_I, BRD_I}, {CPUWrite, NoCPUWrite}) {
    zz_recycleRequest;
  }

  // Ignore replacement related messages after probes processed
  transition({I, I_S, I_ES, I_M, I_C, I_W}, {CPUWrite,NoCPUWrite}) {
      nC_sendNullWBAckToCore;
    i_popIncomingRequestQueue;
  }
  // cannot ignore cancel... otherwise TCP/SQC will be stuck in I_C
  transition({I, I_S, I_ES, I_M, I_C, I_W, S_M, M, O, E, S}, CPUWriteCancel){TagArrayRead}  {
    nC_sendNullWBAckToCore;
    i_popIncomingRequestQueue;
  }

  transition({CP_I, B_I, CP_IOM, CP_ISM, BRWD_I, BRW_I, BRD_I}, {NoVic, VicClean, VicDirty, VicDirtyLast}){
    nT_sendNullWBAckToTCC;
    pl_popTCCRequestQueue;
  }

  // Handling Probes from NB (General process: (1) propagate up, go to blocking state (2) process acks (3) on last ack downward.)

  // step 1
  transition({M, O, E, S}, PrbInvData, CP_I){TagArrayRead} {
    tp_allocateTBE;
    dc_probeInvCoreData;
    d2_probeInvL2Data;
    pp_popProbeQueue;
  }
  // step 2a
  transition(CP_I, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_I, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_I, ProbeAcksComplete, I){TagArrayWrite} {
    pd_sendProbeResponseData;
    c_clearOwner;
    cc_clearSharers;
    dt_deallocateTBE;
    dd_deallocateDir;
    pt_popTriggerQueue;
  }

  // step 1
  transition({M, O, E, S}, PrbInv, B_I){TagArrayWrite} {
    tp_allocateTBE;
    ipc_probeInvCore;
    i2_probeInvL2;
    pp_popProbeQueue;
  }
  // step 2
  transition(B_I, CPUPrbResp) {
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(B_I, TCCPrbResp) {
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(B_I, ProbeAcksComplete, I){TagArrayWrite} {
    // send response down to NB
    pi_sendProbeResponseInv;
    c_clearOwner;
    cc_clearSharers;
    dt_deallocateTBE;
    dd_deallocateDir;
    pt_popTriggerQueue;
  }


  // step 1
  transition({M, O}, PrbShrData, CP_O){TagArrayRead} {
    tp_allocateTBE;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    pp_popProbeQueue;
  }

  transition(E, PrbShrData, CP_O){TagArrayRead} {
    tp_allocateTBE;
    eto_moveExSharerToOwner;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    pp_popProbeQueue;
  }
  // step 2
  transition(CP_O, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_O, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_O, ProbeAcksComplete, O){TagArrayWrite} {
    // send response down to NB
    pd_sendProbeResponseData;
    dt_deallocateTBE;
    pt_popTriggerQueue;
  }

  //step 1
  transition(S, PrbShrData, CP_S) {
    tp_allocateTBE;
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    pp_popProbeQueue;
  }
  // step 2
  transition(CP_S, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_S, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_S, ProbeAcksComplete, S) {
    // send response down to NB
    pd_sendProbeResponseData;
    dt_deallocateTBE;
    pt_popTriggerQueue;
  }

  // step 1
  transition(O_M, PrbInvData, CP_IOM) {
    dc_probeInvCoreData;
    d2_probeInvL2Data;
    pp_popProbeQueue;
  }
  // step 2a
  transition(CP_IOM, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_IOM, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_IOM, ProbeAcksComplete, I_M) {
    pdm_sendProbeResponseDataMs;
    c_clearOwner;
    cc_clearSharers;
    cd_clearDirtyBitTBE;
    pt_popTriggerQueue;
  }

  transition(CP_IOM, ProbeAcksCompleteReissue, I){TagArrayWrite} {
    pdm_sendProbeResponseDataMs;
    c_clearOwner;
    cc_clearSharers;
    dt_deallocateTBE;
    dd_deallocateDir;
    pt_popTriggerQueue;
  }

  // step 1
  transition(S_M, PrbInvData, CP_ISM) {
    dc_probeInvCoreData;
    d2_probeInvL2Data;
    o_checkForAckCompletion;
    pp_popProbeQueue;
  }
  // step 2a
  transition(CP_ISM, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_ISM, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_ISM, ProbeAcksComplete, I_M) {
    pdm_sendProbeResponseDataMs;
    c_clearOwner;
    cc_clearSharers;
    cd_clearDirtyBitTBE;

    //dt_deallocateTBE;
    pt_popTriggerQueue;
  }
  transition(CP_ISM, ProbeAcksCompleteReissue, I){TagArrayWrite} {
    pim_sendProbeResponseInvMs;
    c_clearOwner;
    cc_clearSharers;
    dt_deallocateTBE;
    dd_deallocateDir;
    pt_popTriggerQueue;
  }

  // step 1
  transition({S_M, O_M}, {PrbInv}, CP_ISM) {
    dc_probeInvCoreData;
    d2_probeInvL2Data;
    pp_popProbeQueue;
  }
  // next steps inherited from BS_ISM

  // Simpler cases

  transition({I_C, I_W}, {PrbInvData, PrbInv, PrbShrData}) {
    pi_sendProbeResponseInv;
    pp_popProbeQueue;
  }

  //If the directory is certain that the block is not present, one can send an acknowledgement right away.
  // No need for three step process.
  transition(I, {PrbInv,PrbShrData,PrbInvData}){TagArrayRead} {
    pi_sendProbeResponseInv;
    pp_popProbeQueue;
  }

  transition({I_M, I_ES, I_S}, {PrbInv, PrbInvData}) {
    pi_sendProbeResponseInv;
    pp_popProbeQueue;
  }

  transition({I_M, I_ES, I_S}, PrbShrData) {
    prm_sendProbeResponseMiss;
    pp_popProbeQueue;
  }

  //step 1
  transition(S_M, PrbShrData, CP_SM) {
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    o_checkForAckCompletion;
    pp_popProbeQueue;
  }
  // step 2
  transition(CP_SM, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_SM, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_SM, {ProbeAcksComplete,ProbeAcksCompleteReissue}, S_M){DataArrayRead} {
    // send response down to NB
    pd_sendProbeResponseData;
    pt_popTriggerQueue;
  }

  //step 1
  transition(O_M, PrbShrData, CP_OM) {
    sc_probeShrCoreData;
    s2_probeShrL2Data;
    pp_popProbeQueue;
  }
  // step 2
  transition(CP_OM, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }
  // step 2b
  transition(CP_OM, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  // step 3
  transition(CP_OM, {ProbeAcksComplete,ProbeAcksCompleteReissue}, O_M) {
    // send response down to NB
    pd_sendProbeResponseData;
    pt_popTriggerQueue;
  }

  transition(BRW_I, PrbInvData, I_W) {
     pd_sendProbeResponseData;
     pp_popProbeQueue;
   }

  transition({VM_I,VO_I}, PrbInvData, I_C) {
    pd_sendProbeResponseData;
    pp_popProbeQueue;
  }

  transition(VES_I, {PrbInvData,PrbInv}, I_C) {
    pi_sendProbeResponseInv;
    pp_popProbeQueue;
  }

  transition({VM_I, VO_I, BRW_I}, PrbInv, I_W) {
    pi_sendProbeResponseInv;
    pp_popProbeQueue;
  }

  transition({VM_I, VO_I, VO_S, VES_I, BRW_I}, PrbShrData) {
    pd_sendProbeResponseData;
    sf_setSharedFlip;
    pp_popProbeQueue;
  }

  transition(VO_S, PrbInvData, CP_OSIW) {
    dc_probeInvCoreData;
    d2_probeInvL2Data;
    pp_popProbeQueue;
  }

  transition(CP_OSIW, TCCPrbResp) {
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }
  transition(CP_OSIW, CPUPrbResp) {
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition(CP_OSIW, ProbeAcksComplete, I_C) {
    pd_sendProbeResponseData;
    cd_clearDirtyBitTBE;
    pt_popTriggerQueue;
  }

  transition({I, S, E, O, M, CP_O, CP_S, CP_OM, CP_SM, CP_OSIW, BW_S, BW_E, BW_O, BW_M, I_M, I_ES, I_S, BBS_S, BBO_O, BBM_M, BBM_O, BB_M, BB_O, BB_OO, BB_S, BBS_M, BBO_M, BBO_UM, BBS_UM, S_M, O_M, BBB_S, BBB_M, BBB_E, VES_I, VM_I, VO_I, VO_S, ES_I, MO_I, I_C, I_W}, StaleVic) {
      nT_sendNullWBAckToTCC;
      pl_popTCCRequestQueue;
  }

  transition({CP_I, B_I, CP_IOM, CP_ISM, BRWD_I, BRW_I, BRD_I}, StaleVic) {
      nT_sendNullWBAckToTCC;
      pl_popTCCRequestQueue;
  }

  // Recall Transistions
  // transient states still require the directory state
  transition({M, O}, Recall, BRWD_I) {
    tr_allocateTBE;
    vd_victim;
    dc_probeInvCoreData;
    d2_probeInvL2Data;
  }

  transition({E, S}, Recall, BRWD_I) {
    tr_allocateTBE;
    vc_victim;
    dc_probeInvCoreData;
    d2_probeInvL2Data;
  }

  transition(I, Recall) {
    dd_deallocateDir;
  }

  transition({BRWD_I, BRD_I}, CPUPrbResp) {
    y_writeDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    pk_popResponseQueue;
  }

  transition({BRWD_I, BRD_I}, TCCPrbResp) {
    ty_writeTCCDataToTBE;
    x_decrementAcks;
    o_checkForAckCompletion;
    plr_popTCCResponseQueue;
  }

  transition(BRWD_I, NB_AckWB, BRD_I) {
    pR_popResponseFromNBQueue;
  }

  transition(BRWD_I, ProbeAcksComplete, BRW_I) {
    pt_popTriggerQueue;
  }

  transition(BRW_I, NB_AckWB, I) {
    wb_data;
    dt_deallocateTBE;
    dd_deallocateDir;
    pR_popResponseFromNBQueue;
  }

  transition(BRD_I, ProbeAcksComplete, I) {
    wb_data;
    dt_deallocateTBE;
    dd_deallocateDir;
    pt_popTriggerQueue;
  }

  // wait for stable state for Recall
  transition({BRWD_I,BRD_I,BRW_I,CP_O, CP_S, CP_OM, CP_SM, CP_OSIW, BW_S, BW_E, BW_O, BW_M, I_M, I_ES, I_S, BBS_S, BBO_O, BBM_M, BBM_O, BB_M, BB_O, BB_OO, BB_S, BBS_M, BBO_M, BBO_UM, BBS_UM, S_M, O_M, BBB_S, BBB_M, BBB_E, VES_I, VM_I, VO_I, VO_S, ES_I, MO_I, I_C, I_W, CP_I}, Recall) {
    zz_recycleRequest; // stall and wait would be for the wrong address
    ut_updateTag; // try to find an easier recall
  }

}
