From 5d630f7ebe98fc4fe96706ca4b79e3f80c9e91bf Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 11 Jul 2021 09:29:07 +0800 Subject: [PATCH] Fix signal3 case --- src/elab.c | 9 ++++++--- src/enode.c | 3 +++ test/test_elab.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/elab.c b/src/elab.c index 9d62b4a5..a48b308f 100644 --- a/src/elab.c +++ b/src/elab.c @@ -2503,8 +2503,11 @@ static void drv_add(int op, vcode_reg_t target, unsigned count, drive = n; } else if (offset > o && offset < o + length) { - printf("need to split nexus %d for offset %d\n", i, offset); + printf("need to split nexus %d for offset %d length %d o %d\n", i, + offset, length, o); drive = e_split_nexus(ctx->root, n, offset - o); + if (length - offset + o > count) + e_split_nexus(ctx->root, drive, count); } else if (offset + length < o) break; @@ -2518,8 +2521,8 @@ static void drv_add(int op, vcode_reg_t target, unsigned count, have = e_nexus(proc, j) == n; if (!have) { - e_add_nexus(proc, n); - e_add_proc(n, proc); + e_add_nexus(proc, drive); + e_add_proc(drive, proc); } } } diff --git a/src/enode.c b/src/enode.c index fbcba5a0..7acca686 100644 --- a/src/enode.c +++ b/src/enode.c @@ -389,10 +389,13 @@ e_node_t e_split_nexus(e_node_t root, e_node_t orig, unsigned width) { assert(root->object.kind == E_ROOT); assert(orig->object.kind == E_NEXUS); + assert(width > 0); const unsigned owidth = e_width(orig); e_slice_t oslice = e_slice(orig); + assert(width < owidth); + e_node_t new = e_new(E_NEXUS); e_set_ident(new, e_ident(orig)); e_set_width(new, owidth - width); diff --git a/test/test_elab.c b/test/test_elab.c index 8b571e71..6c9ecc16 100644 --- a/test/test_elab.c +++ b/test/test_elab.c @@ -181,8 +181,6 @@ START_TEST(test_elab3) e_node_t e = run_elab(); check_elab(e); - e_dump(e); - e_node_t n0 = e_nexus(e, 0); fail_unless(e_pos(n0) == 0); fail_unless(e_width(n0) == 4); @@ -882,6 +880,34 @@ START_TEST(test_arrayref1) const int nnexus = e_nexuses(root); ck_assert_int_eq(nnexus, 16); // Would have been 15 with old grouping code + + // TODO: detailed checking here +} +END_TEST + +START_TEST(test_signal3) +{ + input_from_file(TESTDIR "/group/signal3.vhd"); + + e_node_t root = run_elab(); + check_elab(root); + + e_dump(root); + + e_node_t proc1 = e_proc(e_scope(root, 0), 0); + e_node_t proc2 = e_proc(e_scope(root, 0), 1); + + ck_assert_int_eq(e_nexuses(root), 4); + fail_unless(e_width(e_nexus(root, 0)) == 1); + fail_unless(e_procs(e_nexus(root, 0)) == 0); + fail_unless(e_width(e_nexus(root, 1)) == 1); + fail_unless(e_procs(e_nexus(root, 1)) == 1); + fail_unless(e_proc(e_nexus(root, 1), 0) == proc1); + fail_unless(e_width(e_nexus(root, 2)) == 1); + fail_unless(e_procs(e_nexus(root, 2)) == 0); + fail_unless(e_width(e_nexus(root, 3)) == 1); + fail_unless(e_procs(e_nexus(root, 3)) == 1); + fail_unless(e_proc(e_nexus(root, 3), 0) == proc2); } END_TEST @@ -940,6 +966,7 @@ Suite *get_elab_tests(void) TCase *tc_group = nvc_unit_test("group"); tcase_add_test(tc_group, test_arrayref1); + tcase_add_test(tc_group, test_signal3); suite_add_tcase(s, tc_group); return s; -- 2.39.2