diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-05-22 13:03:56 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2021-05-22 13:03:56 +0000 |
| commit | 7d9fd6018aae0b60bbff268f2d4428c34f2bd3e4 (patch) | |
| tree | b0176c467c42222c6b7b81c85e96fd15f08f42f8 /format.py | |
| parent | disable qemu bios (diff) | |
| download | subv-7d9fd6018aae0b60bbff268f2d4428c34f2bd3e4.tar.gz subv-7d9fd6018aae0b60bbff268f2d4428c34f2bd3e4.zip | |
more error reporting in format.py
Diffstat (limited to 'format.py')
| -rwxr-xr-x | format.py | 67 |
1 files changed, 42 insertions, 25 deletions
@@ -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 |
