Don't return packages when iterating over root modules (issue #496)

The code assumed all handles stored in vpip_root_table were modules. This
is true for traditional Verilog, but not so for SystemVerilog.

Whilst here, also add support for iterating over packages.

(cherry picked from commit 3167b2ed24)
This commit is contained in:
Martin Whitaker 2021-04-18 09:47:21 +01:00
parent eaea698027
commit adb4be5c75
3 changed files with 16 additions and 13 deletions

View File

@ -1239,7 +1239,9 @@ static vpiHandle vpi_iterate_global(int type)
{ {
switch (type) { switch (type) {
case vpiModule: case vpiModule:
return vpip_make_root_iterator(); // fallthrough
case vpiPackage:
return vpip_make_root_iterator(type);
case vpiUdpDefn: case vpiUdpDefn:
return vpip_make_udp_iterator(); return vpip_make_udp_iterator();

View File

@ -329,7 +329,7 @@ extern void vpip_attach_to_current_scope(vpiHandle obj);
extern __vpiScope* vpip_peek_context_scope(void); extern __vpiScope* vpip_peek_context_scope(void);
extern unsigned vpip_add_item_to_context(automatic_hooks_s*item, extern unsigned vpip_add_item_to_context(automatic_hooks_s*item,
__vpiScope*scope); __vpiScope*scope);
extern vpiHandle vpip_make_root_iterator(void); extern vpiHandle vpip_make_root_iterator(int type_code);
extern void vpip_make_root_iterator(class __vpiHandle**&table, extern void vpip_make_root_iterator(class __vpiHandle**&table,
unsigned&ntable); unsigned&ntable);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001-2020 Stephen Williams (steve@icarus.com) * Copyright (c) 2001-2021 Stephen Williams (steve@icarus.com)
* *
* This source code is free software; you can redistribute it * This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU * and/or modify it in source code form under the terms of the GNU
@ -35,10 +35,11 @@ using namespace std;
static vector<vpiHandle> vpip_root_table; static vector<vpiHandle> vpip_root_table;
vpiHandle vpip_make_root_iterator(void) static vpiHandle make_subset_iterator_(int type_code, vector<vpiHandle>&table);
vpiHandle vpip_make_root_iterator(int type_code)
{ {
return vpip_make_iterator(vpip_root_table.size(), return make_subset_iterator_(type_code, vpip_root_table);
&vpip_root_table[0], false);
} }
void vpip_make_root_iterator(__vpiHandle**&table, unsigned&ntable) void vpip_make_root_iterator(__vpiHandle**&table, unsigned&ntable)
@ -291,22 +292,22 @@ static int compare_types(int code, int type)
return 0; return 0;
} }
static vpiHandle module_iter_subset(int code, __vpiScope*ref) static vpiHandle make_subset_iterator_(int type_code, vector<vpiHandle>&table)
{ {
unsigned mcnt = 0, ncnt = 0; unsigned mcnt = 0, ncnt = 0;
vpiHandle*args; vpiHandle*args;
for (unsigned idx = 0 ; idx < ref->intern.size() ; idx += 1) for (unsigned idx = 0; idx < table.size(); idx += 1)
if (compare_types(code, ref->intern[idx]->get_type_code())) if (compare_types(type_code, table[idx]->get_type_code()))
mcnt += 1; mcnt += 1;
if (mcnt == 0) if (mcnt == 0)
return 0; return 0;
args = (vpiHandle*)calloc(mcnt, sizeof(vpiHandle)); args = (vpiHandle*)calloc(mcnt, sizeof(vpiHandle));
for (unsigned idx = 0 ; idx < ref->intern.size() ; idx += 1) for (unsigned idx = 0; idx < table.size(); idx += 1)
if (compare_types(code, ref->intern[idx]->get_type_code())) if (compare_types(type_code, table[idx]->get_type_code()))
args[ncnt++] = ref->intern[idx]; args[ncnt++] = table[idx];
assert(ncnt == mcnt); assert(ncnt == mcnt);
@ -324,7 +325,7 @@ static vpiHandle module_iter(int code, vpiHandle obj)
__vpiScope*ref = dynamic_cast<__vpiScope*>(obj); __vpiScope*ref = dynamic_cast<__vpiScope*>(obj);
assert(ref); assert(ref);
return module_iter_subset(code, ref); return make_subset_iterator_(code, ref->intern);
} }