113938Sodanrc@yahoo.com.br/** 213938Sodanrc@yahoo.com.br * Copyright (c) 2018 Inria 313938Sodanrc@yahoo.com.br * All rights reserved. 413938Sodanrc@yahoo.com.br * 513938Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 613938Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 713938Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 813938Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 913938Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1013938Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1113938Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1213938Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1313938Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1413938Sodanrc@yahoo.com.br * this software without specific prior written permission. 1513938Sodanrc@yahoo.com.br * 1613938Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713938Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813938Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913938Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013938Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113938Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213938Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313938Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413938Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513938Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613938Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713938Sodanrc@yahoo.com.br * 2813938Sodanrc@yahoo.com.br * Authors: Daniel Carvalho 2913938Sodanrc@yahoo.com.br */ 3013938Sodanrc@yahoo.com.br 3113938Sodanrc@yahoo.com.br/** @file 3213938Sodanrc@yahoo.com.br * Definition of a simple superblock class. Each superblock consists of a 3313938Sodanrc@yahoo.com.br * number of compressed cache blocks limited by the maximum compression 3413938Sodanrc@yahoo.com.br * factor that may or may not be present in the cache. 3513938Sodanrc@yahoo.com.br */ 3613938Sodanrc@yahoo.com.br 3713938Sodanrc@yahoo.com.br#ifndef __MEM_CACHE_TAGS_SUPER_BLK_HH__ 3813938Sodanrc@yahoo.com.br#define __MEM_CACHE_TAGS_SUPER_BLK_HH__ 3913938Sodanrc@yahoo.com.br 4013938Sodanrc@yahoo.com.br#include "mem/cache/tags/sector_blk.hh" 4113938Sodanrc@yahoo.com.br 4213938Sodanrc@yahoo.com.brclass SuperBlk; 4313938Sodanrc@yahoo.com.br 4413938Sodanrc@yahoo.com.br/** 4513938Sodanrc@yahoo.com.br * A superblock is composed of sub-blocks, and each sub-block has information 4613938Sodanrc@yahoo.com.br * regarding its superblock and a pointer to its superblock tag. A superblock 4713938Sodanrc@yahoo.com.br * can be seen as a variation of a sector block, and therefore we use a sector 4813938Sodanrc@yahoo.com.br * nomenclature. 4913938Sodanrc@yahoo.com.br */ 5013938Sodanrc@yahoo.com.brclass CompressionBlk : public SectorSubBlk 5113938Sodanrc@yahoo.com.br{ 5213940Sodanrc@yahoo.com.br private: 5313940Sodanrc@yahoo.com.br /** 5413940Sodanrc@yahoo.com.br * Set size, in bits, of this compressed block's data. 5513940Sodanrc@yahoo.com.br */ 5613940Sodanrc@yahoo.com.br std::size_t _size; 5713940Sodanrc@yahoo.com.br 5813940Sodanrc@yahoo.com.br /** 5913940Sodanrc@yahoo.com.br * Number of cycles needed to decompress this block. We store it to avoid 6013940Sodanrc@yahoo.com.br * doing decompressions. 6113940Sodanrc@yahoo.com.br */ 6213940Sodanrc@yahoo.com.br Cycles _decompressionLatency; 6313940Sodanrc@yahoo.com.br 6413938Sodanrc@yahoo.com.br public: 6513938Sodanrc@yahoo.com.br CompressionBlk(); 6613938Sodanrc@yahoo.com.br CompressionBlk(const CompressionBlk&) = delete; 6713938Sodanrc@yahoo.com.br CompressionBlk& operator=(const CompressionBlk&) = delete; 6813938Sodanrc@yahoo.com.br ~CompressionBlk() {}; 6913940Sodanrc@yahoo.com.br 7013940Sodanrc@yahoo.com.br /** 7113940Sodanrc@yahoo.com.br * Check if this block holds compressed data. 7213940Sodanrc@yahoo.com.br * 7313940Sodanrc@yahoo.com.br * @return True if the block holds compressed data. 7413940Sodanrc@yahoo.com.br */ 7513940Sodanrc@yahoo.com.br bool isCompressed() const; 7613940Sodanrc@yahoo.com.br 7713940Sodanrc@yahoo.com.br /** 7813940Sodanrc@yahoo.com.br * Set compression bit. 7913940Sodanrc@yahoo.com.br */ 8013940Sodanrc@yahoo.com.br void setCompressed(); 8113940Sodanrc@yahoo.com.br 8213940Sodanrc@yahoo.com.br /** 8313940Sodanrc@yahoo.com.br * Clear compression bit. 8413940Sodanrc@yahoo.com.br */ 8513940Sodanrc@yahoo.com.br void setUncompressed(); 8613940Sodanrc@yahoo.com.br 8713940Sodanrc@yahoo.com.br /* 8813940Sodanrc@yahoo.com.br * Get size, in bits, of this compressed block's data. 8913940Sodanrc@yahoo.com.br * 9013940Sodanrc@yahoo.com.br * @return The compressed size. 9113940Sodanrc@yahoo.com.br */ 9213940Sodanrc@yahoo.com.br std::size_t getSizeBits() const; 9313940Sodanrc@yahoo.com.br 9413940Sodanrc@yahoo.com.br /** 9513940Sodanrc@yahoo.com.br * Set size, in bits, of this compressed block's data. 9613940Sodanrc@yahoo.com.br * 9713940Sodanrc@yahoo.com.br * @param The compressed size. 9813940Sodanrc@yahoo.com.br */ 9913940Sodanrc@yahoo.com.br void setSizeBits(const std::size_t size); 10013940Sodanrc@yahoo.com.br 10113940Sodanrc@yahoo.com.br /** 10213940Sodanrc@yahoo.com.br * Get number of cycles needed to decompress this block. 10313940Sodanrc@yahoo.com.br * 10413940Sodanrc@yahoo.com.br * @return Decompression latency. 10513940Sodanrc@yahoo.com.br */ 10613940Sodanrc@yahoo.com.br Cycles getDecompressionLatency() const; 10713940Sodanrc@yahoo.com.br 10813940Sodanrc@yahoo.com.br /** 10913940Sodanrc@yahoo.com.br * Set number of cycles needed to decompress this block. 11013940Sodanrc@yahoo.com.br * 11113940Sodanrc@yahoo.com.br * @param Decompression latency. 11213940Sodanrc@yahoo.com.br */ 11313940Sodanrc@yahoo.com.br void setDecompressionLatency(const Cycles lat); 11413940Sodanrc@yahoo.com.br 11513940Sodanrc@yahoo.com.br /** 11613940Sodanrc@yahoo.com.br * Pretty-print sector offset and other CacheBlk information. 11713940Sodanrc@yahoo.com.br * 11813940Sodanrc@yahoo.com.br * @return string with basic state information 11913940Sodanrc@yahoo.com.br */ 12013940Sodanrc@yahoo.com.br std::string print() const override; 12113938Sodanrc@yahoo.com.br}; 12213938Sodanrc@yahoo.com.br 12313938Sodanrc@yahoo.com.br/** 12413938Sodanrc@yahoo.com.br * A basic compression superblock. 12513938Sodanrc@yahoo.com.br * Contains the tag and a list of blocks associated to this superblock. 12613938Sodanrc@yahoo.com.br */ 12713938Sodanrc@yahoo.com.brclass SuperBlk : public SectorBlk 12813938Sodanrc@yahoo.com.br{ 12913947Sodanrc@yahoo.com.br protected: 13013947Sodanrc@yahoo.com.br /** Block size, in bytes. */ 13113947Sodanrc@yahoo.com.br std::size_t blkSize; 13213947Sodanrc@yahoo.com.br 13313938Sodanrc@yahoo.com.br public: 13413947Sodanrc@yahoo.com.br SuperBlk() : SectorBlk(), blkSize(0) {} 13513938Sodanrc@yahoo.com.br SuperBlk(const SuperBlk&) = delete; 13613938Sodanrc@yahoo.com.br SuperBlk& operator=(const SuperBlk&) = delete; 13713938Sodanrc@yahoo.com.br ~SuperBlk() {}; 13813940Sodanrc@yahoo.com.br 13913940Sodanrc@yahoo.com.br /** 14013940Sodanrc@yahoo.com.br * Returns whether the superblock contains compressed blocks or not. By 14113940Sodanrc@yahoo.com.br * default, if not blocks are valid, the superblock is compressible. 14213940Sodanrc@yahoo.com.br * 14313947Sodanrc@yahoo.com.br * @param ignored_blk If provided don't consider the given block. 14413940Sodanrc@yahoo.com.br * @return The compressibility state of the superblock. 14513940Sodanrc@yahoo.com.br */ 14613947Sodanrc@yahoo.com.br bool isCompressed(const CompressionBlk* ignored_blk = nullptr) const; 14713947Sodanrc@yahoo.com.br 14813947Sodanrc@yahoo.com.br /** 14913947Sodanrc@yahoo.com.br * Checks whether a superblock can co-allocate given compressed data block. 15013947Sodanrc@yahoo.com.br * 15113947Sodanrc@yahoo.com.br * @param compressed_size Size, in bits, of new block to allocate. 15213947Sodanrc@yahoo.com.br * @return True if block can be co-allocated in superblock. 15313947Sodanrc@yahoo.com.br */ 15413947Sodanrc@yahoo.com.br bool canCoAllocate(const std::size_t compressed_size) const; 15513947Sodanrc@yahoo.com.br 15613947Sodanrc@yahoo.com.br /** 15713947Sodanrc@yahoo.com.br * Set block size. Should be called only once, when initializing blocks. 15813947Sodanrc@yahoo.com.br * 15913947Sodanrc@yahoo.com.br * @param blk_size The uncompressed block size. 16013947Sodanrc@yahoo.com.br */ 16113947Sodanrc@yahoo.com.br void setBlkSize(const std::size_t blk_size); 16213938Sodanrc@yahoo.com.br}; 16313938Sodanrc@yahoo.com.br 16413938Sodanrc@yahoo.com.br#endif //__MEM_CACHE_TAGS_SUPER_BLK_HH__ 165