diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2006-11-08 16:18:10 -0500 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2006-11-08 16:18:10 -0500 |
commit | f720029e97358b2f69ea0ecaace89d5c2ccc6bfe (patch) | |
tree | 49f739cbc78b842fc303c1a1296d293ca03ec961 /src/mem/cache/base_cache.hh | |
parent | 5b90922ad59189f5967dc97a00bbfead062f4ba3 (diff) | |
parent | 74745cfeac4f4de4613d8faed77aa7e3c06cbca4 (diff) | |
download | gem5-f720029e97358b2f69ea0ecaace89d5c2ccc6bfe.tar.xz |
Merge zizzer.eecs.umich.edu:/bk/newmem/
into zeep.eecs.umich.edu:/home/gblack/m5/newmemmemops
--HG--
extra : convert_revision : dc165840841bdd88e40111b98d1be493441703f0
Diffstat (limited to 'src/mem/cache/base_cache.hh')
-rw-r--r-- | src/mem/cache/base_cache.hh | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/mem/cache/base_cache.hh b/src/mem/cache/base_cache.hh index 565280aef..ea7544fbb 100644 --- a/src/mem/cache/base_cache.hh +++ b/src/mem/cache/base_cache.hh @@ -105,6 +105,8 @@ class BaseCache : public MemObject void clearBlocked(); + bool canDrain() { return drainList.empty(); } + bool blocked; bool mustSendRetry; @@ -227,6 +229,9 @@ class BaseCache : public MemObject /** The number of misses to trigger an exit event. */ Counter missCount; + /** The drain event. */ + Event *drainEvent; + public: // Statistics /** @@ -340,7 +345,7 @@ class BaseCache : public MemObject BaseCache(const std::string &name, Params ¶ms) : MemObject(name), blocked(0), blockedSnoop(0), masterRequests(0), slaveRequests(0), blkSize(params.blkSize), - missCount(params.maxMisses) + missCount(params.maxMisses), drainEvent(NULL) { //Start ports at null if more than one is created we should panic cpuSidePort = NULL; @@ -477,6 +482,7 @@ class BaseCache : public MemObject { uint8_t flag = 1<<cause; masterRequests &= ~flag; + checkDrain(); } /** @@ -512,6 +518,7 @@ class BaseCache : public MemObject { uint8_t flag = 1<<cause; slaveRequests &= ~flag; + checkDrain(); } /** @@ -589,6 +596,30 @@ class BaseCache : public MemObject return; } } + + virtual unsigned int drain(Event *de); + + void checkDrain() + { + if (drainEvent && canDrain()) { + drainEvent->process(); + changeState(SimObject::Drained); + // Clear the drain event + drainEvent = NULL; + } + } + + bool canDrain() + { + if (doMasterRequest() || doSlaveRequest()) { + return false; + } else if (memSidePort && !memSidePort->canDrain()) { + return false; + } else if (cpuSidePort && !cpuSidePort->canDrain()) { + return false; + } + return true; + } }; #endif //__BASE_CACHE_HH__ |