-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtlbsim.cpp
109 lines (89 loc) · 2.68 KB
/
tlbsim.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include "lrucache.h"
using namespace std;
pair<int, bool> va_to_pa_translation(int va, unordered_map<int, int> pageTable, int page_size_bits, LRUCache &tlb)
{
int page_size = pow(2, page_size_bits);
int vpn = va / page_size;
int page_offset = va % page_size;
int pfn = tlb.get(vpn);
if (pfn == -1)
{
// TLB Miss
pfn = pageTable[vpn];
tlb.put(vpn, pfn);
return pair<int, bool>(pfn * page_size + page_offset, false);
}
return pair<int, bool>(pfn * page_size + page_offset, true);
}
int main(int argc, char *argv[])
{
string pageTableFileName = argv[1];
string TLBAccessesFileName = argv[2];
string policy = argv[3];
string cache_size = argv[4];
ifstream pageTableFile(pageTableFileName);
ifstream TLBAccessesFile(TLBAccessesFileName);
// output file
ofstream outFile("./22125001_" + pageTableFileName + "_" + TLBAccessesFileName + "_" + policy + "_" + cache_size);
// // READING INPUT FILES
// inputting first few lines
int VPNbits, PFNbits;
pageTableFile >> VPNbits >> PFNbits;
// newline VPN PFN title lines
string _;
getline(pageTableFile, _);
getline(pageTableFile, _);
vector<int> VPN, PFN;
int vpn, pfn;
while (pageTableFile >> vpn >> pfn)
{
VPN.push_back(vpn);
PFN.push_back(pfn);
}
// reading TLB Accesses
int page_size_bits;
TLBAccessesFile >> page_size_bits;
vector<int> TLBAccesses;
int access;
while (TLBAccessesFile >> access)
{
TLBAccesses.push_back(access);
}
// // MAP VPN to PFN
unordered_map<int, int> pageTable;
for (int i=0; i<VPN.size(); i++)
{
pageTable[VPN[i]] = PFN[i];
}
// // translating all virtual addresses
LRUCache tlb(stoi(cache_size));
vector<pair<int, bool>> pa_hit_list;
int num_hits = 0;
int num_misses = 0;
for (auto va: TLBAccesses)
{
pair<int, bool> pa_hit = va_to_pa_translation(va, pageTable, page_size_bits, tlb);
if (pa_hit.second)
num_hits += 1;
else
num_misses += 1;
pa_hit_list.push_back(pa_hit);
}
int num_accesses = num_hits + num_misses;
// // writing into the ouput file
outFile << "TOTAL_ACCESSES = " << num_accesses << endl;
outFile << "TOTAL_MISSES = " << num_misses << endl;
outFile << "TOTAL_HITS = " << num_hits << endl;
for (auto pa_hit: pa_hit_list)
{
outFile << pa_hit.first << " " << (pa_hit.second ? "HIT" : "MISS") << endl;
}
pageTableFile.close();
TLBAccessesFile.close();
outFile.close();
return 0;
}