#include "ast/simplifiers/bv_bounds_simplifier.h"
#include "ast/simplifiers/dominator_simplifier.h"
#include "ast/rewriter/bv_bounds_base.h"
#include "ast/rewriter/dom_simplifier.h"
#include "ast/rewriter/th_rewriter.h"
class dom_bv_bounds_simplifier : public dom_simplifier, public bv::bv_bounds_base {
params_ref m_params;
th_rewriter m_rewriter;
public:
dom_bv_bounds_simplifier(ast_manager& m, params_ref const& p) :
bv_bounds_base(m), m_rewriter(m) {
updt_params(p);
}
void updt_params(params_ref const & p) override {
m_params.append(p);
m_propagate_eq = p.get_bool("propagate_eq", false);
m_rewriter.updt_params(m_params);
}
void collect_param_descrs(param_descrs& r) override {
th_rewriter::get_param_descrs(r);
r.insert("propagate-eq", CPK_BOOL, "propagate equalities from inequalities", "false");
}
bool assert_expr(expr * t, bool sign) override {
return assert_expr_core(t, sign);
}
void operator()(expr_ref& r) override {
expr_ref result(m);
if (simplify_core(r, result)) {
m_rewriter(result);
r = result;
}
}
void pop(unsigned num_scopes) override {
pop_core(num_scopes);
}
dom_simplifier * translate(ast_manager & m) override {
return alloc(dom_bv_bounds_simplifier, m, m_params);
}
unsigned scope_level() const override {
return m_scopes.size();
}
};
dependent_expr_simplifier* mk_bv_bounds_simplifier(ast_manager& m, params_ref const& p, dependent_expr_state& s) {
return alloc(dominator_simplifier, m, s, alloc(dom_bv_bounds_simplifier, m, p), p);
}