mem-cache: Add compression data to CompressionBlk
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Fri, 30 Mar 2018 13:09:51 +0000 (15:09 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 8 May 2019 17:41:09 +0000 (17:41 +0000)
Add a compression bit, decompression latency and compressed
block size and their respective getters and setters.

Change-Id: Ia9d8656552d60e8d4e85fe5379dd75fc5adb0abe
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/11102
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
src/mem/cache/cache_blk.hh
src/mem/cache/tags/super_blk.cc
src/mem/cache/tags/super_blk.hh

index 611ce448dffc2b9f4ef862cb37a3d4cdac593fbf..ddcf3ecb6f2ed8b0de56a967350f78a4e008f89f 100644 (file)
@@ -76,6 +76,8 @@ enum CacheBlkStatusBits : unsigned {
     BlkHWPrefetched =   0x20,
     /** block holds data from the secure memory space */
     BlkSecure =         0x40,
+    /** block holds compressed data */
+    BlkCompressed =     0x80
 };
 
 /**
index 3e88356255597c2df5730fd50d02e4af48a8ec09..530a2c07890caa2d32d81e215edb1e1a82cdba8d 100644 (file)
 #include "base/logging.hh"
 
 CompressionBlk::CompressionBlk()
-    : SectorSubBlk()
+    : SectorSubBlk(), _size(0), _decompressionLatency(0)
 {
 }
+
+bool
+CompressionBlk::isCompressed() const
+{
+    return (status & BlkCompressed) != 0;
+}
+
+void
+CompressionBlk::setCompressed()
+{
+    status |= BlkCompressed;
+}
+
+void
+CompressionBlk::setUncompressed()
+{
+    status &= ~BlkCompressed;
+}
+
+std::size_t
+CompressionBlk::getSizeBits() const
+{
+    return _size;
+}
+
+void
+CompressionBlk::setSizeBits(const std::size_t size)
+{
+    _size = size;
+}
+
+Cycles
+CompressionBlk::getDecompressionLatency() const
+{
+    return _decompressionLatency;
+}
+
+void
+CompressionBlk::setDecompressionLatency(const Cycles lat)
+{
+    _decompressionLatency = lat;
+}
+
+std::string
+CompressionBlk::print() const
+{
+    return csprintf("%s compressed: %d size: %llu decompression latency: %d",
+                    SectorSubBlk::print(), isCompressed(), getSizeBits(),
+                    getDecompressionLatency());
+}
+
+bool
+SuperBlk::isCompressed() const
+{
+    for (const auto& blk : blks) {
+        if (blk->isValid()) {
+            return static_cast<CompressionBlk*>(blk)->isCompressed();
+        }
+    }
+
+    // An invalid block is seen as compressed
+    return true;
+}
index 45c7f1a66c04d426e0af09f325bd8693d182f1b1..bf35c69925dd9c85ae5bcefc15ecaaae5b3b5c15 100644 (file)
@@ -49,11 +49,75 @@ class SuperBlk;
  */
 class CompressionBlk : public SectorSubBlk
 {
+  private:
+    /**
+     * Set size, in bits, of this compressed block's data.
+     */
+    std::size_t _size;
+
+    /**
+     * Number of cycles needed to decompress this block. We store it to avoid
+     * doing decompressions.
+     */
+    Cycles _decompressionLatency;
+
   public:
     CompressionBlk();
     CompressionBlk(const CompressionBlk&) = delete;
     CompressionBlk& operator=(const CompressionBlk&) = delete;
     ~CompressionBlk() {};
+
+    /**
+     * Check if this block holds compressed data.
+     *
+     * @return True if the block holds compressed data.
+     */
+    bool isCompressed() const;
+
+    /**
+     * Set compression bit.
+     */
+    void setCompressed();
+
+    /**
+     * Clear compression bit.
+     */
+    void setUncompressed();
+
+    /*
+     * Get size, in bits, of this compressed block's data.
+     *
+     * @return The compressed size.
+     */
+    std::size_t getSizeBits() const;
+
+    /**
+     * Set size, in bits, of this compressed block's data.
+     *
+     * @param The compressed size.
+     */
+    void setSizeBits(const std::size_t size);
+
+    /**
+     * Get number of cycles needed to decompress this block.
+     *
+     * @return Decompression latency.
+     */
+    Cycles getDecompressionLatency() const;
+
+    /**
+     * Set number of cycles needed to decompress this block.
+     *
+     * @param Decompression latency.
+     */
+    void setDecompressionLatency(const Cycles lat);
+
+    /**
+     * Pretty-print sector offset and other CacheBlk information.
+     *
+     * @return string with basic state information
+     */
+    std::string print() const override;
 };
 
 /**
@@ -67,6 +131,14 @@ class SuperBlk : public SectorBlk
     SuperBlk(const SuperBlk&) = delete;
     SuperBlk& operator=(const SuperBlk&) = delete;
     ~SuperBlk() {};
+
+    /**
+     * Returns whether the superblock contains compressed blocks or not. By
+     * default, if not blocks are valid, the superblock is compressible.
+     *
+     * @return The compressibility state of the superblock.
+     */
+    bool isCompressed() const;
 };
 
 #endif //__MEM_CACHE_TAGS_SUPER_BLK_HH__