void set_tbe(TBE b);
void unset_tbe();
MachineID mapAddressToMachine(Addr addr, MachineType mtype);
+ void wakeUpAllBuffers(Addr a);
Entry getCacheEntry(Addr address), return_by_pointer="yes" {
return static_cast(Entry, "pointer", L2cache[address]);
localDirectory.deallocate(address);
}
- action(zz_recycleL1RequestQueue, "zz", desc="Send the head of the mandatory queue to the back of the queue.") {
- peek(L1requestNetwork_in, RequestMsg) {
- APPEND_TRANSITION_COMMENT(in_msg.Requestor);
- }
- L1requestNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
- }
-
action(zz_recycleRequestQueue, "\zz", desc="Send the head of the mandatory queue to the back of the queue.") {
peek(requestNetwork_in, RequestMsg) {
APPEND_TRANSITION_COMMENT(in_msg.Requestor);
responseNetwork_in.recycle(clockEdge(), cyclesToTicks(recycle_latency));
}
+ action(st_stallAndWaitL1RequestQueue, "st", desc="Stall and wait on the address") {
+ stall_and_wait(L1requestNetwork_in, address);
+ }
+
+ action(wa_wakeUpDependents, "wa", desc="Wake up any requests waiting for this address") {
+ wakeUpAllBuffers(address);
+ }
+
action(da_sendDmaAckUnblock, "da", desc="Send dma ack to global directory") {
enqueue(responseNetwork_out, ResponseMsg, response_latency) {
out_msg.addr := address;
//*****************************************************
transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_PUTO, L1_PUTS, L1_PUTS_only, L1_PUTX}) {
- zz_recycleL1RequestQueue;
+ st_stallAndWaitL1RequestQueue;
}
transition({II, IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, OW, SW, OXW, OLSXW, ILXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX, OLSXS, IGS, IGM, IGMLS, IGMO, IGMIO, OGMIO, IGMIOF, OGMIOF, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, {L1_GETX, L1_GETS}) {
- zz_recycleL1RequestQueue;
+ st_stallAndWaitL1RequestQueue;
}
transition({IFGX, IFGS, ISFGS, IFGXX, IFLXO, OFGX, ILOW, ILOXW, ILOSW, ILOSXW, SLSW, OLSW, ILSW, IW, ILXW, OW, SW, OXW, OLSXW, IFLS, IFLO, IFLOX, IFLOXX, IFLOSX,OLSXS, IGS, IGM, IGMLS, IGMO, MM, SS, OO, OI, MI, MII, OLSI, ILSI, SLSS, OLSS, OLSF, IGMIOFS, ILOSD, ILOSXD, ILOD, ILXD, ILOXD}, L2_Replacement) {
s_deallocateTBE;
da_sendDmaAckUnblock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOSX, Fwd_DMA, ILOSXD) {
s_deallocateTBE;
da_sendDmaAckUnblock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILO, Fwd_DMA, ILOD) {
s_deallocateTBE;
da_sendDmaAckUnblock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILX, Fwd_DMA, ILXD) {
s_deallocateTBE;
da_sendDmaAckUnblock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOX, Fwd_DMA, ILOXD) {
s_deallocateTBE;
da_sendDmaAckUnblock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition({ILOS, ILOSX, ILO, ILX, ILOX, ILXW}, Data) {
c_sendDataFromTBEToFwdGETS;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ISFGS, Data, ILOS) {
c_sendDataFromTBEToFwdGETS;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(IFGS, Data_Exclusive, I) {
gg_clearLocalSharers;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
gg_clearLocalSharers;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition({ILOSX, ILOS}, Fwd_GETX, IFGXX) {
gg_clearLocalSharers;
s_deallocateTBE;
n_popTriggerQueue;
+ wa_wakeUpDependents;
}
s_deallocateTBE;
rr_deallocateL2CacheBlock;
n_popTriggerQueue;
+ wa_wakeUpDependents;
}
e_sendAck;
s_deallocateTBE;
n_popTriggerQueue;
+ wa_wakeUpDependents;
}
transition(S, Inv, I) {
g_recordLocalExclusive;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(OLSX, L1_GETS, OLSXS) {
transition(OLSXS, Unblock, OLSX) {
g_recordLocalSharer;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
// after this, can't get Fwd_GETX
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;
}
g_recordLocalExclusive;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
// LOCAL REQUESTS THAT MUST ISSUE
f_sendUnblock;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(IGS, Exclusive_Unblock, ILX) {
f_sendExclusiveUnblock;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(IGMO, All_Acks) {
f_sendExclusiveUnblock;
s_deallocateTBE;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(SLSS, Unblock, SLS) {
g_recordLocalSharer;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(OLSS, Unblock, OLS) {
g_recordLocalSharer;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(IGMO, Fwd_GETX, IGM) {
transition(MM, Exclusive_Unblock, ILX) {
g_recordLocalExclusive;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(M, L1_GETS, OO) {
transition(SS, Unblock, SLS) {
g_recordLocalSharer;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(O, L1_GETS, OO) {
transition(OO, Unblock, OLS) {
g_recordLocalSharer;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(OO, Exclusive_Unblock, ILX) {
y_copyCacheStateToDir;
rr_deallocateL2CacheBlock;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
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) {
transition(ILOXW, Unblock, ILOX) {
gg_clearSharerFromL1Response;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
// hmmm...keep data or drop. Just drop for now
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) {
transition(SW, {Unblock}, S) {
gg_clearSharerFromL1Response;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(OLS, L1_PUTS, OLSW) {
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 ) {
y_copyDirToCacheAndRemove;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
// clean writeback
y_copyDirToCacheAndRemove;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILXW, Unblock, ILX) {
// writeback canceled because L1 invalidated
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILSW, L1_WBCLEANDATA, SLS) {
u_writeDataToCache;
gg_clearSharerFromL1Response;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(IW, L1_WBCLEANDATA, S) {
u_writeDataToCache;
gg_clearSharerFromL1Response;
n_popResponseQueue;
-
+ wa_wakeUpDependents;
}
// Owner can have dirty data
gg_clearOwnerFromL1Response;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOXW, L1_WBDIRTYDATA, M) {
gg_clearOwnerFromL1Response;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOXW, L1_WBCLEANDATA, M) {
gg_clearOwnerFromL1Response;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOSW, {L1_WBCLEANDATA, L1_WBDIRTYDATA}, OLS) {
gg_clearOwnerFromL1Response;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(ILOSXW, {L1_WBCLEANDATA, L1_WBDIRTYDATA}, OLSX) {
gg_clearOwnerFromL1Response;
u_writeDataToCache;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(SLSW, {Unblock}, SLS) {
gg_clearSharerFromL1Response;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
transition(OLSW, {Unblock}, OLS) {
gg_clearSharerFromL1Response;
n_popResponseQueue;
+ wa_wakeUpDependents;
}
qq_sendDataFromTBEToMemory;
s_deallocateTBE;
m_popRequestQueue;
+ wa_wakeUpDependents;
}
transition(MII, Writeback_Nack, I) {
s_deallocateTBE;
m_popRequestQueue;
+ wa_wakeUpDependents;
}
transition(OI, Writeback_Nack) {
qq_sendDataFromTBEToMemory;
s_deallocateTBE;
m_popRequestQueue;
+ wa_wakeUpDependents;
}
transition(MII, Writeback_Ack, I) {
f_sendUnblock;
s_deallocateTBE;
m_popRequestQueue;
+ wa_wakeUpDependents;
}
transition(ILSI, Writeback_Ack, ILS) {
f_sendUnblock;
s_deallocateTBE;
m_popRequestQueue;
+ wa_wakeUpDependents;
}
}