bvt boolbvt::convert_if(const if_exprt &expr) { std::size_t width=boolbv_width(expr.type()); if(width==0) return bvt(); // An empty bit-vector if. literalt cond=convert(expr.cond()); const bvt &op1_bv=convert_bv(expr.true_case()); const bvt &op2_bv=convert_bv(expr.false_case()); if(op1_bv.size()!=width || op2_bv.size()!=width) throw "operand size mismatch for if "+expr.pretty(); return bv_utils.select(cond, op1_bv, op2_bv); }
void arrayst::add_array_constraints_if( const index_sett &index_set, const if_exprt &expr) { // we got x=(c?a:b) literalt cond_lit=convert(expr.cond()); // get other array index applications // and add c => x[i]=a[i] // !c => x[i]=b[i] // first do true case for(index_sett::const_iterator it=index_set.begin(); it!=index_set.end(); it++) { index_exprt index_expr1; index_expr1.type()=ns.follow(expr.type()).subtype(); index_expr1.array()=expr; index_expr1.index()=*it; index_exprt index_expr2; index_expr2.type()=ns.follow(expr.type()).subtype(); index_expr2.array()=expr.true_case(); index_expr2.index()=*it; assert(index_expr1.type()==index_expr2.type()); // add implication bvt bv; bv.push_back(prop.lnot(cond_lit)); bv.push_back(convert(equality_exprt(index_expr1, index_expr2))); prop.lcnf(bv); } // now the false case for(index_sett::const_iterator it=index_set.begin(); it!=index_set.end(); it++) { index_exprt index_expr1; index_expr1.type()=ns.follow(expr.type()).subtype(); index_expr1.array()=expr; index_expr1.index()=*it; index_exprt index_expr2; index_expr2.type()=ns.follow(expr.type()).subtype(); index_expr2.array()=expr.false_case(); index_expr2.index()=*it; assert(index_expr1.type()==index_expr2.type()); // add implication bvt bv; bv.push_back(cond_lit); bv.push_back(convert(equality_exprt(index_expr1, index_expr2))); prop.lcnf(bv); } }