-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEntry.py
146 lines (128 loc) · 4.3 KB
/
Entry.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
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
class ROBEntry:
def __init__(self, name):
self.name = name
self.op = ''
self.inst_id = -1
self.busy = False
self.ready = True
self.dest = ''
self.value = None
def __str__(self):
if not self.busy:
return self.name + ': '
else:
if self.value is None:
return self.name + ': ' + self.op + ' ' + self.dest
else:
return self.name + ': ' + self.op + ' ' + self.dest + ' ' + str(self.value)
def update(self, op, inst_id, dest, busy, ready, value=None):
self.op = op
self.inst_id = inst_id
self.dest = dest
self.value = value
self.busy = busy
self.ready = ready
class RSEntry:
def __init__(self, id, name, cycle):
self.id = id
self.inst_id = -1
self.op = ""
self.busy = False
self.vj = 0
self.vk = 0
self.qj = ""
self.qk = ""
self.dest = ""
# Functional Unit Params
self.unit_names = name.split(',')
self.cycle = cycle
self.counter = self.cycle
def execute(self):
if self.busy:
# TODO: BRANCH PREDICTION
if self.op == 'LD':
if self.qj == '':
self.counter -= 1
if self.counter == 0:
self.busy = False
self.counter = self.cycle
return [self.dest, self.vj]
else:
if self.qj == '' and self.qk == '':
if self.counter == 0:
self.busy = False
self.counter = self.cycle
if self.op == 'ADD':
return [self.dest, self.vj + self.vk]
if self.op == 'SUB':
return [self.dest, self.vj - self.vk]
if self.op == 'MUL':
return [self.dest, self.vj * self.vk]
if self.op == 'DIV':
return [self.dest, self.vj / self.vk]
if self.op == 'BGE':
return [self.dest, 1 if self.vj >= self.vk else 0]
else:
self.counter -= 1
return
else:
return
def __str__(self):
if not self.busy:
return 'RS' + str(self.id) + ':'
else:
line = 'RS' + str(self.id) + ': ' + self.op + ' '
if self.qj != '':
line += self.qj + ' '
else:
line += str(self.vj) + ' '
if self.qk != '':
line += self.qk + ' '
else:
line += str(self.vk) + ' '
return line + self.dest
class Register:
def __init__(self, name):
self.name = name
self.value = None
self.reorder = None
self.busy = False
def __str__(self):
if self.value is None and self.reorder is None:
return self.name + ': '
elif self.value is None:
return self.name + ': ' + '\t' + ' ' + self.reorder
elif self.reorder is None:
return self.name + ': ' + str(self.value)
else:
return self.name + ': ' + str(self.value) + ' ' + self.reorder
def update(self, rob, value, busy):
self.value = value
self.reorder = rob
self.busy = busy
class Instruction:
def __init__(self, op_name, d, s1, s2=None):
self.op = op_name
self.d = d
self.s1 = s1
self.s2 = s2
def copy(self):
return Instruction(self.op, self.d, self.s1, self.s2)
@staticmethod
def is_operand_reg(operand):
try:
value = int(operand)
return False
except:
return True
def __str__(self):
if self.s2 is None:
return self.op + ' ' + self.d + ', ' + self.s1
else:
return self.op + ' ' + self.d + ', ' + self.s1 + ', ' + self.s2
@classmethod
def fromlist(cls, inst_list):
if len(inst_list) == 3:
return cls(inst_list[0], inst_list[1], inst_list[2])
else:
return cls(inst_list[0], inst_list[1], inst_list[2], inst_list[3])