113553Sjavier.bueno@metempsy.com/** 213553Sjavier.bueno@metempsy.com * Copyright (c) 2018 Metempsy Technology Consulting 313553Sjavier.bueno@metempsy.com * All rights reserved. 413553Sjavier.bueno@metempsy.com * 513553Sjavier.bueno@metempsy.com * Redistribution and use in source and binary forms, with or without 613553Sjavier.bueno@metempsy.com * modification, are permitted provided that the following conditions are 713553Sjavier.bueno@metempsy.com * met: redistributions of source code must retain the above copyright 813553Sjavier.bueno@metempsy.com * notice, this list of conditions and the following disclaimer; 913553Sjavier.bueno@metempsy.com * redistributions in binary form must reproduce the above copyright 1013553Sjavier.bueno@metempsy.com * notice, this list of conditions and the following disclaimer in the 1113553Sjavier.bueno@metempsy.com * documentation and/or other materials provided with the distribution; 1213553Sjavier.bueno@metempsy.com * neither the name of the copyright holders nor the names of its 1313553Sjavier.bueno@metempsy.com * contributors may be used to endorse or promote products derived from 1413553Sjavier.bueno@metempsy.com * this software without specific prior written permission. 1513553Sjavier.bueno@metempsy.com * 1613553Sjavier.bueno@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713553Sjavier.bueno@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813553Sjavier.bueno@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913553Sjavier.bueno@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013553Sjavier.bueno@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113553Sjavier.bueno@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213553Sjavier.bueno@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313553Sjavier.bueno@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413553Sjavier.bueno@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513553Sjavier.bueno@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613553Sjavier.bueno@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713553Sjavier.bueno@metempsy.com * 2813553Sjavier.bueno@metempsy.com * Authors: Javier Bueno 2913553Sjavier.bueno@metempsy.com */ 3013553Sjavier.bueno@metempsy.com 3113553Sjavier.bueno@metempsy.com#ifndef __CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ 3213553Sjavier.bueno@metempsy.com#define __CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ 3313553Sjavier.bueno@metempsy.com 3413553Sjavier.bueno@metempsy.com#include "mem/cache/prefetch/associative_set.hh" 3513553Sjavier.bueno@metempsy.com 3613553Sjavier.bueno@metempsy.comtemplate<class Entry> 3713553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::AssociativeSet(int assoc, int num_entries, 3813553Sjavier.bueno@metempsy.com BaseIndexingPolicy *idx_policy, BaseReplacementPolicy *rpl_policy, 3913553Sjavier.bueno@metempsy.com Entry const &init_value) 4013553Sjavier.bueno@metempsy.com : associativity(assoc), numEntries(num_entries), indexingPolicy(idx_policy), 4113553Sjavier.bueno@metempsy.com replacementPolicy(rpl_policy), entries(numEntries, init_value) 4213553Sjavier.bueno@metempsy.com{ 4313553Sjavier.bueno@metempsy.com fatal_if(!isPowerOf2(num_entries), "The number of entries of an " 4413553Sjavier.bueno@metempsy.com "AssociativeSet<> must be a power of 2"); 4513553Sjavier.bueno@metempsy.com fatal_if(!isPowerOf2(assoc), "The associativity of an AssociativeSet<> " 4613553Sjavier.bueno@metempsy.com "must be a power of 2"); 4713553Sjavier.bueno@metempsy.com for (unsigned int entry_idx = 0; entry_idx < numEntries; entry_idx += 1) { 4813553Sjavier.bueno@metempsy.com Entry* entry = &entries[entry_idx]; 4913553Sjavier.bueno@metempsy.com indexingPolicy->setEntry(entry, entry_idx); 5013553Sjavier.bueno@metempsy.com entry->replacementData = replacementPolicy->instantiateEntry(); 5113553Sjavier.bueno@metempsy.com } 5213553Sjavier.bueno@metempsy.com} 5313553Sjavier.bueno@metempsy.com 5413553Sjavier.bueno@metempsy.comtemplate<class Entry> 5513553Sjavier.bueno@metempsy.comEntry* 5613553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::findEntry(Addr addr, bool is_secure) const 5713553Sjavier.bueno@metempsy.com{ 5813553Sjavier.bueno@metempsy.com Addr tag = indexingPolicy->extractTag(addr); 5913553Sjavier.bueno@metempsy.com const std::vector<ReplaceableEntry*> selected_entries = 6013553Sjavier.bueno@metempsy.com indexingPolicy->getPossibleEntries(addr); 6113553Sjavier.bueno@metempsy.com 6213553Sjavier.bueno@metempsy.com for (const auto& location : selected_entries) { 6313553Sjavier.bueno@metempsy.com Entry* entry = static_cast<Entry *>(location); 6413553Sjavier.bueno@metempsy.com if ((entry->getTag() == tag) && entry->isValid() && 6513553Sjavier.bueno@metempsy.com entry->isSecure() == is_secure) { 6613553Sjavier.bueno@metempsy.com return entry; 6713553Sjavier.bueno@metempsy.com } 6813553Sjavier.bueno@metempsy.com } 6913553Sjavier.bueno@metempsy.com return nullptr; 7013553Sjavier.bueno@metempsy.com} 7113553Sjavier.bueno@metempsy.com 7213553Sjavier.bueno@metempsy.comtemplate<class Entry> 7313553Sjavier.bueno@metempsy.comvoid 7413553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::accessEntry(Entry *entry) 7513553Sjavier.bueno@metempsy.com{ 7613553Sjavier.bueno@metempsy.com replacementPolicy->touch(entry->replacementData); 7713553Sjavier.bueno@metempsy.com} 7813553Sjavier.bueno@metempsy.com 7913553Sjavier.bueno@metempsy.comtemplate<class Entry> 8013553Sjavier.bueno@metempsy.comEntry* 8113553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::findVictim(Addr addr) 8213553Sjavier.bueno@metempsy.com{ 8313553Sjavier.bueno@metempsy.com // Get possible entries to be victimized 8413553Sjavier.bueno@metempsy.com const std::vector<ReplaceableEntry*> selected_entries = 8513553Sjavier.bueno@metempsy.com indexingPolicy->getPossibleEntries(addr); 8613553Sjavier.bueno@metempsy.com Entry* victim = static_cast<Entry*>(replacementPolicy->getVictim( 8713553Sjavier.bueno@metempsy.com selected_entries)); 8813553Sjavier.bueno@metempsy.com // There is only one eviction for this replacement 8913553Sjavier.bueno@metempsy.com victim->reset(); 9013553Sjavier.bueno@metempsy.com return victim; 9113553Sjavier.bueno@metempsy.com} 9213553Sjavier.bueno@metempsy.com 9313553Sjavier.bueno@metempsy.com 9413553Sjavier.bueno@metempsy.comtemplate<class Entry> 9513553Sjavier.bueno@metempsy.comstd::vector<Entry *> 9613553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::getPossibleEntries(const Addr addr) const 9713553Sjavier.bueno@metempsy.com{ 9813553Sjavier.bueno@metempsy.com std::vector<ReplaceableEntry *> selected_entries = 9913553Sjavier.bueno@metempsy.com indexingPolicy->getPossibleEntries(addr); 10013553Sjavier.bueno@metempsy.com std::vector<Entry *> entries(selected_entries.size(), nullptr); 10113553Sjavier.bueno@metempsy.com 10213553Sjavier.bueno@metempsy.com unsigned int idx = 0; 10313553Sjavier.bueno@metempsy.com for (auto &entry : selected_entries) { 10413553Sjavier.bueno@metempsy.com entries[idx++] = static_cast<Entry *>(entry); 10513553Sjavier.bueno@metempsy.com } 10613553Sjavier.bueno@metempsy.com return entries; 10713553Sjavier.bueno@metempsy.com} 10813553Sjavier.bueno@metempsy.com 10913553Sjavier.bueno@metempsy.comtemplate<class Entry> 11013553Sjavier.bueno@metempsy.comvoid 11113553Sjavier.bueno@metempsy.comAssociativeSet<Entry>::insertEntry(Addr addr, bool is_secure, Entry* entry) 11213553Sjavier.bueno@metempsy.com{ 11313553Sjavier.bueno@metempsy.com entry->setValid(); 11413553Sjavier.bueno@metempsy.com entry->setTag(indexingPolicy->extractTag(addr)); 11513553Sjavier.bueno@metempsy.com entry->setSecure(is_secure); 11613553Sjavier.bueno@metempsy.com replacementPolicy->reset(entry->replacementData); 11713553Sjavier.bueno@metempsy.com} 11813553Sjavier.bueno@metempsy.com 11913553Sjavier.bueno@metempsy.com#endif//__CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ 120