Skip to content

Commit 1043f6e

Browse files
authored
Merge pull request #1660 from diffblue/verilog-package-separator
SystemVerilog: use `::` as separator for identifiers in packages
2 parents 79324cf + f5929f9 commit 1043f6e

File tree

6 files changed

+54
-31
lines changed

6 files changed

+54
-31
lines changed

regression/verilog/packages/package_function1.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ package_function1.sv
33

44
^EXIT=0$
55
^SIGNAL=0$
6-
^\[main\.assert\.1\] always package::moo\.foo\(\) == 123: PROVED
6+
^\[main\.assert\.1\] always package::moo::foo\(\) == 123: PROVED
77
--
88
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
package_typedef2.sv
3+
4+
^EXIT=10$
5+
^SIGNAL=0$
6+
--
7+
--
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package some_package;
2+
3+
typedef int some_type;
4+
5+
typedef struct packed {
6+
some_type some_field;
7+
} other_type;
8+
9+
endpackage
10+
11+
module top;
12+
endmodule

src/verilog/verilog_elaborate_type.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ typet verilog_typecheck_exprt::elaborate_package_scope_typedef(
177177

178178
// stitch together
179179
irep_idt full_identifier =
180-
id2string(verilog_package_identifier(package_base_name)) + '.' +
181-
id2string(typedef_base_name);
180+
id2string(verilog_package_identifier(package_base_name)) +
181+
"::" + id2string(typedef_base_name);
182182

183183
// look it up
184184
const symbolt *symbol_ptr;

src/verilog/verilog_typecheck.cpp

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,7 @@ Function: verilog_typecheckt::convert_function_or_task
285285
void verilog_typecheckt::convert_function_or_task(
286286
verilog_function_or_task_declt &decl)
287287
{
288-
const std::string identifier =
289-
id2string(module_identifier) + "." + id2string(decl.base_name());
288+
const auto identifier = hierarchical_identifier(decl.base_name());
290289

291290
auto result=symbol_table.get_writeable(identifier);
292291

@@ -423,26 +422,11 @@ void verilog_typecheckt::convert_decl(verilog_declt &decl)
423422
{
424423
DATA_INVARIANT(declarator.id() == ID_declarator, "must have declarator");
425424

426-
// in a named block?
427-
irep_idt named_block;
428-
if(!named_blocks.empty())
429-
named_block = named_blocks.back();
425+
irep_idt full_identifier = hierarchical_identifier(declarator.base_name());
426+
symbolt &symbol = symbol_table_lookup(full_identifier);
430427

431428
// fix the type and identifier
432-
irep_idt full_identifier;
433-
434-
if(!function_or_task_name.empty())
435-
full_identifier = id2string(function_or_task_name) + "." +
436-
id2string(named_block) +
437-
id2string(declarator.base_name());
438-
else
439-
full_identifier = id2string(module_identifier) + "." +
440-
id2string(named_block) +
441-
id2string(declarator.base_name());
442-
443-
symbolt &symbol = symbol_table_lookup(full_identifier);
444429
declarator.type() = symbol.type;
445-
446430
declarator.identifier(full_identifier);
447431

448432
if(declarator.has_value())

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,18 @@ verilog_typecheck_exprt::hierarchical_identifier(irep_idt base_name) const
5757
return id2string(function_or_task_name) + "." + named_block +
5858
id2string(base_name);
5959
else if(!module_identifier.empty())
60-
return id2string(module_identifier) + "." + named_block +
61-
id2string(base_name);
60+
{
61+
if(has_prefix(id2string(module_identifier), "Verilog::package::"))
62+
{
63+
return id2string(module_identifier) + "::" + named_block +
64+
id2string(base_name);
65+
}
66+
else
67+
{
68+
return id2string(module_identifier) + "." + named_block +
69+
id2string(base_name);
70+
}
71+
}
6272
else
6373
{
6474
// not in a function/task, not in a module/checker/package etc.
@@ -662,7 +672,7 @@ exprt verilog_typecheck_exprt::convert_expr_function_call(
662672
to_verilog_identifier_expr(package_scope.identifier()).base_name();
663673

664674
full_identifier = id2string(verilog_package_identifier(package_base)) +
665-
'.' + id2string(base_name);
675+
"::" + id2string(base_name);
666676
}
667677
else if(f_op.id() == ID_verilog_identifier)
668678
{
@@ -1316,22 +1326,32 @@ const symbolt *verilog_typecheck_exprt::resolve(const irep_idt base_name)
13161326
return symbol; // found!
13171327
}
13181328

1329+
// determine the pacakge/module prefix, using the right separator
1330+
std::string prefix;
1331+
1332+
if(has_prefix(id2string(module_identifier), "Verilog::package::"))
1333+
{
1334+
prefix = id2string(module_identifier) + "::";
1335+
}
1336+
else
1337+
{
1338+
prefix = id2string(module_identifier) + '.';
1339+
}
1340+
13191341
// try named blocks, beginning with inner one
13201342
for(named_blockst::const_reverse_iterator
13211343
it=named_blocks.rbegin();
13221344
it!=named_blocks.rend();
13231345
it++)
13241346
{
1325-
auto full_identifier = id2string(module_identifier) + "." + id2string(*it) +
1326-
id2string(base_name);
1347+
irep_idt full_identifier = prefix + id2string(*it) + id2string(base_name);
13271348

13281349
const symbolt *symbol;
13291350
if(!ns.lookup(full_identifier, symbol))
13301351
return symbol; // found!
13311352
}
13321353

1333-
auto full_identifier =
1334-
id2string(module_identifier) + "." + id2string(base_name);
1354+
irep_idt full_identifier = prefix + id2string(base_name);
13351355

13361356
const symbolt *symbol;
13371357
if(!ns.lookup(full_identifier, symbol))
@@ -3006,8 +3026,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
30063026

30073027
// stitch together
30083028
irep_idt full_identifier =
3009-
id2string(verilog_package_identifier(package_base)) + '.' +
3010-
id2string(rhs_base);
3029+
id2string(verilog_package_identifier(package_base)) +
3030+
"::" + id2string(rhs_base);
30113031

30123032
const symbolt *symbol;
30133033
if(ns.lookup(full_identifier, symbol))

0 commit comments

Comments
 (0)