mirror of
https://github.com/Z3Prover/z3
synced 2025-04-14 21:08:46 +00:00
73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
/*++
|
|
Copyright (c) 2011 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
fpa_factory.h
|
|
|
|
Abstract:
|
|
|
|
Floating-Point Theory Plugin
|
|
|
|
Author:
|
|
|
|
Christoph (cwinter) 2014-04-23
|
|
|
|
--*/
|
|
#pragma once
|
|
|
|
#include "ast/seq_decl_plugin.h"
|
|
#include "model/model_core.h"
|
|
#include "model/value_factory.h"
|
|
|
|
class fpa_value_factory : public value_factory {
|
|
fpa_util m_util;
|
|
|
|
virtual app * mk_value_core(mpf const & val, sort * s) {
|
|
SASSERT(m_util.get_ebits(s) == val.get_ebits());
|
|
SASSERT(m_util.get_sbits(s) == val.get_sbits());
|
|
return m_util.mk_value(val);
|
|
}
|
|
|
|
public:
|
|
fpa_value_factory(ast_manager & m, family_id fid) :
|
|
value_factory(m, fid),
|
|
m_util(m) {}
|
|
|
|
expr * get_some_value(sort * s) override {
|
|
mpf_manager & mpfm = m_util.fm();
|
|
|
|
if (m_util.is_rm(s))
|
|
return m_util.mk_round_toward_zero();
|
|
else {
|
|
scoped_mpf q(mpfm);
|
|
mpfm.set(q, m_util.get_ebits(s), m_util.get_sbits(s), 0);
|
|
return m_util.mk_value(q);
|
|
}
|
|
}
|
|
|
|
bool get_some_values(sort * s, expr_ref & v1, expr_ref & v2) override {
|
|
mpf_manager & mpfm = m_util.fm();
|
|
|
|
if (m_util.is_rm(s))
|
|
v1 = v2 = m_util.mk_round_toward_zero();
|
|
else {
|
|
scoped_mpf q(mpfm);
|
|
mpfm.set(q, m_util.get_ebits(s), m_util.get_sbits(s), 0);
|
|
v1 = m_util.mk_value(q);
|
|
mpfm.set(q, m_util.get_ebits(s), m_util.get_sbits(s), 1);
|
|
v2 = m_util.mk_value(q);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
expr * get_fresh_value(sort * s) override { return get_some_value(s); }
|
|
void register_value(expr * n) override { /* Ignore */ }
|
|
|
|
app * mk_value(mpf const & x) {
|
|
return m_util.mk_value(x);
|
|
}
|
|
};
|
|
|
|
|