@@ -141,9 +141,15 @@ class convert_trans_to_netlistt:public messaget
141141
142142 literalt convert_rhs (const rhst &);
143143
144- void finalize_lhs (lhs_mapt::iterator);
145-
146- void convert_lhs_rec (const exprt &expr, std::size_t from, std::size_t to);
144+ // The bv_varidts of the definitions that are yet to be processed.
145+ using lhs_stackt = std::stack<lhs_mapt::iterator>;
146+ void add_to_stack (
147+ const exprt &expr,
148+ std::size_t from,
149+ std::size_t to,
150+ lhs_stackt &);
151+ void lhs_loop (lhs_stackt &);
152+ void finalize_definition (lhs_mapt::iterator);
147153
148154 void convert_constraints ();
149155
@@ -335,13 +341,17 @@ void convert_trans_to_netlistt::operator()(
335341 add_constraint (trans.invar ());
336342 add_constraint (trans.trans ());
337343
338- // do recursive conversion for LHSs
339- for (lhs_mapt::iterator
340- it=lhs_map.begin ();
341- it!=lhs_map.end ();
342- it++)
343344 {
344- finalize_lhs (it);
345+ // ensure all LHSs will be processed
346+ lhs_stackt lhs_stack;
347+
348+ for (lhs_mapt::iterator
349+ it=lhs_map.begin ();
350+ it!=lhs_map.end ();
351+ it++)
352+ {
353+ lhs_stack.push (it);
354+ }
345355 }
346356
347357 // finish the var_map
@@ -568,7 +578,23 @@ void convert_trans_to_netlistt::finalize_lhs(lhs_mapt::iterator lhs_it)
568578
569579/* ******************************************************************\
570580
571- Function: convert_trans_to_netlistt::convert_lhs_rec
581+ Function: convert_trans_to_netlistt::lhs_loop
582+
583+ Inputs:
584+
585+ Outputs:
586+
587+ Purpose:
588+
589+ \*******************************************************************/
590+
591+ void convert_trans_to_netlistt::lhs_loop (lhs_stackt &lhs_stack)
592+ {
593+ }
594+
595+ /* ******************************************************************\
596+
597+ Function: convert_trans_to_netlistt::add_to_stack
572598
573599 Inputs:
574600
@@ -578,10 +604,11 @@ Function: convert_trans_to_netlistt::convert_lhs_rec
578604
579605\*******************************************************************/
580606
581- void convert_trans_to_netlistt::convert_lhs_rec (
607+ void convert_trans_to_netlistt::add_to_stack (
582608 const exprt &expr,
583609 std::size_t from,
584- std::size_t to)
610+ std::size_t to,
611+ lhs_stackt &lhs_stack)
585612{
586613 PRECONDITION (from <= to);
587614
@@ -604,7 +631,9 @@ void convert_trans_to_netlistt::convert_lhs_rec(
604631 // we only need to do wires
605632 if (!it->second .var ->is_wire ()) return ;
606633
607- finalize_lhs (it);
634+ // only push if not already done
635+ if (!it->second .converted )
636+ lhs_stack.push (it);
608637 }
609638
610639 return ;
@@ -616,7 +645,7 @@ void convert_trans_to_netlistt::convert_lhs_rec(
616645 to_extractbit_expr (expr).index (), i)) // constant?
617646 {
618647 from = i.to_ulong ();
619- convert_lhs_rec (to_extractbit_expr (expr).src (), from, from);
648+ add_to_stack (to_extractbit_expr (expr).src (), from, from, lhs_stack );
620649 return ;
621650 }
622651 }
@@ -635,7 +664,7 @@ void convert_trans_to_netlistt::convert_lhs_rec(
635664 from = new_from.to_ulong ();
636665 to = new_to.to_ulong ();
637666
638- convert_lhs_rec (to_extractbits_expr (expr).src (), from, to);
667+ add_to_stack (to_extractbits_expr (expr).src (), from, to, lhs_stack );
639668 return ;
640669 }
641670 }
@@ -655,7 +684,7 @@ void convert_trans_to_netlistt::convert_lhs_rec(
655684 if (width==0 )
656685 continue ;
657686
658- convert_lhs_rec (*it, 0 , width - 1 );
687+ add_to_stack (*it, 0 , width - 1 , lhs_stack );
659688 }
660689}
661690
@@ -679,7 +708,7 @@ literalt convert_trans_to_netlistt::convert_rhs(const rhst &rhs)
679708 if (!rhs_entry.converted )
680709 {
681710 // get all lhs symbols this depends on
682- convert_lhs_rec (rhs_entry.expr , 0 , rhs_entry.width - 1 );
711+ add_to_stack (rhs_entry.expr , 0 , rhs_entry.width - 1 , lhs_stack );
683712
684713 rhs_entry.converted =true ;
685714
0 commit comments