3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00

Bugfixes for UFs in theory_fpa.

Fixes #591, but performance issues remain.
This commit is contained in:
Christoph M. Wintersteiger 2016-05-14 18:21:53 +01:00
parent c87ffbc3a5
commit bb2c5972c7
4 changed files with 121 additions and 87 deletions

View file

@ -2235,14 +2235,17 @@ void fpa2bv_converter::mk_to_fp(func_decl * f, unsigned num, expr * const * args
SASSERT(is_well_sorted(m, result));
}
void fpa2bv_converter::mk_to_fp_float(func_decl * f, sort * s, expr * rm, expr * x, expr_ref & result) {
SASSERT(is_app_of(rm, m_util.get_family_id(), OP_FPA_INTERNAL_RM));
mk_to_fp_float(s, to_app(rm)->get_arg(0), x, result);
}
void fpa2bv_converter::mk_to_fp_float(sort * to_srt, expr * rm, expr * x, expr_ref & result) {
unsigned from_sbits = m_util.get_sbits(m.get_sort(x));
unsigned from_ebits = m_util.get_ebits(m.get_sort(x));
unsigned to_sbits = m_util.get_sbits(s);
unsigned to_ebits = m_util.get_ebits(s);
SASSERT(is_app_of(rm, m_util.get_family_id(), OP_FPA_INTERNAL_RM));
expr * bv_rm = to_app(rm)->get_arg(0);
unsigned to_sbits = m_util.get_sbits(to_srt);
unsigned to_ebits = m_util.get_ebits(to_srt);
if (from_sbits == to_sbits && from_ebits == to_ebits)
result = x;
@ -2253,20 +2256,20 @@ void fpa2bv_converter::mk_to_fp_float(func_decl * f, sort * s, expr * rm, expr *
one1 = m_bv_util.mk_numeral(1, 1);
expr_ref ninf(m), pinf(m);
mk_pinf(f, pinf);
mk_ninf(f, ninf);
mk_pinf(to_srt, pinf);
mk_ninf(to_srt, ninf);
// NaN -> NaN
mk_is_nan(x, c1);
mk_nan(f, v1);
mk_nan(to_srt, v1);
// +0 -> +0
mk_is_pzero(x, c2);
mk_pzero(f, v2);
mk_pzero(to_srt, v2);
// -0 -> -0
mk_is_nzero(x, c3);
mk_nzero(f, v3);
mk_nzero(to_srt, v3);
// +oo -> +oo
mk_is_pinf(x, c4);
@ -2380,8 +2383,8 @@ void fpa2bv_converter::mk_to_fp_float(func_decl * f, sort * s, expr * rm, expr *
dbg_decouple("fpa2bv_to_float_res_exp", res_exp);
expr_ref rounded(m);
expr_ref rm_e(bv_rm, m);
round(s, rm_e, res_sgn, res_sig, res_exp, rounded);
expr_ref rm_e(rm, m);
round(to_srt, rm_e, res_sgn, res_sig, res_exp, rounded);
expr_ref is_neg(m), sig_inf(m);
m_simp.mk_eq(sgn, one1, is_neg);

View file

@ -144,6 +144,9 @@ public:
void dbg_decouple(const char * prefix, expr_ref & e);
expr_ref_vector m_extra_assertions;
bool is_special(func_decl * f) { return m_specials.contains(f); }
bool is_uf2bvuf(func_decl * f) { return m_uf2bvuf.contains(f); }
protected:
void mk_one(func_decl *f, expr_ref & sign, expr_ref & result);
@ -201,6 +204,8 @@ private:
void mk_div(sort * s, expr_ref & bv_rm, expr_ref & x, expr_ref & y, expr_ref & result);
void mk_rem(sort * s, expr_ref & x, expr_ref & y, expr_ref & result);
void mk_round_to_integral(sort * s, expr_ref & rm, expr_ref & x, expr_ref & result);
void mk_to_fp_float(sort * s, expr * rm, expr * x, expr_ref & result);
};
#endif