From daa15bf5618011a2dcc67caa3dd78e378db8b30f Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 8 Feb 2024 22:04:36 +0000 Subject: [PATCH] Create aliases for collapsed signals with globally static bounds --- src/lower.c | 10 +++++---- src/rt/wave.c | 2 +- test/regress/gold/wave10.dump | 5 +++++ test/regress/testlist.txt | 1 + test/regress/wave10.vhd | 42 +++++++++++++++++++++++++++++++++++ test/test_lower.c | 4 +++- 6 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 test/regress/gold/wave10.dump create mode 100644 test/regress/wave10.vhd diff --git a/src/lower.c b/src/lower.c index 3d998440..b9251d3e 100644 --- a/src/lower.c +++ b/src/lower.c @@ -11913,9 +11913,6 @@ static void lower_direct_mapped_port(lower_unit_t *lu, driver_set_t *ds, lower_check_array_sizes(lu, port_type, type, bounds_reg, src_reg, locus); } - if (field == -1 && vcode_reg_kind(src_reg) == VCODE_TYPE_SIGNAL) - emit_alias_signal(src_reg, lower_debug_locus(port)); - if (field != -1) { vcode_reg_t ptr_reg = emit_index(var, VCODE_INVALID_REG); vcode_reg_t field_reg = emit_record_ref(ptr_reg, field); @@ -11942,6 +11939,9 @@ static void lower_direct_mapped_port(lower_unit_t *lu, driver_set_t *ds, else if (type_is_array(type)) { vcode_reg_t data_reg = lower_array_data(src_reg); + if (vcode_reg_kind(data_reg) == VCODE_TYPE_SIGNAL) + emit_alias_signal(data_reg, lower_debug_locus(port)); + if (bounds_reg != VCODE_INVALID_REG) { vcode_reg_t wrap_reg = lower_rewrap(data_reg, bounds_reg); emit_store(wrap_reg, var); @@ -11954,8 +11954,10 @@ static void lower_direct_mapped_port(lower_unit_t *lu, driver_set_t *ds, else emit_store(data_reg, var); } - else + else { + emit_alias_signal(src_reg, lower_debug_locus(port)); emit_store(src_reg, var); + } hset_insert(direct, map); hset_insert(direct, port); diff --git a/src/rt/wave.c b/src/rt/wave.c index 8430d91a..7de08690 100644 --- a/src/rt/wave.c +++ b/src/rt/wave.c @@ -798,7 +798,7 @@ static void fst_walk_design(wave_dumper_t *wd, tree_t block) ident_t hpath = tree_ident(h); - if (tree_subkind(h) == T_COMPONENT) { + if (tree_subkind(h) == T_COMPONENT && tree_stmts(block) > 0) { // Skip over implicit block statement created for component // instantiation block = tree_stmt(block, 0); diff --git a/test/regress/gold/wave10.dump b/test/regress/gold/wave10.dump new file mode 100644 index 00000000..fe763eae --- /dev/null +++ b/test/regress/gold/wave10.dump @@ -0,0 +1,5 @@ +$comment wave10.u1.x[1:5] is aliased to s[1:5] $end +$comment wave10.u2.x[1:5] is aliased to s[1:5] $end +#0 wave10.s[1:5] 00000 +#1000000 wave10.s[1:5] 01000 +#2000000 wave10.s[1:5] 11100 diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index b433b01a..310f7664 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -935,3 +935,4 @@ signal35 normal,2008 comp3 normal conv13 normal wave9 wave +wave10 wave diff --git a/test/regress/wave10.vhd b/test/regress/wave10.vhd new file mode 100644 index 00000000..3e7cb398 --- /dev/null +++ b/test/regress/wave10.vhd @@ -0,0 +1,42 @@ +entity sub is + generic ( g : in integer ); + port ( x : in bit_vector(1 to g) ); +end entity; + +architecture test of sub is +begin +end architecture; + +------------------------------------------------------------------------------- + +entity wave10 is +end entity; + +architecture test of wave10 is + component comp is + generic ( g : in integer ); + port ( x : in bit_vector(1 to g) ); + end component; + + function get_g return integer is + begin + return 5; + end function; + + for u1 : comp use entity work.sub; + for u2 : comp use open; + + signal s : bit_vector(1 to get_g); +begin + + u1: component comp + generic map (g => get_g) + port map (s); + + u2: component comp + generic map (g => get_g) + port map (s); + + s <= "01000" after 1 ns, "11100" after 2 ns; + +end architecture; diff --git a/test/test_lower.c b/test/test_lower.c index 1d34fe35..e7f9c1ba 100644 --- a/test/test_lower.c +++ b/test/test_lower.c @@ -1,5 +1,5 @@ // -// Copyright (C) 2014-2023 Nick Gasson +// Copyright (C) 2014-2024 Nick Gasson // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -3781,6 +3781,8 @@ START_TEST(test_instance1) { VCODE_OP_UARRAY_LEN }, { VCODE_OP_LENGTH_CHECK }, { VCODE_OP_UNWRAP }, + { VCODE_OP_DEBUG_LOCUS }, + { VCODE_OP_ALIAS_SIGNAL }, { VCODE_OP_STORE, .name = "X" }, { VCODE_OP_RETURN } }; -- 2.39.2