@@ -405,6 +405,33 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
405
405
406
406
/* ******************************************************************\
407
407
408
+ Function: verilog_synthesist::synthesis_constant
409
+
410
+ Inputs:
411
+
412
+ Outputs:
413
+
414
+ Purpose:
415
+
416
+ \*******************************************************************/
417
+
418
+ std::optional<mp_integer>
419
+ verilog_synthesist::synthesis_constant (const exprt &expr) const
420
+ {
421
+ exprt simplified = simplify_expr (expr, ns);
422
+
423
+ if (!simplified.is_constant ())
424
+ return {};
425
+
426
+ auto number = numeric_cast<mp_integer>(to_constant_expr (simplified));
427
+ if (!number.has_value ())
428
+ DATA_INVARIANT (false , " synthesis_constant expects a numerical type" );
429
+
430
+ return number.value ();
431
+ }
432
+
433
+ /* ******************************************************************\
434
+
408
435
Function: verilog_synthesist::value_mapt::guarded_expr
409
436
410
437
Inputs:
@@ -2950,19 +2977,19 @@ void verilog_synthesist::synth_for(const verilog_fort &statement)
2950
2977
{
2951
2978
exprt tmp_guard=statement.condition ();
2952
2979
tmp_guard = typecast_exprt{tmp_guard, bool_typet{}};
2953
- tmp_guard = synth_expr (tmp_guard, symbol_statet::CURRENT);
2954
- simplify (tmp_guard, ns );
2955
-
2956
- if (!tmp_guard. is_constant ())
2980
+
2981
+ auto guard_value_opt = synthesis_constant (tmp_guard);
2982
+
2983
+ if (!guard_value_opt. has_value ())
2957
2984
{
2958
- throw errort ().with_location (
2959
- to_multi_ary_expr (statement).op1 ().source_location ())
2985
+ throw errort ().with_location (statement.condition ().source_location ())
2960
2986
<< " synthesis failed to evaluate loop guard: `" << to_string (tmp_guard)
2961
2987
<< ' \' ' ;
2962
2988
}
2963
2989
2964
- if (tmp_guard.is_false ()) break ;
2965
-
2990
+ if (guard_value_opt.value () == 0 )
2991
+ break ;
2992
+
2966
2993
// copy the body
2967
2994
verilog_statementt tmp_body=statement.body ();
2968
2995
synth_statement (tmp_body);
0 commit comments