/* * Copyright (c) 2018 Inria * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Daniel Carvalho */ /** * @file * Definitions of a base set associative compressed superblocks tag store. */ #include "mem/cache/tags/compressed_tags.hh" #include "mem/cache/replacement_policies/base.hh" #include "mem/cache/tags/indexing_policies/base.hh" #include "mem/packet.hh" #include "params/CompressedTags.hh" CompressedTags::CompressedTags(const Params *p) : SectorTags(p) { } void CompressedTags::tagsInit() { // Create blocks and superblocks blks = std::vector(numBlocks); superBlks = std::vector(numSectors); // Initialize all blocks unsigned blk_index = 0; // index into blks array for (unsigned superblock_index = 0; superblock_index < numSectors; superblock_index++) { // Locate next cache superblock SuperBlk* superblock = &superBlks[superblock_index]; // Link block to indexing policy indexingPolicy->setEntry(superblock, superblock_index); // Associate a replacement data entry to the block superblock->replacementData = replacementPolicy->instantiateEntry(); // Initialize all blocks in this superblock superblock->blks.resize(numBlocksPerSector, nullptr); for (unsigned k = 0; k < numBlocksPerSector; ++k){ // Select block within the set to be linked SectorSubBlk*& blk = superblock->blks[k]; // Locate next cache block blk = &blks[blk_index]; // Associate a data chunk to the block blk->data = &dataBlks[blkSize*blk_index]; // Associate superblock to this block blk->setSectorBlock(superblock); // Associate the superblock replacement data to this block blk->replacementData = superblock->replacementData; // Set its index and sector offset blk->setSectorOffset(k); // Update block index ++blk_index; } } } void CompressedTags::insertBlock(const PacketPtr pkt, CacheBlk *blk) { // Insert block SectorTags::insertBlock(pkt, blk); // @todo We always store compressed blocks when possible CompressionBlk* compression_blk = static_cast(blk); compression_blk->setUncompressed(); } void CompressedTags::forEachBlk(std::function visitor) { for (CompressionBlk& blk : blks) { visitor(blk); } } bool CompressedTags::anyBlk(std::function visitor) { for (CompressionBlk& blk : blks) { if (visitor(blk)) { return true; } } return false; } CompressedTags * CompressedTagsParams::create() { return new CompressedTags(this); }