# Node ID d3f20078bf20f1217b3664d1e3e6df716bb6f57a # Parent 13edc18b6c47e0f788c8a0e79c96f101dec318e9 diff --git a/src/mem/ruby/structures/AbstractReplacementPolicy.hh b/src/mem/ruby/structures/AbstractReplacementPolicy.hh --- a/src/mem/ruby/structures/AbstractReplacementPolicy.hh +++ b/src/mem/ruby/structures/AbstractReplacementPolicy.hh @@ -34,6 +34,8 @@ #include "params/ReplacementPolicy.hh" #include "sim/sim_object.hh" +class CacheMemory; + class AbstractReplacementPolicy : public SimObject { public: @@ -52,6 +54,9 @@ virtual bool useOccupancy() const { return false; } + void setCache(CacheMemory * pCache) {m_cache = pCache;} + CacheMemory * m_cache; + protected: unsigned m_num_sets; /** total number of sets */ unsigned m_assoc; /** set associativity */ diff --git a/src/mem/ruby/structures/CacheMemory.hh b/src/mem/ruby/structures/CacheMemory.hh --- a/src/mem/ruby/structures/CacheMemory.hh +++ b/src/mem/ruby/structures/CacheMemory.hh @@ -97,6 +97,8 @@ Cycles getTagLatency() const { return tagArray.getLatency(); } Cycles getDataLatency() const { return dataArray.getLatency(); } + bool isBlockInvalid(int64 cache_set, int64 loc); + bool isBlockNotBusy(int64 cache_set, int64 loc); // Hook for checkpointing the contents of the cache void recordCacheContents(int cntrl, CacheRecorder* tr) const; diff --git a/src/mem/ruby/structures/CacheMemory.cc b/src/mem/ruby/structures/CacheMemory.cc --- a/src/mem/ruby/structures/CacheMemory.cc +++ b/src/mem/ruby/structures/CacheMemory.cc @@ -61,6 +61,7 @@ m_latency = p->latency; m_cache_assoc = p->assoc; m_replacementPolicy_ptr = p->replacement_policy; + m_replacementPolicy_ptr->setCache(this); m_start_index_bit = p->start_index_bit; m_is_instruction_only_cache = p->is_icache; m_resource_stalls = p->resourceStalls; @@ -616,3 +617,15 @@ return true; } } + +bool +CacheMemory::isBlockInvalid(int64 cache_set, int64 loc) +{ + return (m_cache[cache_set][loc]->m_Permission == AccessPermission_Invalid); +} + +bool +CacheMemory::isBlockNotBusy(int64 cache_set, int64 loc) +{ + return (m_cache[cache_set][loc]->m_Permission != AccessPermission_Busy); +}