diff options
Diffstat (limited to 'subv.py')
| -rw-r--r-- | subv.py | 31 |
1 files changed, 5 insertions, 26 deletions
@@ -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)) |
