#include #include #include #include #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> Result; while(std::cin >> action >> address){ tuple 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[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[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; } } }