From 8a97f71b0c646dae792ac27798d26c3303565c54 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 10 Sep 2024 14:09:34 -0500 Subject: [PATCH] More piov2 updates * As an extension, ".fifo auto" may be specified to request CircuitPython's auto fifo join behavior * bounds check on `.set` directive improved * redundant kwargs (e.g., out_count vs out_pin_count) fixed --- README.rst | 5 +++++ adafruit_pioasm.py | 24 ++++++++++++++++-------- tests/test_version.py | 13 ++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/README.rst b/README.rst index b7ae53a..091c113 100644 --- a/README.rst +++ b/README.rst @@ -55,6 +55,11 @@ To install in a virtual environment in your current project: source .venv/bin/activate pip3 install adafruit-circuitpython-pioasm +CircuitPython Extensions +======================== + +* `.fifo auto`: By default, CircuitPython joins the TX and RX fifos if a PIO program only receives or transmits. The `.fifo auto` directive makes this explicit. + Usage Example ============= diff --git a/adafruit_pioasm.py b/adafruit_pioasm.py index 3b83347..b559dd3 100644 --- a/adafruit_pioasm.py +++ b/adafruit_pioasm.py @@ -34,7 +34,15 @@ MOV_DESTINATIONS_V1 = ["pins", "x", "y", "pindirs", "exec", "pc", "isr", "osr"] MOV_SOURCES = ["pins", "x", "y", "null", None, "status", "isr", "osr"] MOV_OPS = [None, "~", "::", None] SET_DESTINATIONS = ["pins", "x", "y", None, "pindirs", None, None, None] -FIFO_TYPES = {"txrx": 0, "tx": 0, "rx": 0, "txput": 1, "txget": 1, "putget": 1} +FIFO_TYPES = { + "auto": 0, + "txrx": 0, + "tx": 0, + "rx": 0, + "txput": 1, + "txget": 1, + "putget": 1, +} class Program: # pylint: disable=too-few-public-methods @@ -61,7 +69,7 @@ class Program: # pylint: disable=too-few-public-methods wrap_target = None offset = -1 pio_version = 0 - fifo_type = None + fifo_type = "auto" mov_status_type = None mov_status_n = None in_count = None @@ -208,7 +216,7 @@ class Program: # pylint: disable=too-few-public-methods elif words[0] == ".set": require_before_instruction() set_count = int_in_range( - words[1], 32 if pio_version == 0 else 1, 33, ".set count" + words[1], 5 if pio_version == 0 else 1, 6, ".set count" ) elif line.endswith(":"): @@ -443,18 +451,18 @@ class Program: # pylint: disable=too-few-public-methods if wrap_target is not None: self.pio_kwargs["wrap_target"] = wrap_target - if FIFO_TYPES.get(fifo_type): + if fifo_type != "auto": 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_n"] = mov_status_n - if set_count not in (None, 32): - self.pio_kwargs["set_count"] = set_count + if set_count is not None: + self.pio_kwargs["set_pin_count"] = set_count if out_count not in (None, 32): - self.pio_kwargs["out_count"] = out_count + self.pio_kwargs["out_pin_count"] = out_count if out_shift_right is not None: self.pio_kwargs["out_shift_right"] = out_shift_right @@ -466,7 +474,7 @@ class Program: # pylint: disable=too-few-public-methods self.pio_kwargs["pull_threshold"] = pull_threshold if in_count not in (None, 32): - self.pio_kwargs["in_count"] = in_count + self.pio_kwargs["in_pin_count"] = in_count if in_shift_right is not None: self.pio_kwargs["in_shift_right"] = in_shift_right diff --git a/tests/test_version.py b/tests/test_version.py index cf015a6..d7280b3 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -17,7 +17,8 @@ def test_version() -> None: def test_fifo() -> None: - assert_pio_kwargs(".fifo txrx", sideset_enable=0) + assert_pio_kwargs(".fifo txrx", sideset_enable=0, fifo_type="txrx") + assert_pio_kwargs(".fifo auto", sideset_enable=0) assert_assembly_fails(".fifo txput") assert_pio_kwargs( ".pio_version 1\n.fifo txput", @@ -80,7 +81,7 @@ def test_dot_in() -> None: ".pio_version 1\n.in 16 right", pio_version=1, sideset_enable=0, - in_count=16, + in_pin_count=16, auto_push=False, in_shift_right=True, ) @@ -99,17 +100,19 @@ def test_dot_out() -> None: ".pio_version 1\n.out 16 right", pio_version=1, sideset_enable=0, - out_count=16, + out_pin_count=16, auto_pull=False, out_shift_right=True, ) def test_dot_set() -> None: - assert_pio_kwargs(".set 32", sideset_enable=0) + assert_pio_kwargs(".set 5", sideset_enable=0, set_pin_count=5) assert_assembly_fails(".set 16") + assert_assembly_fails(".pio_version 1\n.set 16") + assert_assembly_fails(".set 3") assert_pio_kwargs( - ".pio_version 1\n.set 16 right", pio_version=1, sideset_enable=0, set_count=16 + ".pio_version 1\n.set 3 right", pio_version=1, sideset_enable=0, set_pin_count=3 )