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