-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathCache.py
69 lines (55 loc) · 1.87 KB
/
Cache.py
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
# Cache emulator
class Line:
def __init__(self, age):
self.age = age
self.tag = None
def updateTag(self, tag):
self.tag = tag
def updateAge(self, age_accessed):
if(self.age == age_accessed):
self.age = 0
elif(self.age < age_accessed):
self.age += 1
class Set:
def __init__(self):
self.lines = ( Line(2), Line(1), Line(0) )
def contains(self, tag):
for line in self.lines:
if line.tag is tag:
return True
return False
def lineToUse(self, tag):
line_index = 0
# Use the first tag that has either not been init or is a hit
for line in self.lines:
if line.tag is tag or line.tag is None:
return (line_index, line.age)
line_index += 1
# If all self.lines are full and we have a tag miss we must pick a line
# to evict.
max_age = None
line_with_max_age = None
line_index = 0
for line in self.lines:
if max_age is None or line.age > max_age:
max_age = line.age
line_with_max_age = line_index
line_index += 1
print("Evict line", line_with_max_age)
return (line_with_max_age, max_age)
def updateAges(self, age_accessed):
for line in self.lines:
line.updateAge(age_accessed)
def updateTag(self, tag):
line = self.lineToUse(tag)
self.lines[line[0]].updateTag(tag)
return line
class Cache:
def __init__(self):
self.sets = ( Set(), Set() )
def contains(self, set_id, tag):
return self.sets[set_id].contains(tag)
def updateTag(self, set_id, tag):
return self.sets[set_id].updateTag(tag)
def updateAges(self, set_id, age_accessed):
self.sets[set_id].updateAges(age_accessed)