From cfee88e040aa3bcd09de130de515ce5d474bad8d Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Thu, 5 Sep 2024 09:49:50 -0500 Subject: [PATCH] Add .mov_status --- adafruit_pioasm.py | 33 +++++++++++++++++++++++++++++++++ tests/test_version.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/adafruit_pioasm.py b/adafruit_pioasm.py index c22de11..aea3030 100644 --- a/adafruit_pioasm.py +++ b/adafruit_pioasm.py @@ -61,6 +61,9 @@ class Program: # pylint: disable=too-few-public-methods offset = -1 pio_version = 0 fifo_type = None + mov_status_type = None + mov_status_count = None + mov_status_param = None def require_version(required_version, instruction): if pio_version < required_version: @@ -99,6 +102,31 @@ class Program: # pylint: disable=too-few-public-methods if required_version is None: raise RuntimeError(f"Invalid fifo type {fifo_type}") require_version(required_version, line) + elif line.startswith(".mov_status"): + words = line.split() + required_version = 0 + mov_status_param = 0 + mov_status_type = words[1] + if words[1] in ("txfifo", "rxfifo"): + if words[2] != "<": + raise RuntimeError(f"Invalid {line}") + mov_status_count = int(words[3]) + elif words[1] == "irq": + required_version = 1 + idx = 2 + if words[idx] == "next": + mov_status_param = 2 + idx += 1 + if words[idx] == "next": + mov_status_param = 1 + idx += 1 + if words[idx] != "set": + raise RuntimeError(f"Invalid {line})") + mov_status_count = int(words[idx + 1]) + + if not 0 <= mov_status_count < 16: + raise RuntimeError(f"Invalid mov_status count {mov_status_count}") + require_version(required_version, line) elif line.endswith(":"): label = line[:-1] if label in labels: @@ -281,6 +309,11 @@ class Program: # pylint: disable=too-few-public-methods if FIFO_TYPES.get(fifo_type): self.pio_kwargs["fifo_type"] = fifo_type + if mov_status_type is not None: + self.pio_kwargs["mov_status_type"] = mov_status_type + self.pio_kwargs["mov_status_count"] = mov_status_count + self.pio_kwargs["mov_status_param"] = mov_status_param + self.assembled = array.array("H", assembled) self.debuginfo = (linemap, text_program) if build_debuginfo else None diff --git a/tests/test_version.py b/tests/test_version.py index cf0e63b..d21eb35 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -25,3 +25,39 @@ def test_fifo() -> None: sideset_enable=0, fifo_type="txput", ) + + +def test_mov_status() -> None: + assert_pio_kwargs( + ".mov_status txfifo < 5", + sideset_enable=0, + mov_status_type="txfifo", + mov_status_count=5, + mov_status_param=0, + ) + assert_pio_kwargs( + ".mov_status rxfifo < 8", + sideset_enable=0, + mov_status_type="rxfifo", + mov_status_count=8, + mov_status_param=0, + ) + assert_assembly_fails(".mov_status rxfifo < -1") + assert_assembly_fails(".mov_status rxfifo < 16") + assert_assembly_fails(".mov_status irq next set 3") + assert_pio_kwargs( + ".pio_version 1\n.mov_status irq next set 3", + pio_version=1, + sideset_enable=0, + mov_status_type="irq", + mov_status_count=3, + mov_status_param=2, + ) + assert_pio_kwargs( + ".pio_version 1\n.mov_status irq set 3", + pio_version=1, + sideset_enable=0, + mov_status_type="irq", + mov_status_count=3, + mov_status_param=0, + )