-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpredictor_components.py
67 lines (54 loc) · 2.11 KB
/
predictor_components.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
class nBitPredictor:
def __init__(self, bits, start_state):
self.bits = bits
self.state = start_state
self.mispredicted = 0
self.total_predicted = 0
def update(self, actual_direction):
self.total_predicted += 1
if actual_direction != self.prediction_bit():
self.mispredicted += 1
if actual_direction == 1:
if self.state < ((1 << self.bits) - 1):
self.state += 1
else:
if self.state > 0:
self.state -= 1
def prediction(self):
return "T" if self.state & (1 << (self.bits - 1)) else "NT"
def prediction_bit(self):
return 1 if self.state & (1 << (self.bits - 1)) else 0
def get_state(self):
return format(self.state, f'0{self.bits}b')
# Misprediction rate for each predictor, not for each branch instruction
def misprediction_rate(self):
if self.total_predicted == 0:
return "0 out of 0 (0.00%)"
return "{} out of {} ({:.2f}%)".format(
self.mispredicted,
self.total_predicted,
float(self.mispredicted) / self.total_predicted * 100)
class nBitAgreePredictor(nBitPredictor):
def update(self, bias, actual_direction):
if actual_direction == bias:
if self.state < (1 << self.bits) - 1:
self.state += 1
else:
if self.state > 0:
self.state -= 1
def prediction(self, bias):
return 'T' if self.prediction_bit(bias) else 'NT'
def prediction_bit(self, bias):
return bias if self.state & (1 << (self.bits - 1)) else not bias
class PatternHistoryRegister():
def __init__(self, size, start_state):
self.size = size
self.register = start_state
def update(self, direction):
self.register = (self.register << 1) | direction
if self.register >= (1 << self.size):
self.register -= (1 << self.size)
def get_value(self):
return self.register
def get_text(self):
return format(self.register, f'0{self.size}b')