-
Notifications
You must be signed in to change notification settings - Fork 1
/
registers.py
178 lines (156 loc) · 3.12 KB
/
registers.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
#!/usr/bin/env python3
#from collections import namedtuple
#from typing import NamedTuple
from dataclasses import dataclass, fields
PROCESSOR_ID = 0x59
BIOS_ADDR = 0xbfc00000
BIOS_ADDR2 = 0x9fc00000
BIOS_ADDR3 = 0x1fc00000
GPR_DEFAULTS = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
# pc
BIOS_ADDR,
0, 0, 0, 0, 0)
CPR_DEFAULTS = (
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
# PRId
PROCESSOR_ID,
0,
0, 0,
# Debug
0,
0, 0, 0, 0, 0, 0)
def name(registers, register):
return fields(registers)[register].name
def createGPR():
return GPR(*GPR_DEFAULTS)
def createCPR():
return CPR(*CPR_DEFAULTS)
@dataclass
class CPR:
Index: int
Random: int
EntryLo0: int
EntryLo1: int
Context: int
PageMask: int
Wired: int
Reserved0: int
BadVAddr: int
Count: int
EntryHi: int
Compare: int
Status: int
Cause: int
EPC: int
PRId: int
Config: int
Reserved1: int
BadPAddr: int
Debug: int
Perf: int
Reserved2: int
TagLo: int
TagHi: int
ErrorEPC: int
Reserved3: int
def __getitem__(self, register):
return self.__getattribute__(fields(self)[register].name)
def __setitem__(self, register, value):
return self.__setattr__(fields(self)[register].name, value)
def __len__(self):
return len(fields(self))
@dataclass
class GPR:
Zero: int
AT: int
V0: int
V1: int
A0: int
A1: int
A2: int
A3: int
T0: int
T1: int
T2: int
T3: int
T4: int
T5: int
T6: int
T7: int
S0: int
S1: int
S2: int
S3: int
S4: int
S5: int
S6: int
S7: int
T8: int
T9: int
K0: int
K1: int
GP: int
SP: int
FP: int
RA: int
PC: int
Hi: int
Lo: int
Hi1: int
Lo1: int
SA: int
def __getitem__(self, register):
return self.__getattribute__(fields(self)[register].name)
def __setitem__(self, register, value):
return self.__setattr__(fields(self)[register].name, value)
def __len__(self):
return len(fields(self))
class VPU:
REGISTER_NAMES = ("vf00", "vf01", "vf02", "vf03", "vf04", "vf05", "vf06", "vf07",
"vf08", "vf09",
"vf10",
"vf11",
"vf12",
"vf13",
"vf14",
"vf15",
"vf16",
"vf17",
"vf18",
"vf19",
"vf20",
"vf21",
"vf22",
"vf23",
"vf24",
"vf25",
"vf26",
"vf27",
"vf28",
"vf29",
"vf30",
"vf31",
"vi00",
"vi01",
"vi02",
"vi03",
"vi04",
"vi05",
"vi06",
"vi07",
"vi08",
"vi09",
"vi10",
"vi11",
"vi12",
"vi13",
"vi14",
"vi15",
"acc",
"q", "p"
)
def __init__(self):
self.registers = Registers(VPU.REGISTER_NAMES, typed=True)