Skip to content

Commit ad78200

Browse files
authored
Merge pull request #37 from jepler/pretty-print-and-bugfix
Pretty print and bugfix
2 parents d32edfd + 5736f50 commit ad78200

File tree

3 files changed

+85
-6
lines changed

3 files changed

+85
-6
lines changed

adafruit_pioasm.py

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,17 @@ class Program: # pylint: disable=too-few-public-methods
4040
4141
"""
4242

43-
def __init__(self, text_program: str) -> None:
43+
def __init__(self, text_program: str, *, build_debuginfo=False) -> None:
4444
"""Converts pioasm text to encoded instruction bytes"""
4545
# pylint: disable=too-many-branches,too-many-statements,too-many-locals
4646
assembled = []
4747
program_name = None
4848
labels = {}
49+
linemap = []
4950
instructions = []
5051
sideset_count = 0
5152
sideset_enable = 0
52-
for line in text_program.split("\n"):
53+
for i, line in enumerate(text_program.split("\n")):
5354
line = line.strip()
5455
if not line:
5556
continue
@@ -75,6 +76,7 @@ def __init__(self, text_program: str) -> None:
7576
elif line:
7677
# Only add as an instruction if the line isn't empty
7778
instructions.append(line)
79+
linemap.append(i)
7880

7981
max_delay = 2 ** (5 - sideset_count - sideset_enable) - 1
8082
assembled = []
@@ -219,12 +221,59 @@ def __init__(self, text_program: str) -> None:
219221
# print(bin(assembled[-1]))
220222

221223
self.pio_kwargs = {
222-
"sideset_count": sideset_count,
224+
"sideset_pin_count": sideset_count,
223225
"sideset_enable": sideset_enable,
224226
}
225227

226228
self.assembled = array.array("H", assembled)
227229

230+
if build_debuginfo:
231+
self.debuginfo = (linemap, text_program)
232+
else:
233+
self.debuginfo = None
234+
235+
def print_c_program(self, name, qualifier="const"):
236+
"""Print the program into a C program snippet"""
237+
if self.debuginfo is None:
238+
linemap = None
239+
program_lines = None
240+
else:
241+
linemap = self.debuginfo[0][:] # Use a copy since we destroy it
242+
program_lines = self.debuginfo[1].split("\n")
243+
244+
print(
245+
f"{qualifier} int {name}_sideset_pin_count = {self.pio_kwargs['sideset_pin_count']};"
246+
)
247+
print(
248+
f"{qualifier} bool {name}_sideset_enable = {self.pio_kwargs['sideset_enable']};"
249+
)
250+
print(f"{qualifier} uint16_t {name}[] = " + "{")
251+
last_line = 0
252+
if linemap:
253+
for inst in self.assembled:
254+
next_line = linemap[0]
255+
del linemap[0]
256+
while last_line < next_line:
257+
line = program_lines[last_line]
258+
if line:
259+
print(f" // {line}")
260+
last_line += 1
261+
line = program_lines[last_line]
262+
print(f" 0x{inst:04x}, // {line}")
263+
last_line += 1
264+
while last_line < len(program_lines):
265+
line = program_lines[last_line]
266+
if line:
267+
print(f" // {line}")
268+
last_line += 1
269+
else:
270+
for i in range(0, len(self.assembled), 8):
271+
print(
272+
" " + ", ".join("0x%04x" % i for i in self.assembled[i : i + 8])
273+
)
274+
print("};")
275+
print()
276+
228277

229278
def assemble(program_text: str) -> array.array:
230279
"""Converts pioasm text to encoded instruction bytes

examples/pioasm_print_c_program.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# SPDX-FileCopyrightText: 2021 Scott Shawcroft, written for Adafruit Industries
2+
# SPDX-FileCopyrightText: 2022 Jeff Epler, written for Adafruit Industries
3+
#
4+
# SPDX-License-Identifier: MIT
5+
6+
import adafruit_pioasm
7+
8+
# NeoPixels are 800khz bit streams. Zeroes are 1/3 duty cycle (~416ns) and ones
9+
# are 2/3 duty cycle (~833ns).
10+
text_program = """
11+
.program ws2812
12+
.side_set 1
13+
.wrap_target
14+
bitloop:
15+
out x 1 side 0 [1]; Side-set still takes place when instruction stalls
16+
jmp !x do_zero side 1 [1]; Branch on the bit we shifted out. Positive pulse
17+
do_one:
18+
jmp bitloop side 1 [1]; Continue driving high, for a long pulse
19+
do_zero:
20+
nop side 0 [1]; Or drive low, for a short pulse
21+
.wrap
22+
"""
23+
24+
program = adafruit_pioasm.Program(text_program, build_debuginfo=True)
25+
program.print_c_program("pio_ws2812", qualifier="static const")
26+
27+
program = adafruit_pioasm.Program(text_program, build_debuginfo=False)
28+
program.print_c_program("pio_ws2812_short")

tests/testpioasm.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,11 @@ def testLimits(self):
111111
self.assertAssemblyFails(".side_set 1 opt\nnop side 0 [8]")
112112

113113
def testCls(self):
114-
self.assertPioKwargs("", sideset_count=0, sideset_enable=False)
115-
self.assertPioKwargs(".side_set 1", sideset_count=1, sideset_enable=False)
116-
self.assertPioKwargs(".side_set 3 opt", sideset_count=3, sideset_enable=True)
114+
self.assertPioKwargs("", sideset_pin_count=0, sideset_enable=False)
115+
self.assertPioKwargs(".side_set 1", sideset_pin_count=1, sideset_enable=False)
116+
self.assertPioKwargs(
117+
".side_set 3 opt", sideset_pin_count=3, sideset_enable=True
118+
)
117119

118120

119121
class TestMov(AssembleChecks):

0 commit comments

Comments
 (0)