Skip to content

Commit e720965

Browse files
authored
Merge pull request #755 from diffblue/synth_expr_rec
Verilog: pull out recursive application of verilog_synthesist::synth_expr
2 parents c49ab50 + 57e4e6c commit e720965

File tree

1 file changed

+19
-38
lines changed

1 file changed

+19
-38
lines changed

src/verilog/verilog_synthesis.cpp

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,21 @@ Function: verilog_synthesist::synth_expr
198198

199199
exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
200200
{
201+
if(expr.id() == ID_function_call)
202+
{
203+
return expand_function_call(to_function_call_expr(expr), symbol_state);
204+
}
205+
else if(expr.id() == ID_hierarchical_identifier)
206+
{
207+
expand_hierarchical_identifier(
208+
to_hierarchical_identifier_expr(expr), symbol_state);
209+
return expr;
210+
}
211+
212+
// Do the operands recursively
213+
for(auto &op : expr.operands())
214+
op = synth_expr(op, symbol_state);
215+
201216
if(expr.id()==ID_symbol)
202217
{
203218
const symbolt &symbol=ns.lookup(to_symbol_expr(expr));
@@ -245,9 +260,6 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
245260
}
246261
else if(expr.id() == ID_concatenation)
247262
{
248-
for(auto &op : expr.operands())
249-
op = synth_expr(op, symbol_state);
250-
251263
if(
252264
expr.type().id() == ID_verilog_unsignedbv ||
253265
expr.type().id() == ID_verilog_signedbv)
@@ -259,31 +271,19 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
259271

260272
return expr;
261273
}
262-
else if(expr.id()==ID_function_call)
263-
{
264-
return expand_function_call(to_function_call_expr(expr), symbol_state);
265-
}
266-
else if(expr.id()==ID_hierarchical_identifier)
267-
{
268-
expand_hierarchical_identifier(
269-
to_hierarchical_identifier_expr(expr),
270-
symbol_state);
271-
return expr;
272-
}
273274
else if(expr.id() == ID_power)
274275
{
275276
auto &power_expr = to_power_expr(expr);
276-
DATA_INVARIANT(
277-
power_expr.lhs().type() == power_expr.type(),
278-
"power expression type consistency");
279-
power_expr.lhs() = synth_expr(power_expr.lhs(), symbol_state);
280-
power_expr.rhs() = synth_expr(power_expr.rhs(), symbol_state);
281277

282278
// encode into aval/bval
283279
if(is_four_valued(expr.type()))
284280
return aval_bval(power_expr);
285281
else
286282
{
283+
DATA_INVARIANT(
284+
power_expr.lhs().type() == power_expr.type(),
285+
"power expression type consistency");
286+
287287
auto rhs_int = numeric_cast<std::size_t>(power_expr.rhs());
288288
if(rhs_int.has_value())
289289
{
@@ -306,7 +306,6 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
306306
{
307307
{
308308
auto &op = to_typecast_expr(expr).op();
309-
op = synth_expr(op, symbol_state);
310309

311310
// we perform some form of simplification for these
312311
if(op.is_constant())
@@ -347,8 +346,6 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
347346
auto &part_select = to_verilog_non_indexed_part_select_expr(expr);
348347
auto &src = part_select.src();
349348

350-
src = synth_expr(src, symbol_state);
351-
352349
auto op1 = numeric_cast_v<mp_integer>(to_constant_expr(part_select.msb()));
353350
auto op2 = numeric_cast_v<mp_integer>(to_constant_expr(part_select.lsb()));
354351

@@ -449,46 +446,30 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
449446
}
450447
else if(expr.id() == ID_verilog_logical_equality)
451448
{
452-
for(auto &op : expr.operands())
453-
op = synth_expr(op, symbol_state);
454449
return aval_bval(to_verilog_logical_equality_expr(expr));
455450
}
456451
else if(expr.id() == ID_verilog_logical_inequality)
457452
{
458-
for(auto &op : expr.operands())
459-
op = synth_expr(op, symbol_state);
460453
return aval_bval(to_verilog_logical_inequality_expr(expr));
461454
}
462455
else if(expr.id() == ID_verilog_wildcard_equality)
463456
{
464-
for(auto &op : expr.operands())
465-
op = synth_expr(op, symbol_state);
466457
return aval_bval(to_verilog_wildcard_equality_expr(expr));
467458
}
468459
else if(expr.id() == ID_verilog_wildcard_inequality)
469460
{
470-
for(auto &op : expr.operands())
471-
op = synth_expr(op, symbol_state);
472461
return aval_bval(to_verilog_wildcard_inequality_expr(expr));
473462
}
474463
else if(expr.id() == ID_not)
475464
{
476465
auto &not_expr = to_not_expr(expr);
477-
not_expr.op() = synth_expr(not_expr.op(), symbol_state);
478466

479467
// encode into aval/bval
480468
if(is_four_valued(expr.type()))
481469
return aval_bval(not_expr);
482470
else
483471
return expr; // leave as is
484472
}
485-
else if(expr.has_operands())
486-
{
487-
for(auto &op : expr.operands())
488-
op = synth_expr(op, symbol_state);
489-
490-
return expr;
491-
}
492473
else
493474
return expr; // leave as is
494475

0 commit comments

Comments
 (0)