70 lines
1.8 KiB
C++
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;
|
|
} |