bv_refinementt::approximationt & bv_refinementt::add_approximation( const exprt &expr, bvt &bv) { approximations.push_back(approximationt(approximations.size())); approximationt &a=approximations.back(); // stable! unsigned width=boolbv_width(expr.type()); assert(width!=0); a.expr=expr; a.result_bv=prop.new_variables(width); a.no_operands=expr.operands().size(); set_frozen(a.result_bv); if(a.no_operands==1) { a.op0_bv=convert_bv(expr.op0()); set_frozen(a.op0_bv); } else if(a.no_operands==2) { a.op0_bv=convert_bv(expr.op0()); a.op1_bv=convert_bv(expr.op1()); set_frozen(a.op0_bv); set_frozen(a.op1_bv); } else if(a.no_operands==3) { a.op0_bv=convert_bv(expr.op0()); a.op1_bv=convert_bv(expr.op1()); a.op2_bv=convert_bv(expr.op2()); set_frozen(a.op0_bv); set_frozen(a.op1_bv); set_frozen(a.op2_bv); } else assert(false); bv=a.result_bv; initialize(a); return a; }
void prop_convt::set_frozen(const bvt &bv) { for(unsigned i=0; i<bv.size(); i++) if(!bv[i].is_constant()) set_frozen(bv[i]); }