CacheSim/main.cpp

92 lines
2.6 KiB
C++

#include <iostream>
#include <math.h>
#include <string.h>
#include <iomanip>
#include "simulator.h"
int main(int argc, char* argv[]){
std::string temp;
int machineBits, cacheSize, waySize, blockSize;
short setSize;
short offsetSize, tagSize, indexSize;
std::cin >> temp >> temp >> machineBits;
std::cin >> temp >> temp >> cacheSize;
std::cin >> temp >> waySize;
std::cin >> temp >> temp >> blockSize;
setSize = cacheSize * 1024 / blockSize / waySize;
offsetSize = log2(blockSize);
indexSize = log2(setSize);
tagSize = machineBits - offsetSize - indexSize;
std::cout << "num_set: " << setSize << std::endl;
std::cout << "num_block_offset_bit: " << offsetSize << std::endl;
std::cout << "num_index_bit: " << indexSize << std::endl;
std::cout << "num_tag_bit: " << tagSize << std::endl;
CacheSim::Simulator* Sim;
if(strcmp(argv[1], "FIFO") == 0){
Sim = new CacheSim::Simulator(machineBits, setSize, waySize, tagSize, 0);
}else if(strcmp(argv[1], "LRU") == 0){
Sim = new CacheSim::Simulator(machineBits, setSize, waySize, tagSize, 1);
}else{
std::cout << "Usage: ./sim [ LRU | FIFO]" << std::endl;
return 0;
}
std::string action, address;
bool status;
std::vector<std::tuple<std::string, std::string, bool, short, short>> Result;
while(std::cin >> action >> address){
tuple<bool, short, short> status = Sim->read(address);
Result.push_back(
std::make_tuple(
action,
address,
std::get<0>(status),
std::get<1>(status),
std::get<2>(status)
)
);
}
// FIFO
int allCount = 0, hitCount = 0;
// std::cout << argv[1] << " Replace Policy:" << std::endl;
for(int i=0; i<Result.size(); i++){
allCount++;
if(std::get<2>(Result[i])){
hitCount++;
}
}
std::cout << "num_total_access: " << allCount << std::endl;
std::cout << "num_hit: " << hitCount << std::endl;
std::cout << "num_miss: " << allCount - hitCount << std::endl;
std::cout << "hit_rate: " << std::fixed << std::setprecision(2) << (double)hitCount/allCount*100 << "%" << std::endl;
std::cout << std::endl << "hit trace:" << std::endl << std::endl;
for(int i=0; i<Result.size(); i++){
if(std::get<2>(Result[i])){
std::cout << std::get<0>(Result[i]) << " " << std::get<1>(Result[i]);
std::cout << " hit ";
std::cout << "set: ";
if(std::get<3>(Result[i]) != 0)
std::cout << "0x" << std::hex << std::get<3>(Result[i]) << " ";
else
std::cout << "0 ";
std::cout << "way: ";
if(std::get<4>(Result[i]) != 0)
std::cout << "0x" << std::hex << std::get<4>(Result[i]);
else
std::cout << "0";
if(i != Result.size()-1)
std::cout << std::endl;
}
}
}