1/* 2 * Copyright (c) 2012-2014 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software
--- 33 unchanged lines hidden (view full) ---
42 43/** 44 * @file 45 * Definitions of a base set associative tag store. 46 */ 47 48#include "mem/cache/tags/base_set_assoc.hh" 49
|
50#include <cassert>
|
50#include <string> 51 52#include "base/intmath.hh"
|
54#include "mem/request.hh"
|
53 54BaseSetAssoc::BaseSetAssoc(const Params *p) 55 :BaseTags(p), assoc(p->assoc), allocAssoc(p->assoc), 56 blks(p->size / p->block_size), 57 numSets(p->size / (p->block_size * p->assoc)), 58 sequentialAccess(p->sequential_access), 59 sets(p->size / (p->block_size * p->assoc)), 60 replacementPolicy(p->replacement_policy)
--- 66 unchanged lines hidden (view full) ---
127} 128 129CacheBlk* 130BaseSetAssoc::findBlockBySetAndWay(int set, int way) const 131{ 132 return sets[set].blks[way]; 133} 134
|
137std::string
138BaseSetAssoc::print() const {
139 std::string cache_state;
140 for (const CacheBlk& blk : blks) {
141 if (blk.isValid())
142 cache_state += csprintf("\tset: %d way: %d %s\n", blk.set,
143 blk.way, blk.print());
144 }
145 if (cache_state.empty())
146 cache_state = "no valid tags\n";
147 return cache_state;
148}
149
150void
151BaseSetAssoc::cleanupRefs()
152{
153 for (const CacheBlk& blk : blks) {
154 if (blk.isValid()) {
155 totalRefs += blk.refCount;
156 ++sampledRefs;
157 }
158 }
159}
160
161void
162BaseSetAssoc::computeStats()
163{
164 for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) {
165 occupanciesTaskId[i] = 0;
166 for (unsigned j = 0; j < 5; ++j) {
167 ageTaskId[i][j] = 0;
168 }
169 }
170
171 for (const CacheBlk& blk : blks) {
172 if (blk.isValid()) {
173 assert(blk.task_id < ContextSwitchTaskId::NumTaskId);
174 occupanciesTaskId[blk.task_id]++;
175 assert(blk.tickInserted <= curTick());
176 Tick age = curTick() - blk.tickInserted;
177
178 int age_index;
179 if (age / SimClock::Int::us < 10) { // <10us
180 age_index = 0;
181 } else if (age / SimClock::Int::us < 100) { // <100us
182 age_index = 1;
183 } else if (age / SimClock::Int::ms < 1) { // <1ms
184 age_index = 2;
185 } else if (age / SimClock::Int::ms < 10) { // <10ms
186 age_index = 3;
187 } else
188 age_index = 4; // >10ms
189
190 ageTaskId[blk.task_id][age_index]++;
191 }
192 }
193}
194
|
135BaseSetAssoc * 136BaseSetAssocParams::create() 137{ 138 return new BaseSetAssoc(this); 139}
|