-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
140 lines (118 loc) · 3.15 KB
/
main.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
# Command line interface for risv-c simulator
# version 1.0 with 9 instructions
# 18 Feb 2022
# Prabhas Chongstitvatana
import rv32c as rv # cpu
import load32 as ld # memory
savePC = 0
ninst = 0 # number of executed inst
MAXRUN = 10000 # max simulation run
# print positive/negative 32-bit integer
def pr32(n):
if( n < 2147483648 ): # test positive number (32-bit)
print(n,end="")
else:
print("-",(~n & 0x7FFFFFFF)+1,sep="",end="")
def show():
print("pc",savePC," ",end="")
ld.prCurrentOp()
print(" ",end="")
for i in range(1,11):
print(" x",i,":",sep="",end="")
pr32(rv.getR(i))
print()
# -------------- monitor -----------------
def helpx():
print("g - go")
print("t - single step")
print("d ads n - dump memory")
print("r - show registers")
print("s [xn,mn,pc] v - set [reg,mem,pc]")
print("h - this help")
print("q - quit")
def dumpR():
print(" pc:",rv.getPC())
for i in range(0,32):
if( i%8 == 0):
print()
print(" x",i,":",sep="",end="")
pr32(rv.getR(i))
# save register bank as mem file.
def dumpRtxt():
reg = ""
for i in range(0,32):
reg = reg +"{:08d}".format((rv.getR(i))) + "\n"
with open("regbank_python.mem", 'w') as out_file:
out_file.write(reg)
def dumpM(ads,n):
for i in range(ads,ads+n,4):
print(i, ld.getM(i))
regname = ['x0','x1','x2','x3','x4','x5','x6','x7','x8','x9',
'x10','x11','x12','x13','x14','x15','x16','x17','x18',
'x19','x20','x21','x22','x23','x24','x25','x26','x27',
'x28','x29','x30','x31']
def setvalue(cmd):
a = cmd[1]
v = int(cmd[2])
if( a in regname ):
i = int(a[1:])
rv.setR(i,v)
elif( a[0] == 'm' ):
ld.setM(int(a[1:]),v)
elif( a == "pc" ):
rv.setPC(v)
else:
print("set unknown")
# run one instruction
def runone():
global savePC, ninst
savePC = rv.getPC()
rv.run()
show()
ninst += 1
def trace():
while( 1 ):
if( ninst > MAXRUN ):
print("infinite loop")
break
else:
runone()
if(rv.checkNop()): # stop at "nop"
break
def interp():
while(1):
cmd = input(">").split()
c = cmd[0]
if( c == 'g'):
trace()
elif( c == 't'):
runone()
elif( c == 'r'):
dumpR()
print()
elif( c == 'd'):
dumpM(int(cmd[1]), int(cmd[2]))
print()
elif( c == 's'):
setvalue(cmd)
elif( c == 'h'):
helpx()
elif( c == 'q'):
break
else:
print("unknown command")
# --------------------------------
def getTrackers():
return rv.getTracker
def main():
rv.setControl_vector()
# inp = input("object file:").strip().split()
# fname = inp[0]
# ld.loadobj(fname)
ld.loadobj('instruction.mem')
# ld.loadobj('test.obj')
# ld.dumpAS(0,9)
trace()
dumpRtxt()
# interp()
# main()