-
Notifications
You must be signed in to change notification settings - Fork 0
/
instructions.py
162 lines (109 loc) · 6.11 KB
/
instructions.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
from utils import hex_format, convert_hex
from constants import *
import exceptions as exc
def read_mem_to_A(mem_addr:int, ram_size=RAM_SIZE, check=True):
mem_addr = convert_hex(mem_addr)
if check:
assert mem_addr >= 0 and mem_addr < ram_size,\
f'Memory address {mem_addr} out of range for {ram_size} bytes RAM!'
comment = f' // A <- Mem[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format(INST.READ_MEM_TO_A) + comment, hex_format(mem_addr)])
def read_mem_to_B(mem_addr:int, ram_size=RAM_SIZE, check=True):
mem_addr = convert_hex(mem_addr)
if check:
assert mem_addr >= 0 and mem_addr < ram_size,\
f'Memory address {mem_addr} out of range for {ram_size} bytes RAM!'
comment = f' // B <- Mem[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format(INST.READ_MEM_TO_B) + comment, hex_format(mem_addr)])
def write_A_to_mem(mem_addr:int, ram_size=RAM_SIZE, check=True):
mem_addr = convert_hex(mem_addr)
if check:
assert mem_addr >= 0 and mem_addr < ram_size,\
f'Memory address {mem_addr} out of range for {ram_size} bytes RAM!'
comment = f' // Mem[0x{hex_format(mem_addr)}] <- A'
return '\n'.join([hex_format(INST.WRITE_A_TO_MEM) + comment, hex_format(mem_addr)])
def write_B_to_mem(mem_addr:int, ram_size=RAM_SIZE, check=True):
mem_addr = convert_hex(mem_addr)
if check:
assert mem_addr >= 0 and mem_addr < ram_size,\
f'Memory address {mem_addr} out of range for {ram_size} bytes RAM!'
comment = f' // Mem[0x{hex_format(mem_addr)}] <- B'
return '\n'.join([hex_format(INST.WRITE_B_TO_MEM) + comment, hex_format(mem_addr)])
def alu_to_A(op_code:int):
assert op_code in ALU_OPS._value2member_map_, f'Op-code {op_code} is not valid!'
comment = f' // A <- {ALU_OPS_COMMENTS[op_code]}'
if op_code == ALU_OPS.OUT_A:
return f'Z{hex(INST.ALU_OP_TO_A)[-1]}' + comment
return hex_format((op_code << 4) + INST.ALU_OP_TO_A) + comment
def alu_to_B(op_code:int):
assert op_code in ALU_OPS._value2member_map_, f'Op-code {op_code} is not valid!'
comment = f' // B <- {ALU_OPS_COMMENTS[op_code]}'
if op_code == ALU_OPS.OUT_A:
return f'Z{hex(INST.ALU_OP_TO_B)[-1]}' + comment
return hex_format((op_code << 4) + INST.ALU_OP_TO_B) + comment
def breq(mem_addr:int=None, label:str=None, rom_size=ROM_SIZE):
if mem_addr:
mem_addr = convert_hex(mem_addr)
assert mem_addr >= 0 and mem_addr < rom_size,\
f'Memory address {mem_addr} out of range for {rom_size} bytes ROM!'
comment = f' // if A == B go to ROM[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format((BRANCH_TYPES.EQ << 4) + INST.BRANCH) + comment, hex_format(mem_addr)])
if label:
comment = f' // if A == B go to ROM[0x{label}]'
return '\n'.join([hex_format((BRANCH_TYPES.EQ << 4) + INST.BRANCH) + comment, label])
raise exc.InvalidArgumentException('Either mem_addr or label must be specified for breq function!')
def bgtq(mem_addr:int=None, label=None, rom_size=ROM_SIZE):
if mem_addr:
mem_addr = convert_hex(mem_addr)
assert mem_addr >= 0 and mem_addr < rom_size,\
f'Memory address {mem_addr} out of range for {rom_size} bytes ROM!'
comment = f' // if A > B go to ROM[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format((BRANCH_TYPES.GT << 4) + INST.BRANCH) + comment, hex_format(mem_addr)])
if label:
comment = f' // if A > B go to ROM[0x{label}]'
return '\n'.join([hex_format((BRANCH_TYPES.GT << 4) + INST.BRANCH) + comment, label])
raise exc.InvalidArgumentException('Either mem_addr or label must be specified for bgtq function!')
def bltq(mem_addr:int=None, label=None, rom_size=ROM_SIZE):
if mem_addr:
mem_addr = convert_hex(mem_addr)
assert mem_addr >= 0 and mem_addr < rom_size,\
f'Memory address {mem_addr} out of range for {rom_size} bytes ROM!'
comment = f' // if A < B go to ROM[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format((BRANCH_TYPES.LT << 4) + INST.BRANCH) + comment, hex_format(mem_addr)])
if label:
comment = f' // if A < B go to ROM[0x{label}]'
return '\n'.join([hex_format((BRANCH_TYPES.LT << 4) + INST.BRANCH) + comment, label])
raise exc.InvalidArgumentException('Either mem_addr or label must be specified for bltq function!')
def goto(mem_addr:int=None, label=None, rom_size=ROM_SIZE):
if mem_addr:
mem_addr = convert_hex(mem_addr)
assert mem_addr >= 0 and mem_addr < rom_size,\
f'Memory address {mem_addr} out of range for {rom_size} bytes ROM!'
comment = f' // Go to ROM[0x{hex_format(mem_addr)}]'
return '\n'.join([hex_format(INST.GOTO) + comment, hex_format(mem_addr)])
if label:
comment = f' // Go to ROM[0x{label}]'
return '\n'.join([hex_format(INST.GOTO) + comment, label])
raise exc.InvalidArgumentException('Either mem_addr or label must be specified for goto function!')
def goto_idle():
comment = ' // Go to Idle state and wait for Interrupts'
return hex_format(INST.GOTO_IDLE) + comment
def func_call(mem_addr:int=None, label:str=None, rom_size=ROM_SIZE):
if mem_addr:
mem_addr = convert_hex(mem_addr)
assert mem_addr >= 0 and mem_addr < rom_size,\
f'Memory address {mem_addr} out of range for {rom_size} bytes ROM!'
comment = f' // Function call to ROM[0x{hex_format(mem_addr)}]. Context saved.'
return '\n'.join([hex_format(INST.FUNC_CALL) + comment, hex_format(mem_addr)])
if label:
comment = f' // Function call to ROM[0x{label}]. Context saved.'
return '\n'.join([hex_format(INST.FUNC_CALL) + comment, label])
def func_return():
comment = ' // Restoring saved context after function call.'
return hex_format(INST.RETURN) + comment
def deref_A():
comment = ' // A <- Mem[A]'
return hex_format(INST.DEREF_A) + comment
def deref_B():
comment = ' // B <- Mem[B]'
return hex_format(INST.DEREF_B) + comment