forked from davidcastells/MIOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAssembler.py
143 lines (107 loc) · 4.33 KB
/
Assembler.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
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 7 15:53:10 2024
@author: dcr
"""
# Check info from https://www-ug.eecg.toronto.edu/msl/manuals/n2cpu_nii51017.pdf
class BV:
def __init__(self, length, value):
self.l = length
self.v = ((1 << length)-1) & value
@staticmethod
def concatenate(els):
'''
Concatenate
'''
v = 0
tl = 0
for bv in els:
tl += bv.l
v = v << bv.l
v = v | bv.v
return BV(tl, v)
class Assembler:
@staticmethod
def beq(ra, rb, offset):
return BV.concatenate([BV(6, 0x26), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def bne(ra, rb, offset):
return BV.concatenate([BV(6, 0x1E), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def blt(ra, rb, offset):
return BV.concatenate([BV(6, 0x16), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def bge(ra, rb, offset):
return BV.concatenate([BV(6, 0x0e), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def ori(rb, ra, imm):
return BV.concatenate([BV(6, 0x14), BV(16, imm), BV(5, rb), BV(5, ra)])
@staticmethod
def orhi(rb, ra, imm):
return BV.concatenate([BV(6, 0x34), BV(16, imm), BV(5, rb), BV(5, ra)])
@staticmethod
def and(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x0E), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def andi(rb, ra, imm):
return BV.concatenate([BV(6, 0x0C), BV(16, imm), BV(5, rb), BV(5, ra)])
@staticmethod
def or(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x16), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def nor(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x06), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def add(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x31), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def addi(rb, ra, imm):
return BV.concatenate([BV(6, 0x04), BV(16, imm), BV(5, rb), BV(5, ra)])
@staticmethod
def sub(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x39), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def mul(rc, ra, rb):
return BV.concatenate([BV(6, 0x3A), BV(5, 0), BV(6, 0x27), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def ldw(rb, offset, ra):
return BV.concatenate([BV(6, 0x17), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def ldwio(rb, offset, ra):
return BV.concatenate([BV(6, 0x37), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def stw(rb, offset, ra):
return BV.concatenate([BV(6, 0x15), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def stwio(rb, offset, ra):
return BV.concatenate([BV(6, 0x35), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def stb(rb, offset, ra):
return BV.concatenate([BV(6, 0x05), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
public static BV br(offset):
return BV.concatenate([BV(6, 0x06), BV(16, offset), BV(10,0)])
@staticmethod
def ldb(rb, offset, ra):
return BV.concatenate([BV(6, 0x07), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def ldbu(rb, offset, ra):
return BV.concatenate([BV(6, 0x03), BV(16, offset), BV(5, rb), BV(5, ra)])
@staticmethod
def custom(n, rc, ra, rb):
return BV.concatenate([BV(6, 0x32), BV(8, n), BV(3, 7), BV(5, rc), BV(5, rb), BV(5, ra)])
@staticmethod
def roli(rc, ra, imm):
return BV.concatenate([BV(6, 0x3A), BV(5, imm), BV(6, 0x02), BV(5, rc), BV(5, 0), BV(5, ra)])
@staticmethod
def srli(int rc, int ra, int imm):
return BV.concatenate([BV(6, 0x3A), BV(5, imm), BV(6, 0x1A), BV(5, rc), BV(5, 0), BV(5, ra)])
@staticmethod
def call(int imm)
return BV.concatenate([BV(6, 0x0), BV(26, imm >> 2)])
@staticmethod
def ret():
return BV.concatenate({BV(6, 0x3A), BV(5, 0), BV(6, 0x05), BV(5, 0), BV(5, 0), BV(5, 0x1f)])
@staticmethod
def invalid():
return BV.concatenate(32, -1);