Skip to content

Commit 17b2bea

Browse files
authored
Merge pull request #1466 from diffblue/resolve-typedefs
Verilog: use resolver for typedefs
2 parents 8a0ed88 + 26b4c5a commit 17b2bea

File tree

6 files changed

+28
-25
lines changed

6 files changed

+28
-25
lines changed

regression/verilog/modules/parameters11.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
parameters11.sv
33
--bound 0
44
^EXIT=0$

src/verilog/parser.y

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4734,7 +4734,6 @@ type_identifier: TOK_TYPE_IDENTIFIER
47344734
init($$, ID_typedef_type);
47354735
auto base_name = stack_expr($1).id();
47364736
stack_expr($$).set(ID_base_name, base_name);
4737-
stack_expr($$).set(ID_identifier, PARSER.scopes.current_scope().prefix+id2string(base_name));
47384737
}
47394738
;
47404739

src/verilog/verilog_elaborate_type.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,18 +172,26 @@ typet verilog_typecheck_exprt::elaborate_package_scope_typedef(
172172
<< "verilog_package_scope expects typedef_type on the rhs";
173173

174174
auto package_base_name = src.subtypes()[0].id();
175-
auto typedef_base_name = src.subtypes()[1].get(ID_base_name);
175+
auto typedef_base_name =
176+
to_verilog_typedef_type(src.subtypes()[1]).base_name();
176177

177178
// stitch together
178179
irep_idt full_identifier =
179180
id2string(verilog_package_identifier(package_base_name)) + '.' +
180181
id2string(typedef_base_name);
181182

182-
// recursive call
183-
verilog_typedef_typet full_typedef_type(full_identifier);
184-
full_typedef_type.set(ID_identifier, full_identifier);
183+
// look it up
184+
const symbolt *symbol_ptr;
185185

186-
return elaborate_type(full_typedef_type);
186+
if(ns.lookup(full_identifier, symbol_ptr))
187+
throw errort().with_location(location)
188+
<< "symbol " << typedef_base_name << " not found in package";
189+
190+
// must be type
191+
if(!symbol_ptr->is_type)
192+
throw errort().with_location(location) << "expected a type identifier";
193+
194+
return symbol_ptr->type;
187195
}
188196

189197
/*******************************************************************\
@@ -334,18 +342,17 @@ typet verilog_typecheck_exprt::elaborate_type(const typet &src)
334342
else if(src.id() == ID_typedef_type)
335343
{
336344
// Look it up!
337-
const symbolt *symbol_ptr;
338-
339-
auto identifier = to_verilog_typedef_type(src).identifier();
345+
auto base_name = to_verilog_typedef_type(src).base_name();
346+
const auto *symbol_ptr = resolve(base_name);
340347

341-
if(ns.lookup(identifier, symbol_ptr))
348+
if(symbol_ptr == nullptr)
342349
throw errort().with_location(source_location)
343-
<< "type symbol " << identifier << " not found";
350+
<< "type symbol " << base_name << " not found";
344351

345352
DATA_INVARIANT(symbol_ptr->is_type, "typedef symbols must be types");
346353

347354
// elaborate that typedef symbol, recursively, if needed
348-
elaborate_symbol_rec(identifier);
355+
elaborate_symbol_rec(symbol_ptr->name);
349356

350357
auto result = symbol_ptr->type; // copy
351358
return result.with_source_location(source_location);

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,11 +1270,8 @@ Function: verilog_typecheck_exprt::resolve
12701270
12711271
\*******************************************************************/
12721272

1273-
const symbolt *
1274-
verilog_typecheck_exprt::resolve(const verilog_identifier_exprt &expr)
1273+
const symbolt *verilog_typecheck_exprt::resolve(const irep_idt base_name)
12751274
{
1276-
const irep_idt &base_name = expr.base_name();
1277-
12781275
// in a task or function? Try local ones first
12791276
if(function_or_task_name!="")
12801277
{
@@ -1327,8 +1324,8 @@ exprt verilog_typecheck_exprt::convert_verilog_identifier(
13271324
verilog_identifier_exprt expr,
13281325
const std::optional<typet> &implicit_net_type)
13291326
{
1330-
auto symbol = resolve(expr);
13311327
auto base_name = expr.base_name();
1328+
auto symbol = resolve(base_name);
13321329

13331330
if(symbol != nullptr)
13341331
{

src/verilog/verilog_typecheck_expr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class verilog_typecheck_exprt:public verilog_typecheck_baset
174174
protected:
175175
[[nodiscard]] exprt convert_expr_rec(exprt expr);
176176
[[nodiscard]] exprt convert_constant(constant_exprt);
177-
[[nodiscard]] const symbolt *resolve(const verilog_identifier_exprt &);
177+
[[nodiscard]] const symbolt *resolve(irep_idt base_name);
178178
[[nodiscard]] exprt convert_verilog_identifier(
179179
verilog_identifier_exprt,
180180
const std::optional<typet> &implicit_net_type);

src/verilog/verilog_types.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -777,20 +777,20 @@ inline verilog_event_typet &to_verilog_event_type(typet &type)
777777
class verilog_typedef_typet : public typet
778778
{
779779
public:
780-
explicit verilog_typedef_typet(const irep_idt &_identifier)
780+
explicit verilog_typedef_typet(const irep_idt &_base_name)
781781
: typet(ID_typedef_type)
782782
{
783-
identifier(_identifier);
783+
base_name(_base_name);
784784
}
785785

786-
void identifier(const irep_idt &identifier)
786+
void base_name(const irep_idt &base_name)
787787
{
788-
set(ID_identifier, identifier);
788+
set(ID_base_name, base_name);
789789
}
790790

791-
const irep_idt &identifier() const
791+
const irep_idt &base_name() const
792792
{
793-
return get(ID_identifier);
793+
return get(ID_base_name);
794794
}
795795
};
796796

0 commit comments

Comments
 (0)