示例#1
0
 app * process_bv_mul(func_decl * f, unsigned num, expr * const * args) {
     if (num == 0)
         return nullptr;
     if (uncnstr(num, args)) {
         sort * s = m().get_sort(args[0]);
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         if (m_mc)
             add_defs(num, args, r, m_bv_util.mk_numeral(rational(1), s));
         return r;
     }
     // c * v (c is even) case
     unsigned bv_size;
     rational val;
     rational inv;
     if (num == 2 && 
         uncnstr(args[1]) && 
         m_bv_util.is_numeral(args[0], val, bv_size) &&
         m_bv_util.mult_inverse(val, bv_size, inv)) {
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         sort * s = m().get_sort(args[1]);
         if (m_mc)
             add_def(args[1], m_bv_util.mk_bv_mul(m_bv_util.mk_numeral(inv, s), r));
         return r;
     }
     return nullptr;
 }
示例#2
0
 app * process_arith_mul(func_decl * f, unsigned num, expr * const * args) {
     if (num == 0)
         return nullptr;
     sort * s = m().get_sort(args[0]);
     if (uncnstr(num, args)) {
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         if (m_mc)
             add_defs(num, args, r, m_a_util.mk_numeral(rational(1), s));
         return r;
     }
     // c * v case for reals
     bool is_int;
     rational val;
     if (num == 2 && uncnstr(args[1]) && m_a_util.is_numeral(args[0], val, is_int) && !is_int) {
         if (val.is_zero())
             return nullptr;
         app * r;
         if (!mk_fresh_uncnstr_var_for(f, num, args, r))
             return r;
         if (m_mc) {
             val = rational(1) / val;
             add_def(args[1], m_a_util.mk_mul(m_a_util.mk_numeral(val, false), r));
         }
         return r;
     }
     return nullptr;
 }
bool ssa_prepare::visit(fetch_node& n, bool enter) {
	if (enter) {
	} else {
		add_defs(n);
	}
	return true;
}
bool ssa_prepare::visit(cf_node& n, bool enter) {
	if (enter) {
		push_stk();
	} else {
		add_defs(n);
		pop_stk();
	}
	return true;
}
示例#5
0
 app * process_bv_app(func_decl * f, unsigned num, expr * const * args) {
     SASSERT(f->get_family_id() == m_bv_util.get_family_id());
     switch (f->get_decl_kind()) {
     case OP_BADD:
         return process_add(f->get_family_id(), OP_BADD, OP_BSUB, num, args);
     case OP_BMUL:
         return process_bv_mul(f, num, args);
     case OP_BSDIV:
     case OP_BUDIV:
     case OP_BSDIV_I:
     case OP_BUDIV_I:
         SASSERT(num == 2);
         return process_bv_div(f, args[0], args[1]);
     case OP_SLEQ:
         SASSERT(num == 2);
         return process_bv_le(f, args[0], args[1], true);
     case OP_ULEQ:
         SASSERT(num == 2);
         return process_bv_le(f, args[0], args[1], false);
     case OP_CONCAT:
         return process_concat(f, num, args);
     case OP_EXTRACT:
         SASSERT(num == 1);
         return process_extract(f, args[0]);
     case OP_BNOT:
         SASSERT(num == 1);
         if (uncnstr(args[0])) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             if (m_mc)
                 add_def(args[0], m().mk_app(f, r));
             return r;
         }
         return nullptr;
     case OP_BOR:
         if (num > 0 && uncnstr(num, args)) {
             sort * s = m().get_sort(args[0]);
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             if (m_mc)
                 add_defs(num, args, r, m_bv_util.mk_numeral(rational(0), s));
             return r;
         }
         return nullptr;
     default:
         return nullptr;
     }
 }
示例#6
0
 app * process_basic_app(func_decl * f, unsigned num, expr * const * args) {
     SASSERT(f->get_family_id() == m().get_basic_family_id());
     switch (f->get_decl_kind()) {
     case OP_ITE:
         SASSERT(num == 3);
         if (uncnstr(args[1]) && uncnstr(args[2])) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             add_def(args[1], r);
             add_def(args[2], r);
             return r;
         }
         if (uncnstr(args[0]) && uncnstr(args[1])) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             add_def(args[0], m().mk_true());
             add_def(args[1], r);
             return r;
         }
         if (uncnstr(args[0]) && uncnstr(args[2])) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             add_def(args[0], m().mk_false());
             add_def(args[2], r);
             return r;
         }
         return nullptr;
     case OP_NOT:
         SASSERT(num == 1);
         if (uncnstr(args[0])) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             if (m_mc)
                 add_def(args[0], m().mk_not(r));
             return r;
         }
         return nullptr;
     case OP_AND:
         if (num > 0 && uncnstr(num, args)) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             if (m_mc)
                 add_defs(num, args, r, m().mk_true());
             return r;
         }
         return nullptr;
     case OP_OR:
         if (num > 0 && uncnstr(num, args)) {
             app * r;
             if (!mk_fresh_uncnstr_var_for(f, num, args, r))
                 return r;
             if (m_mc)
                 add_defs(num, args, r, m().mk_false());
             return r;
         }
         return nullptr;
     case OP_IFF:
     case OP_EQ:
         SASSERT(num == 2);
         return process_eq(f, args[0], args[1]);
     default:
         return nullptr;
     }
 }