diff options
author | Gabe Black <gabeblack@google.com> | 2019-08-16 13:11:13 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-08-23 21:13:07 +0000 |
commit | c08351f4d399f56ec6ed6c81b39e52f55a7bc56f (patch) | |
tree | 9677dd2982e4bfe65b5576453b06cf4f326d4a68 /src/mem/protocol/MOESI_CMP_directory-L2cache.sm | |
parent | d97e4e1dd01a943a2c40ead90099d3e085059715 (diff) | |
download | gem5-c08351f4d399f56ec6ed6c81b39e52f55a7bc56f.tar.xz |
mem: Move ruby protocols into a directory called ruby_protocol.
Now that the gem5 protocols are split out, it would be nice to put them
in their own protocol directory. It's also confusing to have files
called *_protocol which are not in the protocol directory.
Change-Id: I7475ee111630050a2421816dfd290921baab9f71
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20230
Reviewed-by: Gabe Black <gabeblack@google.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/mem/protocol/MOESI_CMP_directory-L2cache.sm')
-rw-r--r-- | src/mem/protocol/MOESI_CMP_directory-L2cache.sm | 2924 |
1 files changed, 0 insertions, 2924 deletions
diff --git a/src/mem/protocol/MOESI_CMP_directory-L2cache.sm b/src/mem/protocol/MOESI_CMP_directory-L2cache.sm deleted file mode 100644 index faea79fec..000000000 --- a/src/mem/protocol/MOESI_CMP_directory-L2cache.sm +++ /dev/null @@ -1,2924 +0,0 @@ -/* - * Copyright (c) 2019 ARM Limited - * All rights reserved - * - * The license below extends only to copyright in the software and shall - * not be construed as granting a license to any other intellectual - * property including but not limited to intellectual property relating - * to a hardware implementation of the functionality of the software - * licensed hereunder. You may use the software subject to the license - * terms below provided that you ensure that this notice is replicated - * unmodified and in its entirety in all distributions of the software, - * modified or unmodified, in source code or in binary form. - * - * Copyright (c) 1999-2013 Mark D. Hill and David A. Wood - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer; - * redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution; - * neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -machine(MachineType:L2Cache, "Token protocol") -: CacheMemory * L2cache; - Cycles response_latency := 1; - Cycles request_latency := 1; - - // L2 BANK QUEUES - // From local bank of L2 cache TO the network - MessageBuffer * L1RequestFromL2Cache, network="To", virtual_network="0", - vnet_type="request"; // this L2 bank -> a local L1 - MessageBuffer * GlobalRequestFromL2Cache, network="To", virtual_network="1", - vnet_type="request"; // this L2 bank -> mod-directory - MessageBuffer * responseFromL2Cache, network="To", virtual_network="2", - vnet_type="response"; // this L2 bank -> a local L1 || mod-directory - - // FROM the network to this local bank of L2 cache - MessageBuffer * L1RequestToL2Cache, network="From", virtual_network="0", - vnet_type="request"; // a local L1 -> this L2 bank, Lets try this??? - MessageBuffer * GlobalRequestToL2Cache, network="From", virtual_network="1", - vnet_type="request"; // mod-directory -> this L2 bank - MessageBuffer * responseToL2Cache, network="From", virtual_network="2", - vnet_type="response"; // a local L1 || mod-directory -> this L2 bank - - MessageBuffer * triggerQueue; -{ - // STATES - state_declaration(State, desc="L2 Cache states", default="L2Cache_State_I") { - - // Stable states - NP, AccessPermission:Invalid, desc="Not Present"; - I, AccessPermission:Invalid, desc="Invalid"; - ILS, AccessPermission:Invalid, desc="Idle/NP, but local sharers exist"; - ILX, AccessPermission:Invalid, desc="Idle/NP, but local exclusive exists"; - ILO, AccessPermission:Invalid, desc="Idle/NP, but local owner exists"; - ILOX, AccessPermission:Invalid, desc="Idle/NP, but local owner exists and chip is exclusive"; - ILOS, AccessPermission:Invalid, desc="Idle/NP, but local owner exists and local sharers as well"; - ILOSX, AccessPermission:Invalid, desc="Idle/NP, but local owner exists, local sharers exist, chip is exclusive "; - S, AccessPermission:Read_Only, desc="Shared, no local sharers"; - O, AccessPermission:Read_Only, desc="Owned, no local sharers"; - OLS, AccessPermission:Read_Only, desc="Owned with local sharers"; - OLSX, AccessPermission:Read_Only, desc="Owned with local sharers, chip is exclusive"; - SLS, AccessPermission:Read_Only, desc="Shared with local sharers"; - M, AccessPermission:Read_Write, desc="Modified"; - - // Transient States - - IFGX, AccessPermission:Busy, desc="Blocked, forwarded global GETX to local owner/exclusive. No other on-chip invs needed"; - IFGS, AccessPermission:Busy, desc="Blocked, forwarded global GETS to local owner"; - ISFGS, AccessPermission:Busy, desc="Blocked, forwarded global GETS to local owner, local sharers exist"; - IFGXX, AccessPermission:Busy, desc="Blocked, forwarded global GETX to local owner but may need acks from other sharers"; - OLSF, AccessPermission:Busy, desc="Blocked, got Fwd_GETX with local sharers, waiting for local inv acks"; - - // writebacks - ILOW, AccessPermission:Busy, desc="local WB request, was ILO"; - ILOXW, AccessPermission:Busy, desc="local WB request, was ILOX"; - ILOSW, AccessPermission:Busy, desc="local WB request, was ILOS"; - ILOSXW, AccessPermission:Busy, desc="local WB request, was ILOSX"; - SLSW, AccessPermission:Busy, desc="local WB request, was SLS"; - OLSW, AccessPermission:Busy, desc="local WB request, was OLS"; - ILSW, AccessPermission:Busy, desc="local WB request, was ILS"; - IW, AccessPermission:Busy, desc="local WB request from only sharer, was ILS"; - OW, AccessPermission:Busy, desc="local WB request from only sharer, was OLS"; - SW, AccessPermission:Busy, desc="local WB request from only sharer, was SLS"; - OXW, AccessPermission:Busy, desc="local WB request from only sharer, was OLSX"; - OLSXW, AccessPermission:Busy, desc="local WB request from sharer, was OLSX"; - ILXW, AccessPermission:Busy, desc="local WB request, was ILX"; - - IFLS, AccessPermission:Busy, desc="Blocked, forwarded local GETS to _some_ local sharer"; - IFLO, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner"; - IFLOX, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner but chip is exclusive"; - IFLOXX, AccessPermission:Busy, desc="Blocked, forwarded local GETX to local owner/exclusive, chip is exclusive"; - IFLOSX, AccessPermission:Busy, desc="Blocked, forwarded local GETS to local owner w/ other sharers, chip is exclusive"; - IFLXO, AccessPermission:Busy, desc="Blocked, forwarded local GETX to local owner with other sharers, chip is exclusive"; - - IGS, AccessPermission:Busy, desc="Semi-blocked, issued local GETS to directory"; - IGM, AccessPermission:Busy, desc="Blocked, issued local GETX to directory. Need global acks and data"; - IGMLS, AccessPermission:Busy, desc="Blocked, issued local GETX to directory but may need to INV local sharers"; - IGMO, AccessPermission:Busy, desc="Blocked, have data for local GETX but need all acks"; - IGMIO, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner with possible local sharer, may need to INV"; - OGMIO, AccessPermission:Busy, desc="Blocked, issued local GETX, was owner, may need to INV"; - IGMIOF, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner, waiting for global acks, got Fwd_GETX"; - IGMIOFS, AccessPermission:Busy, desc="Blocked, issued local GETX, local owner, waiting for global acks, got Fwd_GETS"; - OGMIOF, AccessPermission:Busy, desc="Blocked, issued local GETX, was owner, waiting for global acks, got Fwd_GETX"; - - II, AccessPermission:Busy, desc="Blocked, handling invalidations"; - MM, AccessPermission:Busy, desc="Blocked, was M satisfying local GETX"; - SS, AccessPermission:Busy, desc="Blocked, was S satisfying local GETS"; - OO, AccessPermission:Busy, desc="Blocked, was O satisfying local GETS"; - OLSS, AccessPermission:Busy, desc="Blocked, satisfying local GETS"; - OLSXS, AccessPermission:Busy, desc="Blocked, satisfying local GETS"; - SLSS, AccessPermission:Busy, desc="Blocked, satisfying local GETS"; - - OI, AccessPermission:Busy, desc="Blocked, doing writeback, was O"; - MI, AccessPermission:Busy, desc="Blocked, doing writeback, was M"; - MII, AccessPermission:Busy, desc="Blocked, doing writeback, was M, got Fwd_GETX"; - OLSI, AccessPermission:Busy, desc="Blocked, doing writeback, was OLS"; - ILSI, AccessPermission:Busy, desc="Blocked, doing writeback, was OLS got Fwd_GETX"; - - // DMA blocking states - ILOSD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack"; - ILOSXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack"; - ILOD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack"; - ILXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack"; - ILOXD, AccessPermission:Busy, desc="Blocked, waiting for DMA ack"; - } - - // EVENTS - enumeration(Event, desc="Cache events") { - - // Requests - L1_GETS, desc="local L1 GETS request"; - L1_GETX, desc="local L1 GETX request"; - L1_PUTO, desc="local owner wants to writeback"; - L1_PUTX, desc="local exclusive wants to writeback"; - L1_PUTS_only, desc="only local sharer wants to writeback"; - L1_PUTS, desc="local sharer wants to writeback"; - Fwd_GETX, desc="A GetX from another processor"; - Fwd_GETS, desc="A GetS from another processor"; - Fwd_DMA, desc="A request from DMA"; - Own_GETX, desc="A GetX from this node"; - Inv, desc="Invalidations from the directory"; - - // Responses - IntAck, desc="Received an ack message"; - ExtAck, desc="Received an ack message"; - All_Acks, desc="Received all ack messages"; - Data, desc="Received a data message, responder has a shared copy"; - Data_Exclusive, desc="Received a data message"; - L1_WBCLEANDATA, desc="Writeback from L1, with data"; - L1_WBDIRTYDATA, desc="Writeback from L1, with data"; - - Writeback_Ack, desc="Writeback O.K. from directory"; - Writeback_Nack, desc="Writeback not O.K. from directory"; - - Unblock, desc="Local L1 is telling L2 dir to unblock"; - Exclusive_Unblock, desc="Local L1 is telling L2 dir to unblock"; - - DmaAck, desc="DMA ack from local L1"; - // events initiated by this L2 - L2_Replacement, desc="L2 Replacement", format="!r"; - - } - - // TYPES - - // CacheEntry - structure(Entry, desc="...", interface="AbstractCacheEntry") { - State CacheState, desc="cache state"; - NetDest Sharers, desc="Set of the internal processors that want the block in shared state"; - MachineID Owner, desc="ID of the L1 cache to forward the block to once we get a response"; - bool OwnerValid, default="false", desc="true if Owner means something"; - bool Dirty, desc="Is the data dirty (different than memory)?"; - DataBlock DataBlk, desc="data for the block"; - } - - - structure(DirEntry, desc="...", interface="AbstractEntry") { - NetDest Sharers, desc="Set of the internal processors that want the block in shared state"; - MachineID Owner, desc="ID of the L1 cache to forward the block to once we get a response"; - bool OwnerValid, default="false", desc="true if Owner means something"; - State DirState, desc="directory state"; - } - - // TBE fields - structure(TBE, desc="...") { - Addr addr, desc="Physical address for this TBE"; - State TBEState, desc="Transient state"; - Addr PC, desc="Program counter of request"; - DataBlock DataBlk, desc="Buffer for the data block"; - bool Dirty, desc="Is the data dirty (different than memory)?"; - - int NumExtPendingAcks, default="0", desc="Number of global acks/data messages waiting for"; - int NumIntPendingAcks, default="0", desc="Number of global acks/data messages waiting for"; - int Fwd_GETX_ExtAcks, default="0", desc="Number of acks that requestor will need"; - int Local_GETX_IntAcks, default="0", desc="Number of acks that requestor will need"; - - NetDest L1_GetS_IDs, desc="Set of the internal processors that want the block in shared state"; - MachineID L1_GetX_ID, desc="ID of the L1 cache to forward the block to once we get a response"; - NetDest Fwd_GetS_IDs, desc="Set of the internal processors that want the block in shared state"; - MachineID Fwd_GetX_ID, desc="ID of the L1 cache to forward the block to once we get a response"; - } - - structure(TBETable, external = "yes") { - TBE lookup(Addr); - void allocate(Addr); - void deallocate(Addr); - bool isPresent(Addr); - } - - structure(PerfectCacheMemory, external = "yes") { - void allocate(Addr); - void deallocate(Addr); - DirEntry lookup(Addr); - bool isTagPresent(Addr); - } - - TBETable TBEs, template="<L2Cache_TBE>", constructor="m_number_of_TBEs"; - PerfectCacheMemory localDirectory, template="<L2Cache_DirEntry>"; - - Tick clockEdge(); - Tick cyclesToTicks(Cycles c); - void set_cache_entry(AbstractCacheEntry b); - void unset_cache_entry(); - void set_tbe(TBE b); - void unset_tbe(); - MachineID mapAddressToMachine(Addr addr, MachineType mtype); - void wakeUpAllBuffers(Addr a); - - // Latency for responses that fetch data from cache - Cycles cacheResponseLatency() { - if (L2cache.getTagLatency() > response_latency) { - return L2cache.getTagLatency(); - } - else { - return response_latency; - } - } - - Entry getCacheEntry(Addr address), return_by_pointer="yes" { - return static_cast(Entry, "pointer", L2cache[address]); - } - - bool isDirTagPresent(Addr addr) { - return (localDirectory.isTagPresent(addr) ); - } - - DirEntry getDirEntry(Addr address), return_by_pointer="yes" { - return localDirectory.lookup(address); - } - - bool isOnlySharer(Entry cache_entry, Addr addr, MachineID shar_id) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - if (cache_entry.Sharers.count() > 1) { - return false; - } - else if (cache_entry.Sharers.count() == 1) { - if (cache_entry.Sharers.isElement(shar_id)) { - return true; - } - else { - return false; // something happened which should cause this PUTS to be nacked - } - return true; - } - else { - return false; - } - } - else if (localDirectory.isTagPresent(addr)){ - DirEntry dir_entry := getDirEntry(addr); - if (dir_entry.Sharers.count() > 1) { - return false; - } - else if (dir_entry.Sharers.count() == 1) { - if (dir_entry.Sharers.isElement(shar_id)) { - return true; - } - else { - return false; // something happened which should cause this PUTS to be nacked - } - } - else { - return false; - } - } - else { - // shouldn't happen unless L1 issues PUTS before unblock received - return false; - } - } - - void copyCacheStateToDir(Entry cache_entry, Addr addr) { - assert(localDirectory.isTagPresent(addr) == false); - assert(is_valid(cache_entry)); - localDirectory.allocate(addr); - DirEntry dir_entry := getDirEntry(addr); - dir_entry.DirState := cache_entry.CacheState; - dir_entry.Sharers := cache_entry.Sharers; - dir_entry.Owner := cache_entry.Owner; - dir_entry.OwnerValid := cache_entry.OwnerValid; - - } - - void copyDirToCache(Entry cache_entry, Addr addr) { - assert(is_valid(cache_entry)); - DirEntry dir_entry := getDirEntry(addr); - cache_entry.Sharers := dir_entry.Sharers; - cache_entry.Owner := dir_entry.Owner; - cache_entry.OwnerValid := dir_entry.OwnerValid; - } - - - void recordLocalSharerInDir(Entry cache_entry, Addr addr, MachineID shar_id) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - cache_entry.Sharers.add(shar_id); - } - else { - if (localDirectory.isTagPresent(addr) == false) { - localDirectory.allocate(addr); - DirEntry dir_entry := getDirEntry(addr); - dir_entry.Sharers.clear(); - dir_entry.OwnerValid := false; - } - DirEntry dir_entry := getDirEntry(addr); - dir_entry.Sharers.add(shar_id); - } - } - - void recordNewLocalExclusiveInDir(Entry cache_entry, Addr addr, MachineID exc_id) { - - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - cache_entry.Sharers.clear(); - cache_entry.OwnerValid := true; - cache_entry.Owner := exc_id; - } - else { - if (localDirectory.isTagPresent(addr) == false) { - localDirectory.allocate(addr); - } - DirEntry dir_entry := getDirEntry(addr); - dir_entry.Sharers.clear(); - dir_entry.OwnerValid := true; - dir_entry.Owner := exc_id; - } - } - - void removeAllLocalSharersFromDir(Entry cache_entry, Addr addr) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - cache_entry.Sharers.clear(); - cache_entry.OwnerValid := false; - } - else { - DirEntry dir_entry := getDirEntry(addr); - dir_entry.Sharers.clear(); - dir_entry.OwnerValid := false; - } - } - - void removeSharerFromDir(Entry cache_entry, Addr addr, MachineID sender) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - cache_entry.Sharers.remove(sender); - } - else { - DirEntry dir_entry := getDirEntry(addr); - dir_entry.Sharers.remove(sender); - } - } - - void removeOwnerFromDir(Entry cache_entry, Addr addr, MachineID sender) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - cache_entry.OwnerValid := false; - } - else { - DirEntry dir_entry := getDirEntry(addr); - dir_entry.OwnerValid := false; - } - } - - bool isLocalSharer(Entry cache_entry, Addr addr, MachineID shar_id) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - return cache_entry.Sharers.isElement(shar_id); - } - else { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.Sharers.isElement(shar_id); - } - } - - NetDest getLocalSharers(Entry cache_entry, Addr addr) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - return cache_entry.Sharers; - } - else { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.Sharers; - } - } - - MachineID getLocalOwner(Entry cache_entry, Addr addr) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - return cache_entry.Owner; - } - else { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.Owner; - } - } - - int countLocalSharers(Entry cache_entry, Addr addr) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - return cache_entry.Sharers.count(); - } - else { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.Sharers.count(); - } - } - - bool isLocalOwnerValid(Entry cache_entry, Addr addr) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - return cache_entry.OwnerValid; - } - else { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.OwnerValid; - } - } - - int countLocalSharersExceptRequestor(Entry cache_entry, Addr addr, MachineID requestor) { - if (is_valid(cache_entry)) { - assert (localDirectory.isTagPresent(addr) == false); - if (cache_entry.Sharers.isElement(requestor)) { - return ( cache_entry.Sharers.count() - 1 ); - } - else { - return cache_entry.Sharers.count(); - } - } - else { - DirEntry dir_entry := getDirEntry(addr); - if (dir_entry.Sharers.isElement(requestor)) { - return ( dir_entry.Sharers.count() - 1 ); - } - else { - return dir_entry.Sharers.count(); - } - } - } - - State getState(TBE tbe, Entry cache_entry, Addr addr) { - - if (is_valid(tbe)) { - return tbe.TBEState; - } else if (is_valid(cache_entry)) { - return cache_entry.CacheState; - } else if (isDirTagPresent(addr)) { - DirEntry dir_entry := getDirEntry(addr); - return dir_entry.DirState; - } else { - return State:NP; - } - } - - std::string getCoherenceRequestTypeStr(CoherenceRequestType type) { - return CoherenceRequestType_to_string(type); - } - - void setState(TBE tbe, Entry cache_entry, Addr addr, State state) { - assert((localDirectory.isTagPresent(addr) && L2cache.isTagPresent(addr)) == false); - - if (is_valid(tbe)) { - tbe.TBEState := state; - } - - if ( - (state == State:M) || - (state == State:O) || - (state == State:S) || - (state == State:OLS) || - (state == State:SLS) || - (state == State:OLSX) || - (state == State:SLS) - ) { - assert(is_valid(cache_entry)); - } - else if ( - (state == State:ILS) || - (state == State:ILX) || - (state == State:ILO) || - (state == State:ILOX) || - (state == State:ILOS) || - (state == State:ILOSX) - ) { - // assert(isCacheTagPresent(addr) == false); - } - - if (is_valid(cache_entry)) { - if ( ((cache_entry.CacheState != State:M) && (state == State:M)) || - ((cache_entry.CacheState != State:S) && (state == State:S)) || - ((cache_entry.CacheState != State:O) && (state == State:O)) ) { - cache_entry.CacheState := state; - // disable Coherence Checker for now - // sequencer.checkCoherence(addr); - } - else { - cache_entry.CacheState := state; - } - } - else if (localDirectory.isTagPresent(addr)) { - DirEntry dir_entry := getDirEntry(addr); - dir_entry.DirState := state; - } - } - - AccessPermission getAccessPermission(Addr addr) { - TBE tbe := TBEs[addr]; - if(is_valid(tbe)) { - DPRINTF(RubySlicc, "%s\n", L2Cache_State_to_permission(tbe.TBEState)); - return L2Cache_State_to_permission(tbe.TBEState); - } - - Entry cache_entry := getCacheEntry(addr); - if(is_valid(cache_entry)) { - DPRINTF(RubySlicc, "%s\n", L2Cache_State_to_permission(cache_entry.CacheState)); - return L2Cache_State_to_permission(cache_entry.CacheState); - } - - DPRINTF(RubySlicc, "AccessPermission_NotPresent\n"); - return AccessPermission:NotPresent; - } - - void setAccessPermission(Entry cache_entry, Addr addr, State state) { - if (is_valid(cache_entry)) { - cache_entry.changePermission(L2Cache_State_to_permission(state)); - } - } - - void functionalRead(Addr addr, Packet *pkt) { - TBE tbe := TBEs[addr]; - if(is_valid(tbe)) { - testAndRead(addr, tbe.DataBlk, pkt); - } else { - testAndRead(addr, getCacheEntry(addr).DataBlk, pkt); - } - } - - int functionalWrite(Addr addr, Packet *pkt) { - int num_functional_writes := 0; - - TBE tbe := TBEs[addr]; - if(is_valid(tbe)) { - num_functional_writes := num_functional_writes + - testAndWrite(addr, tbe.DataBlk, pkt); - return num_functional_writes; - } - - num_functional_writes := num_functional_writes + - testAndWrite(addr, getCacheEntry(addr).DataBlk, pkt); - return num_functional_writes; - } - - out_port(globalRequestNetwork_out, RequestMsg, GlobalRequestFromL2Cache); - out_port(localRequestNetwork_out, RequestMsg, L1RequestFromL2Cache); - out_port(responseNetwork_out, ResponseMsg, responseFromL2Cache); - - out_port(triggerQueue_out, TriggerMsg, triggerQueue); - - - // ** IN_PORTS ** - - // Trigger Queue - in_port(triggerQueue_in, TriggerMsg, triggerQueue, rank=3) { - if (triggerQueue_in.isReady(clockEdge())) { - peek(triggerQueue_in, TriggerMsg) { - if (in_msg.Type == TriggerType:ALL_ACKS) { - trigger(Event:All_Acks, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else { - error("Unexpected message"); - } - } - } - } - - // Response Network - in_port(responseNetwork_in, ResponseMsg, responseToL2Cache, rank=2) { - if (responseNetwork_in.isReady(clockEdge())) { - peek(responseNetwork_in, ResponseMsg) { - assert(in_msg.Destination.isElement(machineID)); - if (in_msg.Type == CoherenceResponseType:ACK) { - if (in_msg.SenderMachine == MachineType:L2Cache) { - trigger(Event:ExtAck, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } - else { - trigger(Event:IntAck, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } - } else if (in_msg.Type == CoherenceResponseType:DATA) { - trigger(Event:Data, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:DATA_EXCLUSIVE) { - trigger(Event:Data_Exclusive, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:UNBLOCK) { - DPRINTF(RubySlicc, "Received Unblock from L1 addr: %x\n", in_msg.addr); - trigger(Event:Unblock, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:UNBLOCK_EXCLUSIVE) { - trigger(Event:Exclusive_Unblock, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:WB_ACK) { - trigger(Event:Writeback_Ack, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:WB_NACK) { - trigger(Event:Writeback_Nack, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceResponseType:DMA_ACK) { - trigger(Event:DmaAck, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else { - error("Unexpected message"); - } - } - } - } - - - // Request Network - in_port(requestNetwork_in, RequestMsg, GlobalRequestToL2Cache, rank=1) { - if (requestNetwork_in.isReady(clockEdge())) { - peek(requestNetwork_in, RequestMsg) { - if (in_msg.Type == CoherenceRequestType:GETX || in_msg.Type == CoherenceRequestType:DMA_WRITE) { - if (in_msg.Requestor == machineID) { - trigger(Event:Own_GETX, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else { - trigger(Event:Fwd_GETX, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } - } else if (in_msg.Type == CoherenceRequestType:GETS) { - trigger(Event:Fwd_GETS, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if(in_msg.Type == CoherenceRequestType:DMA_READ) { - trigger(Event:Fwd_DMA, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceRequestType:INV) { - trigger(Event:Inv, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else { - error("Unexpected message"); - } - } - } - } - - in_port(L1requestNetwork_in, RequestMsg, L1RequestToL2Cache, rank=0) { - if (L1requestNetwork_in.isReady(clockEdge())) { - peek(L1requestNetwork_in, RequestMsg) { - assert(in_msg.Destination.isElement(machineID)); - if (in_msg.Type == CoherenceRequestType:GETX) { - trigger(Event:L1_GETX, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceRequestType:GETS) { - trigger(Event:L1_GETS, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceRequestType:PUTO) { - trigger(Event:L1_PUTO, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceRequestType:PUTX) { - trigger(Event:L1_PUTX, in_msg.addr, - getCacheEntry(in_msg.addr), TBEs[in_msg.addr]); - } else if (in_msg.Type == CoherenceRequestType:PUTS) { - Entry cache_entry := getCacheEntry(in_msg.addr); - if (isOnlySharer(cache_entry, in_msg.addr, in_msg.Requestor)) { - trigger(Event:L1_PUTS_only, in_msg.addr, - cache_entry, TBEs[in_msg.addr]); - } - else { - trigger(Event:L1_PUTS, in_msg.addr, - cache_entry, TBEs[in_msg.addr]); - } - } else if (in_msg.Type == CoherenceRequestType:WRITEBACK_DIRTY_DATA) { - Entry cache_entry := getCacheEntry(in_msg.addr); - if (is_invalid(cache_entry) && - L2cache.cacheAvail(in_msg.addr) == false) { - trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr), - getCacheEntry(L2cache.cacheProbe(in_msg.addr)), - TBEs[L2cache.cacheProbe(in_msg.addr)]); - } - else { - trigger(Event:L1_WBDIRTYDATA, in_msg.addr, - cache_entry, TBEs[in_msg.addr]); - } - } else if (in_msg.Type == CoherenceRequestType:WRITEBACK_CLEAN_DATA) { - Entry cache_entry := getCacheEntry(in_msg.addr); - if (is_invalid(cache_entry) && - L2cache.cacheAvail(in_msg.addr) == false) { - trigger(Event:L2_Replacement, L2cache.cacheProbe(in_msg.addr), - getCacheEntry(L2cache.cacheProbe(in_msg.addr)), - TBEs[L2cache.cacheProbe(in_msg.addr)]); - } - else { - trigger(Event:L1_WBCLEANDATA, in_msg.addr, - cache_entry, TBEs[in_msg.addr]); - } - } else { - error("Unexpected message"); - } - } - } - } - - - // ACTIONS - - action(a_issueGETS, "a", desc="issue local request globally") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue(globalRequestNetwork_out, RequestMsg, request_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:GETS; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Requestor := machineID; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.MessageSize := MessageSizeType:Request_Control; - } - } - } - - action(a_issueGETX, "\a", desc="issue local request globally") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue(globalRequestNetwork_out, RequestMsg, request_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:GETX; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Requestor := machineID; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.MessageSize := MessageSizeType:Request_Control; - } - } - } - - action(b_issuePUTX, "b", desc="Issue PUTX") { - enqueue(globalRequestNetwork_out, RequestMsg, request_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:PUTX; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Requestor := machineID; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - - action(b_issuePUTO, "\b", desc="Issue PUTO") { - enqueue(globalRequestNetwork_out, RequestMsg, request_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:PUTO; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - - /* PUTO, but local sharers exist */ - action(b_issuePUTO_ls, "\bb", desc="Issue PUTO") { - enqueue(globalRequestNetwork_out, RequestMsg, request_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:PUTO_SHARERS; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - - action(c_sendDataFromTBEToL1GETS, "c", desc="Send data from TBE to L1 requestors in TBE") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(tbe.L1_GetS_IDs); - out_msg.DataBlk := tbe.DataBlk; - // out_msg.Dirty := tbe.Dirty; - // shared data should be clean - out_msg.Dirty := false; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, tbe.DataBlk); - } - - action(c_sendDataFromTBEToL1GETX, "\c", desc="Send data from TBE to L1 requestors in TBE") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(tbe.L1_GetX_ID); - out_msg.DataBlk := tbe.DataBlk; - out_msg.Dirty := tbe.Dirty; - out_msg.Acks := tbe.Local_GETX_IntAcks; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, tbe.DataBlk); - } - - action(c_sendExclusiveDataFromTBEToL1GETS, "\cc", desc="Send data from TBE to L1 requestors in TBE") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(tbe.L1_GetS_IDs); - out_msg.DataBlk := tbe.DataBlk; - out_msg.Dirty := tbe.Dirty; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - } - - action(c_sendDataFromTBEToFwdGETX, "cc", desc="Send data from TBE to external GETX") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(tbe.Fwd_GetX_ID); - out_msg.DataBlk := tbe.DataBlk; - out_msg.Dirty := tbe.Dirty; - out_msg.Acks := tbe.Fwd_GETX_ExtAcks; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - } - - action(cd_sendDataFromTBEToFwdDma, "cd", desc="Send data from TBE to external GETX") { - assert(is_valid(tbe)); - peek(requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := tbe.DataBlk; - // out_msg.Dirty := tbe.Dirty; - // shared data should be clean - out_msg.Dirty := false; - out_msg.Acks := tbe.Fwd_GETX_ExtAcks; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, tbe.DataBlk); - } - - action(c_sendDataFromTBEToFwdGETS, "ccc", desc="Send data from TBE to external GETX") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(tbe.Fwd_GetS_IDs); - out_msg.DataBlk := tbe.DataBlk; - // out_msg.Dirty := tbe.Dirty; - // shared data should be clean - out_msg.Dirty := false; - out_msg.Acks := tbe.Fwd_GETX_ExtAcks; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, tbe.DataBlk); - } - - action(c_sendExclusiveDataFromTBEToFwdGETS, "\ccc", desc="Send data from TBE to external GETX") { - assert(is_valid(tbe)); - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(tbe.Fwd_GetS_IDs); - out_msg.DataBlk := tbe.DataBlk; - out_msg.Dirty := tbe.Dirty; - out_msg.Acks := tbe.Fwd_GETX_ExtAcks; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, tbe.DataBlk); - } - - action(d_sendDataToL1GETS, "d", desc="Send data directly to L1 requestor") { - assert(is_valid(cache_entry)); - peek(L1requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, cacheResponseLatency()) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := cache_entry.DataBlk; - // out_msg.Dirty := cache_entry.Dirty; - // shared data should be clean - out_msg.Dirty := false; - out_msg.MessageSize := MessageSizeType:ResponseL2hit_Data; - } - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - } - - action(d_sendDataToL1GETX, "\d", desc="Send data and a token from TBE to L1 requestor") { - assert(is_valid(cache_entry)); - peek(L1requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, cacheResponseLatency()) { - assert(is_valid(tbe)); - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := cache_entry.DataBlk; - out_msg.Dirty := cache_entry.Dirty; - out_msg.MessageSize := MessageSizeType:ResponseL2hit_Data; - out_msg.Acks := tbe.Local_GETX_IntAcks; - } - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - } - - action(dd_sendDataToFwdGETX, "dd", desc="send data") { - assert(is_valid(cache_entry)); - peek(requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, cacheResponseLatency()) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := cache_entry.DataBlk; - out_msg.Dirty := cache_entry.Dirty; - out_msg.MessageSize := MessageSizeType:Response_Data; - out_msg.Acks := in_msg.Acks; - } - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - } - - - action(dd_sendDataToFwdGETS, "\dd", desc="send data") { - assert(is_valid(cache_entry)); - peek(requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, cacheResponseLatency()) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := cache_entry.DataBlk; - // out_msg.Dirty := cache_entry.Dirty; - // shared data should be clean - out_msg.Dirty := false; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - } - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - } - - action(dd_sendExclusiveDataToFwdGETS, "\d\d", desc="send data") { - assert(is_valid(cache_entry)); - peek(requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, cacheResponseLatency()) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DATA_EXCLUSIVE; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.DataBlk := cache_entry.DataBlk; - out_msg.Dirty := cache_entry.Dirty; - out_msg.MessageSize := MessageSizeType:Response_Data; - } - } - } - - action(e_sendAck, "e", desc="Send ack with the tokens we've collected thus far.") { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - assert(is_valid(tbe)); - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:ACK; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - - out_msg.Destination.add( tbe.Fwd_GetX_ID); - out_msg.Acks := 0 - 1; - out_msg.MessageSize := MessageSizeType:Response_Control; - } - } - - action(e_sendAckToL1Requestor, "\e", desc="Send ack with the tokens we've collected thus far.") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:ACK; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.Acks := 0 - 1; - out_msg.MessageSize := MessageSizeType:Response_Control; - } - } - } - - action(e_sendAckToL1RequestorFromTBE, "eee", desc="Send ack with the tokens we've collected thus far.") { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - assert(is_valid(tbe)); - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:ACK; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(tbe.L1_GetX_ID); - out_msg.Acks := 0 - 1; - out_msg.MessageSize := MessageSizeType:Response_Control; - } - } - - action(ee_sendLocalInv, "\ee", desc="Send local invalidates") { - assert(is_valid(tbe)); - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address); - DPRINTF(RubySlicc, "Address: %#x, Local Sharers: %s, Pending Acks: %d\n", - address, getLocalSharers(cache_entry, address), - tbe.NumIntPendingAcks); - if (isLocalOwnerValid(cache_entry, address)) { - tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + 1; - DPRINTF(RubySlicc, "%s\n", getLocalOwner(cache_entry, address)); - } - - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:INV; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address)); - if (isLocalOwnerValid(cache_entry, address)) - { - out_msg.Destination.add(getLocalOwner(cache_entry, address)); - } - out_msg.MessageSize := MessageSizeType:Invalidate_Control; - } - } - - action(ee_sendLocalInvSharersOnly, "\eee", desc="Send local invalidates to sharers if they exist") { - - // assert(countLocalSharers(address) > 0); - assert(is_valid(tbe)); - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address); - - if (countLocalSharers(cache_entry, address) > 0) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:INV; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address)); - out_msg.MessageSize := MessageSizeType:Invalidate_Control; - } - } - } - - action(ee_addLocalIntAck, "e\ee", desc="add a local ack to wait for") { - assert(is_valid(tbe)); - tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + 1; - } - - action(ee_issueLocalInvExceptL1Requestor, "\eeee", desc="Send local invalidates to sharers if they exist") { - peek(L1requestNetwork_in, RequestMsg) { - -// assert(countLocalSharers(address) > 0); - if (countLocalSharers(cache_entry, address) == 0) { - tbe.NumIntPendingAcks := 0; - } - else { - - if (isLocalSharer(cache_entry, address, in_msg.Requestor)) { - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address) - 1; - } - else { - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address); - } - - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:INV; - out_msg.Requestor := in_msg.Requestor; - out_msg.RequestorMachine := MachineType:L1Cache; - out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address)); - out_msg.Destination.remove(in_msg.Requestor); - out_msg.MessageSize := MessageSizeType:Invalidate_Control; - } - } - } - } - - action(ee_issueLocalInvExceptL1RequestorInTBE, "\eeeeee", desc="Send local invalidates to sharers if they exist") { - assert(is_valid(tbe)); - if (countLocalSharers(cache_entry, address) == 0) { - tbe.NumIntPendingAcks := 0; - } - else { - if (isLocalSharer(cache_entry, address, tbe.L1_GetX_ID)) { - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address) - 1; - } - else { - tbe.NumIntPendingAcks := countLocalSharers(cache_entry, address); - } - } - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:INV; - out_msg.Requestor := tbe.L1_GetX_ID; - out_msg.RequestorMachine := MachineType:L1Cache; - out_msg.Destination.addNetDest(getLocalSharers(cache_entry, address)); - out_msg.Destination.remove(tbe.L1_GetX_ID); - out_msg.MessageSize := MessageSizeType:Invalidate_Control; - } - } - - - action(f_sendUnblock, "f", desc="Send unblock to global directory") { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:UNBLOCK; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.MessageSize := MessageSizeType:Unblock_Control; - } - } - - - action(f_sendExclusiveUnblock, "\f", desc="Send unblock to global directory") { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:UNBLOCK_EXCLUSIVE; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.MessageSize := MessageSizeType:Unblock_Control; - } - } - - - action(g_recordLocalSharer, "g", desc="Record new local sharer from unblock message") { - peek(responseNetwork_in, ResponseMsg) { - recordLocalSharerInDir(cache_entry, in_msg.addr, in_msg.Sender); - } - } - - action(g_recordLocalExclusive, "\g", desc="Record new local exclusive sharer from unblock message") { - peek(responseNetwork_in, ResponseMsg) { - recordNewLocalExclusiveInDir(cache_entry, address, in_msg.Sender); - } - } - - action(gg_clearLocalSharers, "gg", desc="Clear local sharers") { - removeAllLocalSharersFromDir(cache_entry, address); - } - - action(gg_clearSharerFromL1Response, "\gg", desc="Clear sharer from L1 response queue") { - peek(responseNetwork_in, ResponseMsg) { - removeSharerFromDir(cache_entry, in_msg.addr, in_msg.Sender); - } - } - - action(gg_clearSharerFromL1Request, "clsl1r", desc="Clear sharer from L1 request queue") { - peek(L1requestNetwork_in, RequestMsg) { - removeSharerFromDir(cache_entry, in_msg.addr, in_msg.Requestor); - } - } - - action(gg_clearOwnerFromL1Request, "clol1r", desc="Clear owner from L1 request queue") { - peek(L1requestNetwork_in, RequestMsg) { - removeOwnerFromDir(cache_entry, in_msg.addr, in_msg.Requestor); - } - } - - action(h_countLocalSharersExceptRequestor, "h", desc="counts number of acks needed for L1 GETX") { - peek(L1requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.Local_GETX_IntAcks := countLocalSharersExceptRequestor(cache_entry, address, in_msg.Requestor); - } - } - - action(h_clearIntAcks, "\h", desc="clear IntAcks") { - assert(is_valid(tbe)); - tbe.Local_GETX_IntAcks := 0; - } - - action(hh_countLocalSharersExceptL1GETXRequestorInTBE, "hh", desc="counts number of acks needed for L1 GETX") { - assert(is_valid(tbe)); - tbe.Local_GETX_IntAcks := countLocalSharersExceptRequestor(cache_entry, address, tbe.L1_GetX_ID); - } - - action(i_copyDataToTBE, "\i", desc="Copy data from response queue to TBE") { - peek(responseNetwork_in, ResponseMsg) { - assert(is_valid(tbe)); - tbe.DataBlk := in_msg.DataBlk; - tbe.Dirty := in_msg.Dirty; - APPEND_TRANSITION_COMMENT(in_msg.Sender); - } - } - - action(i_allocateTBE, "i", desc="Allocate TBE for internal/external request(isPrefetch=0, number of invalidates=0)") { - check_allocate(TBEs); - TBEs.allocate(address); - set_tbe(TBEs[address]); - if(is_valid(cache_entry)) { - tbe.DataBlk := cache_entry.DataBlk; - tbe.Dirty := cache_entry.Dirty; - } - tbe.NumIntPendingAcks := 0; // default value - tbe.NumExtPendingAcks := 0; // default value - tbe.Fwd_GetS_IDs.clear(); - tbe.L1_GetS_IDs.clear(); - } - - - - action(j_forwardGlobalRequestToLocalOwner, "j", desc="Forward external request to local owner") { - peek(requestNetwork_in, RequestMsg) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := in_msg.Type; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr)); - out_msg.Type := in_msg.Type; - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - out_msg.Acks := 0 - 1; - } - } - } - - action(jd_forwardDmaRequestToLocalOwner, "jd", desc="Forward dma request to local owner") { - peek(requestNetwork_in, RequestMsg) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := in_msg.Type; - out_msg.Requestor := in_msg.Requestor; - out_msg.RequestorMachine := in_msg.RequestorMachine; - out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr)); - out_msg.Type := in_msg.Type; - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - out_msg.Acks := 0 - 1; - } - } - } - - - action(k_forwardLocalGETSToLocalSharer, "k", desc="Forward local request to local sharer/owner") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceRequestType:GETS; - out_msg.Requestor := in_msg.Requestor; - out_msg.RequestorMachine := MachineType:L1Cache; - // should randomize this so one node doesn't get abused more than others - DirEntry dir_entry := getDirEntry(in_msg.addr); - out_msg.Destination.add(dir_entry.Sharers.smallestElement(MachineType:L1Cache)); - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - } - } - } - - action(k_forwardLocalGETXToLocalOwner, "\k", desc="Forward local request to local owner") { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - assert(is_valid(tbe)); - out_msg.addr := address; - out_msg.Type := CoherenceRequestType:GETX; - out_msg.Requestor := tbe.L1_GetX_ID; - out_msg.RequestorMachine := MachineType:L1Cache; - DirEntry dir_entry := getDirEntry(address); - out_msg.Destination.add(dir_entry.Owner); - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - out_msg.Acks := 1 + tbe.Local_GETX_IntAcks; - } - } - - // same as previous except that it assumes to TBE is present to get number of acks - action(kk_forwardLocalGETXToLocalExclusive, "kk", desc="Forward local request to local owner") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceRequestType:GETX; - out_msg.Requestor := in_msg.Requestor; - out_msg.RequestorMachine := MachineType:L1Cache; - out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr)); - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - out_msg.Acks := 1; - } - } - } - - action(kk_forwardLocalGETSToLocalOwner, "\kk", desc="Forward local request to local owner") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( localRequestNetwork_out, RequestMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceRequestType:GETS; - out_msg.Requestor := in_msg.Requestor; - out_msg.RequestorMachine := MachineType:L1Cache; - out_msg.Destination.add(getLocalOwner(cache_entry, in_msg.addr)); - out_msg.MessageSize := MessageSizeType:Forwarded_Control; - } - } - } - - - action(l_writebackAckNeedData, "l", desc="Send writeback ack to L1 requesting data") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( responseNetwork_out, ResponseMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceResponseType:WB_ACK_DATA; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - } - - action(l_writebackAckDropData, "\l", desc="Send writeback ack to L1 indicating to drop data") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( responseNetwork_out, ResponseMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceResponseType:WB_ACK; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - } - - action(ll_writebackNack, "\ll", desc="Send writeback nack to L1") { - peek(L1requestNetwork_in, RequestMsg) { - enqueue( responseNetwork_out, ResponseMsg, response_latency ) { - out_msg.addr := in_msg.addr; - out_msg.Type := CoherenceResponseType:WB_NACK; - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.Destination.add(in_msg.Requestor); - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - } - - action(m_popRequestQueue, "m", desc="Pop request queue.") { - requestNetwork_in.dequeue(clockEdge()); - } - - action(m_decrementNumberOfMessagesInt, "\m", desc="Decrement the number of messages for which we're waiting") { - peek(responseNetwork_in, ResponseMsg) { - assert(is_valid(tbe)); - tbe.NumIntPendingAcks := tbe.NumIntPendingAcks + in_msg.Acks; - } - } - - action(m_decrementNumberOfMessagesExt, "\mmm", desc="Decrement the number of messages for which we're waiting") { - peek(responseNetwork_in, ResponseMsg) { - assert(is_valid(tbe)); - tbe.NumExtPendingAcks := tbe.NumExtPendingAcks - in_msg.Acks; - } - } - - action(mm_decrementNumberOfMessagesExt, "\mm", desc="Decrement the number of messages for which we're waiting") { - peek(requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.NumExtPendingAcks := tbe.NumExtPendingAcks - in_msg.Acks; - } - } - - action(n_popResponseQueue, "n", desc="Pop response queue") { - responseNetwork_in.dequeue(clockEdge()); - } - - action(n_popTriggerQueue, "\n", desc="Pop trigger queue.") { - triggerQueue_in.dequeue(clockEdge()); - } - - action(o_popL1RequestQueue, "o", desc="Pop L1 request queue.") { - L1requestNetwork_in.dequeue(clockEdge()); - } - - - action(o_checkForIntCompletion, "\o", desc="Check if we have received all the messages required for completion") { - assert(is_valid(tbe)); - if (tbe.NumIntPendingAcks == 0) { - enqueue(triggerQueue_out, TriggerMsg) { - out_msg.addr := address; - out_msg.Type := TriggerType:ALL_ACKS; - } - } - } - - action(o_checkForExtCompletion, "\oo", desc="Check if we have received all the messages required for completion") { - assert(is_valid(tbe)); - if (tbe.NumExtPendingAcks == 0) { - enqueue(triggerQueue_out, TriggerMsg) { - out_msg.addr := address; - out_msg.Type := TriggerType:ALL_ACKS; - } - } - } - - - action( qq_sendDataFromTBEToMemory, "qq", desc="Send data from TBE to directory") { - enqueue(globalRequestNetwork_out, RequestMsg, response_latency) { - assert(is_valid(tbe)); - out_msg.addr := address; - out_msg.Requestor := machineID; - out_msg.RequestorMachine := MachineType:L2Cache; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - if (tbe.Dirty) { - out_msg.Type := CoherenceRequestType:WRITEBACK_DIRTY_DATA; - out_msg.DataBlk := tbe.DataBlk; - out_msg.MessageSize := MessageSizeType:Writeback_Data; - } else { - out_msg.Type := CoherenceRequestType:WRITEBACK_CLEAN_ACK; - // NOTE: in a real system this would not send data. We send - // data here only so we can check it at the memory - out_msg.DataBlk := tbe.DataBlk; - out_msg.MessageSize := MessageSizeType:Writeback_Control; - } - } - } - - action( r_setMRU, "\rrr", desc="manually set the MRU bit for cache line" ) { - if(is_valid(cache_entry)) { - L2cache.setMRU(address); - } - } - - action( s_recordGetXL1ID, "ss", desc="record local GETX requestor") { - peek(L1requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.L1_GetX_ID := in_msg.Requestor; - } - } - - action(s_deallocateTBE, "s", desc="Deallocate external TBE") { - TBEs.deallocate(address); - unset_tbe(); - } - - action( s_recordGetSL1ID, "\ss", desc="record local GETS requestor") { - peek(L1requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.L1_GetS_IDs.add(in_msg.Requestor); - } - } - - action(t_recordFwdXID, "t", desc="record global GETX requestor") { - peek(requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.Fwd_GetX_ID := in_msg.Requestor; - tbe.Fwd_GETX_ExtAcks := in_msg.Acks; - } - } - - action(t_recordFwdSID, "\t", desc="record global GETS requestor") { - peek(requestNetwork_in, RequestMsg) { - assert(is_valid(tbe)); - tbe.Fwd_GetS_IDs.clear(); - tbe.Fwd_GetS_IDs.add(in_msg.Requestor); - } - } - - - action(u_writeCleanDataToCache, "wCd", desc="Write clean data to cache") { - peek(L1requestNetwork_in, RequestMsg) { - assert(is_valid(cache_entry)); - cache_entry.DataBlk := in_msg.DataBlk; - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - assert(cache_entry.Dirty == false); - } - } - - action(u_writeDirtyDataToCache, "wDd", desc="Write dirty data to cache") { - peek(L1requestNetwork_in, RequestMsg) { - assert(is_valid(cache_entry)); - cache_entry.DataBlk := in_msg.DataBlk; - DPRINTF(RubySlicc, "Address: %#x, Data Block: %s\n", - address, cache_entry.DataBlk); - cache_entry.Dirty := true; - } - } - - action(vv_allocateL2CacheBlock, "\v", desc="Set L2 cache tag equal to tag of block B.") { - set_cache_entry(L2cache.allocate(address, new Entry)); - } - - action(rr_deallocateL2CacheBlock, "\r", desc="Deallocate L2 cache block. Sets the cache to not present, allowing a replacement in parallel with a fetch.") { - L2cache.deallocate(address); - unset_cache_entry(); - } - - action(uu_profileMiss, "\um", desc="Profile the demand miss") { - ++L2cache.demand_misses; - } - - action(uu_profileHit, "\uh", desc="Profile the demand hit") { - ++L2cache.demand_hits; - } - - action(y_copyCacheStateToDir, "y", desc="Copy cache state to directory state") { - copyCacheStateToDir(cache_entry, address); - } - - action(y_copyDirToCacheAndRemove, "/y", desc="Copy dir state to cache and remove") { - copyDirToCache(cache_entry, address); - localDirectory.deallocate(address); - } - - action(zz_recycleGlobalRequestQueue, "\zglb", desc="Send the head of the mandatory queue to the back of the queue.") { - peek(requestNetwork_in, RequestMsg) { - APPEND_TRANSITION_COMMENT(in_msg.Requestor); - } - requestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency)); - } - - action(zz_recycleL1RequestQueue, "\zl1", desc="Send the head of the mandatory queue to the back of the queue.") { - peek(L1requestNetwork_in, RequestMsg) { - APPEND_TRANSITION_COMMENT(in_msg.Requestor); - } - L1requestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency)); - } - - action(st_stallAndWaitL1RequestQueue, "st", desc="Stall and wait on the address") { - stall_and_wait(L1requestNetwork_in, address); - } - - action(wa_wakeUpDependents, "wa", desc="Wake up any requests waiting for this address") { - wakeUpAllBuffers(address); - } - - action(da_sendDmaAckUnblock, "da", desc="Send dma ack to global directory") { - enqueue(responseNetwork_out, ResponseMsg, response_latency) { - out_msg.addr := address; - out_msg.Type := CoherenceResponseType:DMA_ACK; - out_msg.Destination.add(mapAddressToMachine(address, MachineType:Directory)); - out_msg.Sender := machineID; - out_msg.SenderMachine := MachineType:L2Cache; - out_msg.MessageSize := MessageSizeType:Unblock_Control; - } - } - - - - //***************************************************** - // TRANSITIONS - //***************************************************** - - transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_PUTO, L1_PUTS, L1_PUTS_only, L1_PUTX}) { - st_stallAndWaitL1RequestQueue; - } - - transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_GETX, L1_GETS}) { - st_stallAndWaitL1RequestQueue; - } - - transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, ILXW, OW, SW, OXW, OLSXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, IGS, IGM, IGMLS, IGMO, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, L2_Replacement) { - zz_recycleL1RequestQueue; - } - - transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, IGS, IGM, MM, SS, OO, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Fwd_GETX, Fwd_GETS, Fwd_DMA}) { - zz_recycleGlobalRequestQueue; - } - - transition({OGMIO, IGMIO, IGMO}, Fwd_DMA) { - zz_recycleGlobalRequestQueue; - } - - transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, MM, SS, OO, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Inv}) { - zz_recycleGlobalRequestQueue; - } - - transition({IGM, IGS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {Own_GETX}) { - zz_recycleGlobalRequestQueue; - } - - // must happened because we forwarded GETX to local exclusive trying to do wb - transition({I, M, O, ILS, ILOX, OLS, OLSX, SLS, S}, L1_PUTX) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition({M}, {L1_PUTS, L1_PUTO} ) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition({ILS, OLSX}, L1_PUTO){ - ll_writebackNack; - o_popL1RequestQueue; - } - -// happened if we forwarded GETS to exclusive who tried to do writeback -// ?? should we just Nack these instead? Could be a bugs here - transition(ILO, L1_PUTX, ILOW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - // this can happen if we forwarded a L1_GETX to exclusiver after it issued a PUTX - transition(ILOS, L1_PUTX, ILOSW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(ILOSX, L1_PUTX, ILOSXW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - // must happened because we got Inv when L1 attempted PUTS - transition(I, L1_PUTS) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition(I, L1_PUTO) { - ll_writebackNack; - o_popL1RequestQueue; - } - - // FORWARDED REQUESTS - - transition({ILO, ILX, ILOX}, Fwd_GETS, IFGS) { - i_allocateTBE; - t_recordFwdSID; - j_forwardGlobalRequestToLocalOwner; - m_popRequestQueue; - } - - transition({ILOS, ILOSX}, Fwd_GETS, ISFGS) { - i_allocateTBE; - t_recordFwdSID; - j_forwardGlobalRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILOS, Fwd_DMA, ILOSD) { - i_allocateTBE; - jd_forwardDmaRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILOSD, DmaAck, ILOS) { - s_deallocateTBE; - da_sendDmaAckUnblock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILOSX, Fwd_DMA, ILOSXD) { - i_allocateTBE; - t_recordFwdSID; - jd_forwardDmaRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILOSXD, DmaAck, ILOSX) { - s_deallocateTBE; - da_sendDmaAckUnblock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILO, Fwd_DMA, ILOD) { - i_allocateTBE; - t_recordFwdSID; - jd_forwardDmaRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILOD, DmaAck, ILO) { - s_deallocateTBE; - da_sendDmaAckUnblock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILX, Fwd_DMA, ILXD) { - i_allocateTBE; - t_recordFwdSID; - jd_forwardDmaRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILXD, DmaAck, ILX) { - s_deallocateTBE; - da_sendDmaAckUnblock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILOX, Fwd_DMA, ILOXD) { - i_allocateTBE; - t_recordFwdSID; - jd_forwardDmaRequestToLocalOwner; - m_popRequestQueue; - } - - transition(ILOXD, DmaAck, ILOX) { - s_deallocateTBE; - da_sendDmaAckUnblock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition({ILOS, ILOSX, ILO, ILX, ILOX, ILXW}, Data) { - i_copyDataToTBE; - c_sendDataFromTBEToFwdGETS; - s_deallocateTBE; - n_popResponseQueue; - } - - transition(IFGS, Data, ILO) { - i_copyDataToTBE; - c_sendDataFromTBEToFwdGETS; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ISFGS, Data, ILOS) { - i_copyDataToTBE; - c_sendDataFromTBEToFwdGETS; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IFGS, Data_Exclusive, I) { - i_copyDataToTBE; - c_sendExclusiveDataFromTBEToFwdGETS; - gg_clearLocalSharers; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - transition({ILX, ILO, ILOX}, Fwd_GETX, IFGX) { - i_allocateTBE; - t_recordFwdXID; - j_forwardGlobalRequestToLocalOwner; - m_popRequestQueue; - } - - transition(IFGX, {Data_Exclusive, Data}, I) { - i_copyDataToTBE; - c_sendDataFromTBEToFwdGETX; - gg_clearLocalSharers; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition({ILOSX, ILOS}, Fwd_GETX, IFGXX) { - i_allocateTBE; - t_recordFwdXID; - j_forwardGlobalRequestToLocalOwner; - ee_sendLocalInvSharersOnly; - ee_addLocalIntAck; - m_popRequestQueue; - } - - - transition(IFGXX, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(IFGXX, Data_Exclusive) { - i_copyDataToTBE; - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(IFGXX, All_Acks, I) { - c_sendDataFromTBEToFwdGETX; - gg_clearLocalSharers; - s_deallocateTBE; - n_popTriggerQueue; - wa_wakeUpDependents; - } - - - // transition({O, OX}, Fwd_GETX, I) { - transition(O, Fwd_GETX, I) { - dd_sendDataToFwdGETX; - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - m_popRequestQueue; - } - - transition({O, OLS}, Fwd_GETS) { - dd_sendDataToFwdGETS; - m_popRequestQueue; - } - - transition({O, OLS}, Fwd_DMA) { - dd_sendDataToFwdGETS; - da_sendDmaAckUnblock; - m_popRequestQueue; - } - - // transition({OLSX, OX}, Fwd_GETS, O) { - transition(OLSX, Fwd_GETS, OLS) { - dd_sendDataToFwdGETS; - m_popRequestQueue; - } - - transition(OLSX, Fwd_DMA) { - dd_sendDataToFwdGETS; - da_sendDmaAckUnblock; - m_popRequestQueue; - } - - transition(M, Fwd_GETX, I) { - dd_sendDataToFwdGETX; - rr_deallocateL2CacheBlock; - m_popRequestQueue; - } - - // MAKE THIS THE SAME POLICY FOR NOW - - // transition(M, Fwd_GETS, O) { - // dd_sendDataToFwdGETS; - // m_popRequestQueue; - // } - - transition(M, Fwd_GETS, I) { - dd_sendExclusiveDataToFwdGETS; - rr_deallocateL2CacheBlock; - m_popRequestQueue; - } - - transition(M, Fwd_DMA) { - dd_sendExclusiveDataToFwdGETS; - da_sendDmaAckUnblock; - m_popRequestQueue; - } - - transition({OLS, OLSX}, Fwd_GETX, OLSF) { - i_allocateTBE; - t_recordFwdXID; - ee_sendLocalInv; - m_popRequestQueue; - } - - transition(OLSF, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(OLSF, All_Acks, I) { - c_sendDataFromTBEToFwdGETX; - gg_clearLocalSharers; - s_deallocateTBE; - rr_deallocateL2CacheBlock; - n_popTriggerQueue; - wa_wakeUpDependents; - } - - - - // INVALIDATIONS FROM GLOBAL DIRECTORY - - transition({IGM, IGS}, Inv) { - t_recordFwdXID; - e_sendAck; - m_popRequestQueue; - } - - transition({I,NP}, Inv) { - i_allocateTBE; - t_recordFwdXID; - e_sendAck; - s_deallocateTBE; - m_popRequestQueue; - } - - // NEED INV for S state - - transition({ILS, ILO, ILX}, Inv, II) { - i_allocateTBE; - t_recordFwdXID; - ee_sendLocalInv; - gg_clearLocalSharers; - m_popRequestQueue; - } - - transition(SLS, Inv, II) { - i_allocateTBE; - t_recordFwdXID; - ee_sendLocalInv; - rr_deallocateL2CacheBlock; - m_popRequestQueue; - } - - transition(II, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(II, All_Acks, I) { - e_sendAck; - s_deallocateTBE; - n_popTriggerQueue; - wa_wakeUpDependents; - } - - transition(S, Inv, I) { - i_allocateTBE; - t_recordFwdXID; - e_sendAck; - s_deallocateTBE; - rr_deallocateL2CacheBlock; - m_popRequestQueue; - } - - - // LOCAL REQUESTS SATISFIED LOCALLY - - transition(OLSX, L1_GETX, IFLOX) { - i_allocateTBE; - s_recordGetXL1ID; - // count number of INVs needed that doesn't include requestor - h_countLocalSharersExceptRequestor; - // issue INVs to everyone except requestor - ee_issueLocalInvExceptL1Requestor; - d_sendDataToL1GETX - y_copyCacheStateToDir; - r_setMRU; - rr_deallocateL2CacheBlock; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(IFLOX, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OLSX, L1_GETS, OLSXS) { - d_sendDataToL1GETS; - r_setMRU; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(OLSXS, Unblock, OLSX) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - // after this, can't get Fwd_GETX - transition(IGMO, Own_GETX) { - mm_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - m_popRequestQueue; - - } - - - transition(ILX, L1_GETS, IFLOXX) { - kk_forwardLocalGETSToLocalOwner; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(ILOSX, L1_GETS, IFLOSX) { - kk_forwardLocalGETSToLocalOwner; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition({ILOS, ILO}, L1_GETS, IFLO) { - kk_forwardLocalGETSToLocalOwner; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(ILS, L1_GETS, IFLS) { - k_forwardLocalGETSToLocalSharer; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition({ILX, ILOX}, L1_GETX, IFLOXX) { - kk_forwardLocalGETXToLocalExclusive; - e_sendAckToL1Requestor; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(ILOX, L1_GETS, IFLOX) { - kk_forwardLocalGETSToLocalOwner; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(IFLOX, Unblock, ILOSX) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IFLS, Unblock, ILS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IFLOXX, Unblock, ILOSX) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IFLOSX, Unblock, ILOSX) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition({IFLOSX, IFLOXX}, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IFLO, Unblock, ILOS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - transition(ILOSX, L1_GETX, IFLXO) { - i_allocateTBE; - s_recordGetXL1ID; - h_countLocalSharersExceptRequestor; - ee_issueLocalInvExceptL1Requestor; - k_forwardLocalGETXToLocalOwner; - e_sendAckToL1RequestorFromTBE; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(IFLXO, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - // LOCAL REQUESTS THAT MUST ISSUE - - transition(NP, {L1_PUTS, L1_PUTX, L1_PUTO}) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition({NP, I}, L1_GETS, IGS) { - i_allocateTBE; - s_recordGetSL1ID; - a_issueGETS; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition({NP, I}, L1_GETX, IGM) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(S, L1_GETX, IGM) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - y_copyCacheStateToDir; - r_setMRU; - rr_deallocateL2CacheBlock; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(ILS, L1_GETX, IGMLS) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - // count number of INVs (just sharers?) needed that doesn't include requestor - h_countLocalSharersExceptRequestor; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(IGMLS, Inv) { - t_recordFwdXID; - ee_sendLocalInv; - m_popRequestQueue; - } - - transition(IGMLS, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(IGMLS, All_Acks, IGM) { - gg_clearLocalSharers; - h_clearIntAcks; - e_sendAck; - n_popTriggerQueue; - } - - // transition(IGMLS, ExtAck, IGMO) { - transition(IGMLS, ExtAck) { - m_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - n_popResponseQueue; - } - - transition(IGMLS, {Data, Data_Exclusive}, IGMO) { - ee_issueLocalInvExceptL1RequestorInTBE; - i_copyDataToTBE; - m_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - n_popResponseQueue; - } - - - transition(ILOS, L1_GETX, IGMIO) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - uu_profileMiss; - o_popL1RequestQueue; - } - - // new exclusive happened while sharer attempted writeback - transition(ILX, {L1_PUTS, L1_PUTS_only, L1_PUTO}) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition(S, L1_PUTS) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition(OLS, L1_GETX, OGMIO) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - h_countLocalSharersExceptRequestor; - // COPY DATA FROM CACHE TO TBE (happens during i_allocateTBE) - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(OGMIO, Fwd_GETS) { - t_recordFwdSID; - c_sendDataFromTBEToFwdGETS; - m_popRequestQueue; - } - - transition(ILO, L1_GETX, IGMIO) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - // the following, of course, returns 0 sharers but do anyways for consistency - h_countLocalSharersExceptRequestor; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition({ILO, ILOX}, L1_PUTS) { - ll_writebackNack; - o_popL1RequestQueue; - } - - transition(IGMIO, Fwd_GETX, IGMIOF) { - t_recordFwdXID; - j_forwardGlobalRequestToLocalOwner; - ee_sendLocalInvSharersOnly; - ee_addLocalIntAck; - m_popRequestQueue; - } - - transition(IGMIO, Fwd_GETS, IGMIOFS) { - t_recordFwdSID; - j_forwardGlobalRequestToLocalOwner; - m_popRequestQueue; - } - - transition(IGMIOFS, Data, IGMIO) { - i_copyDataToTBE; - c_sendDataFromTBEToFwdGETS; - n_popResponseQueue; - } - - transition(OGMIO, Fwd_GETX, OGMIOF) { - t_recordFwdXID; - ee_sendLocalInvSharersOnly; - m_popRequestQueue; - } - - transition(OGMIOF, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(OGMIOF, All_Acks, IGM) { - gg_clearLocalSharers; - hh_countLocalSharersExceptL1GETXRequestorInTBE; - c_sendDataFromTBEToFwdGETX; - n_popTriggerQueue; - } - - transition(IGMIOF, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(IGMIOF, Data_Exclusive) { - i_copyDataToTBE; - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(IGMIOF, All_Acks, IGM) { - gg_clearLocalSharers; - c_sendDataFromTBEToFwdGETX; - n_popTriggerQueue; - } - - transition(IGMIO, All_Acks, IGMO) { - hh_countLocalSharersExceptL1GETXRequestorInTBE; - ee_issueLocalInvExceptL1RequestorInTBE; - k_forwardLocalGETXToLocalOwner; - e_sendAckToL1RequestorFromTBE; - n_popTriggerQueue; - } - - transition(OGMIO, All_Acks, IGMO) { - ee_issueLocalInvExceptL1RequestorInTBE; - c_sendDataFromTBEToL1GETX; - n_popTriggerQueue; - } - - transition({IGMIO, OGMIO}, Own_GETX) { - mm_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - m_popRequestQueue; - - } - - transition(IGM, {Data, Data_Exclusive}, IGMO) { - i_copyDataToTBE; - m_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - n_popResponseQueue; - } - - transition({IGM, IGMIO, OGMIO}, ExtAck) { - m_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - n_popResponseQueue; - } - - transition(IGMO, ExtAck) { - m_decrementNumberOfMessagesExt; - o_checkForExtCompletion; - n_popResponseQueue; - } - - transition(IGS, Data) { - i_copyDataToTBE; - m_decrementNumberOfMessagesExt; - c_sendDataFromTBEToL1GETS; - n_popResponseQueue; - } - - transition(IGS, Data_Exclusive) { - i_copyDataToTBE; - m_decrementNumberOfMessagesExt; - c_sendExclusiveDataFromTBEToL1GETS; - n_popResponseQueue; - } - - transition(IGS, Unblock, ILS) { - g_recordLocalSharer; - f_sendUnblock; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IGS, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - f_sendExclusiveUnblock; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IGMO, All_Acks) { - c_sendDataFromTBEToL1GETX; - n_popTriggerQueue; - } - - transition(IGMO, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - f_sendExclusiveUnblock; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - transition(SLS, L1_GETX, IGMLS) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - // count number of INVs needed that doesn't include requestor - h_countLocalSharersExceptRequestor; - // issue INVs to everyone except requestor - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - uu_profileMiss; - o_popL1RequestQueue; - - } - - transition(SLS, L1_GETS, SLSS ) { - d_sendDataToL1GETS; - r_setMRU; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(SLSS, Unblock, SLS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - transition(O, L1_GETX, IGMO) { - i_allocateTBE; - s_recordGetXL1ID; - a_issueGETX; - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - uu_profileMiss; - o_popL1RequestQueue; - } - - transition(OLS, L1_GETS, OLSS) { - d_sendDataToL1GETS; - r_setMRU; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(OLSS, Unblock, OLS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(IGMO, Fwd_GETX, IGM) { - t_recordFwdXID; - c_sendDataFromTBEToFwdGETX; - m_popRequestQueue; - - } - - transition(IGMO, Fwd_GETS) { - t_recordFwdSID; - c_sendDataFromTBEToFwdGETS; - m_popRequestQueue; - } - - - // LOCAL REQUESTS SATISFIED DIRECTLY BY L2 - - transition(M, L1_GETX, MM) { - i_allocateTBE; - // should count 0 of course - h_countLocalSharersExceptRequestor; - d_sendDataToL1GETX; - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - s_deallocateTBE; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(MM, Exclusive_Unblock, ILX) { - g_recordLocalExclusive; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(M, L1_GETS, OO) { - i_allocateTBE; - // should count 0 of course - h_countLocalSharersExceptRequestor; - d_sendDataToL1GETX; - r_setMRU; - s_deallocateTBE; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(S, L1_GETS, SS) { - d_sendDataToL1GETS; - r_setMRU; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(SS, Unblock, SLS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(O, L1_GETS, OO) { - d_sendDataToL1GETS; - r_setMRU; - uu_profileHit; - o_popL1RequestQueue; - } - - transition(OO, Unblock, OLS) { - g_recordLocalSharer; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OO, Exclusive_Unblock, ILX) { - g_recordLocalExclusive - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - // L1 WRITEBACKS - transition(ILO, L1_PUTO, ILOW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(ILOX, L1_PUTO, ILOXW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - - transition(ILOS, L1_PUTO, ILOSW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(ILOSX, L1_PUTO, ILOSXW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - - // hmmm...keep data or drop. Just drop for now - transition(ILOS, L1_PUTS_only, ILOW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(ILSW, Unblock, ILS) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILOW, Unblock, ILO) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILOSX, L1_PUTS_only, ILOXW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(ILOXW, Unblock, ILOX) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - // hmmm...keep data or drop. Just drop for now - transition(ILOS, L1_PUTS, ILOSW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(ILOSX, L1_PUTS, ILOSXW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(ILOSW, Unblock, ILOS) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILOSXW, Unblock, ILOSX) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(SLS, L1_PUTS, SLSW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(SLS, L1_PUTS_only, SW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(SW, {Unblock}, S) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OLS, L1_PUTS, OLSW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(ILS, L1_PUTS, ILSW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(ILS, L1_PUTS_only, IW) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(OLS, L1_PUTS_only, OW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(OLSX, L1_PUTS_only, OXW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(OLSX, L1_PUTS, OLSXW) { - l_writebackAckDropData; - o_popL1RequestQueue; - } - - transition(OLSXW, {Unblock}, OLSX) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OW, {Unblock}, O) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OXW, {Unblock}, M) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILX, L1_PUTX, ILXW ) { - l_writebackAckNeedData; - o_popL1RequestQueue; - } - - transition(ILXW, L1_WBDIRTYDATA, M) { - gg_clearLocalSharers; - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - u_writeDirtyDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - // clean writeback - transition(ILXW, L1_WBCLEANDATA, M) { - gg_clearLocalSharers; - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - u_writeCleanDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILXW, Unblock, ILX) { - // writeback canceled because L1 invalidated - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILSW, L1_WBCLEANDATA, SLS) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - u_writeCleanDataToCache; - gg_clearSharerFromL1Request; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(IW, L1_WBCLEANDATA, S) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - u_writeCleanDataToCache; - gg_clearSharerFromL1Request; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - // Owner can have dirty data - transition(ILOW, L1_WBDIRTYDATA, O) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeDirtyDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOW, L1_WBCLEANDATA, O) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeCleanDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOXW, L1_WBDIRTYDATA, M) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeDirtyDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOXW, L1_WBCLEANDATA, M) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeCleanDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOSW, L1_WBDIRTYDATA, OLS) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeDirtyDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOSW, L1_WBCLEANDATA, OLS) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeCleanDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOSXW, L1_WBDIRTYDATA, OLSX) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeDirtyDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(ILOSXW, L1_WBCLEANDATA, OLSX) { - vv_allocateL2CacheBlock; - y_copyDirToCacheAndRemove; - gg_clearOwnerFromL1Request; - u_writeCleanDataToCache; - o_popL1RequestQueue; - wa_wakeUpDependents; - } - - transition(SLSW, {Unblock}, SLS) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OLSW, {Unblock}, OLS) { - gg_clearSharerFromL1Response; - n_popResponseQueue; - wa_wakeUpDependents; - } - - - // L2 WRITEBACKS - transition({I, S}, L2_Replacement, I) { - rr_deallocateL2CacheBlock; - } - - transition(ILS, L2_Replacement) { - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - } - - transition(ILX, L2_Replacement ) { - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - } - - transition({ILO, ILOS}, L2_Replacement ) { - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - } - - transition(SLS, L2_Replacement, ILS) { - y_copyCacheStateToDir; - rr_deallocateL2CacheBlock; - } - - transition({OLS, OLSX}, L2_Replacement, OLSI) { - y_copyCacheStateToDir; - b_issuePUTO_ls; - i_allocateTBE; - rr_deallocateL2CacheBlock; - } - - - transition(O, L2_Replacement, OI) { - b_issuePUTO; - i_allocateTBE; - rr_deallocateL2CacheBlock; - } - - transition(M, L2_Replacement, MI) { - b_issuePUTX; - i_allocateTBE; - rr_deallocateL2CacheBlock; - } - - transition(OLSI, Fwd_GETX, ILSI) { - t_recordFwdXID; - ee_sendLocalInv; - m_popRequestQueue; - } - - transition(ILSI, IntAck) { - m_decrementNumberOfMessagesInt; - o_checkForIntCompletion; - n_popResponseQueue; - } - - transition(ILSI, All_Acks, MII) { - gg_clearLocalSharers; - c_sendDataFromTBEToFwdGETX; - n_popTriggerQueue; - } - - transition(OLSI, Fwd_GETS) { - t_recordFwdSID; - c_sendDataFromTBEToFwdGETS; - m_popRequestQueue; - } - - transition({MI, OI}, Fwd_GETS, OI) { - t_recordFwdSID; - c_sendDataFromTBEToFwdGETS; - m_popRequestQueue; - } - - transition({MI, OI}, Fwd_DMA, OI) { - cd_sendDataFromTBEToFwdDma; - da_sendDmaAckUnblock; - m_popRequestQueue; - } - - transition(OLSI, Fwd_DMA) { - cd_sendDataFromTBEToFwdDma; - da_sendDmaAckUnblock; - m_popRequestQueue; - } - - transition({MI, OI}, Fwd_GETX, MII) { - t_recordFwdXID; - c_sendDataFromTBEToFwdGETX; - m_popRequestQueue; - } - - transition({MI, OI}, Writeback_Ack, I) { - qq_sendDataFromTBEToMemory; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(MII, Writeback_Nack, I) { - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(OI, Writeback_Nack) { - b_issuePUTO; - n_popResponseQueue; - } - - transition(OLSI, Writeback_Ack, ILS) { - qq_sendDataFromTBEToMemory; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(MII, Writeback_Ack, I) { - f_sendUnblock; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } - - transition(ILSI, Writeback_Ack, ILS) { - f_sendUnblock; - s_deallocateTBE; - n_popResponseQueue; - wa_wakeUpDependents; - } -} |