92 lines
2.6 KiB
C++
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;
|
|
}
|
|
}
|
|
}
|