blob: aba29a338c4a4638cf0475d8a6b6634ef3cd4e70 (
plain)
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
|
#!/usr/bin/env python3
from riscv import byteify, bit_concat
from subx import clean, classify, parse_bits, format_instr
def pack(iter):
for line in iter:
line = clean(line)
if line == '':
continue
type = classify(line)
if type == 'segment' or type == 'label':
yield line
else:
fields = parse_bits(line)
total = bit_concat(*fields)
if total[1] != 32:
raise ValueError("instruction parts do not add up to 32 bit!")
yield format_instr(byteify(total))
if __name__ == '__main__':
import sys
for line in pack(sys.stdin):
print(line)
import unittest
class TestE2E(unittest.TestCase):
def test_e2e(self):
from io import StringIO
from textwrap import dedent
inp = dedent('''\
== code 0x80000000
37/7 05/5 10010/20
13/7 06/5 00/3 00/5 48/12
23/7 00/5 02/3 05/5 06/5 00/7
13/7 06/5 00/3 00/5 65/12
23/7 00/5 02/3 05/5 06/5 00/7
13/7 06/5 00/3 00/5 6c/12
23/7 00/5 02/3 05/5 06/5 00/7
13/7 06/5 00/3 00/5 6c/12
23/7 00/5 02/3 05/5 06/5 00/7
13/7 06/5 00/3 00/5 6f/12
23/7 00/5 02/3 05/5 06/5 00/7
13/7 06/5 00/3 00/5 0a/12
23/7 00/5 02/3 05/5 06/5 00/7
6f/7 00/5 ff/8 01/1 3e6/10 1/1
''')
out = dedent('''\
== code 0x80000000
b7 02 01 10
13 03 80 04
23 a0 62 00
13 03 50 06
23 a0 62 00
13 03 c0 06
23 a0 62 00
13 03 c0 06
23 a0 62 00
13 03 f0 06
23 a0 62 00
13 03 a0 00
23 a0 62 00
6f f0 df fc
''')
got = ''
for line in pack(StringIO(inp)):
got += line + '\n'
self.assertEqual(got, out)
|