From 8d0423543294f46eee9f3eaf2d5d7a043449f668 Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Sun, 11 Jun 2023 10:12:40 -0400 Subject: [PATCH] vhpi: Support SigDecls Add support for SigDecls to the root instance. --- src/vhpi/vhpi-model.c | 16 ++++++++++++---- test/regress/gold/vhpi1.txt | 4 ++++ test/vhpi/vhpi1.c | 6 ++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/vhpi/vhpi-model.c b/src/vhpi/vhpi-model.c index dc53f61c..cb51e601 100644 --- a/src/vhpi/vhpi-model.c +++ b/src/vhpi/vhpi-model.c @@ -289,6 +289,7 @@ typedef struct { typedef struct { c_designInstUnit designInstUnit; vhpiObjectListT ports; + vhpiObjectListT signals; } c_rootInst; DEF_CLASS(rootInst, vhpiRootInstK, designInstUnit.region.object); @@ -805,6 +806,7 @@ static bool init_iterator(c_iterator *it, vhpiOneToManyT type, c_vhpiObject *obj if (rootInst != NULL) { switch (type) { case vhpiPortDecls: it->list = &(rootInst->ports); return true; + case vhpiSigDecls: it->list = &(rootInst->signals); return true; default: break; } } @@ -2273,15 +2275,21 @@ static c_vhpiObject *vhpi_build_signal_decl(tree_t decl, return &(s->objDecl.decl.object); } -static void vhpi_build_decls(tree_t container, c_abstractRegion *region) +static void vhpi_build_decls(tree_t container, c_abstractRegion *region, + c_rootInst *where) { const int ndecls = tree_decls(container); for (int i = 0; i < ndecls; i++) { tree_t d = tree_decl(container, i); switch (tree_kind(d)) { case T_SIGNAL_DECL: - APUSH(region->decls, vhpi_build_signal_decl(d, region)); - break; + { + c_vhpiObject *signal = vhpi_build_signal_decl(d, region); + APUSH(region->decls, signal); + if (where) + APUSH(where->signals, signal); + break; + } default: break; } @@ -2345,7 +2353,7 @@ void vhpi_build_design_model(tree_t top, rt_model_t *m) rootInst = new_object(sizeof(c_rootInst), vhpiRootInstK); init_designInstUnit(&(rootInst->designInstUnit), b0, &(arch->designUnit)); - vhpi_build_decls(b0, &(rootInst->designInstUnit.region)); + vhpi_build_decls(b0, &(rootInst->designInstUnit.region), rootInst); vhpi_build_ports(b0, rootInst); VHPI_TRACE("building model for %s took %"PRIu64" ms", diff --git a/test/regress/gold/vhpi1.txt b/test/regress/gold/vhpi1.txt index d31773bc..0ee838d8 100644 --- a/test/regress/gold/vhpi1.txt +++ b/test/regress/gold/vhpi1.txt @@ -7,8 +7,12 @@ VHPI printf root name is VHPI1 VHPI printf root full name is :VHPI1 VHPI printf root port is X VHPI printf root port is Y +VHPI printf root signal is V +VHPI printf root signal is B +VHPI printf root signal is R VHPI printf root decl is V VHPI printf root decl is B +VHPI printf root decl is R VHPI printf arch handle VHPI printf arch name is VHPI1-TEST VHPI printf arch unit name is WORK.VHPI1-TEST diff --git a/test/vhpi/vhpi1.c b/test/vhpi/vhpi1.c index 19351061..d2460a58 100644 --- a/test/vhpi/vhpi1.c +++ b/test/vhpi/vhpi1.c @@ -360,6 +360,12 @@ void vhpi1_startup(void) fail_unless(vhpi_handle_by_index(vhpiPortDecls, root, i) == port); } + vhpiHandleT root_signals = vhpi_iterator(vhpiSigDecls, root); + fail_if(root_signals == NULL); + i = 0; + for (vhpiHandleT decl = vhpi_scan(root_signals); decl != NULL; decl = vhpi_scan(root_signals)) + vhpi_printf("root signal is %s", vhpi_get_str(vhpiNameP, decl)); + vhpiHandleT root_decls = vhpi_iterator(vhpiDecls, root); fail_if(root_decls == NULL); i = 0; -- 2.39.2