aboutsummaryrefslogtreecommitdiffstats
path: root/format.py
diff options
context:
space:
mode:
Diffstat (limited to 'format.py')
-rwxr-xr-xformat.py58
1 files changed, 5 insertions, 53 deletions
diff --git a/format.py b/format.py
index 385c632..942f4f8 100755
--- a/format.py
+++ b/format.py
@@ -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)