Skip to content

Commit 2e12938

Browse files
committed
netlist conversion: replace recursion by explicit stack
1 parent f4f5c9e commit 2e12938

File tree

1 file changed

+46
-17
lines changed

1 file changed

+46
-17
lines changed

src/trans-netlist/trans_to_netlist.cpp

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)