mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
Fix for FP UFs and conversion functions.
This commit is contained in:
parent
883514c195
commit
a951ff0769
|
@ -79,36 +79,16 @@ struct fpa2bv_rewriter_cfg : public default_rewriter_cfg {
|
||||||
br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
|
br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
|
||||||
TRACE("fpa2bv_rw", tout << "APP: " << f->get_name() << std::endl; );
|
TRACE("fpa2bv_rw", tout << "APP: " << f->get_name() << std::endl; );
|
||||||
|
|
||||||
if (f->get_family_id() == null_family_id) {
|
if (num == 0 && f->get_family_id() == null_family_id && m_conv.is_float(f->get_range())) {
|
||||||
if (num == 0) {
|
m_conv.mk_const(f, result);
|
||||||
if (m_conv.is_float(f->get_range())) {
|
return BR_DONE;
|
||||||
m_conv.mk_const(f, result);
|
|
||||||
return BR_DONE;
|
|
||||||
}
|
|
||||||
else if (m_conv.is_rm(f->get_range())) {
|
|
||||||
m_conv.mk_rm_const(f, result);
|
|
||||||
return BR_DONE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return BR_FAILED;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bool is_float_uf = m_conv.is_float(f->get_range()) || m_conv.is_rm(f->get_range());
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < f->get_arity(); i++) {
|
|
||||||
sort * di = f->get_domain()[i];
|
|
||||||
is_float_uf |= m_conv.is_float(di) || m_conv.is_rm(di);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_float_uf) {
|
|
||||||
m_conv.mk_uninterpreted_function(f, num, args, result);
|
|
||||||
return BR_DONE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return BR_FAILED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (num == 0 && f->get_family_id() == null_family_id && m_conv.is_rm(f->get_range())) {
|
||||||
|
m_conv.mk_rm_const(f, result);
|
||||||
|
return BR_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
if (m().is_eq(f)) {
|
if (m().is_eq(f)) {
|
||||||
SASSERT(num == 2);
|
SASSERT(num == 2);
|
||||||
TRACE("fpa2bv_rw", tout << "(= " << mk_ismt2_pp(args[0], m()) << " " <<
|
TRACE("fpa2bv_rw", tout << "(= " << mk_ismt2_pp(args[0], m()) << " " <<
|
||||||
|
@ -199,6 +179,20 @@ struct fpa2bv_rewriter_cfg : public default_rewriter_cfg {
|
||||||
NOT_IMPLEMENTED_YET();
|
NOT_IMPLEMENTED_YET();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
SASSERT(!m_conv.is_float_family(f));
|
||||||
|
bool is_float_uf = m_conv.is_float(f->get_range()) || m_conv.is_rm(f->get_range());
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < f->get_arity(); i++) {
|
||||||
|
sort * di = f->get_domain()[i];
|
||||||
|
is_float_uf |= m_conv.is_float(di) || m_conv.is_rm(di);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_float_uf) {
|
||||||
|
m_conv.mk_uninterpreted_function(f, num, args, result);
|
||||||
|
return BR_DONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return BR_FAILED;
|
return BR_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,8 +331,21 @@ namespace smt {
|
||||||
proof_ref pr(m);
|
proof_ref pr(m);
|
||||||
m_rw(e, e_conv);
|
m_rw(e, e_conv);
|
||||||
|
|
||||||
if (is_app(e_conv) && to_app(e_conv)->get_family_id() != get_family_id()) {
|
if (is_app(e_conv) && to_app(e_conv)->get_family_id() != get_family_id()) {
|
||||||
m_th_rw(e_conv, res);
|
if (!m_fpa_util.is_float(e_conv))
|
||||||
|
m_th_rw(e_conv, res);
|
||||||
|
else {
|
||||||
|
expr_ref bv(m);
|
||||||
|
bv = wrap(e_conv);
|
||||||
|
unsigned bv_sz = m_bv_util.get_bv_size(bv);
|
||||||
|
unsigned ebits = m_fpa_util.get_ebits(m.get_sort(e_conv));
|
||||||
|
unsigned sbits = m_fpa_util.get_sbits(m.get_sort(e_conv));
|
||||||
|
SASSERT(bv_sz == ebits + sbits);
|
||||||
|
m_converter.mk_fp(m_bv_util.mk_extract(bv_sz - 1, bv_sz - 1, bv),
|
||||||
|
m_bv_util.mk_extract(bv_sz - 2, sbits - 1, bv),
|
||||||
|
m_bv_util.mk_extract(sbits - 2, 0, bv),
|
||||||
|
res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (m_fpa_util.is_rm(e)) {
|
else if (m_fpa_util.is_rm(e)) {
|
||||||
SASSERT(is_sort_of(m.get_sort(e_conv), m_bv_util.get_family_id(), BV_SORT));
|
SASSERT(is_sort_of(m.get_sort(e_conv), m_bv_util.get_family_id(), BV_SORT));
|
||||||
|
@ -464,7 +477,7 @@ namespace smt {
|
||||||
else if (m_fpa_util.is_float(e) || m_fpa_util.is_rm(e))
|
else if (m_fpa_util.is_float(e) || m_fpa_util.is_rm(e))
|
||||||
res = convert_term(e);
|
res = convert_term(e);
|
||||||
else if (m_arith_util.is_real(e) || m_bv_util.is_bv(e))
|
else if (m_arith_util.is_real(e) || m_bv_util.is_bv(e))
|
||||||
res = convert_conversion_term(e);
|
res = convert_conversion_term(e);
|
||||||
else
|
else
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
|
||||||
|
@ -643,13 +656,12 @@ namespace smt {
|
||||||
expr_ref xc(m), yc(m);
|
expr_ref xc(m), yc(m);
|
||||||
xc = convert(xe);
|
xc = convert(xe);
|
||||||
yc = convert(ye);
|
yc = convert(ye);
|
||||||
|
|
||||||
|
|
||||||
TRACE("t_fpa_detail", tout << "xc = " << mk_ismt2_pp(xc, m) << std::endl <<
|
TRACE("t_fpa_detail", tout << "xc = " << mk_ismt2_pp(xc, m) << std::endl <<
|
||||||
"yc = " << mk_ismt2_pp(yc, m) << std::endl;);
|
"yc = " << mk_ismt2_pp(yc, m) << std::endl;);
|
||||||
|
|
||||||
expr_ref c(m);
|
expr_ref c(m);
|
||||||
|
|
||||||
if (fu.is_float(xe) && fu.is_float(ye))
|
if (fu.is_float(xe) && fu.is_float(ye))
|
||||||
m_converter.mk_eq(xc, yc, c);
|
m_converter.mk_eq(xc, yc, c);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue