summaryrefslogtreecommitdiff
path: root/src/mem/cache/tags/iic.hh
diff options
context:
space:
mode:
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:39 -0500
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>2013-01-07 13:05:39 -0500
commitd44f2f611ff51941a8702a33a0bc57d7f574e462 (patch)
tree85928f5bc95981755c11118a62c42fc28e1e6a0f /src/mem/cache/tags/iic.hh
parent9364d35b8bce516459be09bb13891600921e9e6e (diff)
downloadgem5-d44f2f611ff51941a8702a33a0bc57d7f574e462.tar.xz
mem: Remove the IIC replacement policy
The IIC replacement policy seems to be unused and has probably gathered too much bit rot to be useful. This patch removes the IIC and its associated cache parameters.
Diffstat (limited to 'src/mem/cache/tags/iic.hh')
-rw-r--r--src/mem/cache/tags/iic.hh540
1 files changed, 0 insertions, 540 deletions
diff --git a/src/mem/cache/tags/iic.hh b/src/mem/cache/tags/iic.hh
deleted file mode 100644
index a41af8612..000000000
--- a/src/mem/cache/tags/iic.hh
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright (c) 2012 ARM Limited
- * All rights reserved.
- *
- * The license below extends only to copyright in the software and shall
- * not be construed as granting a license to any other intellectual
- * property including but not limited to intellectual property relating
- * to a hardware implementation of the functionality of the software
- * licensed hereunder. You may use the software subject to the license
- * terms below provided that you ensure that this notice is replicated
- * unmodified and in its entirety in all distributions of the software,
- * modified or unmodified, in source code or in binary form.
- *
- * Copyright (c) 2002-2005 The Regents of The University of Michigan
- * 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: Erik Hallnor
- */
-
-/**
- * @file
- * Declaration of the Indirect Index Cache (IIC) tags store.
- */
-
-#ifndef __IIC_HH__
-#define __IIC_HH__
-
-#include <list>
-#include <vector>
-
-#include "base/statistics.hh"
-#include "mem/cache/tags/iic_repl/repl.hh"
-#include "mem/cache/tags/base.hh"
-#include "mem/cache/blk.hh"
-#include "mem/packet.hh"
-
-class BaseCache; // Forward declaration
-
-/**
- * IIC cache blk.
- */
-class IICTag : public CacheBlk
-{
- public:
- /**
- * Copy the contents of the given IICTag into this one.
- * @param rhs The tag to copy.
- * @return const reference to this tag.
- */
- const IICTag& operator=(const IICTag& rhs)
- {
- CacheBlk::operator=(rhs);
- chain_ptr = rhs.chain_ptr;
- re = rhs.re;
- set = rhs.set;
- trivialData = rhs.trivialData;
- numData = rhs.numData;
- data_ptr.clear();
- for (int i = 0; i < rhs.numData; ++i) {
- data_ptr.push_back(rhs.data_ptr[i]);
- }
- return *this;
- }
-
- /** Hash chain pointer into secondary store. */
- unsigned long chain_ptr;
- /** Data array pointers for each subblock. */
- std::vector<unsigned long> data_ptr;
- /** Replacement Entry pointer. */
- void *re;
- /**
- * An array to store small compressed data. Conceputally the same size
- * as the unsused data array pointers.
- */
- uint8_t *trivialData;
- /**
- * The number of allocated subblocks.
- */
- int numData;
-};
-
-/**
- * A hash set for the IIC primary lookup table.
- */
-class IICSet{
- public:
- /** The associativity of the primary table. */
- int assoc;
-
- /** The number of hash chains followed when finding the last block. */
- int depth;
- /** The current number of blocks on the chain. */
- int size;
-
- /** Tag pointer into the secondary tag storage. */
- unsigned long chain_ptr;
-
- /** The LRU list of the primary table. MRU is at 0 index. */
- IICTag ** tags;
-
- /**
- * Find the addr in this set, return the chain pointer to the secondary if
- * it isn't found.
- * @param asid The address space ID.
- * @param tag The address to find.
- * @param chain_ptr The chain pointer to start the search of the secondary
- * @return Pointer to the tag, NULL if not found.
- */
- IICTag* findTag( Addr tag, unsigned long &chain_ptr)
- {
- depth = 1;
- for (int i = 0; i < assoc; ++i) {
- if (tags[i]->tag == tag && tags[i]->isValid()) {
- return tags[i];
- }
- }
- chain_ptr = this->chain_ptr;
- return 0;
- }
-
- /**
- * Find an usused tag in this set.
- * @return Pointer to the unused tag, NULL if none are free.
- */
- IICTag* findFree()
- {
- for (int i = 0; i < assoc; ++i) {
- if (!tags[i]->isValid()) {
- return tags[i];
- }
- }
- return 0;
- }
-
- /**
- * Move a tag to the head of the LRU list
- * @param tag The tag to move.
- */
- void moveToHead(IICTag *tag);
-
- /**
- * Move a tag to the tail (LRU) of the LRU list
- * @param tag The tag to move.
- */
- void moveToTail(IICTag *tag);
-};
-
-/**
- * The IIC tag store. This is a hardware-realizable, fully-associative tag
- * store that uses software replacement, e.g. Gen.
- */
-class IIC : public BaseTags
-{
- public:
- /** Typedef of the block type used in this class. */
- typedef IICTag BlkType;
- /** Typedef for list of pointers to the local block type. */
- typedef std::list<IICTag*> BlkList;
-
- protected:
- /** The number of set in the primary table. */
- const unsigned hashSets;
- /** The block size in bytes. */
- const unsigned blkSize;
- /** The associativity of the primary table. */
- const unsigned assoc;
- /** The base hit latency. */
- const Cycles hitLatency;
- /** The subblock size, used for compression. */
- const unsigned subSize;
-
- /** The number of subblocks */
- const unsigned numSub;
- /** The number of bytes used by data pointers */
- const unsigned trivialSize;
-
- /** The amount to shift address to get the tag. */
- const unsigned tagShift;
- /** The mask to get block offset bits. */
- const unsigned blkMask;
-
- /** The amount to shift to get the subblock number. */
- const unsigned subShift;
- /** The mask to get the correct subblock number. */
- const unsigned subMask;
-
- /** The latency of a hash lookup. */
- const Cycles hashDelay;
- /** The total number of tags in primary and secondary. */
- const unsigned numTags;
- /** The number of tags in the secondary tag store. */
- const unsigned numSecondary;
-
- /** The Null tag pointer. */
- const unsigned tagNull;
- /** The last tag in the primary table. */
- const unsigned primaryBound;
-
- /** All of the tags */
- IICTag *tagStore;
- /**
- * Pointer to the head of the secondary freelist (maintained with chain
- * pointers.
- */
- unsigned long freelist;
- /**
- * The data block freelist.
- */
- std::list<unsigned long> blkFreelist;
-
- /** The primary table. */
- IICSet *sets;
-
- /** The replacement policy. */
- Repl *repl;
-
- /** An array of data reference counters. */
- int *dataReferenceCount;
-
- /** The data blocks. */
- uint8_t *dataStore;
-
- /** Storage for the fast access data of each cache block. */
- uint8_t **dataBlks;
-
- /**
- * Count of the current number of free secondary tags.
- * Used for debugging.
- */
- int freeSecond;
-
- // IIC Statistics
- /**
- * @addtogroup IICStatistics IIC Statistics
- * @{
- */
-
- /** Hash hit depth of cache hits. */
- Stats::Distribution hitHashDepth;
- /** Hash depth for cache misses. */
- Stats::Distribution missHashDepth;
- /** Count of accesses to each hash set. */
- Stats::Distribution setAccess;
-
- /** The total hash depth for every miss. */
- Stats::Scalar missDepthTotal;
- /** The total hash depth for all hits. */
- Stats::Scalar hitDepthTotal;
- /** The number of hash misses. */
- Stats::Scalar hashMiss;
- /** The number of hash hits. */
- Stats::Scalar hashHit;
- /** @} */
-
- public:
- /**
- * Collection of parameters for the IIC.
- */
- class Params {
- public:
- /** The size in bytes of the cache. */
- unsigned size;
- /** The number of sets in the primary table. */
- unsigned numSets;
- /** The block size in bytes. */
- unsigned blkSize;
- /** The associativity of the primary table. */
- unsigned assoc;
- /** The number of cycles for each hash lookup. */
- Cycles hashDelay;
- /** The number of cycles to read the data. */
- Cycles hitLatency;
- /** The replacement policy. */
- Repl *rp;
- /** The subblock size in bytes. */
- unsigned subblockSize;
- };
-
- /**
- * Construct and initialize this tag store.
- * @param params The IIC parameters.
- * @todo
- * Should make a way to have less tags in the primary than blks in the
- * cache. Also should be able to specify number of secondary blks.
- */
- IIC(Params &params);
-
- /**
- * Destructor.
- */
- virtual ~IIC();
-
- /**
- * Register the statistics.
- * @param name The name to prepend to the statistic descriptions.
- */
- void regStats(const std::string &name);
-
- /**
- * Regenerate the block address from the tag.
- * @param tag The tag of the block.
- * @param set Not needed for the iic.
- * @return The block address.
- */
- Addr regenerateBlkAddr(Addr tag, int set) {
- return (((Addr)tag << tagShift));
- }
-
- /**
- * Return the block size.
- * @return The block size.
- */
- unsigned
- getBlockSize() const
- {
- return blkSize;
- }
-
- /**
- * Return the subblock size.
- * @return The subblock size.
- */
- unsigned
- getSubBlockSize() const
- {
- return subSize;
- }
-
- /**
- * Return the hit latency.
- * @return the hit latency.
- */
- int getHitLatency() const
- {
- return hitLatency;
- }
-
- /**
- * Generate the tag from the address.
- * @param addr The address to a get a tag for.
- * @return the tag.
- */
- Addr extractTag(Addr addr) const
- {
- return (addr >> tagShift);
- }
-
- /**
- * Return the set, always 0 for IIC.
- * @return 0.
- */
- int extractSet(Addr addr) const
- {
- return 0;
- }
-
- /**
- * Get the block offset of an address.
- * @param addr The address to get the offset of.
- * @return the block offset of the address.
- */
- int extractBlkOffset(Addr addr) const
- {
- return (addr & blkMask);
- }
-
- /**
- * Align an address to the block size.
- * @param addr the address to align.
- * @return The block address.
- */
- Addr blkAlign(Addr addr) const
- {
- return (addr & ~(Addr)blkMask);
- }
-
- /**
- * Swap the position of two tags.
- * @param index1 The first tag location.
- * @param index2 The second tag location.
- */
- void tagSwap(unsigned long index1, unsigned long index2);
-
- /**
- * Clear the reference bit of the tag and return its old value.
- * @param index The pointer of the tag to manipulate.
- * @return The previous state of the reference bit.
- */
- bool clearRef(unsigned long index)
- {
- bool tmp = tagStore[index].isReferenced();
- tagStore[index].status &= ~BlkReferenced;
- return tmp;
- }
-
- /**
- * Invalidate a block.
- * @param blk The block to invalidate.
- */
- void invalidate(BlkType *blk);
-
- /**
- * Access block and update replacement data. May not succeed, in which case
- * NULL pointer is returned. This has all the implications of a cache
- * access and should only be used as such.
- * Returns the access latency and inCache flags as a side effect.
- * @param addr The address to find.
- * @param asid The address space ID.
- * @param lat The access latency.
- * @return A pointer to the block found, if any.
- */
- IICTag* accessBlock(Addr addr, Cycles &lat, int context_src);
-
- /**
- * Find the block, do not update the replacement data.
- * @param addr The address to find.
- * @param asid The address space ID.
- * @return A pointer to the block found, if any.
- */
- IICTag* findBlock(Addr addr) const;
-
- /**
- * Find a replacement block for the address provided.
- * @param pkt The request to a find a replacement candidate for.
- * @param writebacks List for any writebacks to be performed.
- * @return The block to place the replacement in.
- */
- IICTag* findVictim(Addr addr, PacketList &writebacks);
-
- void insertBlock(Addr addr, BlkType *blk, int context_src);
- /**
- *iterated through all blocks and clear all locks
- *Needed to clear all lock tracking at once
- */
- virtual void clearLocks();
-
- /**
- * Called at end of simulation to complete average block reference stats.
- */
- virtual void cleanupRefs();
-
- /**
- * Visit each block in the tag store and apply a visitor to the
- * block.
- *
- * The visitor should be a function (or object that behaves like a
- * function) that takes a cache block reference as its parameter
- * and returns a bool. A visitor can request the traversal to be
- * stopped by returning false, returning true causes it to be
- * called for the next block in the tag store.
- *
- * \param visitor Visitor to call on each block.
- */
- template <typename V>
- void forEachBlk(V &visitor) {
- for (unsigned i = 0; i < numTags; ++i) {
- if (!visitor(tagStore[i]))
- return;
- }
- }
-
-private:
- /**
- * Return the hash of the address.
- * @param addr The address to hash.
- * @return the hash of the address.
- */
- unsigned hash(Addr addr) const;
-
- /**
- * Search for a block in the secondary tag store. Returns the number of
- * hash lookups as a side effect.
- * @param asid The address space ID.
- * @param tag The tag to match.
- * @param chain_ptr The first entry to search.
- * @param depth The number of hash lookups made while searching.
- * @return A pointer to the block if found.
- */
- IICTag *secondaryChain(Addr tag, unsigned long chain_ptr,
- int *depth) const;
-
- /**
- * Free the resources associated with the next replacement block.
- * @param writebacks A list of any writebacks to perform.
- */
- void freeReplacementBlock(PacketList & writebacks);
-
- /**
- * Return the pointer to a free data block.
- * @param writebacks A list of any writebacks to perform.
- * @return A pointer to a free data block.
- */
- unsigned long getFreeDataBlock(PacketList & writebacks);
-
- /**
- * Get a free tag in the given hash set.
- * @param set The hash set to search.
- * @param writebacks A list of any writebacks to perform.
- * @return a pointer to a free tag.
- */
- IICTag* getFreeTag(int set, PacketList & writebacks);
-
- /**
- * Free the resources associated with the given tag.
- * @param tag_ptr The tag to free.
- */
- void freeTag(IICTag *tag_ptr);
-
- /**
- * Mark the given data block as being available.
- * @param data_ptr The data block to free.
- */
- void freeDataBlock(unsigned long data_ptr);
-
-};
-#endif // __IIC_HH__
-