aboutsummaryrefslogtreecommitdiffstats
path: root/subv.py
diff options
context:
space:
mode:
Diffstat (limited to 'subv.py')
-rw-r--r--subv.py31
1 files changed, 5 insertions, 26 deletions
diff --git a/subv.py b/subv.py
index 8871625..c514e34 100644
--- a/subv.py
+++ b/subv.py
@@ -7,6 +7,7 @@ num = re.compile(r"^\d+$")
ref_re = re.compile(r"^([^\[+-]+)(?:([+-]\d+))?$")
immediate_re = re.compile(r"^(imm|off)(\d+)(hi|lo)?$")
+
# parsing
def parse_part(part):
"""parse a literal with attached metadata.
@@ -113,7 +114,7 @@ def parse_reference(part):
"""parse a sliced-label part.
>>> parse_reference(('lbl', 'imm32'))
- {'label': 'lbl', 'mode': 'imm', 'size': 32, offset: 0}
+ {'label': 'lbl', 'mode': 'imm', 'size': 32, 'offset': 0}
>>> parse_reference(('lbl+0', 'off32'))
{'label': 'lbl', 'mode': 'off', 'size': 32, 'offset': 0}
>>> parse_reference(('lbl+2', 'imm32'))
@@ -274,30 +275,6 @@ def untag(part, expect=None):
return part[0]
-def format_reference(ref):
- """opposite of parse_reference..
-
- >>> format_reference({'label': 'lbl', 'mode': 'imm', 'size': 32, 'meta': ()})
- ('lbl', 'imm32')
- >>> format_reference({'label': 'lbl', 'offset': 0, 'mode': 'imm', 'size': 32, 'meta': ()})
- ('lbl+0', 'imm32')
- >>> format_reference({'label': 'lbl', 'offset': 2, 'mode': 'imm', 'size': 32, 'meta': ()})
- ('lbl+2', 'imm32')
- >>> format_reference({'label': 'x', 'mode': 'off', 'size': 12, 'meta': (), 'hi': 11, 'lo': 0})
- ('x[11:0]', 'off12')
- >>> format_reference({'label': 'x', 'offset': -16, 'mode': 'off', 'size': 12, 'meta': (), 'hi': 11, 'lo': 0})
- ('x-16[11:0]', 'off12')
- >>> format_reference({'label': 'x', 'offset': -16, 'mode': 'off', 'size': 12, 'meta': ('extra', 'stuff'), 'hi': 11, 'lo': 0})
- ('x-16[11:0]', 'off12', 'extra', 'stuff')
- """
- label = ref["label"]
- if "offset" in ref:
- label += "{:+}".format(ref["offset"])
- if "hi" in ref:
- label += "[{hi}:{lo}]".format(**ref)
- return (label, "{mode}{size}".format(**ref), *ref["meta"])
-
-
def format_immediate(imm):
tag = "{mode}{size}".format(**imm)
if "split" in imm:
@@ -327,7 +304,7 @@ def format_part(part):
>>> format_part(('$label:suff', 'tag'))
'$label:suff/tag'
"""
- if isinstance(part, bits.WordBase):
+ if isinstance(part, bits.Bitfield):
return str(part)
elif not is_reference(part):
first = "{:x}".format(part[0])
@@ -351,6 +328,8 @@ def format(line):
if line["comment"]:
packed = packed + " # " + line["comment"]
return packed
+ elif type == "empty":
+ return line["raw"]
else:
raise NotImplementedError("type {}".format(type))