-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathupro.py
216 lines (177 loc) · 4.51 KB
/
upro.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
class Uinst:
"""
微指令对象
"""
def __init__(self, b):
"""b 为 4 个 bytes"""
self.__byte = (b[2] << 16) + (b[1] << 8) + (b[0])
def is_default_uint(self):
"""该微指令是否为默认指令"""
return self.__byte == 0xffffff
def get_upro(self):
"""获取微程序"""
return hex(self.__byte)[2:].upper()
# X2X1X0 对应的数据输出字符串
xs_map_data_out = [
"用户IN", "中断地址IA",
"堆栈寄存器ST", "PC值",
"ALU直通", "ALU右移",
"ALU左移", "浮空"
]
def get_data_out(self):
"""获取数据输出"""
if self.emen():
return "存贮器值EM"
if self.rrd():
return "寄存器值R?"
return Uinst.xs_map_data_out[self.get_xs()]
def get_data_in(self):
"""获取数据打入"""
b = self.__byte
buf = []
if self.aen():
buf.append("寄存器A")
if self.wen():
buf.append("寄存器W")
if self.rwr():
buf.append("寄存器R?")
if self.fen():
buf.append("标志位C,Z")
if self.emwr():
buf.append("存贮器EM")
if self.iren():
buf.append("指令寄存器IR")
if self.elp():
buf.append("寄存器PC")
if self.maren():
buf.append("地址寄存器MAR")
if self.outen():
buf.append("用户OUT")
if self.sten():
buf.append("堆栈寄存器ST")
return " ".join(buf)
def get_addr_out(self):
"""获取地址输出"""
if self.pcoe():
return "PC输出"
if self.maroe():
return "MAR输出"
else:
return "浮空"
ss_map_calculator = [
"加运算", "减运算", "或运算", "与运算",
"带进位加运算", "带进位减运算", "A取反", "A输出"
]
def get_calculator(self):
"""获取运算器"""
ss = self.get_ss()
return Uinst.ss_map_calculator[ss]
def get_bit_shift_control(self):
"""获取移位控制"""
xs = self.get_xs()
cn = self.cn()
if xs == 5:
return "右移" if cn else "带进位右移"
if xs == 6:
return "左移" if cn else "带进位左移"
else:
return ""
def get_upc(self):
"""获取 uPC"""
if self.iren():
return "写入"
else:
return "+1"
def get_pc(self):
"""获取 PC"""
if self.elp():
return "写入\n"
if self.pcoe():
return "+1\n"
else:
return "\n"
def get_xs(self):
"""计算 X2X1X0 形式的二进制值,对应十进制0-7"""
x2 = (Uinst.X2_MASK & self.__byte) >> 7
x1 = (Uinst.X1_MASK & self.__byte) >> 6
x0 = (Uinst.X0_MASK & self.__byte) >> 5
return x2 * 4 + x1 * 2 + x0
def get_ss(self):
"""计算 S2S1S0 形式的二进制值,对应十进制0-7"""
s2 = (Uinst.S2_MASK & self.__byte) >> 2
s1 = (Uinst.S1_MASK & self.__byte) >> 1
s0 = (Uinst.S0_MASK & self.__byte) >> 0
return s2 * 4 + s1 * 2 + s0
def xrd(self):
return not Uinst.XRD_MASK & self.__byte
def emwr(self):
return not Uinst.EMWR_MASK & self.__byte
def emrd(self):
return not Uinst.EMRD_MASK & self.__byte
def pcoe(self):
return not Uinst.PCOE_MASK & self.__byte
def emen(self):
return not Uinst.EMEN_MASK & self.__byte
def iren(self):
return not Uinst.IREN_MASK & self.__byte
def eint(self):
return not Uinst.EINT_MASK & self.__byte
def elp(self):
return not Uinst.ELP_MASK & self.__byte
def maren(self):
return not Uinst.MAREN_MASK & self.__byte
def maroe(self):
return not Uinst.MAROE_MASK & self.__byte
def outen(self):
return not Uinst.OUTEN_MASK & self.__byte
def sten(self):
return not Uinst.STEN_MASK & self.__byte
def rrd(self):
return not Uinst.RRD_MASK & self.__byte
def rwr(self):
return not Uinst.RWR_MASK & self.__byte
def cn(self):
return not Uinst.CN_MASK & self.__byte
def fen(self):
return not Uinst.FEN_MASK & self.__byte
def x2(self):
return not Uinst.X2_MASK & self.__byte
def x1(self):
return not Uinst.X1_MASK & self.__byte
def x0(self):
return not Uinst.X0_MASK & self.__byte
def wen(self):
return not Uinst.WEN_MASK & self.__byte
def aen(self):
return not Uinst.AEN_MASK & self.__byte
def s2(self):
return not Uinst.S2_MASK & self.__byte
def s1(self):
return not Uinst.S1_MASK & self.__byte
def s0(self):
return not Uinst.S0_MASK & self.__byte
# 微指令中 24 个控制位的掩码
XRD_MASK = 1 << 23
EMWR_MASK = 1 << 22
EMRD_MASK = 1 << 21
PCOE_MASK = 1 << 20
EMEN_MASK = 1 << 19
IREN_MASK = 1 << 18
EINT_MASK = 1 << 17
ELP_MASK = 1 << 16
MAREN_MASK = 1 << 15
MAROE_MASK = 1 << 14
OUTEN_MASK = 1 << 13
STEN_MASK = 1 << 12
RRD_MASK = 1 << 11
RWR_MASK = 1 << 10
CN_MASK = 1 << 9
FEN_MASK = 1 << 8
X2_MASK = 1 << 7
X1_MASK = 1 << 6
X0_MASK = 1 << 5
WEN_MASK = 1 << 4
AEN_MASK = 1 << 3
S2_MASK = 1 << 2
S1_MASK = 1 << 1
S0_MASK = 1 << 0