/*
 * Copyright (c) 1999-2013 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:L1Cache, "AMD Hammer-like protocol")
    : Sequencer * sequencer;
      CacheMemory * L1Icache;
      CacheMemory * L1Dcache;
      CacheMemory * L2cache;
      Cycles cache_response_latency := 10;
      Cycles issue_latency := 2;
      Cycles l2_cache_hit_latency := 10;
      bool no_mig_atomic := "True";
      bool send_evictions;

      // NETWORK BUFFERS
      MessageBuffer * requestFromCache, network="To", virtual_network="2",
            vnet_type="request";
      MessageBuffer * responseFromCache, network="To", virtual_network="4",
            vnet_type="response";
      MessageBuffer * unblockFromCache, network="To", virtual_network="5",
            vnet_type="unblock";

      MessageBuffer * forwardToCache, network="From", virtual_network="3",
            vnet_type="forward";
      MessageBuffer * responseToCache, network="From", virtual_network="4",
            vnet_type="response";

      MessageBuffer * mandatoryQueue;

      MessageBuffer * triggerQueue;
{
  // STATES
  state_declaration(State, desc="Cache states", default="L1Cache_State_I") {
    // Base states
    I, AccessPermission:Invalid, desc="Idle";
    S, AccessPermission:Read_Only, desc="Shared";
    O, AccessPermission:Read_Only, desc="Owned";
    M, AccessPermission:Read_Only, desc="Modified (dirty)";
    MM, AccessPermission:Read_Write, desc="Modified (dirty and locally modified)";

    // Base states, locked and ready to service the mandatory queue
    IR, AccessPermission:Invalid, desc="Idle";
    SR, AccessPermission:Read_Only, desc="Shared";
    OR, AccessPermission:Read_Only, desc="Owned";
    MR, AccessPermission:Read_Only, desc="Modified (dirty)";
    MMR, AccessPermission:Read_Write, desc="Modified (dirty and locally modified)";

    // Transient States
    IM, AccessPermission:Busy, "IM", desc="Issued GetX";
    SM, AccessPermission:Read_Only, "SM", desc="Issued GetX, we still have a valid copy of the line";
    OM, AccessPermission:Read_Only, "OM", desc="Issued GetX, received data";
    ISM, AccessPermission:Read_Only, "ISM", desc="Issued GetX, received valid data, waiting for all acks";
    M_W, AccessPermission:Read_Only, "M^W", desc="Issued GetS, received exclusive data";
    MM_W, AccessPermission:Read_Write, "MM^W", desc="Issued GetX, received exclusive data";
    IS, AccessPermission:Busy, "IS", desc="Issued GetS";
    SS, AccessPermission:Read_Only, "SS", desc="Issued GetS, received data, waiting for all acks";
    OI, AccessPermission:Busy, "OI", desc="Issued PutO, waiting for ack";
    MI, AccessPermission:Busy, "MI", desc="Issued PutX, waiting for ack";
    II, AccessPermission:Busy, "II", desc="Issued PutX/O, saw Other_GETS or Other_GETX, waiting for ack";
    ST, AccessPermission:Busy, "ST", desc="S block transferring to L1";
    OT, AccessPermission:Busy, "OT", desc="O block transferring to L1";
    MT, AccessPermission:Busy, "MT", desc="M block transferring to L1";
    MMT, AccessPermission:Busy, "MMT", desc="MM block transferring to L0";

    //Transition States Related to Flushing
    MI_F, AccessPermission:Busy, "MI_F", desc="Issued PutX due to a Flush, waiting for ack";
    MM_F, AccessPermission:Busy, "MM_F", desc="Issued GETF due to a Flush, waiting for ack";
    IM_F, AccessPermission:Busy, "IM_F", desc="Issued GetX due to a Flush";
    ISM_F, AccessPermission:Read_Only, "ISM_F", desc="Issued GetX, received data, waiting for all acks";
    SM_F, AccessPermission:Read_Only, "SM_F", desc="Issued GetX, we still have an old copy of the line";
    OM_F, AccessPermission:Read_Only, "OM_F", desc="Issued GetX, received data";
    MM_WF, AccessPermission:Busy, "MM_WF", desc="Issued GetX, received exclusive data";
  }

  // EVENTS
  enumeration(Event, desc="Cache events") {
    Load,            desc="Load request from the processor";
    Ifetch,          desc="I-fetch request from the processor";
    Store,           desc="Store request from the processor";
    L2_Replacement,  desc="L2 Replacement";
    L1_to_L2,        desc="L1 to L2 transfer";
    Trigger_L2_to_L1D,  desc="Trigger L2 to L1-Data transfer";
    Trigger_L2_to_L1I,  desc="Trigger L2 to L1-Instruction transfer";
    Complete_L2_to_L1, desc="L2 to L1 transfer completed";

    // Requests
    Other_GETX,      desc="A GetX from another processor";
    Other_GETS,      desc="A GetS from another processor";
    Merged_GETS,     desc="A Merged GetS from another processor";
    Other_GETS_No_Mig, desc="A GetS from another processor";
    NC_DMA_GETS,     desc="special GetS when only DMA exists";
    Invalidate,      desc="Invalidate block";

    // Responses
    Ack,             desc="Received an ack message";
    Shared_Ack,      desc="Received an ack message, responder has a shared copy";
    Data,            desc="Received a data message";
    Shared_Data,     desc="Received a data message, responder has a shared copy";
    Exclusive_Data,  desc="Received a data message, responder had an exclusive copy, they gave it to us";

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

    // Triggers
    All_acks,                  desc="Received all required data and message acks";
    All_acks_no_sharers,        desc="Received all acks and no other processor has a shared copy";

    // For Flush
    Flush_line,                  desc="flush the cache line from all caches";
    Block_Ack,                   desc="the directory is blocked and ready for the flush";
  }

  // STRUCTURE DEFINITIONS
  // CacheEntry
  structure(Entry, desc="...", interface="AbstractCacheEntry") {
    State CacheState,        desc="cache state";
    bool Dirty,              desc="Is the data dirty (different than memory)?";
    DataBlock DataBlk,       desc="data for the block";
    bool FromL2, default="false", desc="block just moved from L2";
    bool AtomicAccessed, default="false", desc="block just moved from L2";
  }

  // TBE fields
  structure(TBE, desc="...") {
    State TBEState,          desc="Transient state";
    DataBlock DataBlk,       desc="data for the block, required for concurrent writebacks";
    bool Dirty,              desc="Is the data dirty (different than memory)?";
    int NumPendingMsgs,      desc="Number of acks/data messages that this processor is waiting for";
    bool Sharers,            desc="On a GetS, did we find any other sharers in the system";
    bool AppliedSilentAcks, default="false", desc="for full-bit dir, does the pending msg count reflect the silent acks";
    MachineID LastResponder, desc="last machine to send a response for this request";
    MachineID CurOwner,      desc="current owner of the block, used for UnblockS responses";

    Cycles InitialRequestTime, default="Cycles(0)",
            desc="time the initial requests was sent from the L1Cache";
    Cycles ForwardRequestTime, default="Cycles(0)",
            desc="time the dir forwarded the request";
    Cycles FirstResponseTime, default="Cycles(0)",
            desc="the time the first response was received";
  }

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

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

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

  Entry getCacheEntry(Addr address), return_by_pointer="yes" {
    Entry L2cache_entry := static_cast(Entry, "pointer", L2cache.lookup(address));
    if(is_valid(L2cache_entry)) {
      return L2cache_entry;
    }

    Entry L1Dcache_entry := static_cast(Entry, "pointer", L1Dcache.lookup(address));
    if(is_valid(L1Dcache_entry)) {
      return L1Dcache_entry;
    }

    Entry L1Icache_entry := static_cast(Entry, "pointer", L1Icache.lookup(address));
    return L1Icache_entry;
  }

  void functionalRead(Addr addr, Packet *pkt) {
    Entry cache_entry := getCacheEntry(addr);
    if(is_valid(cache_entry)) {
      testAndRead(addr, cache_entry.DataBlk, pkt);
    } else {
      TBE tbe := TBEs[addr];
      if(is_valid(tbe)) {
        testAndRead(addr, tbe.DataBlk, pkt);
      } else {
        error("Missing data block");
      }
    }
  }

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

    Entry cache_entry := getCacheEntry(addr);
    if(is_valid(cache_entry)) {
      num_functional_writes := num_functional_writes +
        testAndWrite(addr, cache_entry.DataBlk, pkt);
      return num_functional_writes;
    }

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

  Entry getL2CacheEntry(Addr address), return_by_pointer="yes" {
    Entry L2cache_entry := static_cast(Entry, "pointer", L2cache.lookup(address));
    return L2cache_entry;
  }

  Entry getL1DCacheEntry(Addr address), return_by_pointer="yes" {
    Entry L1Dcache_entry := static_cast(Entry, "pointer", L1Dcache.lookup(address));
    return L1Dcache_entry;
  }

  Entry getL1ICacheEntry(Addr address), return_by_pointer="yes" {
    Entry L1Icache_entry := static_cast(Entry, "pointer", L1Icache.lookup(address));
    return L1Icache_entry;
  }

  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 setState(TBE tbe, Entry cache_entry, Addr addr, State state) {
    assert((L1Dcache.isTagPresent(addr) && L1Icache.isTagPresent(addr)) == false);
    assert((L1Icache.isTagPresent(addr) && L2cache.isTagPresent(addr)) == false);
    assert((L1Dcache.isTagPresent(addr) && L2cache.isTagPresent(addr)) == false);

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

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

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

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

    return AccessPermission:NotPresent;
  }

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

  Event mandatory_request_type_to_event(RubyRequestType type) {
    if (type == RubyRequestType:LD) {
      return Event:Load;
    } else if (type == RubyRequestType:IFETCH) {
      return Event:Ifetch;
    } else if ((type == RubyRequestType:ST) || (type == RubyRequestType:ATOMIC)) {
      return Event:Store;
    } else if ((type == RubyRequestType:FLUSH)) {
      return Event:Flush_line;
    } else {
      error("Invalid RubyRequestType");
    }
  }

  MachineType testAndClearLocalHit(Entry cache_entry) {
    if (is_valid(cache_entry) && cache_entry.FromL2) {
      cache_entry.FromL2 := false;
      return MachineType:L2Cache;
    }
    return MachineType:L1Cache;
  }

  bool IsAtomicAccessed(Entry cache_entry) {
    assert(is_valid(cache_entry));
    return cache_entry.AtomicAccessed;
  }

  // ** OUT_PORTS **
  out_port(requestNetwork_out, RequestMsg, requestFromCache);
  out_port(responseNetwork_out, ResponseMsg, responseFromCache);
  out_port(unblockNetwork_out, ResponseMsg, unblockFromCache);
  out_port(triggerQueue_out, TriggerMsg, triggerQueue);

  // ** IN_PORTS **

  // Trigger Queue
  in_port(triggerQueue_in, TriggerMsg, triggerQueue, rank=3) {
    if (triggerQueue_in.isReady(clockEdge())) {
      peek(triggerQueue_in, TriggerMsg) {

        Entry cache_entry := getCacheEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];

        if (in_msg.Type == TriggerType:L2_to_L1) {
          trigger(Event:Complete_L2_to_L1, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == TriggerType:ALL_ACKS) {
          trigger(Event:All_acks, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == TriggerType:ALL_ACKS_NO_SHARERS) {
          trigger(Event:All_acks_no_sharers, in_msg.addr, cache_entry, tbe);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  // Nothing from the unblock network

  // Response Network
  in_port(responseToCache_in, ResponseMsg, responseToCache, rank=2) {
    if (responseToCache_in.isReady(clockEdge())) {
      peek(responseToCache_in, ResponseMsg, block_on="addr") {

        Entry cache_entry := getCacheEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];

        if (in_msg.Type == CoherenceResponseType:ACK) {
          trigger(Event:Ack, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:ACK_SHARED) {
          trigger(Event:Shared_Ack, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA) {
          trigger(Event:Data, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA_SHARED) {
          trigger(Event:Shared_Data, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) {
          trigger(Event:Exclusive_Data, in_msg.addr, cache_entry, tbe);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  // Forward Network
  in_port(forwardToCache_in, RequestMsg, forwardToCache, rank=1) {
    if (forwardToCache_in.isReady(clockEdge())) {
      peek(forwardToCache_in, RequestMsg, block_on="addr") {

        Entry cache_entry := getCacheEntry(in_msg.addr);
        TBE tbe := TBEs[in_msg.addr];

        if ((in_msg.Type == CoherenceRequestType:GETX) ||
            (in_msg.Type == CoherenceRequestType:GETF)) {
          trigger(Event:Other_GETX, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:MERGED_GETS) {
          trigger(Event:Merged_GETS, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:GETS) {
          if (machineCount(MachineType:L1Cache) > 1) {
            if (is_valid(cache_entry)) {
              if (IsAtomicAccessed(cache_entry) && no_mig_atomic) {
                trigger(Event:Other_GETS_No_Mig, in_msg.addr, cache_entry, tbe);
              } else {
                trigger(Event:Other_GETS, in_msg.addr, cache_entry, tbe);
              }
            } else {
              trigger(Event:Other_GETS, in_msg.addr, cache_entry, tbe);
            }
          } else {
            trigger(Event:NC_DMA_GETS, in_msg.addr, cache_entry, tbe);
          }
        } else if (in_msg.Type == CoherenceRequestType:INV) {
          trigger(Event:Invalidate, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:WB_ACK) {
          trigger(Event:Writeback_Ack, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:WB_NACK) {
          trigger(Event:Writeback_Nack, in_msg.addr, cache_entry, tbe);
        } else if (in_msg.Type == CoherenceRequestType:BLOCK_ACK) {
          trigger(Event:Block_Ack, in_msg.addr, cache_entry, tbe);
        } else {
          error("Unexpected message");
        }
      }
    }
  }

  // Nothing from the request network

  // Mandatory Queue
  in_port(mandatoryQueue_in, RubyRequest, mandatoryQueue, desc="...", rank=0) {
    if (mandatoryQueue_in.isReady(clockEdge())) {
      peek(mandatoryQueue_in, RubyRequest, block_on="LineAddress") {

        // Check for data access to blocks in I-cache and ifetchs to blocks in D-cache
        TBE tbe := TBEs[in_msg.LineAddress];

        if (in_msg.Type == RubyRequestType:IFETCH) {
          // ** INSTRUCTION ACCESS ***

          Entry L1Icache_entry := getL1ICacheEntry(in_msg.LineAddress);
          if (is_valid(L1Icache_entry)) {
            // The tag matches for the L1, so the L1 fetches the line.
            // We know it can't be in the L2 due to exclusion
            trigger(mandatory_request_type_to_event(in_msg.Type),
                    in_msg.LineAddress, L1Icache_entry, tbe);
          } else {
            // Check to see if it is in the OTHER L1
            Entry L1Dcache_entry := getL1DCacheEntry(in_msg.LineAddress);
            if (is_valid(L1Dcache_entry)) {
              // The block is in the wrong L1, try to write it to the L2
              if (L2cache.cacheAvail(in_msg.LineAddress)) {
                trigger(Event:L1_to_L2, in_msg.LineAddress, L1Dcache_entry, tbe);
              } else {
                Addr l2_victim_addr := L2cache.cacheProbe(in_msg.LineAddress);
                trigger(Event:L2_Replacement,
                        l2_victim_addr,
                        getL2CacheEntry(l2_victim_addr),
                        TBEs[l2_victim_addr]);
              }
            }

            if (L1Icache.cacheAvail(in_msg.LineAddress)) {
              // L1 does't have the line, but we have space for it in the L1

              Entry L2cache_entry := getL2CacheEntry(in_msg.LineAddress);
              if (is_valid(L2cache_entry)) {
                // L2 has it (maybe not with the right permissions)
                trigger(Event:Trigger_L2_to_L1I, in_msg.LineAddress,
                        L2cache_entry, tbe);
              } else {
                // We have room, the L2 doesn't have it, so the L1 fetches the line
                trigger(mandatory_request_type_to_event(in_msg.Type),
                        in_msg.LineAddress, L1Icache_entry, tbe);
              }
            } else {
              // No room in the L1, so we need to make room
              // Check if the line we want to evict is not locked
              Addr l1i_victim_addr := L1Icache.cacheProbe(in_msg.LineAddress);
              check_on_cache_probe(mandatoryQueue_in, l1i_victim_addr);
              if (L2cache.cacheAvail(l1i_victim_addr)) {
                // The L2 has room, so we move the line from the L1 to the L2
                trigger(Event:L1_to_L2,
                        l1i_victim_addr,
                        getL1ICacheEntry(l1i_victim_addr),
                        TBEs[l1i_victim_addr]);
              } else {
                Addr l2_victim_addr := L2cache.cacheProbe(l1i_victim_addr);
                // The L2 does not have room, so we replace a line from the L2
                trigger(Event:L2_Replacement,
                        l2_victim_addr,
                        getL2CacheEntry(l2_victim_addr),
                        TBEs[l2_victim_addr]);
              }
            }
          }
        } else {
          // *** DATA ACCESS ***

          Entry L1Dcache_entry := getL1DCacheEntry(in_msg.LineAddress);
          if (is_valid(L1Dcache_entry)) {
            // The tag matches for the L1, so the L1 fetches the line.
            // We know it can't be in the L2 due to exclusion
            trigger(mandatory_request_type_to_event(in_msg.Type),
                    in_msg.LineAddress, L1Dcache_entry, tbe);
          } else {

            // Check to see if it is in the OTHER L1
            Entry L1Icache_entry := getL1ICacheEntry(in_msg.LineAddress);
            if (is_valid(L1Icache_entry)) {
              // The block is in the wrong L1, try to write it to the L2
              if (L2cache.cacheAvail(in_msg.LineAddress)) {
                trigger(Event:L1_to_L2, in_msg.LineAddress, L1Icache_entry, tbe);
              } else {
                Addr l2_victim_addr := L2cache.cacheProbe(in_msg.LineAddress);
                trigger(Event:L2_Replacement,
                        l2_victim_addr,
                        getL2CacheEntry(l2_victim_addr),
                        TBEs[l2_victim_addr]);
              }
            }

            if (L1Dcache.cacheAvail(in_msg.LineAddress)) {
              // L1 does't have the line, but we have space for it in the L1
              Entry L2cache_entry := getL2CacheEntry(in_msg.LineAddress);
              if (is_valid(L2cache_entry)) {
                // L2 has it (maybe not with the right permissions)
                trigger(Event:Trigger_L2_to_L1D, in_msg.LineAddress,
                        L2cache_entry, tbe);
              } else {
                // We have room, the L2 doesn't have it, so the L1 fetches the line
                trigger(mandatory_request_type_to_event(in_msg.Type),
                        in_msg.LineAddress, L1Dcache_entry, tbe);
              }
            } else {
              // No room in the L1, so we need to make room
              // Check if the line we want to evict is not locked
              Addr l1d_victim_addr := L1Dcache.cacheProbe(in_msg.LineAddress);
              check_on_cache_probe(mandatoryQueue_in, l1d_victim_addr);
              if (L2cache.cacheAvail(l1d_victim_addr)) {
                // The L2 has room, so we move the line from the L1 to the L2
                trigger(Event:L1_to_L2,
                        l1d_victim_addr,
                        getL1DCacheEntry(l1d_victim_addr),
                        TBEs[l1d_victim_addr]);
              } else {
                Addr l2_victim_addr := L2cache.cacheProbe(l1d_victim_addr);
                // The L2 does not have room, so we replace a line from the L2
                trigger(Event:L2_Replacement,
                        l2_victim_addr,
                        getL2CacheEntry(l2_victim_addr),
                        TBEs[l2_victim_addr]);
              }
            }
          }
        }
      }
    }
  }

  // ACTIONS

  action(a_issueGETS, "a", desc="Issue GETS") {
    enqueue(requestNetwork_out, RequestMsg, issue_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:GETS;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
      out_msg.InitialRequestTime := curCycle();

      // One from each other cache (n-1) plus the memory (+1)
      tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
    }
  }

  action(b_issueGETX, "b", desc="Issue GETX") {
    enqueue(requestNetwork_out, RequestMsg, issue_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:GETX;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
      out_msg.InitialRequestTime := curCycle();

      // One from each other cache (n-1) plus the memory (+1)
      tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
    }
  }

  action(b_issueGETXIfMoreThanOne, "bo", desc="Issue GETX") {
    if (machineCount(MachineType:L1Cache) > 1) {
      enqueue(requestNetwork_out, RequestMsg, issue_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceRequestType:GETX;
        out_msg.Requestor := machineID;
        out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
        out_msg.MessageSize := MessageSizeType:Request_Control;
        out_msg.InitialRequestTime := curCycle();
      }
    }

    // One from each other cache (n-1) plus the memory (+1)
    tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
  }

  action(bf_issueGETF, "bf", desc="Issue GETF") {
    enqueue(requestNetwork_out, RequestMsg, issue_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:GETF;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Request_Control;
      out_msg.InitialRequestTime := curCycle();

      // One from each other cache (n-1) plus the memory (+1)
      tbe.NumPendingMsgs := machineCount(MachineType:L1Cache);
    }
  }

  action(c_sendExclusiveData, "c", desc="Send exclusive data from cache to requestor") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(cache_entry));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(ct_sendExclusiveDataFromTBE, "ct", desc="Send exclusive data from tbe to requestor") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(d_issuePUT, "d", desc="Issue PUT") {
    enqueue(requestNetwork_out, RequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:PUT;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  action(df_issuePUTF, "df", desc="Issue PUTF") {
    enqueue(requestNetwork_out, RequestMsg, issue_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceRequestType:PUTF;
      out_msg.Requestor := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Writeback_Control;
    }
  }

  action(e_sendData, "e", desc="Send data from cache to requestor") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(cache_entry));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(ee_sendDataShared, "\e", desc="Send data from cache to requestor, remaining the owner") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(cache_entry));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg.DataBlk);
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(et_sendDataSharedFromTBE, "\et", desc="Send data from TBE to requestor, keep a shared copy") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg.DataBlk);
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(em_sendDataSharedMultiple, "em", desc="Send data from cache to all requestors, still the owner") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(cache_entry));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination := in_msg.MergedRequestors;
        out_msg.DataBlk := cache_entry.DataBlk;
        out_msg.Dirty := cache_entry.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg.DataBlk);
        out_msg.Acks := machineCount(MachineType:L1Cache);
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(emt_sendDataSharedMultipleFromTBE, "emt", desc="Send data from tbe to all requestors") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination := in_msg.MergedRequestors;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        DPRINTF(RubySlicc, "%s\n", out_msg.DataBlk);
        out_msg.Acks := machineCount(MachineType:L1Cache);
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(f_sendAck, "f", desc="Send ack from cache to requestor") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:ACK;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.Acks := 1;
        out_msg.SilentAcks := in_msg.SilentAcks;
        assert(in_msg.DirectedProbe == false);
        out_msg.MessageSize := MessageSizeType:Response_Control;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(ff_sendAckShared, "\f", desc="Send shared ack from cache to requestor") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:ACK_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        out_msg.Acks := 1;
        out_msg.SilentAcks := in_msg.SilentAcks;
        assert(in_msg.DirectedProbe == false);
        out_msg.MessageSize := MessageSizeType:Response_Control;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(g_sendUnblock, "g", desc="Send unblock to memory") {
    enqueue(unblockNetwork_out, ResponseMsg, cache_response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:UNBLOCK;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }

  action(gm_sendUnblockM, "gm", desc="Send unblock to memory and indicate M/O/E state") {
    enqueue(unblockNetwork_out, ResponseMsg, cache_response_latency) {
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:UNBLOCKM;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }

  action(gs_sendUnblockS, "gs", desc="Send unblock to memory and indicate S state") {
    enqueue(unblockNetwork_out, ResponseMsg, cache_response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Type := CoherenceResponseType:UNBLOCKS;
      out_msg.Sender := machineID;
      out_msg.CurOwner := tbe.CurOwner;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.MessageSize := MessageSizeType:Unblock_Control;
    }
  }

  action(h_load_hit, "hd", desc="Notify sequencer the load completed.") {
    assert(is_valid(cache_entry));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    L1Dcache.setMRU(cache_entry);
    sequencer.readCallback(address, cache_entry.DataBlk, false,
                           testAndClearLocalHit(cache_entry));
  }

  action(h_ifetch_hit, "hi", desc="Notify sequencer the ifetch completed.") {
    assert(is_valid(cache_entry));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    L1Icache.setMRU(cache_entry);
    sequencer.readCallback(address, cache_entry.DataBlk, false,
                           testAndClearLocalHit(cache_entry));
  }

  action(hx_external_load_hit, "hx", desc="load required external msgs") {
    assert(is_valid(cache_entry));
    assert(is_valid(tbe));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    peek(responseToCache_in, ResponseMsg) {
      L1Icache.setMRU(address);
      L1Dcache.setMRU(address);
      sequencer.readCallback(address, cache_entry.DataBlk, true,
                 machineIDToMachineType(in_msg.Sender), tbe.InitialRequestTime,
                 tbe.ForwardRequestTime, tbe.FirstResponseTime);
    }
  }

  action(hh_store_hit, "\h", desc="Notify sequencer that store completed.") {
    assert(is_valid(cache_entry));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    peek(mandatoryQueue_in, RubyRequest) {
      L1Dcache.setMRU(cache_entry);
      sequencer.writeCallback(address, cache_entry.DataBlk, false,
                              testAndClearLocalHit(cache_entry));

      cache_entry.Dirty := true;
      if (in_msg.Type == RubyRequestType:ATOMIC) {
        cache_entry.AtomicAccessed := true;
      }
    }
  }

  action(hh_flush_hit, "\hf", desc="Notify sequencer that flush completed.") {
    assert(is_valid(tbe));
    DPRINTF(RubySlicc, "%s\n", tbe.DataBlk);
    sequencer.writeCallback(address, tbe.DataBlk, false, MachineType:L1Cache);
  }

  action(sx_external_store_hit, "sx", desc="store required external msgs.") {
    assert(is_valid(cache_entry));
    assert(is_valid(tbe));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    peek(responseToCache_in, ResponseMsg) {
      L1Icache.setMRU(address);
      L1Dcache.setMRU(address);
      sequencer.writeCallback(address, cache_entry.DataBlk, true,
              machineIDToMachineType(in_msg.Sender), tbe.InitialRequestTime,
              tbe.ForwardRequestTime, tbe.FirstResponseTime);
    }
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    cache_entry.Dirty := true;
  }

  action(sxt_trig_ext_store_hit, "sxt", desc="store required external msgs.") {
    assert(is_valid(cache_entry));
    assert(is_valid(tbe));
    DPRINTF(RubySlicc, "%s\n", cache_entry.DataBlk);
    L1Icache.setMRU(address);
    L1Dcache.setMRU(address);
    sequencer.writeCallback(address, cache_entry.DataBlk, true,
            machineIDToMachineType(tbe.LastResponder), tbe.InitialRequestTime,
            tbe.ForwardRequestTime, tbe.FirstResponseTime);

    cache_entry.Dirty := true;
  }

  action(i_allocateTBE, "i", desc="Allocate TBE") {
    check_allocate(TBEs);
    assert(is_valid(cache_entry));
    TBEs.allocate(address);
    set_tbe(TBEs[address]);
    tbe.DataBlk := cache_entry.DataBlk; // Data only used for writebacks
    tbe.Dirty := cache_entry.Dirty;
    tbe.Sharers := false;
  }

  action(it_allocateTBE, "it", desc="Allocate TBE") {
    check_allocate(TBEs);
    TBEs.allocate(address);
    set_tbe(TBEs[address]);
    tbe.Dirty := false;
    tbe.Sharers := false;
  }

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

  action(k_popMandatoryQueue, "k", desc="Pop mandatory queue.") {
    mandatoryQueue_in.dequeue(clockEdge());
  }

  action(l_popForwardQueue, "l", desc="Pop forwareded request queue.") {
    forwardToCache_in.dequeue(clockEdge());
  }

  action(hp_copyFromTBEToL2, "li", desc="Copy data from TBE to L2 cache entry.") {
    assert(is_valid(cache_entry));
    assert(is_valid(tbe));
    cache_entry.Dirty   := tbe.Dirty;
    cache_entry.DataBlk := tbe.DataBlk;
  }

  action(nb_copyFromTBEToL1, "fu", desc="Copy data from TBE to L1 cache entry.") {
    assert(is_valid(cache_entry));
    assert(is_valid(tbe));
    cache_entry.Dirty   := tbe.Dirty;
    cache_entry.DataBlk := tbe.DataBlk;
    cache_entry.FromL2 := true;
  }

  action(m_decrementNumberOfMessages, "m", desc="Decrement the number of messages for which we're waiting") {
    peek(responseToCache_in, ResponseMsg) {
      assert(in_msg.Acks >= 0);
      assert(is_valid(tbe));
      DPRINTF(RubySlicc, "Sender = %s\n", in_msg.Sender);
      DPRINTF(RubySlicc, "SilentAcks = %d\n", in_msg.SilentAcks);
      if (tbe.AppliedSilentAcks == false) {
        tbe.NumPendingMsgs := tbe.NumPendingMsgs - in_msg.SilentAcks;
        tbe.AppliedSilentAcks := true;
      }
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
      tbe.NumPendingMsgs := tbe.NumPendingMsgs - in_msg.Acks;
      DPRINTF(RubySlicc, "%d\n", tbe.NumPendingMsgs);
      APPEND_TRANSITION_COMMENT(tbe.NumPendingMsgs);
      APPEND_TRANSITION_COMMENT(in_msg.Sender);
      tbe.LastResponder := in_msg.Sender;
      if (tbe.InitialRequestTime != zero_time() && in_msg.InitialRequestTime != zero_time()) {
        assert(tbe.InitialRequestTime == in_msg.InitialRequestTime);
      }
      if (in_msg.InitialRequestTime != zero_time()) {
        tbe.InitialRequestTime := in_msg.InitialRequestTime;
      }
      if (tbe.ForwardRequestTime != zero_time() && in_msg.ForwardRequestTime != zero_time()) {
        assert(tbe.ForwardRequestTime == in_msg.ForwardRequestTime);
      }
      if (in_msg.ForwardRequestTime != zero_time()) {
        tbe.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
      if (tbe.FirstResponseTime == zero_time()) {
        tbe.FirstResponseTime := curCycle();
      }
    }
  }
  action(uo_updateCurrentOwner, "uo", desc="When moving SS state, update current owner.") {
    peek(responseToCache_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.CurOwner := in_msg.Sender;
    }
  }

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

  action(ll_L2toL1Transfer, "ll", desc="") {
    enqueue(triggerQueue_out, TriggerMsg, l2_cache_hit_latency) {
      out_msg.addr := address;
      out_msg.Type := TriggerType:L2_to_L1;
    }
  }

  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) {
          out_msg.Type := TriggerType:ALL_ACKS;
        } else {
          out_msg.Type := TriggerType:ALL_ACKS_NO_SHARERS;
        }
      }
    }
  }

  action(p_decrementNumberOfMessagesByOne, "p", desc="Decrement the number of messages for which we're waiting by one") {
    assert(is_valid(tbe));
    tbe.NumPendingMsgs := tbe.NumPendingMsgs - 1;
  }

  action(pp_incrementNumberOfMessagesByOne, "\p", desc="Increment the number of messages for which we're waiting by one") {
    assert(is_valid(tbe));
    tbe.NumPendingMsgs := tbe.NumPendingMsgs + 1;
  }

  action(q_sendDataFromTBEToCache, "q", desc="Send data from TBE to cache") {
    peek(forwardToCache_in, RequestMsg) {
        assert(in_msg.Requestor != machineID);
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        DPRINTF(RubySlicc, "%s\n", out_msg.Destination);
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(sq_sendSharedDataFromTBEToCache, "sq", desc="Send shared data from TBE to cache, still the owner") {
    peek(forwardToCache_in, RequestMsg) {
        assert(in_msg.Requestor != machineID);
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination.add(in_msg.Requestor);
        DPRINTF(RubySlicc, "%s\n", out_msg.Destination);
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        if (in_msg.DirectedProbe) {
          out_msg.Acks := machineCount(MachineType:L1Cache);
        } else {
          out_msg.Acks := 2;
        }
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(qm_sendDataFromTBEToCache, "qm", desc="Send data from TBE to cache, multiple sharers, still the owner") {
    peek(forwardToCache_in, RequestMsg) {
      enqueue(responseNetwork_out, ResponseMsg, cache_response_latency) {
        assert(is_valid(tbe));
        out_msg.addr := address;
        out_msg.Type := CoherenceResponseType:DATA_SHARED;
        out_msg.Sender := machineID;
        out_msg.Destination := in_msg.MergedRequestors;
        DPRINTF(RubySlicc, "%s\n", out_msg.Destination);
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.Dirty := tbe.Dirty;
        out_msg.Acks := machineCount(MachineType:L1Cache);
        out_msg.SilentAcks := in_msg.SilentAcks;
        out_msg.MessageSize := MessageSizeType:Response_Data;
        out_msg.InitialRequestTime := in_msg.InitialRequestTime;
        out_msg.ForwardRequestTime := in_msg.ForwardRequestTime;
      }
    }
  }

  action(qq_sendDataFromTBEToMemory, "\q", desc="Send data from TBE to memory") {
    enqueue(unblockNetwork_out, ResponseMsg, cache_response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.Dirty := tbe.Dirty;
      if (tbe.Dirty) {
        out_msg.Type := CoherenceResponseType:WB_DIRTY;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Writeback_Data;
      } else {
        out_msg.Type := CoherenceResponseType:WB_CLEAN;
        // NOTE: in a real system this would not send data.  We send
        // data here only so we can check it at the memory
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

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

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

  action(t_sendExclusiveDataFromTBEToMemory, "t", desc="Send exclusive data from TBE to memory") {
    enqueue(unblockNetwork_out, ResponseMsg, cache_response_latency) {
      assert(is_valid(tbe));
      out_msg.addr := address;
      out_msg.Sender := machineID;
      out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory));
      out_msg.DataBlk := tbe.DataBlk;
      out_msg.Dirty := tbe.Dirty;
      if (tbe.Dirty) {
        out_msg.Type := CoherenceResponseType:WB_EXCLUSIVE_DIRTY;
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Writeback_Data;
      } else {
        out_msg.Type := CoherenceResponseType:WB_EXCLUSIVE_CLEAN;
        // NOTE: in a real system this would not send data.  We send
        // data here only so we can check it at the memory
        out_msg.DataBlk := tbe.DataBlk;
        out_msg.MessageSize := MessageSizeType:Writeback_Control;
      }
    }
  }

  action(u_writeDataToCache, "u", desc="Write data to cache") {
    peek(responseToCache_in, ResponseMsg) {
      assert(is_valid(cache_entry));
      cache_entry.DataBlk := in_msg.DataBlk;
      cache_entry.Dirty := in_msg.Dirty;
    }
  }

  action(uf_writeDataToCacheTBE, "uf", desc="Write data to TBE") {
    peek(responseToCache_in, ResponseMsg) {
      assert(is_valid(tbe));
      tbe.DataBlk := in_msg.DataBlk;
      tbe.Dirty := in_msg.Dirty;
    }
  }

  action(v_writeDataToCacheVerify, "v", desc="Write data to cache, assert it was same as before") {
    peek(responseToCache_in, ResponseMsg) {
      assert(is_valid(cache_entry));
      DPRINTF(RubySlicc, "Cached Data Block: %s, Msg Data Block: %s\n",
              cache_entry.DataBlk, in_msg.DataBlk);
      assert(cache_entry.DataBlk == in_msg.DataBlk);
      cache_entry.DataBlk := in_msg.DataBlk;
      cache_entry.Dirty := in_msg.Dirty || cache_entry.Dirty;
    }
  }

  action(vt_writeDataToTBEVerify, "vt", desc="Write data to TBE, assert it was same as before") {
    peek(responseToCache_in, ResponseMsg) {
      assert(is_valid(tbe));
      DPRINTF(RubySlicc, "Cached Data Block: %s, Msg Data Block: %s\n",
              tbe.DataBlk, in_msg.DataBlk);
      assert(tbe.DataBlk == in_msg.DataBlk);
      tbe.DataBlk := in_msg.DataBlk;
      tbe.Dirty := in_msg.Dirty || tbe.Dirty;
    }
  }

  action(gg_deallocateL1CacheBlock, "\g", desc="Deallocate cache block.  Sets the cache to invalid, allowing a replacement in parallel with a fetch.") {
    if (L1Dcache.isTagPresent(address)) {
      L1Dcache.deallocate(address);
    } else {
      L1Icache.deallocate(address);
    }
    unset_cache_entry();
  }

  action(ii_allocateL1DCacheBlock, "\i", desc="Set L1 D-cache tag equal to tag of block B.") {
    if (is_invalid(cache_entry)) {
      set_cache_entry(L1Dcache.allocate(address, new Entry));
    }
  }

  action(jj_allocateL1ICacheBlock, "\j", desc="Set L1 I-cache tag equal to tag of block B.") {
    if (is_invalid(cache_entry)) {
      set_cache_entry(L1Icache.allocate(address, new Entry));
    }
  }

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

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

  action(gr_deallocateCacheBlock, "\gr", desc="Deallocate an L1 or L2 cache block.") {
    if (L1Dcache.isTagPresent(address)) {
      L1Dcache.deallocate(address);
    }
    else if (L1Icache.isTagPresent(address)){
      L1Icache.deallocate(address);
    }
    else {
      assert(L2cache.isTagPresent(address));
      L2cache.deallocate(address);
    }
    unset_cache_entry();
  }

  action(forward_eviction_to_cpu, "\cc", desc="sends eviction information to the processor") {
    if (send_evictions) {
      DPRINTF(RubySlicc, "Sending invalidation for %#x to the CPU\n", address);
      sequencer.evictionCallback(address);
    }
  }

  action(uu_profileL1DataMiss, "\udm", desc="Profile the demand miss") {
    L1Dcache.profileDemandMiss();
  }

  action(uu_profileL1DataHit, "\udh", desc="Profile the demand hits") {
    L1Dcache.profileDemandHit();
  }

  action(uu_profileL1InstMiss, "\uim", desc="Profile the demand miss") {
    L1Icache.profileDemandMiss();
  }

  action(uu_profileL1InstHit, "\uih", desc="Profile the demand hits") {
    L1Icache.profileDemandHit();
  }

  action(uu_profileL2Miss, "\um", desc="Profile the demand miss") {
    L2cache.profileDemandMiss();
  }

  action(uu_profileL2Hit, "\uh", desc="Profile the demand hits") {
    L2cache.profileDemandHit();
  }

  action(zz_stallAndWaitMandatoryQueue, "\z", desc="Send the head of the mandatory queue to the back of the queue.") {
    stall_and_wait(mandatoryQueue_in, address);
  }

  action(z_stall, "z", desc="stall") {
    // do nothing and the special z_stall action will return a protocol stall
    // so that the next port is checked
  }

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

  action(ka_wakeUpAllDependents, "ka", desc="wake-up all dependents") {
    wakeUpAllBuffers();
  }

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

  // Transitions for Load/Store/L2_Replacement from transient states
  transition({IM, IM_F, MM_WF, SM, SM_F, ISM, ISM_F, OM, OM_F, IS, SS, OI, MI, II, ST, OT, MT, MMT}, {Store, L2_Replacement}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({IM, IM_F, MM_WF, SM, SM_F, ISM, ISM_F, OM, OM_F, IS, SS, OI, MI, II}, {Flush_line}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({M_W, MM_W}, {L2_Replacement, Flush_line}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({IM, IS, OI, MI, II, ST, OT, MT, MMT, MI_F, MM_F, OM_F, IM_F, ISM_F, SM_F, MM_WF}, {Load, Ifetch}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({IM, SM, ISM, OM, IS, SS, MM_W, M_W, OI, MI, II, ST, OT, MT, MMT, IM_F, SM_F, ISM_F, OM_F, MM_WF, MI_F, MM_F, IR, SR, OR, MR, MMR}, L1_to_L2) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({MI_F, MM_F}, {Store}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({MM_F, MI_F}, {Flush_line}) {
    zz_stallAndWaitMandatoryQueue;
  }

  transition({ST, OT, MT, MMT}, {Other_GETX, NC_DMA_GETS, Other_GETS, Merged_GETS, Other_GETS_No_Mig, Invalidate, Flush_line}) {
    z_stall;
  }

  transition({IR, SR, OR, MR, MMR}, {Other_GETX, NC_DMA_GETS, Other_GETS, Merged_GETS, Other_GETS_No_Mig, Invalidate}) {
    z_stall;
  }

  // Transitions moving data between the L1 and L2 caches
  transition({S, O, M, MM}, L1_to_L2) {
    i_allocateTBE;
    gg_deallocateL1CacheBlock;
    vv_allocateL2CacheBlock;
    hp_copyFromTBEToL2;
    s_deallocateTBE;
  }

  transition(S, Trigger_L2_to_L1D, ST) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    ii_allocateL1DCacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(O, Trigger_L2_to_L1D, OT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    ii_allocateL1DCacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(M, Trigger_L2_to_L1D, MT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    ii_allocateL1DCacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(MM, Trigger_L2_to_L1D, MMT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    ii_allocateL1DCacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(S, Trigger_L2_to_L1I, ST) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    jj_allocateL1ICacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(O, Trigger_L2_to_L1I, OT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    jj_allocateL1ICacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(M, Trigger_L2_to_L1I, MT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    jj_allocateL1ICacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(MM, Trigger_L2_to_L1I, MMT) {
    i_allocateTBE;
    rr_deallocateL2CacheBlock;
    jj_allocateL1ICacheBlock;
    nb_copyFromTBEToL1;
    s_deallocateTBE;
    zz_stallAndWaitMandatoryQueue;
    ll_L2toL1Transfer;
  }

  transition(ST, Complete_L2_to_L1, SR) {
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(OT, Complete_L2_to_L1, OR) {
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(MT, Complete_L2_to_L1, MR) {
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(MMT, Complete_L2_to_L1, MMR) {
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  // Transitions from Idle
  transition({I,IR}, Load, IS) {
    ii_allocateL1DCacheBlock;
    i_allocateTBE;
    a_issueGETS;
    uu_profileL1DataMiss;
    uu_profileL2Miss;
    k_popMandatoryQueue;
  }

  transition({I,IR}, Ifetch, IS) {
    jj_allocateL1ICacheBlock;
    i_allocateTBE;
    a_issueGETS;
    uu_profileL1InstMiss;
    uu_profileL2Miss;
    k_popMandatoryQueue;
  }

  transition({I,IR}, Store, IM) {
    ii_allocateL1DCacheBlock;
    i_allocateTBE;
    b_issueGETX;
    uu_profileL1DataMiss;
    uu_profileL2Miss;
    k_popMandatoryQueue;
  }

  transition({I, IR}, Flush_line, IM_F) {
    it_allocateTBE;
    bf_issueGETF;
    k_popMandatoryQueue;
  }

  transition(I, {Other_GETX, NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig, Invalidate}) {
    f_sendAck;
    l_popForwardQueue;
  }

  // Transitions from Shared
  transition({S, SM, ISM}, Load) {
    h_load_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition({S, SM, ISM}, Ifetch) {
    h_ifetch_hit;
    uu_profileL1InstHit;
    k_popMandatoryQueue;
  }

  transition(SR, Load, S) {
    h_load_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(SR, Ifetch, S) {
    h_ifetch_hit;
    uu_profileL1InstMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition({S,SR}, Store, SM) {
    i_allocateTBE;
    b_issueGETX;
    uu_profileL1DataMiss;
    uu_profileL2Miss;
    k_popMandatoryQueue;
  }

  transition({S, SR}, Flush_line, SM_F) {
    i_allocateTBE;
    bf_issueGETF;
    forward_eviction_to_cpu;
    gg_deallocateL1CacheBlock;
    k_popMandatoryQueue;
  }

  transition(S, L2_Replacement, I) {
    forward_eviction_to_cpu;
    rr_deallocateL2CacheBlock;
    ka_wakeUpAllDependents;
  }

  transition(S, {Other_GETX, Invalidate}, I) {
    f_sendAck;
    forward_eviction_to_cpu;
    gr_deallocateCacheBlock;
    l_popForwardQueue;
  }

  transition(S, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}) {
    ff_sendAckShared;
    l_popForwardQueue;
  }

  // Transitions from Owned
  transition({O, OM, SS, MM_W, M_W}, {Load}) {
    h_load_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition({O, OM, SS, MM_W, M_W}, {Ifetch}) {
    h_ifetch_hit;
    uu_profileL1InstHit;
    k_popMandatoryQueue;
  }

  transition(OR, Load, O) {
    h_load_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(OR, Ifetch, O) {
    h_ifetch_hit;
    uu_profileL1InstMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition({O,OR}, Store, OM) {
    i_allocateTBE;
    b_issueGETX;
    p_decrementNumberOfMessagesByOne;
    uu_profileL1DataMiss;
    uu_profileL2Miss;
    k_popMandatoryQueue;
  }

  transition({O, OR}, Flush_line, OM_F) {
    i_allocateTBE;
    bf_issueGETF;
    p_decrementNumberOfMessagesByOne;
    forward_eviction_to_cpu;
    gg_deallocateL1CacheBlock;
    k_popMandatoryQueue;
  }

  transition(O, L2_Replacement, OI) {
    i_allocateTBE;
    d_issuePUT;
    forward_eviction_to_cpu;
    rr_deallocateL2CacheBlock;
    ka_wakeUpAllDependents;
  }

  transition(O, {Other_GETX, Invalidate}, I) {
    e_sendData;
    forward_eviction_to_cpu;
    gr_deallocateCacheBlock;
    l_popForwardQueue;
  }

  transition(O, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(O, Merged_GETS) {
    em_sendDataSharedMultiple;
    l_popForwardQueue;
  }

  // Transitions from Modified
  transition({MM, M}, {Ifetch}) {
    h_ifetch_hit;
    uu_profileL1InstHit;
    k_popMandatoryQueue;
  }

  transition({MM, M}, {Load}) {
    h_load_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition(MM, Store) {
    hh_store_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition(MMR, Load, MM) {
    h_load_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(MMR, Ifetch, MM) {
    h_ifetch_hit;
    uu_profileL1InstMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(MMR, Store, MM) {
    hh_store_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition({MM, M, MMR, MR}, Flush_line, MM_F) {
    i_allocateTBE;
    bf_issueGETF;
    p_decrementNumberOfMessagesByOne;
    forward_eviction_to_cpu;
    gg_deallocateL1CacheBlock;
    k_popMandatoryQueue;
  }

  transition(MM_F, Block_Ack, MI_F) {
    df_issuePUTF;
    l_popForwardQueue;
    kd_wakeUpDependents;
  }

  transition(MM, L2_Replacement, MI) {
    i_allocateTBE;
    d_issuePUT;
    forward_eviction_to_cpu;
    rr_deallocateL2CacheBlock;
    ka_wakeUpAllDependents;
  }

  transition(MM, {Other_GETX, Invalidate}, I) {
    c_sendExclusiveData;
    forward_eviction_to_cpu;
    gr_deallocateCacheBlock;
    l_popForwardQueue;
  }

  transition(MM, Other_GETS, I) {
    c_sendExclusiveData;
    forward_eviction_to_cpu;
    gr_deallocateCacheBlock;
    l_popForwardQueue;
  }

  transition(MM, NC_DMA_GETS, O) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(MM, Other_GETS_No_Mig, O) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(MM, Merged_GETS, O) {
    em_sendDataSharedMultiple;
    l_popForwardQueue;
  }

  // Transitions from Dirty Exclusive
  transition(M, Store, MM) {
    hh_store_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition(MR, Load, M) {
    h_load_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(MR, Ifetch, M) {
    h_ifetch_hit;
    uu_profileL1InstMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(MR, Store, MM) {
    hh_store_hit;
    uu_profileL1DataMiss;
    uu_profileL2Hit;
    k_popMandatoryQueue;
    ka_wakeUpAllDependents;
  }

  transition(M, L2_Replacement, MI) {
    i_allocateTBE;
    d_issuePUT;
    forward_eviction_to_cpu;
    rr_deallocateL2CacheBlock;
    ka_wakeUpAllDependents;
  }

  transition(M, {Other_GETX, Invalidate}, I) {
    c_sendExclusiveData;
    forward_eviction_to_cpu;
    gr_deallocateCacheBlock;
    l_popForwardQueue;
  }

  transition(M, {Other_GETS, Other_GETS_No_Mig}, O) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(M, NC_DMA_GETS, O) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(M, Merged_GETS, O) {
    em_sendDataSharedMultiple;
    l_popForwardQueue;
  }

  // Transitions from IM

  transition({IM, IM_F}, {Other_GETX, NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig, Invalidate}) {
    f_sendAck;
    l_popForwardQueue;
  }

  transition({IM, IM_F, MM_F}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(IM, Data, ISM) {
    u_writeDataToCache;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(IM_F, Data, ISM_F) {
      uf_writeDataToCacheTBE;
      m_decrementNumberOfMessages;
      o_checkForCompletion;
      n_popResponseQueue;
  }

  transition(IM, Exclusive_Data, MM_W) {
    u_writeDataToCache;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    sx_external_store_hit;
    n_popResponseQueue;
    kd_wakeUpDependents;
  }

  transition(IM_F, Exclusive_Data, MM_WF) {
      uf_writeDataToCacheTBE;
      m_decrementNumberOfMessages;
      o_checkForCompletion;
      n_popResponseQueue;
  }

  // Transitions from SM
  transition({SM, SM_F}, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}) {
    ff_sendAckShared;
    l_popForwardQueue;
  }

  transition(SM, {Other_GETX, Invalidate}, IM) {
    f_sendAck;
    forward_eviction_to_cpu;
    l_popForwardQueue;
  }

  transition(SM_F, {Other_GETX, Invalidate}, IM_F) {
    f_sendAck;
    forward_eviction_to_cpu;
    l_popForwardQueue;
  }

  transition({SM, SM_F}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(SM, {Data, Exclusive_Data}, ISM) {
    v_writeDataToCacheVerify;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(SM_F, {Data, Exclusive_Data}, ISM_F) {
    vt_writeDataToTBEVerify;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  // Transitions from ISM
  transition({ISM, ISM_F}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(ISM, All_acks_no_sharers, MM) {
    sxt_trig_ext_store_hit;
    gm_sendUnblockM;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(ISM_F, All_acks_no_sharers, MI_F) {
    df_issuePUTF;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  // Transitions from OM

  transition(OM, {Other_GETX, Invalidate}, IM) {
    e_sendData;
    pp_incrementNumberOfMessagesByOne;
    forward_eviction_to_cpu;
    l_popForwardQueue;
  }

  transition(OM_F, {Other_GETX, Invalidate}, IM_F) {
    q_sendDataFromTBEToCache;
    pp_incrementNumberOfMessagesByOne;
    forward_eviction_to_cpu;
    l_popForwardQueue;
  }

  transition(OM, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}) {
    ee_sendDataShared;
    l_popForwardQueue;
  }

  transition(OM, Merged_GETS) {
    em_sendDataSharedMultiple;
    l_popForwardQueue;
  }

  transition(OM_F, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}) {
    et_sendDataSharedFromTBE;
    l_popForwardQueue;
  }

  transition(OM_F, Merged_GETS) {
    emt_sendDataSharedMultipleFromTBE;
    l_popForwardQueue;
  }

  transition({OM, OM_F}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(OM, {All_acks, All_acks_no_sharers}, MM) {
    sxt_trig_ext_store_hit;
    gm_sendUnblockM;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition({MM_F, OM_F}, {All_acks, All_acks_no_sharers}, MI_F) {
    df_issuePUTF;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }
  // Transitions from IS

  transition(IS, {Other_GETX, NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig, Invalidate}) {
    f_sendAck;
    l_popForwardQueue;
  }

  transition(IS, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

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

  transition(IS, Data, SS) {
    u_writeDataToCache;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    hx_external_load_hit;
    uo_updateCurrentOwner;
    n_popResponseQueue;
    kd_wakeUpDependents;
  }

  transition(IS, Exclusive_Data, M_W) {
    u_writeDataToCache;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    hx_external_load_hit;
    n_popResponseQueue;
    kd_wakeUpDependents;
  }

  transition(IS, Shared_Data, SS) {
    u_writeDataToCache;
    r_setSharerBit;
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    hx_external_load_hit;
    uo_updateCurrentOwner;
    n_popResponseQueue;
    kd_wakeUpDependents;
  }

  // Transitions from SS

  transition(SS, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

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

  transition(SS, All_acks, S) {
    gs_sendUnblockS;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(SS, All_acks_no_sharers, S) {
    // Note: The directory might still be the owner, so that is why we go to S
    gs_sendUnblockS;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  // Transitions from MM_W

  transition(MM_W, Store) {
    hh_store_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition({MM_W, MM_WF}, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(MM_W, All_acks_no_sharers, MM) {
    gm_sendUnblockM;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  transition(MM_WF, All_acks_no_sharers, MI_F) {
    df_issuePUTF;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }
  // Transitions from M_W

  transition(M_W, Store, MM_W) {
    hh_store_hit;
    uu_profileL1DataHit;
    k_popMandatoryQueue;
  }

  transition(M_W, Ack) {
    m_decrementNumberOfMessages;
    o_checkForCompletion;
    n_popResponseQueue;
  }

  transition(M_W, All_acks_no_sharers, M) {
    gm_sendUnblockM;
    s_deallocateTBE;
    j_popTriggerQueue;
    kd_wakeUpDependents;
  }

  // Transitions from OI/MI

  transition({OI, MI}, {Other_GETX, Invalidate}, II) {
    q_sendDataFromTBEToCache;
    l_popForwardQueue;
  }

  transition({OI, MI}, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig}, OI) {
    sq_sendSharedDataFromTBEToCache;
    l_popForwardQueue;
  }

  transition({OI, MI}, Merged_GETS, OI) {
    qm_sendDataFromTBEToCache;
    l_popForwardQueue;
  }

  transition(MI, Writeback_Ack, I) {
    t_sendExclusiveDataFromTBEToMemory;
    s_deallocateTBE;
    l_popForwardQueue;
    kd_wakeUpDependents;
  }

  transition(MI_F, Writeback_Ack, I) {
      hh_flush_hit;
      t_sendExclusiveDataFromTBEToMemory;
      s_deallocateTBE;
      l_popForwardQueue;
      kd_wakeUpDependents;
  }

  transition(OI, Writeback_Ack, I) {
    qq_sendDataFromTBEToMemory;
    s_deallocateTBE;
    l_popForwardQueue;
    kd_wakeUpDependents;
  }

  // Transitions from II
  transition(II, {NC_DMA_GETS, Other_GETS, Other_GETS_No_Mig, Other_GETX, Invalidate}, II) {
    f_sendAck;
    l_popForwardQueue;
  }

  transition(II, Writeback_Ack, I) {
    g_sendUnblock;
    s_deallocateTBE;
    l_popForwardQueue;
    kd_wakeUpDependents;
  }

  transition(II, Writeback_Nack, I) {
    s_deallocateTBE;
    l_popForwardQueue;
    kd_wakeUpDependents;
  }

  transition(MM_F, {Other_GETX, Invalidate}, IM_F) {
    ct_sendExclusiveDataFromTBE;
    pp_incrementNumberOfMessagesByOne;
    l_popForwardQueue;
  }

  transition(MM_F, Other_GETS, IM_F) {
    ct_sendExclusiveDataFromTBE;
    pp_incrementNumberOfMessagesByOne;
    l_popForwardQueue;
  }

  transition(MM_F, NC_DMA_GETS, OM_F) {
    sq_sendSharedDataFromTBEToCache;
    l_popForwardQueue;
  }

  transition(MM_F, Other_GETS_No_Mig, OM_F) {
    et_sendDataSharedFromTBE;
    l_popForwardQueue;
  }

  transition(MM_F, Merged_GETS, OM_F) {
    emt_sendDataSharedMultipleFromTBE;
    l_popForwardQueue;
  }
}
