/*
 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
 * Copyright (c) 2009 Advanced Micro Devices, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * AMD's contributions to the MOESI hammer protocol do not constitute an
 * endorsement of its similarity to any AMD products.
 */

machine(MachineType:Directory, "AMD Hammer-like protocol")
    : DirectoryMemory * directory;
      CacheMemory * probeFilter;
      Cycles from_memory_controller_latency := 2;
      Cycles to_memory_controller_latency := 1;
      bool probe_filter_enabled := "False";
      bool full_bit_dir_enabled := "False";

      MessageBuffer * forwardFromDir, network="To", virtual_network="3",
            vnet_type="forward";

      MessageBuffer * responseFromDir, network="To", virtual_network="4",
            vnet_type="response";

      // For a finite buffered network, note that the DMA response network only
      // works at this relatively lower numbered (lower priority) virtual network
      // because the trigger queue decouples cache responses from DMA responses.
      MessageBuffer * dmaResponseFromDir, network="To", virtual_network="1",
            vnet_type="response";

      MessageBuffer * unblockToDir, network="From", virtual_network="5",
            vnet_type="unblock";

      MessageBuffer * responseToDir, network="From", virtual_network="4",
            vnet_type="response";

      MessageBuffer * requestToDir, network="From", virtual_network="2",
            vnet_type="request";

      MessageBuffer * dmaRequestToDir, network="From", virtual_network="0",
            vnet_type="request";

      MessageBuffer * triggerQueue;
      MessageBuffer * requestToMemory;
      MessageBuffer * responseFromMemory;
{
  // STATES
  state_declaration(State, desc="Directory states", default="Directory_State_E") {
    // Base states
    NX, AccessPermission:Maybe_Stale, desc="Not Owner, probe filter entry exists, block in O at Owner";
    NO, AccessPermission:Maybe_Stale, desc="Not Owner, probe filter entry exists, block in E/M at Owner";
    S, AccessPermission:Read_Only, desc="Data clean, probe filter entry exists pointing to the current owner";
    O, AccessPermission:Read_Only, desc="Data clean, probe filter entry exists";
    E, AccessPermission:Read_Write, desc="Exclusive Owner, no probe filter entry";

    O_R, AccessPermission:Read_Only, desc="Was data Owner, replacing probe filter entry";
    S_R, AccessPermission:Read_Only, desc="Was Not Owner or Sharer, replacing probe filter entry";
    NO_R, AccessPermission:Busy, desc="Was Not Owner or Sharer, replacing probe filter entry";

    NO_B, AccessPermission:Busy, "NO^B", desc="Not Owner, Blocked";
    NO_B_X, AccessPermission:Busy, "NO^B", desc="Not Owner, Blocked, next queued request GETX";
    NO_B_S, AccessPermission:Busy, "NO^B", desc="Not Owner, Blocked, next queued request GETS";
    NO_B_S_W, AccessPermission:Busy, "NO^B", desc="Not Owner, Blocked, forwarded merged GETS, waiting for responses";
    O_B, AccessPermission:Busy, "O^B", desc="Owner, Blocked";
    NO_B_W, AccessPermission:Busy, desc="Not Owner, Blocked, waiting for Dram";
    O_B_W, AccessPermission:Busy, desc="Owner, Blocked, waiting for Dram";
    NO_W, AccessPermission:Busy, desc="Not Owner, waiting for Dram";
    O_W, AccessPermission:Busy, desc="Owner, waiting for Dram";
    NO_DW_B_W, AccessPermission:Busy, desc="Not Owner, Dma Write waiting for Dram and cache responses";
    NO_DR_B_W, AccessPermission:Busy, desc="Not Owner, Dma Read waiting for Dram and cache responses";
    NO_DR_B_D, AccessPermission:Busy, desc="Not Owner, Dma Read waiting for cache responses including dirty data";
    NO_DR_B, AccessPermission:Busy, desc="Not Owner, Dma Read waiting for cache responses";
    NO_DW_W, AccessPermission:Busy, desc="Not Owner, Dma Write waiting for Dram";
    O_DR_B_W, AccessPermission:Busy, desc="Owner, Dma Read waiting for Dram and cache responses";
    O_DR_B, AccessPermission:Busy, desc="Owner, Dma Read waiting for cache responses";
    WB, AccessPermission:Busy, desc="Blocked on a writeback";
    WB_O_W, AccessPermission:Busy, desc="Blocked on memory write, will go to O";
    WB_E_W, AccessPermission:Busy, desc="Blocked on memory write, will go to E";

    NO_F,  AccessPermission:Busy, desc="Blocked on a flush";
    NO_F_W, AccessPermission:Busy, desc="Not Owner, Blocked, waiting for Dram";
  }

  // Events
  enumeration(Event, desc="Directory events") {
    GETX,                      desc="A GETX arrives";
    GETS,                      desc="A GETS arrives";
    PUT,                       desc="A PUT arrives";
    Unblock,                   desc="An unblock message arrives";
    UnblockS,                   desc="An unblock message arrives";
    UnblockM,                   desc="An unblock message arrives";
    Writeback_Clean,           desc="The final part of a PutX (no data)";
    Writeback_Dirty,           desc="The final part of a PutX (data)";
    Writeback_Exclusive_Clean, desc="The final part of a PutX (no data, exclusive)";
    Writeback_Exclusive_Dirty, desc="The final part of a PutX (data, exclusive)";

    // Probe filter
    Pf_Replacement,            desc="probe filter replacement";

    // DMA requests
    DMA_READ, desc="A DMA Read memory request";
    DMA_WRITE, desc="A DMA Write memory request";

    // Memory Controller
    Memory_Data, desc="Fetched data from memory arrives";
    Memory_Ack, desc="Writeback Ack from memory arrives";

    // Cache responses required to handle DMA
    Ack,             desc="Received an ack message";
    Shared_Ack,      desc="Received an ack message, responder has a shared copy";
    Shared_Data,     desc="Received a data message, responder has a shared copy";
    Data,            desc="Received a data message, responder had a owner or exclusive copy, they gave it to us";
    Exclusive_Data,  desc="Received a data message, responder had an exclusive copy, they gave it to us";

    // Triggers
    All_acks_and_shared_data,     desc="Received shared data and message acks";
    All_acks_and_owner_data,     desc="Received shared data and message acks";
    All_acks_and_data_no_sharers, desc="Received all acks and no other processor has a shared copy";
    All_Unblocks, desc="Received all unblocks for a merged gets request";
    GETF,  desc="A GETF arrives";
    PUTF,  desc="A PUTF arrives";
  }

  // TYPES

  // DirectoryEntry
  structure(Entry, desc="...", interface="AbstractCacheEntry", main="false") {
    State DirectoryState,          desc="Directory state";
  }

  // ProbeFilterEntry
  structure(PfEntry, desc="...", interface="AbstractCacheEntry") {
    State PfState,                 desc="Directory state";
    MachineID Owner,               desc="Owner node";
    Set Sharers,                   desc="sharing vector for full bit directory";
  }

  // TBE entries for DMA requests
  structure(TBE, desc="TBE entries for outstanding DMA requests") {
    Addr PhysicalAddress, desc="physical address";
    State TBEState,        desc="Transient State";
    CoherenceResponseType ResponseType, desc="The type for the subsequent response message";
    int Acks, default="0", desc="The number of acks that the waiting response represents";
    int SilentAcks, default="0", desc="The number of silent acks associated with this transaction";
    DataBlock DmaDataBlk,  desc="DMA Data to be written.  Partial blocks need to merged with system memory";
    DataBlock DataBlk,     desc="The current view of system memory";
    int Len,               desc="...";
    MachineID DmaRequestor, desc="DMA requestor";
    NetDest GetSRequestors, desc="GETS merged requestors";
    int NumPendingMsgs,    desc="Number of pending acks/messages";
    bool CacheDirty, default="false", desc="Indicates whether a cache has responded with dirty data";
    bool Sharers, default="false", desc="Indicates whether a cache has indicated it is currently a sharer";
    bool Owned, default="false", desc="Indicates whether a cache has indicated it is currently a sharer";
  }

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

  Tick clockEdge();
  void set_cache_entry(AbstractCacheEntry b);
  void unset_cache_entry();
  void set_tbe(TBE a);
  void unset_tbe();
  void wakeUpBuffers(Addr a);
  Cycles curCycle();

  // ** OBJECTS **

  Set fwd_set;

  TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";

  Entry getDirectoryEntry(Addr addr), return_by_pointer="yes" {
    Entry dir_entry := static_cast(Entry, "pointer", directory[addr]);

    if (is_valid(dir_entry)) {
      return dir_entry;
    }

    dir_entry :=  static_cast(Entry, "pointer",
                              directory.allocate(addr, new Entry));
    return dir_entry;
  }

  PfEntry getProbeFilterEntry(Addr addr), return_by_pointer="yes" {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      PfEntry pfEntry := static_cast(PfEntry, "pointer", probeFilter.lookup(addr));
      return pfEntry;
    }
    return OOD;
  }

  State getState(TBE tbe, PfEntry pf_entry, Addr addr) {
    if (is_valid(tbe)) {
      return tbe.TBEState;
    } else {
      if (probe_filter_enabled || full_bit_dir_enabled) {
        if (is_valid(pf_entry)) {
          assert(pf_entry.PfState == getDirectoryEntry(addr).DirectoryState);
        }
      }
      return getDirectoryEntry(addr).DirectoryState;
    }
  }

  void setState(TBE tbe, PfEntry pf_entry, Addr addr, State state) {
    if (is_valid(tbe)) {
      tbe.TBEState := state;
    }
    if (probe_filter_enabled || full_bit_dir_enabled) {
      if (is_valid(pf_entry)) {
        pf_entry.PfState := state;
      }
      if (state == State:NX || state == State:NO || state == State:S || state == State:O) {
        assert(is_valid(pf_entry));
      }
      if (state == State:E) {
        assert(is_valid(pf_entry) == false);
      }
    }
    if (state == State:E || state == State:NX || state == State:NO || state == State:S ||
        state == State:O) {
      assert(is_valid(tbe) == false);
    }
    getDirectoryEntry(addr).DirectoryState := state;
  }

  AccessPermission getAccessPermission(Addr addr) {
    TBE tbe := TBEs[addr];
    if(is_valid(tbe)) {
      return Directory_State_to_permission(tbe.TBEState);
    }

    if(directory.isPresent(addr)) {
      return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState);
    }

    return AccessPermission:NotPresent;
  }

  void setAccessPermission(PfEntry pf_entry, Addr addr, State state) {
    getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state));
  }

  void functionalRead(Addr addr, Packet *pkt) {
    TBE tbe := TBEs[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[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;
  }

  Event cache_request_to_event(CoherenceRequestType type) {
    if (type == CoherenceRequestType:GETS) {
      return Event:GETS;
    } else if (type == CoherenceRequestType:GETX) {
      return Event:GETX;
    } else if (type == CoherenceRequestType:GETF) {
      return Event:GETF;
    } else {
      error("Invalid CoherenceRequestType");
    }
  }

  // ** OUT_PORTS **
  out_port(requestQueue_out, ResponseMsg, requestToDir); // For recycling requests
  out_port(forwardNetwork_out, RequestMsg, forwardFromDir);
  out_port(memQueue_out, MemoryMsg, requestToMemory);
  out_port(responseNetwork_out, ResponseMsg, responseFromDir);
  out_port(dmaResponseNetwork_out, DMAResponseMsg, dmaResponseFromDir);
  out_port(triggerQueue_out, TriggerMsg, triggerQueue);

  // ** IN_PORTS **

  // Trigger Queue
  in_port(triggerQueue_in, TriggerMsg, triggerQueue, rank=5) {
    if (triggerQueue_in.isReady(clockEdge())) {
      peek(triggerQueue_in, TriggerMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];
        if (in_msg.Type == TriggerType:ALL_ACKS) {
          trigger(Event:All_acks_and_owner_data, in_msg.addr,
                  pf_entry, tbe);
        } else if (in_msg.Type == TriggerType:ALL_ACKS_OWNER_EXISTS) {
          trigger(Event:All_acks_and_shared_data, in_msg.addr,
                  pf_entry, tbe);
        } else if (in_msg.Type == TriggerType:ALL_ACKS_NO_SHARERS) {
          trigger(Event:All_acks_and_data_no_sharers, in_msg.addr,
                  pf_entry, tbe);
        } else if (in_msg.Type == TriggerType:ALL_UNBLOCKS) {
          trigger(Event:All_Unblocks, in_msg.addr,
                  pf_entry, tbe);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  in_port(unblockNetwork_in, ResponseMsg, unblockToDir, rank=4) {
    if (unblockNetwork_in.isReady(clockEdge())) {
      peek(unblockNetwork_in, ResponseMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];
        if (in_msg.Type == CoherenceResponseType:UNBLOCK) {
          trigger(Event:Unblock, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:UNBLOCKS) {
          trigger(Event:UnblockS, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:UNBLOCKM) {
          trigger(Event:UnblockM, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:WB_CLEAN) {
          trigger(Event:Writeback_Clean, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:WB_DIRTY) {
          trigger(Event:Writeback_Dirty, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:WB_EXCLUSIVE_CLEAN) {
          trigger(Event:Writeback_Exclusive_Clean, in_msg.addr,
                  pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:WB_EXCLUSIVE_DIRTY) {
          trigger(Event:Writeback_Exclusive_Dirty, in_msg.addr,
                  pf_entry, tbe);
        } else {
          error("Invalid message");
        }
      }
    }
  }

  // Response Network
  in_port(responseToDir_in, ResponseMsg, responseToDir, rank=3) {
    if (responseToDir_in.isReady(clockEdge())) {
      peek(responseToDir_in, ResponseMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];
        if (in_msg.Type == CoherenceResponseType:ACK) {
          trigger(Event:Ack, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:ACK_SHARED) {
          trigger(Event:Shared_Ack, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA_SHARED) {
          trigger(Event:Shared_Data, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA) {
          trigger(Event:Data, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) {
          trigger(Event:Exclusive_Data, in_msg.addr, pf_entry, tbe);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  // off-chip memory request/response is done
  in_port(memQueue_in, MemoryMsg, responseFromMemory, rank=2) {
    if (memQueue_in.isReady(clockEdge())) {
      peek(memQueue_in, MemoryMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];
        if (in_msg.Type == MemoryRequestType:MEMORY_READ) {
          trigger(Event:Memory_Data, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == MemoryRequestType:MEMORY_WB) {
          trigger(Event:Memory_Ack, in_msg.addr, pf_entry, tbe);
        } else {
          DPRINTF(RubySlicc, "%d\n", in_msg.Type);
          error("Invalid message");
        }
      }
    }
  }

  in_port(requestQueue_in, RequestMsg, requestToDir, rank=1) {
    if (requestQueue_in.isReady(clockEdge())) {
      peek(requestQueue_in, RequestMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];
        if (in_msg.Type == CoherenceRequestType:PUT) {
          trigger(Event:PUT, in_msg.addr, pf_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:PUTF) {
          trigger(Event:PUTF, in_msg.addr, pf_entry, tbe);
        } else {
          if (probe_filter_enabled || full_bit_dir_enabled) {
            if (is_valid(pf_entry)) {
              trigger(cache_request_to_event(in_msg.Type), in_msg.addr,
                      pf_entry, tbe);
            } else {
              if (probeFilter.cacheAvail(in_msg.addr)) {
                trigger(cache_request_to_event(in_msg.Type), in_msg.addr,
                        pf_entry, tbe);
              } else {
                Addr victim := probeFilter.cacheProbe(in_msg.addr);
                trigger(Event:Pf_Replacement,
                        victim, getProbeFilterEntry(victim), TBEs[victim]);
              }
            }
          } else {
            trigger(cache_request_to_event(in_msg.Type), in_msg.addr,
                    pf_entry, tbe);
          }
        }
      }
    }
  }

  in_port(dmaRequestQueue_in, DMARequestMsg, dmaRequestToDir, rank=0) {
    if (dmaRequestQueue_in.isReady(clockEdge())) {
      peek(dmaRequestQueue_in, DMARequestMsg) {
        PfEntry pf_entry := getProbeFilterEntry(in_msg.LineAddress);
        TBE tbe := TBEs[in_msg.LineAddress];
        if (in_msg.Type == DMARequestType:READ) {
          trigger(Event:DMA_READ, in_msg.LineAddress, pf_entry, tbe);
        } else if (in_msg.Type == DMARequestType:WRITE) {
          trigger(Event:DMA_WRITE, in_msg.LineAddress, pf_entry, tbe);
        } else {
          error("Invalid message");
        }
      }
    }
  }

  // Actions

  action(r_setMRU, "\rr", desc="manually set the MRU bit for pf entry" ) {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      assert(is_valid(cache_entry));
      probeFilter.setMRU(address);
    }
  }

  action(auno_assertUnblockerNotOwner, "auno", desc="assert unblocker not owner") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      assert(is_valid(cache_entry));
      peek(unblockNetwork_in, ResponseMsg) {
        assert(cache_entry.Owner != in_msg.Sender);
        if (full_bit_dir_enabled) {
          assert(cache_entry.Sharers.isElement(machineIDToNodeID(in_msg.Sender)) == false);
        }
      }
    }
  }

  action(uo_updateOwnerIfPf, "uo", desc="update owner") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      assert(is_valid(cache_entry));
      peek(unblockNetwork_in, ResponseMsg) {
        cache_entry.Owner := in_msg.Sender;
        if (full_bit_dir_enabled) {
          cache_entry.Sharers.clear();
          cache_entry.Sharers.add(machineIDToNodeID(in_msg.Sender));
          APPEND_TRANSITION_COMMENT(cache_entry.Sharers);
          DPRINTF(RubySlicc, "Sharers = %d\n", cache_entry.Sharers);
        }
      }
    }
  }

  action(us_updateSharerIfFBD, "us", desc="update sharer if full-bit directory") {
   if (full_bit_dir_enabled) {
      assert(probeFilter.isTagPresent(address));
      peek(unblockNetwork_in, ResponseMsg) {
        cache_entry.Sharers.add(machineIDToNodeID(in_msg.Sender));
      }
    }
  }

  action(a_sendWriteBackAck, "a", desc="Send writeback ack to requestor") {
    peek(requestQueue_in, RequestMsg) {
      enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:WB_ACK;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(oc_sendBlockAck, "oc", desc="Send block ack to the owner") {
    peek(requestQueue_in, RequestMsg) {
        if (((probe_filter_enabled || full_bit_dir_enabled) && (in_msg.Requestor == cache_entry.Owner)) || machineCount(MachineType:L1Cache) == 1) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := CoherenceRequestType:BLOCK_ACK;
          out_msg.Requestor := in_msg.Requestor;
          out_msg.Destination.add(in_msg.Requestor);
          out_msg.MessageSize := MessageSizeType:Writeback_Control;
        }
      }
    }
  }

  action(b_sendWriteBackNack, "b", desc="Send writeback nack to requestor") {
    peek(requestQueue_in, RequestMsg) {
      enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:WB_NACK;
        out_msg.Requestor := in_msg.Requestor;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(pfa_probeFilterAllocate, "pfa", desc="Allocate ProbeFilterEntry") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      peek(requestQueue_in, RequestMsg) {
        set_cache_entry(probeFilter.allocate(address, new PfEntry));
        cache_entry.Owner := in_msg.Requestor;
        cache_entry.Sharers.setSize(machineCount(MachineType:L1Cache));
      }
    }
  }

  action(pfd_probeFilterDeallocate, "pfd", desc="Deallocate ProbeFilterEntry") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      probeFilter.deallocate(address);
      unset_cache_entry();
    }
  }

  action(ppfd_possibleProbeFilterDeallocate, "ppfd", desc="Deallocate ProbeFilterEntry") {
    if ((probe_filter_enabled || full_bit_dir_enabled) && is_valid(cache_entry)) {
      probeFilter.deallocate(address);
      unset_cache_entry();
    }
  }

  action(v_allocateTBE, "v", desc="Allocate TBE") {
    check_allocate(TBEs);
    peek(requestQueue_in, RequestMsg) {
      TBEs.allocate(address);
      set_tbe(TBEs[address]);
      tbe.PhysicalAddress := address;
      tbe.ResponseType := CoherenceResponseType:NULL;
    }
  }

  action(vd_allocateDmaRequestInTBE, "vd", desc="Record Data in TBE") {
    check_allocate(TBEs);
    peek(dmaRequestQueue_in, DMARequestMsg) {
      TBEs.allocate(address);
      set_tbe(TBEs[address]);
      tbe.DmaDataBlk := in_msg.DataBlk;
      tbe.PhysicalAddress := in_msg.PhysicalAddress;
      tbe.Len := in_msg.Len;
      tbe.DmaRequestor := in_msg.Requestor;
      tbe.ResponseType := CoherenceResponseType:DATA_EXCLUSIVE;
      //
      // One ack for each last-level cache
      //
      tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
      //
      // Assume initially that the caches store a clean copy and that memory
      // will provide the data
      //
      tbe.CacheDirty := false;
    }
  }

  action(pa_setPendingMsgsToAll, "pa", desc="set pending msgs to all") {
    assert(is_valid(tbe));
    if (full_bit_dir_enabled) {
      assert(is_valid(cache_entry));
      tbe.NumPendingMsgs := cache_entry.Sharers.count();
    } else {
      tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
    }
  }

  action(po_setPendingMsgsToOne, "po", desc="set pending msgs to one") {
    assert(is_valid(tbe));
    tbe.NumPendingMsgs := 1;
  }

  action(w_deallocateTBE, "w", desc="Deallocate TBE") {
    TBEs.deallocate(address);
    unset_tbe();
  }

  action(sa_setAcksToOne, "sa", desc="Forwarded request, set the ack amount to one") {
    assert(is_valid(tbe));
    peek(requestQueue_in, RequestMsg) {
      if (full_bit_dir_enabled) {
        assert(is_valid(cache_entry));
        //
        // If we are using the full-bit directory and no sharers exists beyond
        // the requestor, then we must set the ack number to all, not one
        //
        fwd_set := cache_entry.Sharers;
        fwd_set.remove(machineIDToNodeID(in_msg.Requestor));
        if (fwd_set.count() > 0) {
          tbe.Acks := 1;
          tbe.SilentAcks := machineCount(MachineType:L1Cache) - fwd_set.count();
          tbe.SilentAcks := tbe.SilentAcks - 1;
        } else {
          tbe.Acks := machineCount(MachineType:L1Cache);
          tbe.SilentAcks := 0;
        }
      } else {
        tbe.Acks := 1;
      }
    }
  }

  action(saa_setAcksToAllIfPF, "saa", desc="Non-forwarded request, set the ack amount to all") {
    assert(is_valid(tbe));
    if (probe_filter_enabled || full_bit_dir_enabled) {
      tbe.Acks := machineCount(MachineType:L1Cache);
      tbe.SilentAcks := 0;
    } else {
      tbe.Acks := 1;
    }
  }

  action(m_decrementNumberOfMessages, "m", desc="Decrement the number of messages for which we're waiting") {
    peek(responseToDir_in, ResponseMsg) {
      assert(is_valid(tbe));
      assert(in_msg.Acks > 0);
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
      //
      // Note that cache data responses will have an ack count of 2.  However,
      // directory DMA requests must wait for acks from all LLC caches, so
      // only decrement by 1.
      //
      if ((in_msg.Type == CoherenceResponseType:DATA_SHARED) ||
          (in_msg.Type == CoherenceResponseType:DATA) ||
          (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE)) {
        tbe.NumPendingMsgs := tbe.NumPendingMsgs - 1;
      } else {
        tbe.NumPendingMsgs := tbe.NumPendingMsgs - in_msg.Acks;
      }
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
    }
  }

  action(mu_decrementNumberOfUnblocks, "mu", desc="Decrement the number of messages for which we're waiting") {
    peek(unblockNetwork_in, ResponseMsg) {
      assert(is_valid(tbe));
      assert(in_msg.Type == CoherenceResponseType:UNBLOCKS);
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
      tbe.NumPendingMsgs := tbe.NumPendingMsgs - 1;
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
    }
  }

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

  action(o_checkForCompletion, "o", desc="Check if we have received all the messages required for completion") {
    assert(is_valid(tbe));
    if (tbe.NumPendingMsgs == 0) {
      enqueue(triggerQueue_out, TriggerMsg) {
        out_msg.addr := address;
        if (tbe.Sharers) {
          if (tbe.Owned) {
            out_msg.Type := TriggerType:ALL_ACKS_OWNER_EXISTS;
          } else {
            out_msg.Type := TriggerType:ALL_ACKS;
          }
        } else {
          out_msg.Type := TriggerType:ALL_ACKS_NO_SHARERS;
        }
      }
    }
  }

  action(os_checkForMergedGetSCompletion, "os", desc="Check for merged GETS completion") {
    assert(is_valid(tbe));
    if (tbe.NumPendingMsgs == 0) {
      enqueue(triggerQueue_out, TriggerMsg) {
        out_msg.addr := address;
        out_msg.Type := TriggerType:ALL_UNBLOCKS;
      }
    }
  }

  action(sp_setPendingMsgsToMergedSharers, "sp", desc="Set pending messages to waiting sharers") {
    assert(is_valid(tbe));
    tbe.NumPendingMsgs := tbe.GetSRequestors.count();
  }

  action(spa_setPendingAcksToZeroIfPF, "spa", desc="if probe filter, no need to wait for acks") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      assert(is_valid(tbe));
      tbe.NumPendingMsgs := 0;
    }
  }

  action(sc_signalCompletionIfPF, "sc", desc="indicate that we should skip waiting for cpu acks") {
    assert(is_valid(tbe));
    if (tbe.NumPendingMsgs == 0) {
      assert(probe_filter_enabled || full_bit_dir_enabled);
      enqueue(triggerQueue_out, TriggerMsg) {
        out_msg.addr := address;
        out_msg.Type := TriggerType:ALL_ACKS_NO_SHARERS;
      }
    }
  }

  action(d_sendData, "d", desc="Send data to requestor") {
    peek(memQueue_in, MemoryMsg) {
      enqueue(responseNetwork_out, ResponseMsg, 1) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := tbe.ResponseType;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.OriginalRequestorMachId);
        out_msg.DataBlk := in_msg.DataBlk;
        DPRINTF(RubySlicc, "%s\n", out_msg.DataBlk);
        out_msg.Dirty := false; // By definition, the block is now clean
        out_msg.Acks := tbe.Acks;
        out_msg.SilentAcks := tbe.SilentAcks;
        DPRINTF(RubySlicc, "%d\n", out_msg.Acks);
        assert(out_msg.Acks > 0);
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
  }

  action(dr_sendDmaData, "dr", desc="Send Data to DMA controller from memory") {
    peek(memQueue_in, MemoryMsg) {
      enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) {
        assert(is_valid(tbe));
        out_msg.PhysicalAddress := address;
        out_msg.LineAddress := address;
        out_msg.Type := DMAResponseType:DATA;
        //
        // we send the entire data block and rely on the dma controller to
        // split it up if need be
        //
        out_msg.DataBlk := in_msg.DataBlk;
        out_msg.Destination.add(tbe.DmaRequestor);
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
  }

  action(dt_sendDmaDataFromTbe, "dt", desc="Send Data to DMA controller from tbe") {
    peek(triggerQueue_in, TriggerMsg) {
      enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) {
        assert(is_valid(tbe));
        out_msg.PhysicalAddress := address;
        out_msg.LineAddress := address;
        out_msg.Type := DMAResponseType:DATA;
        //
        // we send the entire data block and rely on the dma controller to
        // split it up if need be
        //
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Destination.add(tbe.DmaRequestor);
        out_msg.MessageSize := MessageSizeType:Response_Data;
      }
    }
  }

  action(da_sendDmaAck, "da", desc="Send Ack to DMA controller") {
    enqueue(dmaResponseNetwork_out, DMAResponseMsg, 1) {
      assert(is_valid(tbe));
      out_msg.PhysicalAddress := address;
      out_msg.LineAddress := address;
      out_msg.Type := DMAResponseType:ACK;
      out_msg.Destination.add(tbe.DmaRequestor);
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  action(rx_recordExclusiveInTBE, "rx", desc="Record Exclusive in TBE") {
    peek(requestQueue_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.ResponseType := CoherenceResponseType:DATA_EXCLUSIVE;
    }
  }

  action(r_recordDataInTBE, "rt", desc="Record Data in TBE") {
    peek(requestQueue_in, RequestMsg) {
      assert(is_valid(tbe));
      if (full_bit_dir_enabled) {
        fwd_set := cache_entry.Sharers;
        fwd_set.remove(machineIDToNodeID(in_msg.Requestor));
        if (fwd_set.count() > 0) {
          tbe.ResponseType := CoherenceResponseType:DATA;
        } else {
          tbe.ResponseType := CoherenceResponseType:DATA_EXCLUSIVE;
        }
      } else {
        tbe.ResponseType := CoherenceResponseType:DATA;
      }
    }
  }

  action(rs_recordGetSRequestor, "rs", desc="Record GETS requestor in TBE") {
    peek(requestQueue_in, RequestMsg) {
      assert(is_valid(tbe));
      tbe.GetSRequestors.add(in_msg.Requestor);
    }
  }

  action(r_setSharerBit, "r", desc="We saw other sharers") {
    assert(is_valid(tbe));
    tbe.Sharers := true;
  }

  action(so_setOwnerBit, "so", desc="We saw other sharers") {
    assert(is_valid(tbe));
    tbe.Sharers := true;
    tbe.Owned := true;
  }

  action(qf_queueMemoryFetchRequest, "qf", desc="Queue off-chip fetch request") {
    peek(requestQueue_in, RequestMsg) {
      enqueue(memQueue_out, MemoryMsg, to_memory_controller_latency) {
        out_msg.addr := address;
        out_msg.Type := MemoryRequestType:MEMORY_READ;
        out_msg.Sender := in_msg.Requestor;
        out_msg.MessageSize := MessageSizeType:Request_Control;
        out_msg.Len := 0;
      }
    }
  }

  action(qd_queueMemoryRequestFromDmaRead, "qd", desc="Queue off-chip fetch request") {
    peek(dmaRequestQueue_in, DMARequestMsg) {
      enqueue(memQueue_out, MemoryMsg, to_memory_controller_latency) {
        out_msg.addr := address;
        out_msg.Type := MemoryRequestType:MEMORY_READ;
        out_msg.Sender := in_msg.Requestor;
        out_msg.MessageSize := MessageSizeType:Request_Control;
        out_msg.Len := 0;
      }
    }
  }

  action(fn_forwardRequestIfNecessary, "fn", desc="Forward requests if necessary") {
    assert(is_valid(tbe));
    if ((machineCount(MachineType:L1Cache) > 1) && (tbe.Acks <= 1)) {
      if (full_bit_dir_enabled) {
        assert(is_valid(cache_entry));
        peek(requestQueue_in, RequestMsg) {
          fwd_set := cache_entry.Sharers;
          fwd_set.remove(machineIDToNodeID(in_msg.Requestor));
          if (fwd_set.count() > 0) {
            enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
              out_msg.addr := address;
              out_msg.Type := in_msg.Type;
              out_msg.Requestor := in_msg.Requestor;
              out_msg.Destination.setNetDest(MachineType:L1Cache, fwd_set);
              out_msg.MessageSize := MessageSizeType:Multicast_Control;
              out_msg.InitialRequestTime := in_msg.InitialRequestTime;
              out_msg.ForwardRequestTime := curCycle();
              assert(tbe.SilentAcks > 0);
              out_msg.SilentAcks := tbe.SilentAcks;
            }
          }
        }
      } else {
        peek(requestQueue_in, RequestMsg) {
          enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
            out_msg.addr := address;
            out_msg.Type := in_msg.Type;
            out_msg.Requestor := in_msg.Requestor;
            out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all L1 caches
            out_msg.Destination.remove(in_msg.Requestor); // Don't include the original requestor
            out_msg.MessageSize := MessageSizeType:Broadcast_Control;
            out_msg.InitialRequestTime := in_msg.InitialRequestTime;
            out_msg.ForwardRequestTime := curCycle();
          }
        }
      }
    }
  }

  action(ia_invalidateAllRequest, "ia", desc="invalidate all copies") {
    if (machineCount(MachineType:L1Cache) > 1) {
      if (full_bit_dir_enabled) {
        assert(cache_entry.Sharers.count() > 0);
        peek(requestQueue_in, RequestMsg) {
          enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
            out_msg.addr := address;
            out_msg.Type := CoherenceRequestType:INV;
            out_msg.Requestor := machineID;
            out_msg.Destination.setNetDest(MachineType:L1Cache, cache_entry.Sharers);
            out_msg.MessageSize := MessageSizeType:Multicast_Control;
          }
        }
      } else {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := CoherenceRequestType:INV;
          out_msg.Requestor := machineID;
          out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all L1 caches
          out_msg.MessageSize := MessageSizeType:Broadcast_Control;
        }
      }
    }
  }

  action(io_invalidateOwnerRequest, "io", desc="invalidate all copies") {
    if (machineCount(MachineType:L1Cache) > 1) {
      enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
        assert(is_valid(cache_entry));
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:INV;
        out_msg.Requestor := machineID;
        out_msg.Destination.add(cache_entry.Owner);
        out_msg.MessageSize := MessageSizeType:Request_Control;
        out_msg.DirectedProbe := true;
      }
    }
  }

  action(fb_forwardRequestBcast, "fb", desc="Forward requests to all nodes") {
    if (machineCount(MachineType:L1Cache) > 1) {
      peek(requestQueue_in, RequestMsg) {
        if (full_bit_dir_enabled) {
          fwd_set := cache_entry.Sharers;
          fwd_set.remove(machineIDToNodeID(in_msg.Requestor));
          if (fwd_set.count() > 0) {
            enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
                  out_msg.addr := address;
                  out_msg.Type := in_msg.Type;
                  out_msg.Requestor := in_msg.Requestor;
                  out_msg.Destination.setNetDest(MachineType:L1Cache, fwd_set);
                  out_msg.MessageSize := MessageSizeType:Multicast_Control;
                  out_msg.InitialRequestTime := in_msg.InitialRequestTime;
                  out_msg.ForwardRequestTime := curCycle();
                  out_msg.SilentAcks := machineCount(MachineType:L1Cache) - fwd_set.count();
                  out_msg.SilentAcks := out_msg.SilentAcks - 1;
              }
          }
        } else {
            enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
                out_msg.addr := address;
                out_msg.Type := in_msg.Type;
                out_msg.Requestor := in_msg.Requestor;
                out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all L1 caches
                out_msg.Destination.remove(in_msg.Requestor); // Don't include the original requestor
                out_msg.MessageSize := MessageSizeType:Broadcast_Control;
                out_msg.InitialRequestTime := in_msg.InitialRequestTime;
                out_msg.ForwardRequestTime := curCycle();
            }
        }
      }
    } else {
      peek(requestQueue_in, RequestMsg) {
          enqueue(responseNetwork_out, ResponseMsg, 1) {
            out_msg.addr := address;
            out_msg.Type := CoherenceResponseType:ACK;
            out_msg.Sender := machineID;
            out_msg.Destination.add(in_msg.Requestor);
            out_msg.Dirty := false; // By definition, the block is now clean
            out_msg.Acks := 0;
            out_msg.SilentAcks := 0;
            DPRINTF(RubySlicc, "%d\n", out_msg.Acks);
            out_msg.MessageSize := MessageSizeType:Response_Control;
          }
      }
    }
  }

  action(fr_forwardMergeReadRequestsToOwner, "frr", desc="Forward coalesced read request to owner") {
    assert(machineCount(MachineType:L1Cache) > 1);
    //
    // Fixme! The unblock network should not stall on the forward network.  Add a trigger queue to
    // decouple the two.
    //
    peek(unblockNetwork_in, ResponseMsg) {
      enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:MERGED_GETS;
        out_msg.MergedRequestors := tbe.GetSRequestors;
        if (in_msg.Type == CoherenceResponseType:UNBLOCKS) {
          out_msg.Destination.add(in_msg.CurOwner);
        } else {
          out_msg.Destination.add(in_msg.Sender);
        }
        out_msg.MessageSize := MessageSizeType:Request_Control;
        out_msg.InitialRequestTime := zero_time();
        out_msg.ForwardRequestTime := curCycle();
      }
    }
  }

  action(fc_forwardRequestConditionalOwner, "fc", desc="Forward request to one or more nodes") {
    assert(machineCount(MachineType:L1Cache) > 1);
    if (probe_filter_enabled || full_bit_dir_enabled) {
      peek(requestQueue_in, RequestMsg) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          assert(is_valid(cache_entry));
          out_msg.addr := address;
          out_msg.Type := in_msg.Type;
          out_msg.Requestor := in_msg.Requestor;
          out_msg.Destination.add(cache_entry.Owner);
          out_msg.MessageSize := MessageSizeType:Request_Control;
          out_msg.DirectedProbe := true;
          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
          out_msg.ForwardRequestTime := curCycle();
        }
      }
    } else {
      peek(requestQueue_in, RequestMsg) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := in_msg.Type;
          out_msg.Requestor := in_msg.Requestor;
          out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all L1 caches
          out_msg.Destination.remove(in_msg.Requestor); // Don't include the original requestor
          out_msg.MessageSize := MessageSizeType:Broadcast_Control;
          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
          out_msg.ForwardRequestTime := curCycle();
        }
      }
    }
  }

  action(nofc_forwardRequestConditionalOwner, "nofc", desc="Forward request to one or more nodes if the requestor is not the owner") {
   if (machineCount(MachineType:L1Cache) > 1) {

     if (probe_filter_enabled || full_bit_dir_enabled) {
       peek(requestQueue_in, RequestMsg) {
        if (in_msg.Requestor != cache_entry.Owner) {
          enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
            assert(is_valid(cache_entry));
            out_msg.addr := address;
            out_msg.Type := in_msg.Type;
            out_msg.Requestor := in_msg.Requestor;
            out_msg.Destination.add(cache_entry.Owner);
            out_msg.MessageSize := MessageSizeType:Request_Control;
            out_msg.DirectedProbe := true;
            out_msg.InitialRequestTime := in_msg.InitialRequestTime;
            out_msg.ForwardRequestTime := curCycle();
          }
        }
       }
     } else {
      peek(requestQueue_in, RequestMsg) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := in_msg.Type;
          out_msg.Requestor := in_msg.Requestor;
          out_msg.Destination.broadcast(MachineType:L1Cache); // Send to all L1 caches
          out_msg.Destination.remove(in_msg.Requestor); // Don't include the original requestor
          out_msg.MessageSize := MessageSizeType:Broadcast_Control;
          out_msg.InitialRequestTime := in_msg.InitialRequestTime;
          out_msg.ForwardRequestTime := curCycle();
        }
      }
     }
   }
  }

  action(f_forwardWriteFromDma, "fw", desc="Forward requests") {
    assert(is_valid(tbe));
    if (tbe.NumPendingMsgs > 0) {
      peek(dmaRequestQueue_in, DMARequestMsg) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := CoherenceRequestType:GETX;
          //
          // Send to all L1 caches, since the requestor is the memory controller
          // itself
          //
          out_msg.Requestor := machineID;
          out_msg.Destination.broadcast(MachineType:L1Cache);
          out_msg.MessageSize := MessageSizeType:Broadcast_Control;
        }
      }
    }
  }

  action(f_forwardReadFromDma, "fr", desc="Forward requests") {
    assert(is_valid(tbe));
    if (tbe.NumPendingMsgs > 0) {
      peek(dmaRequestQueue_in, DMARequestMsg) {
        enqueue(forwardNetwork_out, RequestMsg, from_memory_controller_latency) {
          out_msg.addr := address;
          out_msg.Type := CoherenceRequestType:GETS;
          //
          // Send to all L1 caches, since the requestor is the memory controller
          // itself
          //
          out_msg.Requestor := machineID;
          out_msg.Destination.broadcast(MachineType:L1Cache);
          out_msg.MessageSize := MessageSizeType:Broadcast_Control;
        }
      }
    }
  }

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

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

  action(k_wakeUpDependents, "k", desc="wake-up dependents") {
    wakeUpBuffers(address);
  }

  action(l_popMemQueue, "q", desc="Pop off-chip request queue") {
    memQueue_in.dequeue(clockEdge());
  }

  action(g_popTriggerQueue, "g", desc="Pop trigger queue") {
    triggerQueue_in.dequeue(clockEdge());
  }

  action(p_popDmaRequestQueue, "pd", desc="pop dma request queue") {
    dmaRequestQueue_in.dequeue(clockEdge());
  }

  action(zd_stallAndWaitDMARequest, "zd", desc="Stall and wait the dma request queue") {
    peek(dmaRequestQueue_in, DMARequestMsg) {
        APPEND_TRANSITION_COMMENT(in_msg.Requestor);
    }
    stall_and_wait(dmaRequestQueue_in, address);
  }

  action(r_recordMemoryData, "rd", desc="record data from memory to TBE") {
    peek(memQueue_in, MemoryMsg) {
      assert(is_valid(tbe));
      if (tbe.CacheDirty == false) {
        tbe.DataBlk := in_msg.DataBlk;
      }
    }
  }

  action(r_recordCacheData, "rc", desc="record data from cache response to TBE") {
    peek(responseToDir_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.CacheDirty := true;
      tbe.DataBlk := in_msg.DataBlk;
    }
  }

  action(a_assertCacheData, "ac", desc="Assert that a cache provided the data") {
    assert(is_valid(tbe));
    assert(tbe.CacheDirty);
  }

  action(ano_assertNotOwner, "ano", desc="Assert that request is not current owner") {
    if (probe_filter_enabled || full_bit_dir_enabled) {
      peek(requestQueue_in, RequestMsg) {
        assert(is_valid(cache_entry));
        assert(cache_entry.Owner != in_msg.Requestor);
      }
    }
  }

  action(ans_assertNotSharer, "ans", desc="Assert that request is not a current sharer") {
    if (full_bit_dir_enabled) {
      peek(requestQueue_in, RequestMsg) {
        assert(cache_entry.Sharers.isElement(machineIDToNodeID(in_msg.Requestor)) == false);
      }
    }
  }

  action(rs_removeSharer, "s", desc="remove current sharer") {
    if (full_bit_dir_enabled) {
      peek(unblockNetwork_in, ResponseMsg) {
        assert(cache_entry.Sharers.isElement(machineIDToNodeID(in_msg.Sender)));
        cache_entry.Sharers.remove(machineIDToNodeID(in_msg.Sender));
      }
    }
  }

  action(cs_clearSharers, "cs", desc="clear current sharers") {
    if (full_bit_dir_enabled) {
      peek(requestQueue_in, RequestMsg) {
        cache_entry.Sharers.clear();
        cache_entry.Sharers.add(machineIDToNodeID(in_msg.Requestor));
      }
    }
  }

  action(l_queueMemoryWBRequest, "lq", desc="Write PUTX data to memory") {
    peek(unblockNetwork_in, ResponseMsg) {
      enqueue(memQueue_out, MemoryMsg, to_memory_controller_latency) {
        out_msg.addr := address;
        out_msg.Type := MemoryRequestType:MEMORY_WB;
        out_msg.Sender := in_msg.Sender;
        out_msg.MessageSize := MessageSizeType:Writeback_Data;
        out_msg.DataBlk := in_msg.DataBlk;
        out_msg.Len := 0;
      }
    }
  }

  action(ld_queueMemoryDmaWrite, "ld", desc="Write DMA data to memory") {
    assert(is_valid(tbe));
    enqueue(memQueue_out, MemoryMsg, to_memory_controller_latency) {
      out_msg.addr := tbe.PhysicalAddress;
      out_msg.Type := MemoryRequestType:MEMORY_WB;
      out_msg.Sender := tbe.DmaRequestor;
      out_msg.MessageSize := MessageSizeType:Writeback_Data;
      out_msg.DataBlk := tbe.DmaDataBlk;
      out_msg.Len := tbe.Len;
    }
  }

  action(ly_queueMemoryWriteFromTBE, "ly", desc="Write data to memory from TBE") {
    enqueue(memQueue_out, MemoryMsg, to_memory_controller_latency) {
      out_msg.addr := address;
      out_msg.Type := MemoryRequestType:MEMORY_WB;
      out_msg.Sender := tbe.DmaRequestor;
      out_msg.MessageSize := MessageSizeType:Writeback_Data;
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Len := 0;
    }
  }

  action(ll_checkIncomingWriteback, "\l", desc="Check PUTX/PUTO response message") {
    peek(unblockNetwork_in, ResponseMsg) {
      assert(in_msg.Dirty == false);
      assert(in_msg.MessageSize == MessageSizeType:Writeback_Control);
      DPRINTF(RubySlicc, "%s\n", in_msg.DataBlk);
    }
  }

  action(z_stallAndWaitRequest, "z", desc="Recycle the request queue") {
    peek(requestQueue_in, RequestMsg) {
        APPEND_TRANSITION_COMMENT(in_msg.Requestor);
    }
    stall_and_wait(requestQueue_in, address);
  }

  // TRANSITIONS

  // Transitions out of E state
  transition(E, GETX, NO_B_W) {
    pfa_probeFilterAllocate;
    v_allocateTBE;
    rx_recordExclusiveInTBE;
    saa_setAcksToAllIfPF;
    qf_queueMemoryFetchRequest;
    fn_forwardRequestIfNecessary;
    i_popIncomingRequestQueue;
  }

  transition(E, GETF, NO_F_W) {
    pfa_probeFilterAllocate;
    v_allocateTBE;
    rx_recordExclusiveInTBE;
    saa_setAcksToAllIfPF;
    qf_queueMemoryFetchRequest;
    fn_forwardRequestIfNecessary;
    i_popIncomingRequestQueue;
  }

  transition(E, GETS, NO_B_W) {
    pfa_probeFilterAllocate;
    v_allocateTBE;
    rx_recordExclusiveInTBE;
    saa_setAcksToAllIfPF;
    qf_queueMemoryFetchRequest;
    fn_forwardRequestIfNecessary;
    i_popIncomingRequestQueue;
  }

  transition(E, DMA_READ, NO_DR_B_W) {
    vd_allocateDmaRequestInTBE;
    qd_queueMemoryRequestFromDmaRead;
    spa_setPendingAcksToZeroIfPF;
    f_forwardReadFromDma;
    p_popDmaRequestQueue;
  }

  transition(E, DMA_WRITE, NO_DW_B_W) {
    vd_allocateDmaRequestInTBE;
    spa_setPendingAcksToZeroIfPF;
    sc_signalCompletionIfPF;
    f_forwardWriteFromDma;
    p_popDmaRequestQueue;
  }

  // Transitions out of O state
  transition(O, GETX, NO_B_W) {
    r_setMRU;
    v_allocateTBE;
    r_recordDataInTBE;
    sa_setAcksToOne;
    qf_queueMemoryFetchRequest;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  transition(O, GETF, NO_F_W) {
    r_setMRU;
    v_allocateTBE;
    r_recordDataInTBE;
    sa_setAcksToOne;
    qf_queueMemoryFetchRequest;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  // This transition is dumb, if a shared copy exists on-chip, then that should
  // provide data, not slow off-chip dram.  The problem is that the current
  // caches don't provide data in S state
  transition(O, GETS, O_B_W) {
    r_setMRU;
    v_allocateTBE;
    r_recordDataInTBE;
    saa_setAcksToAllIfPF;
    qf_queueMemoryFetchRequest;
    fn_forwardRequestIfNecessary;
    i_popIncomingRequestQueue;
  }

  transition(O, DMA_READ, O_DR_B_W) {
    vd_allocateDmaRequestInTBE;
    spa_setPendingAcksToZeroIfPF;
    qd_queueMemoryRequestFromDmaRead;
    f_forwardReadFromDma;
    p_popDmaRequestQueue;
  }

  transition(O, Pf_Replacement, O_R) {
    v_allocateTBE;
    pa_setPendingMsgsToAll;
    ia_invalidateAllRequest;
    pfd_probeFilterDeallocate;
  }

  transition(S, Pf_Replacement, S_R) {
    v_allocateTBE;
    pa_setPendingMsgsToAll;
    ia_invalidateAllRequest;
    pfd_probeFilterDeallocate;
  }

  transition(NO, Pf_Replacement, NO_R) {
    v_allocateTBE;
    po_setPendingMsgsToOne;
    io_invalidateOwnerRequest;
    pfd_probeFilterDeallocate;
  }

  transition(NX, Pf_Replacement, NO_R) {
    v_allocateTBE;
    pa_setPendingMsgsToAll;
    ia_invalidateAllRequest;
    pfd_probeFilterDeallocate;
  }

  transition({O, S, NO, NX}, DMA_WRITE, NO_DW_B_W) {
    vd_allocateDmaRequestInTBE;
    f_forwardWriteFromDma;
    p_popDmaRequestQueue;
  }

  // Transitions out of NO state
  transition(NX, GETX, NO_B) {
    r_setMRU;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  transition(NX, GETF, NO_F) {
    r_setMRU;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  // Transitions out of NO state
  transition(NO, GETX, NO_B) {
    r_setMRU;
    ano_assertNotOwner;
    fc_forwardRequestConditionalOwner;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  transition(NO, GETF, NO_F) {
    r_setMRU;
    //ano_assertNotOwner;
    nofc_forwardRequestConditionalOwner; //forward request if the requester is not the owner
    cs_clearSharers;
    oc_sendBlockAck; // send ack if the owner
    i_popIncomingRequestQueue;
  }

  transition(S, GETX, NO_B) {
    r_setMRU;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  transition(S, GETF, NO_F) {
    r_setMRU;
    fb_forwardRequestBcast;
    cs_clearSharers;
    i_popIncomingRequestQueue;
  }

  transition(S, GETS, NO_B) {
    r_setMRU;
    ano_assertNotOwner;
    fb_forwardRequestBcast;
    i_popIncomingRequestQueue;
  }

  transition(NO, GETS, NO_B) {
    r_setMRU;
    ano_assertNotOwner;
    ans_assertNotSharer;
    fc_forwardRequestConditionalOwner;
    i_popIncomingRequestQueue;
  }

  transition(NX, GETS, NO_B) {
    r_setMRU;
    ano_assertNotOwner;
    fc_forwardRequestConditionalOwner;
    i_popIncomingRequestQueue;
  }

  transition({NO, NX, S}, PUT, WB) {
    //
    // note that the PUT requestor may not be the current owner if an invalidate
    // raced with PUT
    //
    a_sendWriteBackAck;
    i_popIncomingRequestQueue;
  }

  transition({NO, NX, S}, DMA_READ, NO_DR_B_D) {
    vd_allocateDmaRequestInTBE;
    f_forwardReadFromDma;
    p_popDmaRequestQueue;
  }

  // Nack PUT requests when races cause us to believe we own the data
  transition({O, E}, PUT) {
    b_sendWriteBackNack;
    i_popIncomingRequestQueue;
  }

  // Blocked transient states
  transition({NO_B_X, O_B, NO_DR_B_W, NO_DW_B_W, NO_B_W, NO_DR_B_D,
              NO_DR_B, O_DR_B, O_B_W, O_DR_B_W, NO_DW_W, NO_B_S_W,
              NO_W, O_W, WB, WB_E_W, WB_O_W, O_R, S_R, NO_R, NO_F_W},
             {GETS, GETX, GETF, PUT, Pf_Replacement}) {
    z_stallAndWaitRequest;
  }

  transition(NO_F, {GETS, GETX, GETF, PUT, Pf_Replacement}){
    z_stallAndWaitRequest;
  }

  transition(NO_B, {GETX, GETF}, NO_B_X) {
    z_stallAndWaitRequest;
  }

  transition(NO_B, {PUT, Pf_Replacement}) {
    z_stallAndWaitRequest;
  }

  transition(NO_B_S, {GETX, GETF, PUT, Pf_Replacement}) {
    z_stallAndWaitRequest;
  }

  transition({NO_B_X, NO_B, NO_B_S, O_B, NO_DR_B_W, NO_DW_B_W, NO_B_W, NO_DR_B_D,
              NO_DR_B, O_DR_B, O_B_W, O_DR_B_W, NO_DW_W, NO_B_S_W,
              NO_W, O_W, WB, WB_E_W, WB_O_W, O_R, S_R, NO_R, NO_F_W},
             {DMA_READ, DMA_WRITE}) {
    zd_stallAndWaitDMARequest;
  }

  // merge GETS into one response
  transition(NO_B, GETS, NO_B_S) {
    v_allocateTBE;
    rs_recordGetSRequestor;
    i_popIncomingRequestQueue;
  }

  transition(NO_B_S, GETS) {
    rs_recordGetSRequestor;
    i_popIncomingRequestQueue;
  }

  // unblock responses
  transition({NO_B, NO_B_X}, UnblockS, NX) {
    us_updateSharerIfFBD;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition({NO_B, NO_B_X}, UnblockM, NO) {
    uo_updateOwnerIfPf;
    us_updateSharerIfFBD;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_S, UnblockS, NO_B_S_W) {
    us_updateSharerIfFBD;
    fr_forwardMergeReadRequestsToOwner;
    sp_setPendingMsgsToMergedSharers;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_S, UnblockM, NO_B_S_W) {
    uo_updateOwnerIfPf;
    fr_forwardMergeReadRequestsToOwner;
    sp_setPendingMsgsToMergedSharers;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_S_W, UnblockS) {
    us_updateSharerIfFBD;
    mu_decrementNumberOfUnblocks;
    os_checkForMergedGetSCompletion;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_S_W, All_Unblocks, NX) {
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(O_B, UnblockS, O) {
    us_updateSharerIfFBD;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(O_B, UnblockM, NO) {
    us_updateSharerIfFBD;
    uo_updateOwnerIfPf;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_W, Memory_Data, NO_B) {
    d_sendData;
    w_deallocateTBE;
    l_popMemQueue;
  }

  transition(NO_F_W, Memory_Data, NO_F) {
    d_sendData;
    w_deallocateTBE;
    l_popMemQueue;
  }

  transition(NO_DR_B_W, Memory_Data, NO_DR_B) {
    r_recordMemoryData;
    o_checkForCompletion;
    l_popMemQueue;
  }

  transition(O_DR_B_W, Memory_Data, O_DR_B) {
    r_recordMemoryData;
    dr_sendDmaData;
    o_checkForCompletion;
    l_popMemQueue;
  }

  transition({NO_DR_B, O_DR_B, NO_DR_B_D, NO_DW_B_W}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition({O_R, S_R, NO_R}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(S_R, Data) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(NO_R, {Data, Exclusive_Data}) {
    r_recordCacheData;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition({O_R, S_R}, All_acks_and_data_no_sharers, E) {
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_R, All_acks_and_data_no_sharers, WB_E_W) {
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition({NO_DR_B_W, O_DR_B_W}, Ack) {
    m_decrementNumberOfMessages;
    n_popResponseQueue;
  }

  transition(NO_DR_B_W, Shared_Ack) {
    m_decrementNumberOfMessages;
    r_setSharerBit;
    n_popResponseQueue;
  }

  transition(O_DR_B, Shared_Ack) {
    m_decrementNumberOfMessages;
    r_setSharerBit;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(O_DR_B_W, Shared_Ack) {
    m_decrementNumberOfMessages;
    r_setSharerBit;
    n_popResponseQueue;
  }

  transition({NO_DR_B, NO_DR_B_D}, Shared_Ack) {
    m_decrementNumberOfMessages;
    r_setSharerBit;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(NO_DR_B_W, Shared_Data) {
    r_recordCacheData;
    m_decrementNumberOfMessages;
    so_setOwnerBit;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition({NO_DR_B, NO_DR_B_D}, Shared_Data) {
    r_recordCacheData;
    m_decrementNumberOfMessages;
    so_setOwnerBit;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(NO_DR_B_W, {Exclusive_Data, Data}) {
    r_recordCacheData;
    m_decrementNumberOfMessages;
    n_popResponseQueue;
  }

  transition({NO_DR_B, NO_DR_B_D, NO_DW_B_W}, {Exclusive_Data, Data}) {
    r_recordCacheData;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(NO_DR_B, All_acks_and_owner_data, WB_O_W) {
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DR_B, All_acks_and_shared_data, S) {
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DR_B_D, All_acks_and_owner_data, WB_O_W) {
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DR_B_D, All_acks_and_shared_data, S) {
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(O_DR_B, All_acks_and_owner_data, WB_O_W) {
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(O_DR_B, All_acks_and_data_no_sharers, WB_E_W) {
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    pfd_probeFilterDeallocate;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DR_B, All_acks_and_data_no_sharers, WB_E_W) {
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    ppfd_possibleProbeFilterDeallocate;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DR_B_D, All_acks_and_data_no_sharers, WB_E_W) {
    a_assertCacheData;
    //
    // Note that the DMA consistency model allows us to send the DMA device
    // a response as soon as we receive valid data and prior to receiving
    // all acks.  However, to simplify the protocol we wait for all acks.
    //
    dt_sendDmaDataFromTbe;
    ly_queueMemoryWriteFromTBE;
    w_deallocateTBE;
    ppfd_possibleProbeFilterDeallocate;
    k_wakeUpDependents;
    g_popTriggerQueue;
  }

  transition(NO_DW_B_W, All_acks_and_data_no_sharers, NO_DW_W) {
    ld_queueMemoryDmaWrite;
    g_popTriggerQueue;
  }

  transition(NO_DW_W, Memory_Ack, E) {
    da_sendDmaAck;
    w_deallocateTBE;
    ppfd_possibleProbeFilterDeallocate;
    k_wakeUpDependents;
    l_popMemQueue;
  }

  transition(O_B_W, Memory_Data, O_B) {
    d_sendData;
    w_deallocateTBE;
    l_popMemQueue;
  }

  transition(NO_B_W, UnblockM, NO_W) {
    uo_updateOwnerIfPf;
    j_popIncomingUnblockQueue;
  }

  transition(NO_B_W, UnblockS, NO_W) {
    us_updateSharerIfFBD;
    j_popIncomingUnblockQueue;
  }

  transition(O_B_W, UnblockS, O_W) {
    us_updateSharerIfFBD;
    j_popIncomingUnblockQueue;
  }

  transition(NO_W, Memory_Data, NO) {
    w_deallocateTBE;
    k_wakeUpDependents;
    l_popMemQueue;
  }

  transition(O_W, Memory_Data, O) {
    w_deallocateTBE;
    k_wakeUpDependents;
    l_popMemQueue;
  }

  // WB State Transistions
  transition(WB, Writeback_Dirty, WB_O_W) {
    rs_removeSharer;
    l_queueMemoryWBRequest;
    j_popIncomingUnblockQueue;
  }

  transition(WB, Writeback_Exclusive_Dirty, WB_E_W) {
    rs_removeSharer;
    l_queueMemoryWBRequest;
    pfd_probeFilterDeallocate;
    j_popIncomingUnblockQueue;
  }

  transition(WB_E_W, Memory_Ack, E) {
    k_wakeUpDependents;
    l_popMemQueue;
  }

  transition(WB_O_W, Memory_Ack, O) {
    k_wakeUpDependents;
    l_popMemQueue;
  }

  transition(WB, Writeback_Clean, O) {
    ll_checkIncomingWriteback;
    rs_removeSharer;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(WB, Writeback_Exclusive_Clean, E) {
    ll_checkIncomingWriteback;
    rs_removeSharer;
    pfd_probeFilterDeallocate;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(WB, Unblock, NX) {
    auno_assertUnblockerNotOwner;
    k_wakeUpDependents;
    j_popIncomingUnblockQueue;
  }

  transition(NO_F, PUTF, WB) {
    a_sendWriteBackAck;
    i_popIncomingRequestQueue;
  }

  //possible race between GETF and UnblockM -- not sure needed any more?
  transition(NO_F, UnblockM) {
    us_updateSharerIfFBD;
    uo_updateOwnerIfPf;
    j_popIncomingUnblockQueue;
  }
}
