CacheSim/simulator.cpp

60 lines
1.5 KiB
C++

#include "simulator.h"
#include <sstream>
#include <bitset>
using CacheSim::Simulator;
using std::stringstream;
using std::bitset;
Simulator::Simulator(int machineBits, short setSize, short waySize, short tagSize){
this->setSize = setSize;
this->tagSize = tagSize;
this->machineBits = machineBits;
for(int i=0; i<setSize; i++){
this->sets.push_back(Set(waySize, tagSize));
}
}
bool Simulator::read(string address){
vector<bool> addrBits = this->addressTranslate(address);
for(int i=0; i<addrBits.size(); i++){
std::cout << addrBits[i] << " ";
}
// std::cout << std::endl << addrBits.size() << std::endl;
short index = this->getIndex(addrBits);
// std::cout<<index<<std::endl;
return true;
}
bool Simulator::write(string address){
return true;
}
vector<bool> Simulator::addressTranslate(string address){
vector<bool> ans;
ans.reserve(this->tagSize);
stringstream ss;
ss << std::hex << address;
unsigned long long number;
ss >> number;
bitset<64> bits(number);
for(int i=this->machineBits-1; i>=0; i--){
ans.push_back(bits[i]);
}
return ans;
}
short Simulator::getIndex(vector<bool> addrBits){
short ans = 0 , base = 1;
// std::cout<<"hi"<<std::endl;
for(int i=(this->tagSize+log2(this->setSize)-1); i>=this->tagSize; i--){
// std::cout<<i<<std::endl;
ans += base * addrBits[i];
base *= 2;
}
// std::cout<<"bye"<<std::endl;
return ans;
}