super_blk.cc revision 13947
111249Sradhika.jagtap@ARM.com/** 211631Sradhika.jagtap@arm.com * Copyright (c) 2018 Inria 311249Sradhika.jagtap@ARM.com * All rights reserved. 411249Sradhika.jagtap@ARM.com * 511249Sradhika.jagtap@ARM.com * Redistribution and use in source and binary forms, with or without 611249Sradhika.jagtap@ARM.com * modification, are permitted provided that the following conditions are 711249Sradhika.jagtap@ARM.com * met: redistributions of source code must retain the above copyright 811249Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer; 911249Sradhika.jagtap@ARM.com * redistributions in binary form must reproduce the above copyright 1011249Sradhika.jagtap@ARM.com * notice, this list of conditions and the following disclaimer in the 1111249Sradhika.jagtap@ARM.com * documentation and/or other materials provided with the distribution; 1211249Sradhika.jagtap@ARM.com * neither the name of the copyright holders nor the names of its 1311249Sradhika.jagtap@ARM.com * contributors may be used to endorse or promote products derived from 1411249Sradhika.jagtap@ARM.com * this software without specific prior written permission. 1511249Sradhika.jagtap@ARM.com * 1611249Sradhika.jagtap@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711249Sradhika.jagtap@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811249Sradhika.jagtap@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911249Sradhika.jagtap@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011249Sradhika.jagtap@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111249Sradhika.jagtap@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211249Sradhika.jagtap@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311249Sradhika.jagtap@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411249Sradhika.jagtap@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511249Sradhika.jagtap@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611249Sradhika.jagtap@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711249Sradhika.jagtap@ARM.com * 2811249Sradhika.jagtap@ARM.com * Authors: Daniel Carvalho 2911249Sradhika.jagtap@ARM.com */ 3011249Sradhika.jagtap@ARM.com 3111249Sradhika.jagtap@ARM.com/** @file 3211249Sradhika.jagtap@ARM.com * Implementation of a simple superblock class. Each superblock consists of a 3311249Sradhika.jagtap@ARM.com * number of compressed cache blocks limited by the maximum compression factor 3411249Sradhika.jagtap@ARM.com * that may or may not be present in the cache. 3511249Sradhika.jagtap@ARM.com */ 3611249Sradhika.jagtap@ARM.com 3711249Sradhika.jagtap@ARM.com#include "mem/cache/tags/super_blk.hh" 3811249Sradhika.jagtap@ARM.com 3911249Sradhika.jagtap@ARM.com#include "base/logging.hh" 4011249Sradhika.jagtap@ARM.com 4111249Sradhika.jagtap@ARM.comCompressionBlk::CompressionBlk() 4211249Sradhika.jagtap@ARM.com : SectorSubBlk(), _size(0), _decompressionLatency(0) 4311249Sradhika.jagtap@ARM.com{ 4411249Sradhika.jagtap@ARM.com} 4511249Sradhika.jagtap@ARM.com 4611249Sradhika.jagtap@ARM.combool 4711249Sradhika.jagtap@ARM.comCompressionBlk::isCompressed() const 4811249Sradhika.jagtap@ARM.com{ 4911249Sradhika.jagtap@ARM.com return (status & BlkCompressed) != 0; 5011249Sradhika.jagtap@ARM.com} 5111249Sradhika.jagtap@ARM.com 5211249Sradhika.jagtap@ARM.comvoid 5311249Sradhika.jagtap@ARM.comCompressionBlk::setCompressed() 5411249Sradhika.jagtap@ARM.com{ 5511249Sradhika.jagtap@ARM.com status |= BlkCompressed; 5611249Sradhika.jagtap@ARM.com} 5711249Sradhika.jagtap@ARM.com 5811249Sradhika.jagtap@ARM.comvoid 5911249Sradhika.jagtap@ARM.comCompressionBlk::setUncompressed() 6011249Sradhika.jagtap@ARM.com{ 6111249Sradhika.jagtap@ARM.com status &= ~BlkCompressed; 6211249Sradhika.jagtap@ARM.com} 6311249Sradhika.jagtap@ARM.com 6411249Sradhika.jagtap@ARM.comstd::size_t 6511249Sradhika.jagtap@ARM.comCompressionBlk::getSizeBits() const 6611249Sradhika.jagtap@ARM.com{ 6711249Sradhika.jagtap@ARM.com return _size; 6811249Sradhika.jagtap@ARM.com} 6911249Sradhika.jagtap@ARM.com 7011249Sradhika.jagtap@ARM.comvoid 7111249Sradhika.jagtap@ARM.comCompressionBlk::setSizeBits(const std::size_t size) 7211249Sradhika.jagtap@ARM.com{ 7311249Sradhika.jagtap@ARM.com _size = size; 7411249Sradhika.jagtap@ARM.com} 7511249Sradhika.jagtap@ARM.com 7611249Sradhika.jagtap@ARM.comCycles 7711249Sradhika.jagtap@ARM.comCompressionBlk::getDecompressionLatency() const 7811249Sradhika.jagtap@ARM.com{ 7911249Sradhika.jagtap@ARM.com return _decompressionLatency; 8011249Sradhika.jagtap@ARM.com} 8111249Sradhika.jagtap@ARM.com 8211249Sradhika.jagtap@ARM.comvoid 8311249Sradhika.jagtap@ARM.comCompressionBlk::setDecompressionLatency(const Cycles lat) 8411249Sradhika.jagtap@ARM.com{ 8511249Sradhika.jagtap@ARM.com _decompressionLatency = lat; 8611249Sradhika.jagtap@ARM.com} 8711249Sradhika.jagtap@ARM.com 8811249Sradhika.jagtap@ARM.comstd::string 8911249Sradhika.jagtap@ARM.comCompressionBlk::print() const 9011249Sradhika.jagtap@ARM.com{ 9111249Sradhika.jagtap@ARM.com return csprintf("%s compressed: %d size: %llu decompression latency: %d", 9211249Sradhika.jagtap@ARM.com SectorSubBlk::print(), isCompressed(), getSizeBits(), 9311249Sradhika.jagtap@ARM.com getDecompressionLatency()); 9411249Sradhika.jagtap@ARM.com} 9511249Sradhika.jagtap@ARM.com 9611249Sradhika.jagtap@ARM.combool 9711249Sradhika.jagtap@ARM.comSuperBlk::isCompressed(const CompressionBlk* ignored_blk) const 9811249Sradhika.jagtap@ARM.com{ 9911249Sradhika.jagtap@ARM.com for (const auto& blk : blks) { 10011249Sradhika.jagtap@ARM.com if (blk->isValid() && (blk != ignored_blk)) { 10111249Sradhika.jagtap@ARM.com return static_cast<CompressionBlk*>(blk)->isCompressed(); 10211249Sradhika.jagtap@ARM.com } 10311249Sradhika.jagtap@ARM.com } 10411249Sradhika.jagtap@ARM.com 10511249Sradhika.jagtap@ARM.com // An invalid block is seen as compressed 10611249Sradhika.jagtap@ARM.com return true; 10711249Sradhika.jagtap@ARM.com} 10811249Sradhika.jagtap@ARM.com 10911249Sradhika.jagtap@ARM.combool 11011249Sradhika.jagtap@ARM.comSuperBlk::canCoAllocate(const std::size_t compressed_size) const 11111249Sradhika.jagtap@ARM.com{ 11211249Sradhika.jagtap@ARM.com // Simple co-allocation function: at most numBlocksPerSector blocks that 11311249Sradhika.jagtap@ARM.com // compress at least to (100/numBlocksPerSector)% of their original size 11411249Sradhika.jagtap@ARM.com // can share a superblock 11511249Sradhika.jagtap@ARM.com return (compressed_size <= (blkSize * 8) / blks.size()); 11611249Sradhika.jagtap@ARM.com} 11711249Sradhika.jagtap@ARM.com 11811249Sradhika.jagtap@ARM.comvoid 11911249Sradhika.jagtap@ARM.comSuperBlk::setBlkSize(const std::size_t blk_size) 12011249Sradhika.jagtap@ARM.com{ 12111249Sradhika.jagtap@ARM.com assert(blkSize == 0); 12211249Sradhika.jagtap@ARM.com blkSize = blk_size; 12311249Sradhika.jagtap@ARM.com} 12411249Sradhika.jagtap@ARM.com