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
This commit is contained in:
parent
b379f05b29
commit
8a97f71b0c
3 changed files with 29 additions and 13 deletions
|
|
@ -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
|
||||
=============
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue