Skip to content

Commit e6d1bfb

Browse files
committed
Verilog: collect symbols from statements
1 parent b1ffbf0 commit e6d1bfb

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

src/verilog/verilog_elaborate_constants.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,87 @@ void verilog_typecheckt::collect_symbols(const verilog_declt &decl)
125125
}
126126
}
127127

128+
void verilog_typecheckt::collect_symbols(const verilog_statementt &statement)
129+
{
130+
if(statement.id() == ID_assert || statement.id() == ID_assume)
131+
{
132+
}
133+
else if(statement.id() == ID_block)
134+
{
135+
// These may be named
136+
auto &block_statement = to_verilog_block(statement);
137+
138+
if(block_statement.is_named())
139+
enter_named_block(block_statement.identifier());
140+
141+
for(auto &block_statement : to_verilog_block(statement).operands())
142+
collect_symbols(to_verilog_statement(block_statement));
143+
144+
if(block_statement.is_named())
145+
named_blocks.pop_back();
146+
}
147+
else if(statement.id() == ID_blocking_assign)
148+
{
149+
}
150+
else if(
151+
statement.id() == ID_case || statement.id() == ID_casex ||
152+
statement.id() == ID_casez)
153+
{
154+
auto &case_statement = to_verilog_case_base(statement);
155+
156+
for(std::size_t i = 1; i < case_statement.operands().size(); i++)
157+
{
158+
const verilog_case_itemt &c =
159+
to_verilog_case_item(statement.operands()[i]);
160+
161+
collect_symbols(c.case_statement());
162+
}
163+
}
164+
else if(statement.id() == ID_decl)
165+
{
166+
collect_symbols(to_verilog_decl(statement));
167+
}
168+
else if(statement.id() == ID_delay)
169+
{
170+
collect_symbols(to_verilog_delay(statement).body());
171+
}
172+
else if(statement.id() == ID_event_guard)
173+
{
174+
collect_symbols(to_verilog_event_guard(statement).body());
175+
}
176+
else if(statement.id() == ID_for)
177+
{
178+
collect_symbols(to_verilog_for(statement).body());
179+
}
180+
else if(statement.id() == ID_forever)
181+
{
182+
collect_symbols(to_verilog_forever(statement).body());
183+
}
184+
else if(statement.id() == ID_function_call)
185+
{
186+
}
187+
else if(statement.id() == ID_if)
188+
{
189+
auto &if_statement = to_verilog_if(statement);
190+
collect_symbols(if_statement.then_case());
191+
if(if_statement.has_else_case())
192+
collect_symbols(if_statement.else_case());
193+
}
194+
else if(statement.id() == ID_non_blocking_assign)
195+
{
196+
}
197+
else if(
198+
statement.id() == ID_postincrement || statement.id() == ID_postdecrement ||
199+
statement.id() == ID_preincrement || statement.id() == ID_predecrement)
200+
{
201+
}
202+
else if(statement.id() == ID_skip)
203+
{
204+
}
205+
else
206+
DATA_INVARIANT(false, "unexpected statement: " + statement.id_string());
207+
}
208+
128209
void verilog_typecheckt::collect_symbols(
129210
const verilog_module_itemt &module_item)
130211
{
@@ -148,9 +229,11 @@ void verilog_typecheckt::collect_symbols(
148229
}
149230
else if(module_item.id() == ID_always)
150231
{
232+
collect_symbols(to_verilog_always(module_item).statement());
151233
}
152234
else if(module_item.id() == ID_initial)
153235
{
236+
collect_symbols(to_verilog_initial(module_item).statement());
154237
}
155238
else if(module_item.id() == ID_generate_block)
156239
{

src/verilog/verilog_typecheck.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class verilog_typecheckt:
8484
void collect_symbols(const verilog_module_sourcet &);
8585
void collect_symbols(const verilog_module_itemt &);
8686
void collect_symbols(const verilog_declt &);
87+
void collect_symbols(const verilog_statementt &);
8788
void
8889
collect_symbols(const typet &, const verilog_parameter_declt::declaratort &);
8990
std::vector<irep_idt> symbols_added;

0 commit comments

Comments
 (0)