mirror of
https://github.com/Z3Prover/z3
synced 2025-04-10 19:27:06 +00:00
124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
/*++
|
|
Copyright (c) 2006 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
bit_blaster.cpp
|
|
|
|
Abstract:
|
|
|
|
<abstract>
|
|
|
|
Author:
|
|
|
|
Leonardo de Moura (leonardo) 2008-06-05.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include"bit_blaster.h"
|
|
#include"ast_pp.h"
|
|
#include"ast_ll_pp.h"
|
|
|
|
void mk_bits(ast_manager & m, char const * prefix, unsigned sz, expr_ref_vector & r) {
|
|
sort_ref b(m);
|
|
b = m.mk_bool_sort();
|
|
for (unsigned i = 0; i < sz; ++i) {
|
|
char buffer[128];
|
|
#ifdef _WINDOWS
|
|
sprintf_s(buffer, ARRAYSIZE(buffer), "%s%d.smt", prefix, i);
|
|
#else
|
|
sprintf(buffer, "%s%d.smt", prefix, i);
|
|
#endif
|
|
r.push_back(m.mk_const(symbol(buffer), b));
|
|
}
|
|
}
|
|
|
|
void display(std::ostream & out, expr_ref_vector & r, bool ll=true) {
|
|
ast_mark v;
|
|
for (unsigned i = 0; i < r.size(); i++) {
|
|
if (ll)
|
|
ast_ll_pp(out, r.get_manager(), r.get(i), v);
|
|
else
|
|
out << mk_pp(r.get(i), r.get_manager());
|
|
out << "\n";
|
|
}
|
|
}
|
|
|
|
void tst_adder(ast_manager & m, unsigned sz) {
|
|
// expr_ref_vector a(m);
|
|
// expr_ref_vector b(m);
|
|
// expr_ref_vector c(m);
|
|
// mk_bits(m, "a", sz, a);
|
|
// mk_bits(m, "b", sz, b);
|
|
// bool t = true;
|
|
// bit_blaster blaster(m, t);
|
|
// blaster.mk_adder(sz, a.c_ptr(), b.c_ptr(), c);
|
|
// TRACE("bit_blaster", display(tout, c););
|
|
}
|
|
|
|
void tst_multiplier(ast_manager & m, unsigned sz) {
|
|
// expr_ref_vector a(m);
|
|
// expr_ref_vector b(m);
|
|
// expr_ref_vector c(m);
|
|
// mk_bits(m, "a", sz, a);
|
|
// mk_bits(m, "b", sz, b);
|
|
// bool t = true;
|
|
// bit_blaster blaster(m, t);
|
|
// blaster.mk_multiplier(sz, a.c_ptr(), b.c_ptr(), c);
|
|
// TRACE("bit_blaster", display(tout, c););
|
|
}
|
|
|
|
void tst_le(ast_manager & m, unsigned sz) {
|
|
// expr_ref_vector a(m);
|
|
// expr_ref_vector b(m);
|
|
// expr_ref out(m);
|
|
// mk_bits(m, "a", sz, a);
|
|
// mk_bits(m, "b", sz, b);
|
|
// bool t = true;
|
|
// bit_blaster blaster(m, t);
|
|
// blaster.mk_ule(sz, a.c_ptr(), b.c_ptr(), out);
|
|
// TRACE("bit_blaster", tout << mk_pp(out, m) << "\n";);
|
|
// blaster.mk_sle(sz, a.c_ptr(), b.c_ptr(), out);
|
|
// TRACE("bit_blaster", tout << mk_pp(out, m) << "\n";);
|
|
}
|
|
|
|
void tst_eqs(ast_manager & m, unsigned sz) {
|
|
// expr_ref_vector a(m);
|
|
// expr_ref_vector b(m);
|
|
// expr_ref out(m);
|
|
// mk_bits(m, "a", sz, a);
|
|
// bool t = true;
|
|
// bit_blaster blaster(m, t);
|
|
// blaster.mk_eqs(sz, a.c_ptr(), b);
|
|
// TRACE("bit_blaster", display(tout, b, false););
|
|
}
|
|
|
|
void tst_sh(ast_manager & m, unsigned sz) {
|
|
// expr_ref_vector a(m);
|
|
// expr_ref_vector b(m);
|
|
// expr_ref_vector c(m);
|
|
// mk_bits(m, "a", sz, a);
|
|
// mk_bits(m, "b", sz, b);
|
|
// bool t = true;
|
|
// bit_blaster blaster(m, t);
|
|
// blaster.mk_shl(sz, a.c_ptr(), b.c_ptr(), c);
|
|
// TRACE("bit_blaster", tout << "shl\n"; display(tout, c););
|
|
// c.reset();
|
|
// blaster.mk_lshr(sz, a.c_ptr(), b.c_ptr(), c);
|
|
// TRACE("bit_blaster", tout << "lshr\n"; display(tout, c););
|
|
// c.reset();
|
|
// blaster.mk_ashr(sz, a.c_ptr(), b.c_ptr(), c);
|
|
// TRACE("bit_blaster", tout << "ashr " << c.size() << "\n"; display(tout, c, false););
|
|
}
|
|
|
|
void tst_bit_blaster() {
|
|
ast_manager m;
|
|
tst_adder(m, 4);
|
|
tst_multiplier(m, 4);
|
|
tst_le(m, 4);
|
|
tst_eqs(m, 8);
|
|
tst_sh(m, 4);
|
|
}
|