From 7cc1306d76b05391e429dffd44a9b57d2e62c07d Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 25 Apr 2024 21:37:44 +0100 Subject: [PATCH] Fix assertion failure with procedure declared inside process (all) Issue #882 --- src/simp.c | 14 +++++++++++++- test/simp/issue882.vhd | 18 ++++++++++++++++++ test/test_simp.c | 24 +++++++++++++++++++++++- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 test/simp/issue882.vhd diff --git a/src/simp.c b/src/simp.c index 28164506..a657dcfb 100644 --- a/src/simp.c +++ b/src/simp.c @@ -635,6 +635,18 @@ static void simp_build_wait_cb(tree_t expr, void *ctx) tree_add_trigger(wait, expr); } +static void simp_all_sensitivity_cb(tree_t expr, void *ctx) +{ + tree_t ref = name_to_ref(expr); + assert(ref != NULL); + + tree_t decl = tree_ref(ref); + if (tree_kind(decl) == T_PARAM_DECL) + return; // Parameter of procedure declared within process + + simp_build_wait_cb(expr, ctx); +} + static tree_t simp_process(tree_t t) { // Replace sensitivity list with a "wait on" statement @@ -661,7 +673,7 @@ static tree_t simp_process(tree_t t) tree_set_flag(w, TREE_F_STATIC_WAIT); if (ntriggers == 1 && tree_kind(tree_trigger(t, 0)) == T_ALL) - build_wait(t, simp_build_wait_cb, w); + build_wait(t, simp_all_sensitivity_cb, w); else { for (int i = 0; i < ntriggers; i++) tree_add_trigger(w, tree_trigger(t, i)); diff --git a/test/simp/issue882.vhd b/test/simp/issue882.vhd new file mode 100644 index 00000000..ecb7ce06 --- /dev/null +++ b/test/simp/issue882.vhd @@ -0,0 +1,18 @@ +entity test is +end entity; + +architecture arch of test is + signal my_a : integer := 0; + signal my_b : integer := 1; + +begin + process (all) is + procedure do_thing (signal a : in integer; signal b : out integer) is + begin + b <= a; + end procedure; + begin + + my_b <= my_a; + end process; +end architecture; diff --git a/test/test_simp.c b/test/test_simp.c index 21dfeee5..5e15cb99 100644 --- a/test/test_simp.c +++ b/test/test_simp.c @@ -1,5 +1,5 @@ // -// Copyright (C) 2011-2022 Nick Gasson +// Copyright (C) 2011-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 @@ -1699,6 +1699,27 @@ START_TEST(test_issue867) } END_TEST +START_TEST(test_issue882) +{ + set_standard(STD_08); + + input_from_file(TESTDIR "/simp/issue882.vhd"); + + tree_t a = parse_check_and_simplify(T_ENTITY, T_ARCH); + fail_if(a == NULL); + + tree_t p0 = tree_stmt(a, 0); + fail_unless(tree_kind(p0) == T_PROCESS); + + tree_t p0s1 = tree_stmt(p0, 1); + fail_unless(tree_kind(p0s1) == T_WAIT); + fail_unless(tree_triggers(p0s1) == 1); + fail_unless(icmp(tree_ident(tree_trigger(p0s1, 0)), "MY_A")); + + fail_if_errors(); +} +END_TEST + Suite *get_simp_tests(void) { Suite *s = suite_create("simplify"); @@ -1766,6 +1787,7 @@ Suite *get_simp_tests(void) tcase_add_test(tc_core, test_issue812); tcase_add_test(tc_core, test_issue821); tcase_add_test(tc_core, test_issue867); + tcase_add_test(tc_core, test_issue882); suite_add_tcase(s, tc_core); return s; -- 2.39.2