From 8464e5eeb7cca71ade06898be1cba8a3f32020bb Mon Sep 17 00:00:00 2001 From: audiobird Date: Sun, 6 Apr 2025 13:41:04 -0700 Subject: [PATCH 1/3] Add pioasm c++ constexpr output target --- tools/pioasm/CMakeLists.txt | 1 + tools/pioasm/constexpr_output.cpp | 62 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 tools/pioasm/constexpr_output.cpp diff --git a/tools/pioasm/CMakeLists.txt b/tools/pioasm/CMakeLists.txt index a7698cd81..333a22605 100644 --- a/tools/pioasm/CMakeLists.txt +++ b/tools/pioasm/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable(pioasm target_sources(pioasm PRIVATE c_sdk_output.cpp) target_sources(pioasm PRIVATE python_output.cpp) target_sources(pioasm PRIVATE hex_output.cpp) +target_sources(pioasm PRIVATE constexpr_output.cpp) target_sources(pioasm PRIVATE json_output.cpp) target_sources(pioasm PRIVATE ada_output.cpp) target_sources(pioasm PRIVATE go_output.cpp) diff --git a/tools/pioasm/constexpr_output.cpp b/tools/pioasm/constexpr_output.cpp new file mode 100644 index 000000000..fd8b5cea4 --- /dev/null +++ b/tools/pioasm/constexpr_output.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "output_format.h" +#include "pio_disassembler.h" + +struct constexpr_output : public output_format { + struct factory { + factory() { output_format::add(new constexpr_output()); } + }; + + constexpr_output() : output_format("constexpr") {} + + std::string get_description() { + return "c++ constexpr array output (only raw program are output) "; + } + + virtual int output(std::string destination, + std::vector output_options, + const compiled_source &source) { + FILE *out = open_single_output(destination); + if (!out) + return 1; + + fprintf(out, "#pragma once\n\n"); + fprintf(out, "#include \n"); + fprintf(out, "#include \n\n"); + + fprintf(out, "namespace Pioasm {\n\n"); + + for (auto &p : source.programs) { + fprintf(out, "inline constexpr std::array %s = {\n", + p.instructions.size(), p.name.c_str()); + for (auto i = 0u; i < p.instructions.size(); ++i) { + const auto &inst = p.instructions[i]; + if (i == p.wrap_target) { + fprintf(out, " // .wrap_target\n"); + } + fprintf(out, " 0x%04x, // %2d: %s\n", inst, i, + disassemble(inst, p.sideset_bits_including_opt.get(), + p.sideset_opt) + .c_str()); + if (i == p.wrap) { + fprintf(out, " // .wrap\n"); + } + } + fprintf(out, "};\n\n"); + } + + fprintf(out, "}"); + + if (out != stdout) { + fclose(out); + } + return 0; + } +}; + +static constexpr_output::factory creator; From be979f65f5985b71365657a1810077724d7aac23 Mon Sep 17 00:00:00 2001 From: audiobird Date: Mon, 7 Apr 2025 09:54:26 -0700 Subject: [PATCH 2/3] Fix typo . --- tools/pioasm/constexpr_output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pioasm/constexpr_output.cpp b/tools/pioasm/constexpr_output.cpp index fd8b5cea4..bc0c8fe9f 100644 --- a/tools/pioasm/constexpr_output.cpp +++ b/tools/pioasm/constexpr_output.cpp @@ -15,7 +15,7 @@ struct constexpr_output : public output_format { constexpr_output() : output_format("constexpr") {} std::string get_description() { - return "c++ constexpr array output (only raw program are output) "; + return "c++ constexpr array output (only raw programs are output) "; } virtual int output(std::string destination, From 410956a3e6f7d015e5c0d709025e6f9babc985a5 Mon Sep 17 00:00:00 2001 From: audiobird Date: Mon, 7 Apr 2025 10:51:12 -0700 Subject: [PATCH 3/3] Make constexpr output namespace a user defined option --- tools/pioasm/constexpr_output.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/pioasm/constexpr_output.cpp b/tools/pioasm/constexpr_output.cpp index bc0c8fe9f..cc947e0b9 100644 --- a/tools/pioasm/constexpr_output.cpp +++ b/tools/pioasm/constexpr_output.cpp @@ -15,12 +15,24 @@ struct constexpr_output : public output_format { constexpr_output() : output_format("constexpr") {} std::string get_description() { - return "c++ constexpr array output (only raw programs are output) "; + return "c++ constexpr array output (only raw programs are output)\n" + " " + "-p namespace=some_namespace add optional namespace"; } virtual int output(std::string destination, std::vector output_options, const compiled_source &source) { + + std::string generated_namespace = ""; + + for (const auto &o_opt : output_options) { + const std::string prefix = "namespace="; + if (o_opt.find(prefix) == 0) { + generated_namespace = o_opt.substr(prefix.size()); + } + } + FILE *out = open_single_output(destination); if (!out) return 1; @@ -29,7 +41,7 @@ struct constexpr_output : public output_format { fprintf(out, "#include \n"); fprintf(out, "#include \n\n"); - fprintf(out, "namespace Pioasm {\n\n"); + fprintf(out, "namespace %s {\n\n", generated_namespace.c_str()); for (auto &p : source.programs) { fprintf(out, "inline constexpr std::array %s = {\n", @@ -50,7 +62,7 @@ struct constexpr_output : public output_format { fprintf(out, "};\n\n"); } - fprintf(out, "}"); + fprintf(out, "}\n"); if (out != stdout) { fclose(out);