aboutsummaryrefslogtreecommitdiffstats
path: root/pack.py
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-05-24 16:21:14 +0000
committers-ol <s+removethis@s-ol.nu>2021-05-24 16:21:14 +0000
commitacfaab0c3ffe04e7382e7095d9a19c86d80c3a66 (patch)
treebc33043d70ae9d5a4aab4655efbbe7f52f020a1f /pack.py
parentsupport offsets on labels (diff)
downloadsubv-acfaab0c3ffe04e7382e7095d9a19c86d80c3a66.tar.gz
subv-acfaab0c3ffe04e7382e7095d9a19c86d80c3a66.zip
turn bits into a class
Diffstat (limited to 'pack.py')
-rwxr-xr-xpack.py31
1 files changed, 15 insertions, 16 deletions
diff --git a/pack.py b/pack.py
index f717df4..5dbaf95 100755
--- a/pack.py
+++ b/pack.py
@@ -44,22 +44,21 @@ import bits
def byteify(word):
""" split longer bitfield into bytes.
- >>> byteify((0x12345678, 32))
+ >>> byteify(bits.Bitfield(0x12345678, 32))
[(120,), (86,), (52,), (18,)]
- >>> byteify((0x4801813, 32))
+ >>> byteify(bits.Bitfield(0x4801813, 32))
[(19,), (24,), (128,), (4,)]
- >>> byteify((0x13, 9)),
+ >>> byteify(bits.Bitfield(0x13, 9)),
Traceback (most recent call last):
...
- AssertionError: not byte aligned: 9 bits
+ AssertionError: not byte aligned: 0x13'9
"""
- (val, size) = word
- assert size % 8 == 0, "not byte aligned: {} bits".format(size)
+ assert word.size % 8 == 0, "not byte aligned: {}".format(word)
out = []
- for i in range(0, size, 8):
- byte = bits.slice(word, i+7, i)
- out.append(byte[:1])
+ for i in range(0, word.size, 8):
+ byte = word[i+7:i]
+ out.append((byte.val,))
return out
@subv.with_parsed_lines
@@ -79,27 +78,27 @@ def pack(iter):
last_segment = None
for segment, line in iter:
if last_segment != segment:
- assert buf[1] == 0, "segment '{}' end isn't byte-aligned".format(segment)
+ assert buf.size == 0, "segment '{}' end isn't byte-aligned".format(segment)
if out:
yield subv.format(flush_bytes())
if line['type'] == 'instr':
for part in line['instr']:
- buf = bits.concat(buf, bits.from_part(part))
+ buf = bits.from_part(part) & buf
else:
yield line['raw']
- while buf[1] >= 8:
- byte = bits.slice(buf, 7, 0)
- buf = bits.slice(buf, buf[1] - 1, 8, allow_empty=True)
- out.append(byte[:1])
+ while buf.size >= 8:
+ byte = buf[7:0]
+ buf = buf.slice_allowempty(slice(buf.size-1, 8))
+ out.append((byte.val,))
if len(out) == 4:
yield subv.format(flush_bytes())
last_segment = segment
- assert buf[1] == 0, "segment '{}' end isn't byte-aligned".format(segment)
+ assert buf.size == 0, "segment '{}' end isn't byte-aligned".format(segment)
if __name__ == '__main__':
import sys