mem-cache: Use findBlock() in accessBlock()
[gem5.git] / src / mem / cache / tags / base.cc
index d4d7542a0c414a1911a393be020b6333a11d9971..8b52b746eaa2809080b0acba1331219a8acd15fd 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2013,2016 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) 2003-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Definitions of BaseTags.
  */
 
-#include "cpu/smt.hh" //maxThreadsPerCPU
 #include "mem/cache/tags/base.hh"
+
+#include "cpu/smt.hh" //maxThreadsPerCPU
 #include "mem/cache/base.hh"
 #include "sim/sim_exit.hh"
 
 using namespace std;
 
+BaseTags::BaseTags(const Params *p)
+    : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1),
+      size(p->size),
+      lookupLatency(p->tag_latency),
+      accessLatency(p->sequential_access ?
+                    p->tag_latency + p->data_latency :
+                    std::max(p->tag_latency, p->data_latency)),
+      cache(nullptr),
+      warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
+      warmedUp(false), numBlocks(p->size / p->block_size)
+{
+}
+
 void
 BaseTags::setCache(BaseCache *_cache)
 {
+    assert(!cache);
     cache = _cache;
-    objName = cache->name();
 }
 
 void
-BaseTags::regStats(const string &name)
+BaseTags::regStats()
 {
+    ClockedObject::regStats();
+
     using namespace Stats;
+
     replacements
         .init(maxThreadsPerCPU)
-        .name(name + ".replacements")
+        .name(name() + ".replacements")
         .desc("number of replacements")
         .flags(total)
         ;
 
     tagsInUse
-        .name(name + ".tagsinuse")
+        .name(name() + ".tagsinuse")
         .desc("Cycle average of tags in use")
         ;
 
     totalRefs
-        .name(name + ".total_refs")
+        .name(name() + ".total_refs")
         .desc("Total number of references to valid blocks.")
         ;
 
     sampledRefs
-        .name(name + ".sampled_refs")
+        .name(name() + ".sampled_refs")
         .desc("Sample count of references to valid blocks.")
         ;
 
     avgRefs
-        .name(name + ".avg_refs")
+        .name(name() + ".avg_refs")
         .desc("Average number of references to valid blocks.")
         ;
 
     avgRefs = totalRefs/sampledRefs;
 
     warmupCycle
-        .name(name + ".warmup_cycle")
+        .name(name() + ".warmup_cycle")
         .desc("Cycle when the warmup percentage was hit.")
         ;
 
     occupancies
-        .init(cache->numCpus() + 1)
-        .name(name + ".occ_blocks")
-        .desc("Average occupied blocks per context")
+        .init(cache->system->maxMasters())
+        .name(name() + ".occ_blocks")
+        .desc("Average occupied blocks per requestor")
         .flags(nozero | nonan)
         ;
+    for (int i = 0; i < cache->system->maxMasters(); i++) {
+        occupancies.subname(i, cache->system->getMasterName(i));
+    }
 
     avgOccs
-        .name(name + ".occ_%")
+        .name(name() + ".occ_percent")
         .desc("Average percentage of cache occupancy")
-        .flags(nozero)
+        .flags(nozero | total)
         ;
+    for (int i = 0; i < cache->system->maxMasters(); i++) {
+        avgOccs.subname(i, cache->system->getMasterName(i));
+    }
 
     avgOccs = occupancies / Stats::constant(numBlocks);
 
+    occupanciesTaskId
+        .init(ContextSwitchTaskId::NumTaskId)
+        .name(name() + ".occ_task_id_blocks")
+        .desc("Occupied blocks per task id")
+        .flags(nozero | nonan)
+        ;
+
+    ageTaskId
+        .init(ContextSwitchTaskId::NumTaskId, 5)
+        .name(name() + ".age_task_id_blocks")
+        .desc("Occupied blocks per task id")
+        .flags(nozero | nonan)
+        ;
+
+    percentOccsTaskId
+        .name(name() + ".occ_task_id_percent")
+        .desc("Percentage of cache occupancy per task id")
+        .flags(nozero)
+        ;
+
+    percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks);
+
+    tagAccesses
+        .name(name() + ".tag_accesses")
+        .desc("Number of tag accesses")
+        ;
+
+    dataAccesses
+        .name(name() + ".data_accesses")
+        .desc("Number of data accesses")
+        ;
+
+    registerDumpCallback(new BaseTagsDumpCallback(this));
     registerExitCallback(new BaseTagsCallback(this));
 }