aboutsummaryrefslogtreecommitdiffstats
path: root/subv.py
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-05-29 10:41:25 +0000
committers-ol <s-ol@users.noreply.github.com>2020-05-29 11:49:42 +0000
commit212ea358c73cd5f3c70d143987472327cf15f653 (patch)
treeb8ee641d14ae68c5558341a58e6a825930c7b83d /subv.py
parentfix permissions (diff)
downloadsubv-212ea358c73cd5f3c70d143987472327cf15f653.tar.gz
subv-212ea358c73cd5f3c70d143987472327cf15f653.zip
new label-slice syntax in format.py; switch to doctest
Diffstat (limited to 'subv.py')
-rw-r--r--subv.py38
1 files changed, 37 insertions, 1 deletions
diff --git a/subv.py b/subv.py
index b53639d..146d544 100644
--- a/subv.py
+++ b/subv.py
@@ -1,6 +1,8 @@
import re
white = re.compile('[ \t\.\n]+')
hex = re.compile(r'^\-?(0x)?[0-9a-f]+$')
+slice_re = re.compile(r'^([^\[]+)(?:\[(\d+):(\d+)\])?$')
+field_re = re.compile(r'^(imm|off)(\d+)$')
# parsing
@@ -22,6 +24,26 @@ def parse_segment(line):
def parse_label(line):
return line[:-1]
+def parse_reference(part):
+ ref = part[0]
+ field = part[1]
+
+ label, hi, lo = slice_re.match(ref).groups()
+ mode, size = field_re.match(field).groups()
+
+ ref = {
+ 'label': label,
+ 'mode': mode,
+ 'size': int(size),
+ 'meta': part[2:],
+ }
+
+ if hi is not None:
+ ref['hi'] = int(hi)
+ ref['lo'] = int(lo)
+
+ return ref
+
def classify(line):
if line == '':
return 'empty'
@@ -71,7 +93,7 @@ def untag(part, expect=None):
def format_part(part):
if not is_lref(part):
first = '{:02x}'.format(part[0])
- part = (first,) + part[1:]
+ part = (first, *part[1:])
return '/'.join([str(p) for p in part])
def format_instr(inst, comment=None):
@@ -80,6 +102,10 @@ def format_instr(inst, comment=None):
packed = packed + ' # ' + comment
return packed
+def join_all(gen):
+ res = '\n'.join(gen)
+ return res
+
import unittest
class TestParsing(unittest.TestCase):
def test_parse_part(self):
@@ -101,6 +127,16 @@ class TestParsing(unittest.TestCase):
self.assertEqual(parse_part('label:suff/tag*'), ('label:suff', 'tag*'))
self.assertEqual(parse_part('$label:suff/tag*'), ('$label:suff', 'tag*'))
+ def test_parse_reference(self):
+ self.assertEqual(
+ parse_reference(('lbl', 'imm32')),
+ { 'label': 'lbl', 'hi': None, 'lo': None, 'mode': 'imm', 'size': 32, 'meta': () }
+ )
+ self.assertEqual(
+ parse_reference(('x[11:0]', 'off12')),
+ { 'label': 'x', 'hi': 11, 'lo': 0, 'mode': 'off', 'size': 12, 'meta': () }
+ )
+
class TestChecks(unittest.TestCase):
def test_is_lref(self):
self.assertTrue(is_lref(('hello',)))