Add .out directive
This commit is contained in:
parent
5659a2672a
commit
ed74947440
2 changed files with 58 additions and 0 deletions
|
|
@ -68,6 +68,10 @@ class Program: # pylint: disable=too-few-public-methods
|
||||||
in_shift_right = None
|
in_shift_right = None
|
||||||
auto_push = None
|
auto_push = None
|
||||||
push_threshold = None
|
push_threshold = None
|
||||||
|
out_count = None
|
||||||
|
out_shift_right = None
|
||||||
|
auto_pull = None
|
||||||
|
pull_threshold = None
|
||||||
|
|
||||||
def require_before_instruction():
|
def require_before_instruction():
|
||||||
if len(instructions) != 0:
|
if len(instructions) != 0:
|
||||||
|
|
@ -140,6 +144,29 @@ class Program: # pylint: disable=too-few-public-methods
|
||||||
raise RuntimeError(f"Invalid {line})")
|
raise RuntimeError(f"Invalid {line})")
|
||||||
mov_status_count = int(words[idx + 1])
|
mov_status_count = int(words[idx + 1])
|
||||||
require_version(required_version, line)
|
require_version(required_version, line)
|
||||||
|
elif words[0] == ".out":
|
||||||
|
require_before_instruction()
|
||||||
|
out_count = int_in_range(
|
||||||
|
words[1], 32 if pio_version == 0 else 1, 33, ".out count"
|
||||||
|
)
|
||||||
|
auto_pull = False
|
||||||
|
|
||||||
|
idx = 2
|
||||||
|
if idx < len(words) and words[idx] == "left":
|
||||||
|
out_shift_right = False
|
||||||
|
idx += 1
|
||||||
|
elif idx < len(words) and words[idx] == "right":
|
||||||
|
out_shift_right = True
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
if idx < len(words) and words[idx] == "auto":
|
||||||
|
auto_pull = True
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
if idx < len(words):
|
||||||
|
pull_threshold = int_in_range(words[idx], 1, 33, ".out threshold")
|
||||||
|
idx += 1
|
||||||
|
|
||||||
elif words[0] == ".in":
|
elif words[0] == ".in":
|
||||||
require_before_instruction()
|
require_before_instruction()
|
||||||
in_count = int_in_range(
|
in_count = int_in_range(
|
||||||
|
|
@ -350,6 +377,18 @@ class Program: # pylint: disable=too-few-public-methods
|
||||||
self.pio_kwargs["mov_status_count"] = mov_status_count
|
self.pio_kwargs["mov_status_count"] = mov_status_count
|
||||||
self.pio_kwargs["mov_status_param"] = mov_status_param
|
self.pio_kwargs["mov_status_param"] = mov_status_param
|
||||||
|
|
||||||
|
if out_count not in (None, 32):
|
||||||
|
self.pio_kwargs["out_count"] = out_count
|
||||||
|
|
||||||
|
if out_shift_right is not None:
|
||||||
|
self.pio_kwargs["out_shift_right"] = out_shift_right
|
||||||
|
|
||||||
|
if auto_pull is not None:
|
||||||
|
self.pio_kwargs["auto_pull"] = auto_pull
|
||||||
|
|
||||||
|
if pull_threshold is not None:
|
||||||
|
self.pio_kwargs["pull_threshold"] = pull_threshold
|
||||||
|
|
||||||
if in_count not in (None, 32):
|
if in_count not in (None, 32):
|
||||||
self.pio_kwargs["in_count"] = in_count
|
self.pio_kwargs["in_count"] = in_count
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,3 +80,22 @@ def test_dot_in() -> None:
|
||||||
auto_push=False,
|
auto_push=False,
|
||||||
in_shift_right=True,
|
in_shift_right=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_dot_out() -> None:
|
||||||
|
assert_pio_kwargs(
|
||||||
|
".out 32 left auto 11",
|
||||||
|
sideset_enable=0,
|
||||||
|
auto_pull=True,
|
||||||
|
pull_threshold=11,
|
||||||
|
out_shift_right=False,
|
||||||
|
)
|
||||||
|
assert_assembly_fails(".out 16")
|
||||||
|
assert_pio_kwargs(
|
||||||
|
".pio_version 1\n.out 16 right",
|
||||||
|
pio_version=1,
|
||||||
|
sideset_enable=0,
|
||||||
|
out_count=16,
|
||||||
|
auto_pull=False,
|
||||||
|
out_shift_right=True,
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue