From a5bf5e145ff9b2226872a2403c9310ebbb7bb05f Mon Sep 17 00:00:00 2001 From: Lars-Peter Clausen Date: Sat, 20 Jun 2026 15:29:54 -0700 Subject: [PATCH] tgt-vvp: Avoid interleaving array ports into mux output Currently draw_lpm_mux_nest() calls draw_net_input() while printing a .functor statement. For array word inputs draw_net_input() emits an .array/port statement as a side effect, which interleaves the .array/port text into the middle of the .functor line and generates invalid VVP. draw_lpm_substitute() has the same pattern. Collect the input labels before starting to print the consuming statement so any side-effect output appears as a separate statement first. Signed-off-by: Lars-Peter Clausen --- tgt-vvp/draw_mux.c | 8 ++++++-- tgt-vvp/draw_substitute.c | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tgt-vvp/draw_mux.c b/tgt-vvp/draw_mux.c index 16d793d73..ac729da53 100644 --- a/tgt-vvp/draw_mux.c +++ b/tgt-vvp/draw_mux.c @@ -83,10 +83,14 @@ static void draw_lpm_mux_nest(ivl_lpm_t net, const char*muxz) net, select_input); for (idx = 0 ; idx < ivl_lpm_size(net) ; idx += 2) { + /* draw_net_input() can emit helper statements, for example for + array words. Emit those before starting the .functor line. */ + const char*input0 = draw_net_input(ivl_lpm_data(net,idx+0)); + const char*input1 = draw_net_input(ivl_lpm_data(net,idx+1)); fprintf(vvp_out, "L_%p/0/%u .functor %s %u", net, idx/2, muxz, width); - fprintf(vvp_out, ", %s", draw_net_input(ivl_lpm_data(net,idx+0))); - fprintf(vvp_out, ", %s", draw_net_input(ivl_lpm_data(net,idx+1))); + fprintf(vvp_out, ", %s", input0); + fprintf(vvp_out, ", %s", input1); fprintf(vvp_out, ", L_%p/0s, C4<>;\n", net); } diff --git a/tgt-vvp/draw_substitute.c b/tgt-vvp/draw_substitute.c index 22d5c4223..72fd048c1 100644 --- a/tgt-vvp/draw_substitute.c +++ b/tgt-vvp/draw_substitute.c @@ -25,8 +25,13 @@ void draw_lpm_substitute(ivl_lpm_t net) { unsigned swidth = width_of_nexus(ivl_lpm_data(net,1)); + /* draw_net_input() can emit helper statements, for example for + array words. Emit those before starting the .substitute line. */ + const char*input0 = draw_net_input(ivl_lpm_data(net,0)); + const char*input1 = draw_net_input(ivl_lpm_data(net,1)); + fprintf(vvp_out, "L_%p .substitute %u, %u %u", net, ivl_lpm_width(net), ivl_lpm_base(net), swidth); - fprintf(vvp_out, ", %s", draw_net_input(ivl_lpm_data(net,0))); - fprintf(vvp_out, ", %s;\n", draw_net_input(ivl_lpm_data(net,1))); + fprintf(vvp_out, ", %s", input0); + fprintf(vvp_out, ", %s;\n", input1); }