mem-cache: Create tags initialization function
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Thu, 21 Jun 2018 14:57:37 +0000 (16:57 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 10 Oct 2018 18:17:42 +0000 (18:17 +0000)
Having the blocks initialized in the constructor makes it harder
to apply inheritance in the tags classes. This patch decouples
the block initialization functionality from the constructor by
using an init() function. It also sets the parent cache.

Change-Id: I0da7fdaae492b1177c7cc3bda8639f79921fbbeb
Reviewed-on: https://gem5-review.googlesource.com/c/11509
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/mem/cache/base.cc
src/mem/cache/tags/base.hh
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/base_set_assoc.hh
src/mem/cache/tags/fa_lru.cc
src/mem/cache/tags/fa_lru.hh
src/mem/cache/tags/sector_tags.cc
src/mem/cache/tags/sector_tags.hh

index 6c79fd683c5eadb43803b0439e87962f71476a75..736f167617ed5b38b2b97e93b644c8368eda3e5b 100644 (file)
@@ -115,7 +115,7 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
 
     tempBlock = new TempCacheBlk(blkSize);
 
-    tags->setCache(this);
+    tags->init(this);
     if (prefetcher)
         prefetcher->setCache(this);
 }
index 30a7af72c5a1a413f8e4ee73b398a1c084e8cc94..385d25c9fbc535739d4344e14e6db1775094ea86 100644 (file)
@@ -154,6 +154,13 @@ class BaseTags : public ClockedObject
      * @}
      */
 
+    /**
+     * Set the parent cache back pointer.
+     *
+     * @param _cache Pointer to parent cache.
+     */
+    void setCache(BaseCache *_cache);
+
   public:
     typedef BaseTagsParams Params;
     BaseTags(const Params *p);
@@ -164,10 +171,11 @@ class BaseTags : public ClockedObject
     virtual ~BaseTags() {}
 
     /**
-     * Set the parent cache back pointer.
+     * Initialize blocks and set the parent cache back pointer.
+     *
      * @param _cache Pointer to parent cache.
      */
-    void setCache(BaseCache *_cache);
+    virtual void init(BaseCache *_cache) = 0;
 
     /**
      * Register local statistics.
index 18da532733a0e3ad85bd1528ef7042fabf34a230..8bd65e03ba4a3e2f766c4d56dd0d03ce087acc0b 100644 (file)
@@ -73,7 +73,15 @@ BaseSetAssoc::BaseSetAssoc(const Params *p)
     setShift = floorLog2(blkSize);
     setMask = numSets - 1;
     tagShift = setShift + floorLog2(numSets);
+}
+
+void
+BaseSetAssoc::init(BaseCache* cache)
+{
+    // Set parent cache
+    setCache(cache);
 
+    // Initialize blocks
     unsigned blkIndex = 0;       // index into blks array
     for (unsigned i = 0; i < numSets; ++i) {
         sets[i].assoc = assoc;
index dc0e04275daf1b27bf2bc10fd72964d4a8ea2fdf..a3826499fc59c5096567e976d16bf1c0984f9718 100644 (file)
@@ -120,6 +120,13 @@ class BaseSetAssoc : public BaseTags
      */
     virtual ~BaseSetAssoc() {};
 
+    /**
+     * Initialize blocks and set the parent cache back pointer.
+     *
+     * @param _cache Pointer to parent cache.
+     */
+    void init(BaseCache *_cache) override;
+
     /**
      * This function updates the tags when a block is invalidated. It also
      * updates the replacement data.
index 1b43e9892bfef026d9aab3f14b0d31bb717be260..d35e37c7b4da8e02ab958a13804e08274b79fd47 100644 (file)
@@ -69,6 +69,18 @@ FALRU::FALRU(const Params *p)
         fatal("Cache Size must be power of 2 for now");
 
     blks = new FALRUBlk[numBlocks];
+}
+
+FALRU::~FALRU()
+{
+    delete[] blks;
+}
+
+void
+FALRU::init(BaseCache* cache)
+{
+    // Set parent cache
+    setCache(cache);
 
     head = &(blks[0]);
     head->prev = nullptr;
@@ -97,11 +109,6 @@ FALRU::FALRU(const Params *p)
     cacheTracking.init(head, tail);
 }
 
-FALRU::~FALRU()
-{
-    delete[] blks;
-}
-
 void
 FALRU::regStats()
 {
index c8ccc66f3fda98e8115b904866616857e867e045..0d9a8d4401e47ec337b86dda0bf44cfeee8819c6 100644 (file)
@@ -68,6 +68,7 @@
 // TrackedCaches class
 //#define FALRU_DEBUG
 
+class BaseCache;
 class ReplaceableEntry;
 
 // A bitmask of the caches we are keeping track of. Currently the
@@ -150,6 +151,13 @@ class FALRU : public BaseTags
     FALRU(const Params *p);
     ~FALRU();
 
+    /**
+     * Initialize blocks and set the parent cache back pointer.
+     *
+     * @param _cache Pointer to parent cache.
+     */
+    void init(BaseCache *_cache) override;
+
     /**
      * Register the stats for this object.
      */
index 76034e1ea4132873183e51dd7442611b8d8c5438..988fda54007af217fb6ffe21b42c1acfc0c366ee 100644 (file)
@@ -67,6 +67,13 @@ SectorTags::SectorTags(const SectorTagsParams *p)
     fatal_if(!isPowerOf2(numBlocksPerSector),
              "# of blocks per sector must be non-zero and a power of 2");
     fatal_if(assoc <= 0, "associativity must be greater than zero");
+}
+
+void
+SectorTags::init(BaseCache* cache)
+{
+    // Set parent cache
+    setCache(cache);
 
     // Initialize all sets
     unsigned sec_blk_index = 0;   // index into sector blks array
index 109b9832b0bcd069e70c47a4c124ef88216a6035..7a2cddae97967141a36017ce6df3052b4d44ed50 100644 (file)
@@ -43,6 +43,7 @@
 #include "mem/cache/tags/base.hh"
 #include "params/SectorTags.hh"
 
+class BaseCache;
 class BaseReplacementPolicy;
 class ReplaceableEntry;
 
@@ -113,6 +114,13 @@ class SectorTags : public BaseTags
      */
     virtual ~SectorTags() {};
 
+    /**
+     * Initialize blocks and set the parent cache back pointer.
+     *
+     * @param _cache Pointer to parent cache.
+     */
+    void init(BaseCache *_cache) override;
+
     /**
      * This function updates the tags when a block is invalidated but does
      * not invalidate the block itself. It also updates the replacement data.