/** * Updates cache appropriately when an access to 'address' occurs. * Updates Hit count, Miss count, Cold Miss count appropriately. */ void Cache::updateCache (Address address) { if (addressLog.find(make_pair(address.getSet(), address.getIndex())) == addressLog.end()) { addressLog.insert(make_pair(address.getSet(), address.getIndex())); numColdMiss++; } bool status = cache[address.getSet()].updateLRUQueue(address); if (status) numHits++; else numMisses++; }
/** * Updates queue of addresses appropriately according to * LRU Replacement policy. * Return true if a Hit occurs, otherwise returns false. */ bool LRUQueue::updateLRUQueue (Address address) { if (lruQueue.size() == 0) { lruQueue.push_back(address); return false; } list<Address>::iterator iterator; for (iterator = lruQueue.begin(); iterator != lruQueue.end(); iterator++) { if (iterator->getSet() == address.getSet() && iterator->getIndex() == address.getIndex()) { lruQueue.push_back(address); lruQueue.erase(iterator); return true; } } if (lruQueue.size() == ways) { lruQueue.pop_front(); } lruQueue.push_back(address); return false; }