diff options
Diffstat (limited to 'format.py')
| -rwxr-xr-x | format.py | 58 |
1 files changed, 5 insertions, 53 deletions
@@ -98,54 +98,6 @@ def sign_trunc(val, size): rest = val[size-2:0] return sign & rest -global_slice = slice -def default_slice(val, hi, lo): - """ add a default slice spec to labels if missing. - - >>> default_slice(('label', 'imm12'), 12, 1) - LabelRef('label', 0, ('imm', 12), 12:1) - >>> default_slice(('label-4', 'imm12'), 12, 1) - LabelRef('label', -4, ('imm', 12), 12:1) - >>> default_slice(('label', 'imm12', '[14:3]'), 12, 1) - LabelRef('label', 0, ('imm', 12), 14:3) - >>> default_slice(('label+4', 'imm12', '[14:3]'), 12, 1) - LabelRef('label', 4, ('imm', 12), 14:3) - >>> default_slice(('label', 'imm12', '[14:3]'), 12, 1) - LabelRef('label', 0, ('imm', 12), 14:3) - >>> default_slice(('label', 'imm12', '[31:0]'), 11, 0) - Traceback (most recent call last): - ... - AssertionError: expected 12 bit slice, got label/imm12/[31:0] - """ - if len(val) == 3: - label_offset, mode, slice = val - elif len(val) == 2: - label_offset, mode = val - slice = global_slice(hi, lo) - else: - raise ValueError("expected label reference") - - import re - - ref_re = re.compile(r'^([^\[+-]+)(?:([+-]\d+))?$') - slice_re = re.compile(r'^\[(\d+):(\d+)]$') - - match = ref_re.match(label_offset) - assert match, ValueError("invalid label reference") - label, offset = match.group(1), int(match.group(2) or 0) - - if isinstance(slice, str): - match = slice_re.match(slice) - assert match, ValueError("invalid slice syntax") - a, b = match.groups() - slice = global_slice(int(a), int(b)) - - ref = bits.LabelRef(label, offset, mode, slice) - - expected = hi - lo + 1 - assert expected == ref.size, ValueError("expected {} bit slice, got {}".format(expected, ref)) - return ref - def pack_u(instr): """ verify & pack U-type instructions. @@ -167,7 +119,7 @@ def pack_u(instr): op = bits.u(subv.untag(op), 7) rd = bits.u(subv.untag(rd, 'rd'), 5) if subv.is_reference(imm): - imm = default_slice(imm, 31, 12) + imm = bits.ref(imm, slice(31, 12)) else: imm = bits.i(subv.untag(imm, 'imm20'), 20) @@ -188,7 +140,7 @@ def pack_i(instr): rd = bits.u(subv.untag(rd, 'rd'), 5) rs = bits.u(subv.untag(rs, 'rs'), 5) if subv.is_reference(imm): - imm = default_slice(imm, 11, 0) + imm = bits.ref(imm, slice(11, 0)) else: imm = bits.i(subv.untag(imm, 'imm12'), 12) @@ -210,7 +162,7 @@ def pack_s(instr): rs2 = bits.u(subv.untag(rs2, 'rs'), 5) if subv.is_reference(imm): - imm = default_slice(imm, 11, 0) + imm = bits.ref(imm, slice(11, 0)) else: imm = bits.i(subv.untag(imm, 'off12'), 12) @@ -235,7 +187,7 @@ def pack_j(instr): rd = bits.u(subv.untag(rd, 'rd'), 5) if subv.is_reference(imm): - imm = default_slice(imm, 20, 1) + imm = bits.ref(imm, slice(20, 1)) else: imm = bits.i(subv.untag(imm, 'off20'), 20) @@ -265,7 +217,7 @@ def pack_b(instr): rs2 = bits.u(subv.untag(rs2, 'rs'), 5) if subv.is_reference(imm): - imm = default_slice(imm, 12, 1) + imm = bits.ref(imm, slice(12, 1)) else: imm = bits.i(subv.untag(imm, 'off12'), 12) |
