diff --git a/tools/pioasm/test/errors/fifo/test_fifo_autopush_incompatible_errors.pio b/tools/pioasm/test/errors/fifo/test_fifo_autopush_incompatible_errors.pio new file mode 100644 index 00000000..06e5c07c --- /dev/null +++ b/tools/pioasm/test/errors/fifo/test_fifo_autopush_incompatible_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program fifo_autopush_incompatible +.fifo txput +.in 1 auto + in pins, 1 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.7-11: PIO version 1 is required for 'txput' +// 3 | .fifo txput +// | ^~~~~ +// diff --git a/tools/pioasm/test/errors/fifo/test_fifo_index_errors.pio b/tools/pioasm/test/errors/fifo/test_fifo_index_errors.pio new file mode 100644 index 00000000..3f55cc69 --- /dev/null +++ b/tools/pioasm/test/errors/fifo/test_fifo_index_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm -v 1 input.pio +.program fifo_index_invalid +.pio_version 1 +.fifo putget + mov rxfifo[8], isr +// -- Output +// Command: pioasm -v 1 input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.16: FIFO index myst be between 0 and 7 +// 5 | mov rxfifo[8], isr +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_circular_dependency_errors.pio b/tools/pioasm/test/errors/general/test_circular_dependency_errors.pio new file mode 100644 index 00000000..cbea74ff --- /dev/null +++ b/tools/pioasm/test/errors/general/test_circular_dependency_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program circular_dependency +.define a b + 1 +.define b a + 1 + .word a +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.11: circular dependency in definition of 'a'; detected at input.pio:4.11) +// 5 | .word a +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_delay_negative_errors.pio b/tools/pioasm/test/errors/general/test_delay_negative_errors.pio new file mode 100644 index 00000000..5dc22da4 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_delay_negative_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program delay_negative + nop [-1] +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.10-11: instruction delay must be positive +// 3 | nop [-1] +// | ^~ +// diff --git a/tools/pioasm/test/errors/general/test_delay_sideset_limit_errors.pio b/tools/pioasm/test/errors/general/test_delay_sideset_limit_errors.pio new file mode 100644 index 00000000..8d057c12 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_delay_sideset_limit_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program delay_sideset_limit +.side_set 5 + nop side 0 [1] +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.17: the instruction delay limit is 0 because of the side set specified at input.pio:3.1-11 +// 4 | nop side 0 [1] +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_delay_too_large_errors.pio b/tools/pioasm/test/errors/general/test_delay_too_large_errors.pio new file mode 100644 index 00000000..fc4cd959 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_delay_too_large_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program delay_too_large + nop [32] +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.10-11: instruction delay must be <= 31 +// 3 | nop [32] +// | ^~ +// diff --git a/tools/pioasm/test/errors/general/test_duplicate_symbol_errors.pio b/tools/pioasm/test/errors/general/test_duplicate_symbol_errors.pio new file mode 100644 index 00000000..68dd2296 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_duplicate_symbol_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program dup_symbol +start: +start: + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.1-5: label 'start' was already defined at input.pio:3.1-5 +// 4 | start: +// | ^~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_instruction_limit_errors.pio b/tools/pioasm/test/errors/general/test_instruction_limit_errors.pio new file mode 100644 index 00000000..03e82469 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_instruction_limit_errors.pio @@ -0,0 +1,44 @@ +// run: pioasm input.pio +.program over_limit + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:35.5-7: program instruction limit of 32 instruction(s) exceeded +// 35 | nop +// | ^~~ +// diff --git a/tools/pioasm/test/errors/general/test_jmp_target_negative_errors.pio b/tools/pioasm/test/errors/general/test_jmp_target_negative_errors.pio new file mode 100644 index 00000000..3ef4bb8a --- /dev/null +++ b/tools/pioasm/test/errors/general/test_jmp_target_negative_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program jmp_negative + jmp -1 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.9-10: jmp target address must be positive +// 3 | jmp -1 +// | ^~ +// diff --git a/tools/pioasm/test/errors/general/test_jmp_target_out_of_range_errors.pio b/tools/pioasm/test/errors/general/test_jmp_target_out_of_range_errors.pio new file mode 100644 index 00000000..e7f5f608 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_jmp_target_out_of_range_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program jmp_out_of_range + jmp 5 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.9: jmp target address 5 is beyond the end of the program +// 3 | jmp 5 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_out_set_wait_errors.pio b/tools/pioasm/test/errors/general/test_out_set_wait_errors.pio new file mode 100644 index 00000000..5e7e330a --- /dev/null +++ b/tools/pioasm/test/errors/general/test_out_set_wait_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program out_set_wait_invalid + out pins, 0 + set pins, 32 + wait 2 irq 0 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.15: 'out' bit count must be >= 1 and <= 32 +// 3 | out pins, 0 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_bits_negative_errors.pio b/tools/pioasm/test/errors/general/test_sideset_bits_negative_errors.pio new file mode 100644 index 00000000..31b4d595 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_bits_negative_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_bits_negative +.side_set -1 + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.11: syntax error, unexpected -, expecting ( or identifier or integer +// 3 | .side_set -1 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_bits_optional_too_large_errors.pio b/tools/pioasm/test/errors/general/test_sideset_bits_optional_too_large_errors.pio new file mode 100644 index 00000000..f2cf1ee9 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_bits_optional_too_large_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_bits_optional_too_large +.side_set 5 opt + nop side 0 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.11: maximum number of side set bits with optional is 4 +// 3 | .side_set 5 opt +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_bits_too_large_errors.pio b/tools/pioasm/test/errors/general/test_sideset_bits_too_large_errors.pio new file mode 100644 index 00000000..e721622a --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_bits_too_large_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_bits_too_large +.side_set 6 + nop side 0 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.11: maximum number of side set bits is 5 +// 3 | .side_set 6 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_missing_errors.pio b/tools/pioasm/test/errors/general/test_sideset_missing_errors.pio new file mode 100644 index 00000000..aef90da5 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_missing_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_missing +.side_set 1 + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.5-7: instruction requires 'side' to specify side set value for the instruction because non optional sideset was specified for the program at input.pio:3.1-11 +// 4 | nop +// | ^~~ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_value_negative_errors.pio b/tools/pioasm/test/errors/general/test_sideset_value_negative_errors.pio new file mode 100644 index 00000000..6d605ec4 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_value_negative_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_value_negative +.side_set 2 + nop side -1 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.14: syntax error, unexpected -, expecting ( or identifier or integer +// 4 | nop side -1 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_sideset_value_too_large_errors.pio b/tools/pioasm/test/errors/general/test_sideset_value_too_large_errors.pio new file mode 100644 index 00000000..b175a6e6 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_sideset_value_too_large_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program sideset_value_too_large +.side_set 2 + nop side 4 +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.14: the maximum side set value is 3 based on the configuration specified at input.pio:3.1-11 +// 4 | nop side 4 +// | ^ +// diff --git a/tools/pioasm/test/errors/general/test_undefined_symbol_errors.pio b/tools/pioasm/test/errors/general/test_undefined_symbol_errors.pio new file mode 100644 index 00000000..f7e44d46 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_undefined_symbol_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program undefined_symbol + .word missing_symbol +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.11-24: undefined symbol 'missing_symbol' +// 3 | .word missing_symbol +// | ^~~~~~~~~~~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_word_too_large_errors.pio b/tools/pioasm/test/errors/general/test_word_too_large_errors.pio new file mode 100644 index 00000000..0c1b2f14 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_word_too_large_errors.pio @@ -0,0 +1,12 @@ +// run: pioasm input.pio +.program word_too_large + .word 0x1ffff +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.5-17: .word value must be a positive 16 bit value +// 3 | .word 0x1ffff +// | ^~~~~~~~~~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_wrap_before_instruction_errors.pio b/tools/pioasm/test/errors/general/test_wrap_before_instruction_errors.pio new file mode 100644 index 00000000..5144db3e --- /dev/null +++ b/tools/pioasm/test/errors/general/test_wrap_before_instruction_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program wrap_error +.wrap + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:3.1-5: .wrap cannot be placed before the first program instruction +// 3 | .wrap +// | ^~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_wrap_duplicate_errors.pio b/tools/pioasm/test/errors/general/test_wrap_duplicate_errors.pio new file mode 100644 index 00000000..9550e4c3 --- /dev/null +++ b/tools/pioasm/test/errors/general/test_wrap_duplicate_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program wrap_duplicate + nop +.wrap +.wrap +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.1-5: .wrap was already specified at input.pio:4.1-5 +// 5 | .wrap +// | ^~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_wrap_target_after_end_errors.pio b/tools/pioasm/test/errors/general/test_wrap_target_after_end_errors.pio new file mode 100644 index 00000000..4124b88a --- /dev/null +++ b/tools/pioasm/test/errors/general/test_wrap_target_after_end_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm input.pio +.program wrap_target_after_end + nop +.wrap_target +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.1-12: .wrap_target cannot be placed after the last program instruction +// 4 | .wrap_target +// | ^~~~~~~~~~~~ +// diff --git a/tools/pioasm/test/errors/general/test_wrap_target_duplicate_errors.pio b/tools/pioasm/test/errors/general/test_wrap_target_duplicate_errors.pio new file mode 100644 index 00000000..63e749ed --- /dev/null +++ b/tools/pioasm/test/errors/general/test_wrap_target_duplicate_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm input.pio +.program wrap_target_duplicate +.wrap_target + nop +.wrap_target +// -- Output +// Command: pioasm input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.1-12: .wrap_target was already specified at input.pio:3.1-12 +// 5 | .wrap_target +// | ^~~~~~~~~~~~ +// diff --git a/tools/pioasm/test/errors/mov_status/test_mov_status_irq_errors.pio b/tools/pioasm/test/errors/mov_status/test_mov_status_irq_errors.pio new file mode 100644 index 00000000..a2788c02 --- /dev/null +++ b/tools/pioasm/test/errors/mov_status/test_mov_status_irq_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm -v 1 input.pio +.program mov_status_irq +.pio_version 1 +.mov_status irq set 8 + mov x, status +// -- Output +// Command: pioasm -v 1 input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.21: irq number should be >= 0 and <= 7 +// 4 | .mov_status irq set 8 +// | ^ +// diff --git a/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_high_then_low_errors.pio b/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_high_then_low_errors.pio new file mode 100644 index 00000000..ae47bc35 --- /dev/null +++ b/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_high_then_low_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm -v 1 input.pio +.program wait_gpio_conflict_high_then_low +.pio_version 1 + wait 0 gpio 40 + wait 0 gpio 0 +// -- Output +// Command: pioasm -v 1 input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.17: absolute GPIO number must be must be >= 16 and <= 47 as a GPIO number >32 has already been used +// 5 | wait 0 gpio 0 +// | ^ +// diff --git a/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_low_then_high_errors.pio b/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_low_then_high_errors.pio new file mode 100644 index 00000000..99cfacbc --- /dev/null +++ b/tools/pioasm/test/errors/pin_config/test_wait_gpio_conflict_low_then_high_errors.pio @@ -0,0 +1,14 @@ +// run: pioasm -v 1 input.pio +.program wait_gpio_conflict_low_then_high +.pio_version 1 + wait 0 gpio 0 + wait 0 gpio 40 +// -- Output +// Command: pioasm -v 1 input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:5.17-18: absolute GPIO number must be must be >= 0 and <= 31 as a GPIO number <16 has already been used +// 5 | wait 0 gpio 40 +// | ^~ +// diff --git a/tools/pioasm/test/errors/pin_config/test_wait_gpio_range_errors.pio b/tools/pioasm/test/errors/pin_config/test_wait_gpio_range_errors.pio new file mode 100644 index 00000000..74ef1669 --- /dev/null +++ b/tools/pioasm/test/errors/pin_config/test_wait_gpio_range_errors.pio @@ -0,0 +1,13 @@ +// run: pioasm -v 1 input.pio +.program wait_gpio_range +.pio_version 1 + wait 0 gpio 48 +// -- Output +// Command: pioasm -v 1 input.pio +// Exit code: 1 +// Stdout: +// Stderr: +// input.pio:4.17-18: absolute GPIO number must be must be >= 0 and <= 47 +// 4 | wait 0 gpio 48 +// | ^~ +// diff --git a/tools/pioasm/test/valid/expressions/test_expressions_unary_valid.pio b/tools/pioasm/test/valid/expressions/test_expressions_unary_valid.pio new file mode 100644 index 00000000..653db923 --- /dev/null +++ b/tools/pioasm/test/valid/expressions/test_expressions_unary_valid.pio @@ -0,0 +1,57 @@ +// run: pioasm input.pio +.program unary_test +.define PUBLIC neg_val -5 +.define PUBLIC rev_val ::1 +start: + nop +// -- Output +// Command: pioasm input.pio +// Exit code: 0 +// Stdout: +// // ------------------------------------------------------------------------ // +//? +// // ------------------------------------------------------------------------ // +// +// #pragma once +// +// #if !PICO_NO_HARDWARE +// #include "hardware/pio.h" +// #endif +// +// // ---------- // +// // unary_test // +// // ---------- // +// +// #define unary_test_wrap_target 0 +// #define unary_test_wrap 0 +// #define unary_test_pio_version 0 +// +// #define unary_test_neg_val -5 +// #define unary_test_rev_val -2147483648 +// +// static const uint16_t unary_test_program_instructions[] = { +// // .wrap_target +// 0xa042, // 0: nop +// // .wrap +// }; +// +// #if !PICO_NO_HARDWARE +// static const struct pio_program unary_test_program = { +// .instructions = unary_test_program_instructions, +// .length = 1, +// .origin = -1, +// .pio_version = unary_test_pio_version, +// #if PICO_PIO_VERSION > 0 +// .used_gpio_ranges = 0x0 +// #endif +// }; +// +// static inline pio_sm_config unary_test_program_get_default_config(uint offset) { +// pio_sm_config c = pio_get_default_sm_config(); +// sm_config_set_wrap(&c, offset + unary_test_wrap_target, offset + unary_test_wrap); +// return c; +// } +// #endif +// +// +// Stderr: diff --git a/tools/pioasm/test/valid/output/test_output_go_symbols_valid.pio b/tools/pioasm/test/valid/output/test_output_go_symbols_valid.pio new file mode 100644 index 00000000..49283f03 --- /dev/null +++ b/tools/pioasm/test/valid/output/test_output_go_symbols_valid.pio @@ -0,0 +1,40 @@ +// run: pioasm -o go input.pio +.define PUBLIC global_const 7 +.program format_test +public entry: + nop +%go { +package pioasmtest +// Custom Go block +%} +// -- Output +// Command: pioasm -o go input.pio +// Exit code: 0 +// Stdout: +//? +// +// package pioasmtest +// // Custom Go block +// // format_test +// +// const format_testWrapTarget = 0 +// const format_testWrap = 0 +// +// const format_testoffset_entry = 0 +// +// var format_testInstructions = []uint16{ +// // .wrap_target +// 0xa042, // 0: nop +// // .wrap +// } +// const format_testOrigin = -1 +// func format_testProgramDefaultConfig(offset uint8) pio.StateMachineConfig { +// cfg := pio.DefaultStateMachineConfig() +// cfg.SetWrap(offset+format_testWrapTarget, offset+format_testWrap) +// return cfg; +// } +// +// const global_const = 7 +// +// +// Stderr: diff --git a/tools/pioasm/test/valid/output/test_output_json_symbols_valid.pio b/tools/pioasm/test/valid/output/test_output_json_symbols_valid.pio new file mode 100644 index 00000000..2e12ed52 --- /dev/null +++ b/tools/pioasm/test/valid/output/test_output_json_symbols_valid.pio @@ -0,0 +1,36 @@ +// run: pioasm -o json input.pio +.define PUBLIC global_const 7 +.program format_test +public entry: + nop +.lang_opt json foo = 1 +// -- Output +// Command: pioasm -o json input.pio +// Exit code: 0 +// Stdout: +// { +// "publicSymbols": { +// "global_const": 7 +// }, +// "programs": [ +// { +// "name": "format_test", +// "wrapTarget": 0, +// "wrap": 0, +// "origin": -1, +// "sideset": {"size": 0, "optional": false, "pindirs": false}, +// "publicSymbols": { +// }, +// "publicLabels": { +// "entry": 0 +// }, +// "instructions": [ +// {"hex": "A042"} +// ] +// } +// ] +// } +// +// Stderr: +// warning: json does not support output options; json lang_opt ignored. +// diff --git a/tools/pioasm/test/valid/output/test_output_python_symbols_valid.pio b/tools/pioasm/test/valid/output/test_output_python_symbols_valid.pio new file mode 100644 index 00000000..088696d4 --- /dev/null +++ b/tools/pioasm/test/valid/output/test_output_python_symbols_valid.pio @@ -0,0 +1,39 @@ +// run: pioasm -o python input.pio +.define PUBLIC global_const 7 +.program format_test +public entry: + nop +.lang_opt python in_shiftdir = right +%python { +# Custom python block +%} +// -- Output +// Command: pioasm -o python input.pio +// Exit code: 0 +// Stdout: +// # ------------------------------------------------------------------------ # +//? +// # ------------------------------------------------------------------------ # +// +// import rp2 +// from machine import Pin +// global_const = 7 +// +// # ----------- # +// # format_test # +// # ----------- # +// +// format_test_offset_entry = 0 +// +// @rp2.asm_pio(in_shiftdir=right) +// def format_test(): +// wrap_target() +// nop() # 0 +// wrap() +// +// +// # Custom python block +// +// +// +// Stderr: