aboutsummaryrefslogtreecommitdiffstats
path: root/format.py
diff options
context:
space:
mode:
Diffstat (limited to 'format.py')
-rwxr-xr-xformat.py67
1 files changed, 42 insertions, 25 deletions
diff --git a/format.py b/format.py
index e97fac2..d43f835 100755
--- a/format.py
+++ b/format.py
@@ -91,17 +91,18 @@ def default_slice(val, hi, lo):
>>> default_slice(('label[31:0]', 'imm12'), 11, 0)
Traceback (most recent call last):
...
- AssertionError: expected 12 bit slice
+ AssertionError: expected 12 bit slice, got label[31:0] (32 bit)
"""
parsed = subv.parse_reference(val)
if 'hi' not in parsed:
parsed['hi'] = hi
parsed['lo'] = lo
+ ref = '{label}[{hi}:{lo}]'.format(**parsed)
+
p_size = parsed['hi'] - parsed['lo'] + 1
- assert parsed['size'] == p_size, "expected {} bit slice".format(parsed['size'])
+ assert parsed['size'] == p_size, "expected {} bit slice, got {} ({} bit)".format(parsed['size'], ref, p_size)
- ref = '{label}[{hi}:{lo}]'.format(**parsed)
return (ref, *val[1:])
def slice_bit_or_ref(val, hi, lo):
@@ -155,7 +156,7 @@ def pack_u(instr):
>>> pack_u([(0x37, 'lui'), (5, 'rd', 't0'), ('pos[31:0]', 'imm20')])
Traceback (most recent call last):
...
- AssertionError: expected 20 bit slice
+ AssertionError: expected 20 bit slice, got pos[31:0] (32 bit)
"""
(op, rd, imm) = instr
op = bits.u(subv.untag(op), 7)
@@ -283,27 +284,43 @@ instr_map = {
def format(iter):
segment = None
- for line in iter:
- line = subv.parse(line)
-
- if segment == 'code' and line['type'] == 'instr':
- op = line['instr'][0]
- assert len(op) == 2, 'instruction without op label: {}'.format(op)
-
- (op, label) = op
- if label not in instr_map:
- raise ValueError("unknown instruction label: {}".format(label))
- (formatter, expected) = instr_map[label]
- if op != expected:
- raise ValueError("opcode {} doesn't match label {} (expected {})"
- .format(op, label, expected))
-
- line['instr'] = formatter(line['instr'])
- yield subv.format(line)
- else:
- if line['type'] == 'segment':
- segment = line['segment'][0]
- yield line['raw']
+ for line_no, raw_line in enumerate(iter, start=1):
+ try:
+ line = subv.parse(raw_line)
+ except AssertionError as e:
+ message = '''
+failed to format line:
+<input>:{} {}
+parsed as {}
+ '''.strip().format(line_no, raw_line.strip())
+ raise Exception(message) from e
+
+ try:
+ if segment == 'code' and line['type'] == 'instr':
+ op = line['instr'][0]
+ assert len(op) == 2, 'instruction without op label: {}'.format(op)
+
+ (op, label) = op
+ if label not in instr_map:
+ raise ValueError("unknown instruction label: {}".format(label))
+ (formatter, expected) = instr_map[label]
+ if op != expected:
+ raise ValueError("opcode {} doesn't match label {} (expected {})"
+ .format(op, label, expected))
+
+ line['instr'] = formatter(line['instr'])
+ yield subv.format(line)
+ else:
+ if line['type'] == 'segment':
+ segment = line['segment'][0]
+ yield line['raw']
+ except AssertionError as e:
+ message = '''
+failed to format line:
+<input>:{} {}
+parsed as {}
+ '''.strip().format(line_no, raw_line.strip(), subv.dump(line))
+ raise Exception(message) from e
if __name__ == '__main__':
import sys