CacheSim/simulator.cpp

70 lines
1.8 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;
short index = this->getValue(addrBits, "index");
short offset = this->getValue(addrBits, "offset");
vector<bool> tag;
tag.assign(addrBits.begin(), addrBits.begin()+this->tagSize);
std::cout<<"更新 index: "<<index<<std::endl;
return this->sets[index].read(tag, offset);
// return 0;
}
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::getValue(vector<bool> addrBits, string type){
int start, end;
if(type == "index"){
start = this->tagSize + log2(this->setSize) - 1;
end = this->tagSize;
} else if(type == "offset"){
start = this->machineBits-1;
end = this->tagSize + log2(this->setSize);
}
short ans = 0 , base = 1;
for(int i=start; i>=end; i--){
ans += base * addrBits[i];
base *= 2;
}
return ans;
}