summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/prop/bvminisat/bvminisat.cpp100
-rw-r--r--src/prop/bvminisat/bvminisat.h33
-rw-r--r--src/prop/bvminisat/core/Solver.cc144
-rw-r--r--src/prop/bvminisat/core/Solver.h43
-rw-r--r--src/prop/bvminisat/core/SolverTypes.h13
-rw-r--r--src/prop/bvminisat/simp/SimpSolver.cc15
-rw-r--r--src/prop/bvminisat/simp/SimpSolver.h14
-rw-r--r--src/prop/cryptominisat/MTRand/Makefile.in141
-rw-r--r--src/prop/cryptominisat/Makefile.in369
-rw-r--r--src/prop/cryptominisat/Solver/Makefile.in198
-rw-r--r--src/prop/cryptominisat/man/Makefile.in141
-rw-r--r--src/prop/cryptominisat/mtl/Makefile.in141
-rw-r--r--src/prop/minisat/core/Solver.cc2
-rw-r--r--src/prop/sat_solver.h11
-rw-r--r--src/prop/sat_solver_factory.cpp4
-rw-r--r--src/prop/sat_solver_factory.h2
-rw-r--r--src/theory/bv/bitblast_strategies.cpp237
-rw-r--r--src/theory/bv/bv_sat.cpp100
-rw-r--r--src/theory/bv/bv_sat.h13
-rw-r--r--src/theory/bv/kinds10
-rw-r--r--src/theory/bv/theory_bv.cpp109
-rw-r--r--src/theory/bv/theory_bv.h10
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules.h50
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h144
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_core.h40
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_normalization.h577
-rw-r--r--src/theory/bv/theory_bv_rewrite_rules_simplification.h355
-rw-r--r--src/theory/bv/theory_bv_rewriter.cpp256
-rw-r--r--src/theory/bv/theory_bv_rewriter.h78
-rw-r--r--src/theory/bv/theory_bv_utils.h45
-rw-r--r--src/util/bitvector.h4
-rw-r--r--test/regress/regress0/bv/fuzz01.smt183
-rw-r--r--test/regress/regress0/bv/fuzz02.smt122
-rw-r--r--test/regress/regress0/bv/fuzz03.smt81
-rw-r--r--test/regress/regress0/bv/fuzz04.smt249
-rw-r--r--test/regress/regress0/bv/fuzz05.smt282
-rw-r--r--test/regress/regress0/bv/fuzz06.smt218
-rw-r--r--test/regress/regress0/bv/fuzz07.smt395
-rw-r--r--test/regress/regress0/bv/fuzz08.smt19
-rw-r--r--test/regress/regress0/bv/fuzz09.smt370
40 files changed, 4462 insertions, 856 deletions
diff --git a/src/prop/bvminisat/bvminisat.cpp b/src/prop/bvminisat/bvminisat.cpp
index b32483cbe..232502696 100644
--- a/src/prop/bvminisat/bvminisat.cpp
+++ b/src/prop/bvminisat/bvminisat.cpp
@@ -22,13 +22,19 @@
using namespace CVC4;
using namespace prop;
-BVMinisatSatSolver::BVMinisatSatSolver() :
- d_minisat(new BVMinisat::SimpSolver())
+BVMinisatSatSolver::BVMinisatSatSolver(context::Context* mainSatContext)
+: context::ContextNotifyObj(mainSatContext, false),
+ d_minisat(new BVMinisat::SimpSolver(mainSatContext)),
+ d_solveCount(0),
+ d_assertionsCount(0),
+ d_assertionsRealCount(mainSatContext, 0),
+ d_lastPropagation(mainSatContext, 0)
{
- d_statistics.init(d_minisat);
+ d_statistics.init(d_minisat);
}
-BVMinisatSatSolver::~BVMinisatSatSolver() {
+
+BVMinisatSatSolver::~BVMinisatSatSolver() throw(AssertionException) {
delete d_minisat;
}
@@ -42,6 +48,42 @@ void BVMinisatSatSolver::addClause(SatClause& clause, bool removable) {
d_minisat->addClause(minisat_clause);
}
+void BVMinisatSatSolver::addMarkerLiteral(SatLiteral lit) {
+ d_minisat->addMarkerLiteral(BVMinisat::var(toMinisatLit(lit)));
+}
+
+bool BVMinisatSatSolver::getPropagations(std::vector<SatLiteral>& propagations) {
+ for (; d_lastPropagation < d_minisat->atom_propagations.size(); d_lastPropagation = d_lastPropagation + 1) {
+ propagations.push_back(toSatLiteral(d_minisat->atom_propagations[d_lastPropagation]));
+ }
+ return propagations.size() > 0;
+}
+
+void BVMinisatSatSolver::explainPropagation(SatLiteral lit, std::vector<SatLiteral>& explanation) {
+ std::vector<BVMinisat::Lit> minisat_explanation;
+ d_minisat->explainPropagation(toMinisatLit(lit), minisat_explanation);
+ for (unsigned i = 0; i < minisat_explanation.size(); ++i) {
+ explanation.push_back(toSatLiteral(minisat_explanation[i]));
+ }
+}
+
+SatValue BVMinisatSatSolver::assertAssumption(SatLiteral lit, bool propagate) {
+ d_assertionsCount ++;
+ d_assertionsRealCount = d_assertionsRealCount + 1;
+ return toSatLiteralValue(d_minisat->assertAssumption(toMinisatLit(lit), propagate));
+}
+
+void BVMinisatSatSolver::notify() {
+ while (d_assertionsCount > d_assertionsRealCount) {
+ popAssumption();
+ d_assertionsCount --;
+ }
+}
+
+void BVMinisatSatSolver::popAssumption() {
+ d_minisat->popAssumption();
+}
+
SatVariable BVMinisatSatSolver::newVar(bool freeze){
return d_minisat->newVar(true, true, freeze);
}
@@ -74,20 +116,28 @@ SatValue BVMinisatSatSolver::solve(long unsigned int& resource){
return result;
}
-SatValue BVMinisatSatSolver::solve(const context::CDList<SatLiteral> & assumptions){
- Debug("sat::minisat") << "Solve with assumptions ";
- context::CDList<SatLiteral>::const_iterator it = assumptions.begin();
- BVMinisat::vec<BVMinisat::Lit> assump;
- for(; it!= assumptions.end(); ++it) {
- SatLiteral lit = *it;
- Debug("sat::minisat") << lit <<" ";
- assump.push(toMinisatLit(lit));
- }
- Debug("sat::minisat") <<"\n";
-
- SatValue result = toSatLiteralValue(d_minisat->solve(assump));
- return result;
-}
+// SatValue BVMinisatSatSolver::solve(const context::CDList<SatLiteral> & assumptions, bool only_bcp){
+// ++d_solveCount;
+// ++d_statistics.d_statCallsToSolve;
+
+// Debug("sat::minisat") << "Solve with assumptions ";
+// context::CDList<SatLiteral>::const_iterator it = assumptions.begin();
+// BVMinisat::vec<BVMinisat::Lit> assump;
+// for(; it!= assumptions.end(); ++it) {
+// SatLiteral lit = *it;
+// Debug("sat::minisat") << lit <<" ";
+// assump.push(toMinisatLit(lit));
+// }
+// Debug("sat::minisat") <<"\n";
+
+// clock_t begin, end;
+// begin = clock();
+// d_minisat->setOnlyBCP(only_bcp);
+// SatLiteralValue result = toSatLiteralValue(d_minisat->solve(assump));
+// end = clock();
+// d_statistics.d_statSolveTime = d_statistics.d_statSolveTime.getData() + (end - begin)/(double)CLOCKS_PER_SEC;
+// return result;
+// }
void BVMinisatSatSolver::getUnsatCore(SatClause& unsatCore) {
@@ -98,13 +148,11 @@ void BVMinisatSatSolver::getUnsatCore(SatClause& unsatCore) {
}
SatValue BVMinisatSatSolver::value(SatLiteral l){
- Unimplemented();
- return SAT_VALUE_UNKNOWN;
+ return toSatLiteralValue(d_minisat->value(toMinisatLit(l)));
}
SatValue BVMinisatSatSolver::modelValue(SatLiteral l){
- Unimplemented();
- return SAT_VALUE_UNKNOWN;
+ return toSatLiteralValue(d_minisat->modelValue(toMinisatLit(l)));
}
void BVMinisatSatSolver::unregisterVar(SatLiteral lit) {
@@ -191,7 +239,9 @@ BVMinisatSatSolver::Statistics::Statistics() :
d_statLearntsLiterals("theory::bv::bvminisat::learnts_literals"),
d_statMaxLiterals("theory::bv::bvminisat::max_literals"),
d_statTotLiterals("theory::bv::bvminisat::tot_literals"),
- d_statEliminatedVars("theory::bv::bvminisat::eliminated_vars")
+ d_statEliminatedVars("theory::bv::bvminisat::eliminated_vars"),
+ d_statCallsToSolve("theory::bv::bvminisat::calls_to_solve", 0),
+ d_statSolveTime("theory::bv::bvminisat::solve_time", 0)
{
StatisticsRegistry::registerStat(&d_statStarts);
StatisticsRegistry::registerStat(&d_statDecisions);
@@ -203,6 +253,8 @@ BVMinisatSatSolver::Statistics::Statistics() :
StatisticsRegistry::registerStat(&d_statMaxLiterals);
StatisticsRegistry::registerStat(&d_statTotLiterals);
StatisticsRegistry::registerStat(&d_statEliminatedVars);
+ StatisticsRegistry::registerStat(&d_statCallsToSolve);
+ StatisticsRegistry::registerStat(&d_statSolveTime);
}
BVMinisatSatSolver::Statistics::~Statistics() {
@@ -216,6 +268,8 @@ BVMinisatSatSolver::Statistics::~Statistics() {
StatisticsRegistry::unregisterStat(&d_statMaxLiterals);
StatisticsRegistry::unregisterStat(&d_statTotLiterals);
StatisticsRegistry::unregisterStat(&d_statEliminatedVars);
+ StatisticsRegistry::unregisterStat(&d_statCallsToSolve);
+ StatisticsRegistry::unregisterStat(&d_statSolveTime);
}
void BVMinisatSatSolver::Statistics::init(BVMinisat::SimpSolver* minisat){
diff --git a/src/prop/bvminisat/bvminisat.h b/src/prop/bvminisat/bvminisat.h
index 4ca1164c0..19b605067 100644
--- a/src/prop/bvminisat/bvminisat.h
+++ b/src/prop/bvminisat/bvminisat.h
@@ -21,16 +21,27 @@
#include "prop/sat_solver.h"
#include "prop/sat_solver_registry.h"
#include "prop/bvminisat/simp/SimpSolver.h"
+#include "context/cdo.h"
namespace CVC4 {
namespace prop {
-class BVMinisatSatSolver: public BVSatSolverInterface {
+class BVMinisatSatSolver: public BVSatSolverInterface, public context::ContextNotifyObj {
BVMinisat::SimpSolver* d_minisat;
+ unsigned d_solveCount;
+ unsigned d_assertionsCount;
+ context::CDO<unsigned> d_assertionsRealCount;
+ context::CDO<unsigned> d_lastPropagation;
public:
- BVMinisatSatSolver();
- ~BVMinisatSatSolver();
+ BVMinisatSatSolver() :
+ ContextNotifyObj(NULL, false),
+ d_assertionsRealCount(NULL, (unsigned)0),
+ d_lastPropagation(NULL, (unsigned)0)
+ { Unreachable(); }
+ BVMinisatSatSolver(context::Context* mainSatContext);
+ ~BVMinisatSatSolver() throw(AssertionException);
+
void addClause(SatClause& clause, bool removable);
SatVariable newVar(bool theoryAtom = false);
@@ -38,10 +49,11 @@ public:
void markUnremovable(SatLiteral lit);
void interrupt();
-
+ void notify();
+
SatValue solve();
SatValue solve(long unsigned int&);
- SatValue solve(const context::CDList<SatLiteral> & assumptions);
+ SatValue solve(bool quick_solve);
void getUnsatCore(SatClause& unsatCore);
SatValue value(SatLiteral l);
@@ -62,6 +74,15 @@ public:
static void toMinisatClause(SatClause& clause, BVMinisat::vec<BVMinisat::Lit>& minisat_clause);
static void toSatClause (BVMinisat::vec<BVMinisat::Lit>& clause, SatClause& sat_clause);
+ void addMarkerLiteral(SatLiteral lit);
+
+ bool getPropagations(std::vector<SatLiteral>& propagations);
+
+ void explainPropagation(SatLiteral lit, std::vector<SatLiteral>& explanation);
+
+ SatValue assertAssumption(SatLiteral lit, bool propagate);
+
+ void popAssumption();
class Statistics {
public:
@@ -71,6 +92,8 @@ public:
ReferenceStat<uint64_t> d_statLearntsLiterals, d_statMaxLiterals;
ReferenceStat<uint64_t> d_statTotLiterals;
ReferenceStat<int> d_statEliminatedVars;
+ IntStat d_statCallsToSolve;
+ BackedStat<double> d_statSolveTime;
Statistics();
~Statistics();
void init(BVMinisat::SimpSolver* minisat);
diff --git a/src/prop/bvminisat/core/Solver.cc b/src/prop/bvminisat/core/Solver.cc
index 7ff7b50db..5066d5d8f 100644
--- a/src/prop/bvminisat/core/Solver.cc
+++ b/src/prop/bvminisat/core/Solver.cc
@@ -22,8 +22,10 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
#include "mtl/Sort.h"
#include "core/Solver.h"
+#include <vector>
#include <iostream>
#include "util/output.h"
+#include "util/utility.h"
using namespace BVMinisat;
@@ -64,7 +66,7 @@ static DoubleOption opt_garbage_frac (_cat, "gc-frac", "The fraction o
// Constructor/Destructor:
-Solver::Solver() :
+Solver::Solver(CVC4::context::Context* c) :
// Parameters (user settable):
//
@@ -112,6 +114,8 @@ Solver::Solver() :
, conflict_budget (-1)
, propagation_budget (-1)
, asynch_interrupt (false)
+ , only_bcp(false)
+ , d_explanations(c)
{}
@@ -134,6 +138,7 @@ Var Solver::newVar(bool sign, bool dvar)
watches .init(mkLit(v, true ));
assigns .push(l_Undef);
vardata .push(mkVarData(CRef_Undef, 0));
+ marker .push(0);
//activity .push(0);
activity .push(rnd_init_act ? drand(random_seed) * 0.00001 : 0);
seen .push(0);
@@ -226,13 +231,20 @@ void Solver::cancelUntil(int level) {
for (int c = trail.size()-1; c >= trail_lim[level]; c--){
Var x = var(trail[c]);
assigns [x] = l_Undef;
+ if (marker[x] == 2) marker[x] = 1;
if (phase_saving > 1 || (phase_saving == 1) && c > trail_lim.last())
polarity[x] = sign(trail[c]);
insertVarOrder(x); }
qhead = trail_lim[level];
trail.shrink(trail.size() - trail_lim[level]);
trail_lim.shrink(trail_lim.size() - level);
- } }
+ }
+
+ if (level < atom_propagations_lim.size()) {
+ atom_propagations.shrink(atom_propagations.size() - atom_propagations_lim[level]);
+ atom_propagations_lim.shrink(atom_propagations_lim.size() - level);
+ }
+}
//=================================================================================================
@@ -278,7 +290,7 @@ Lit Solver::pickBranchLit()
| rest of literals. There may be others from the same level though.
|
|________________________________________________________________________________________________@*/
-void Solver::analyze(CRef confl, vec<Lit>& out_learnt, int& out_btlevel)
+void Solver::analyze(CRef confl, vec<Lit>& out_learnt, int& out_btlevel, UIP uip)
{
int pathC = 0;
Lit p = lit_Undef;
@@ -288,6 +300,7 @@ void Solver::analyze(CRef confl, vec<Lit>& out_learnt, int& out_btlevel)
out_learnt.push(); // (leave room for the asserting literal)
int index = trail.size() - 1;
+ bool done = false;
do{
assert(confl != CRef_Undef); // (otherwise should be UIP)
Clause& c = ca[confl];
@@ -315,7 +328,18 @@ void Solver::analyze(CRef confl, vec<Lit>& out_learnt, int& out_btlevel)
seen[var(p)] = 0;
pathC--;
- }while (pathC > 0);
+ switch (uip) {
+ case UIP_FIRST:
+ done = pathC == 0;
+ break;
+ case UIP_LAST:
+ done = confl == CRef_Undef || (pathC == 0 && marker[var(p)] == 2);
+ break;
+ default:
+ Unreachable();
+ break;
+ }
+ } while (!done);
out_learnt[0] = ~p;
// Simplify conflict clause:
@@ -427,8 +451,10 @@ void Solver::analyzeFinal(Lit p, vec<Lit>& out_conflict)
Var x = var(trail[i]);
if (seen[x]){
if (reason(x) == CRef_Undef){
+ if (marker[x] == 2) {
assert(level(x) > 0);
out_conflict.push(~trail[i]);
+ }
}else{
Clause& c = ca[reason(x)];
for (int j = 1; j < c.size(); j++)
@@ -449,8 +475,34 @@ void Solver::uncheckedEnqueue(Lit p, CRef from)
assigns[var(p)] = lbool(!sign(p));
vardata[var(p)] = mkVarData(from, decisionLevel());
trail.push_(p);
+ if (only_bcp && marker[var(p)] == 1 && from != CRef_Undef) {
+ atom_propagations.push(p);
+ }
+}
+
+void Solver::popAssumption() {
+ marker[var(assumptions.last())] = 1;
+ assumptions.pop();
+ conflict.clear();
+ cancelUntil(assumptions.size());
}
+lbool Solver::assertAssumption(Lit p, bool propagate) {
+
+ assert(marker[var(p)] == 1);
+
+ // add to the assumptions
+ assumptions.push(p);
+ conflict.clear();
+
+ // run the propagation
+ if (propagate) {
+ only_bcp = true;
+ return search(-1, UIP_FIRST);
+ } else {
+ return l_True;
+ }
+}
/*_________________________________________________________________________________________________
|
@@ -628,7 +680,7 @@ bool Solver::simplify()
| all variables are decision variables, this means that the clause set is satisfiable. 'l_False'
| if the clause set is unsatisfiable. 'l_Undef' if the bound on number of conflicts is reached.
|________________________________________________________________________________________________@*/
-lbool Solver::search(int nof_conflicts)
+lbool Solver::search(int nof_conflicts, UIP uip)
{
assert(ok);
int backtrack_level;
@@ -644,17 +696,27 @@ lbool Solver::search(int nof_conflicts)
if (decisionLevel() == 0) return l_False;
learnt_clause.clear();
- analyze(confl, learnt_clause, backtrack_level);
+ analyze(confl, learnt_clause, backtrack_level, uip);
cancelUntil(backtrack_level);
+ Lit p = learnt_clause[0];
+ bool assumption = marker[var(p)] == 2;
+
if (learnt_clause.size() == 1){
- uncheckedEnqueue(learnt_clause[0]);
+ uncheckedEnqueue(p);
}else{
CRef cr = ca.alloc(learnt_clause, true);
learnts.push(cr);
attachClause(cr);
claBumpActivity(ca[cr]);
- uncheckedEnqueue(learnt_clause[0], cr);
+ uncheckedEnqueue(p, cr);
+ }
+
+ // if an assumption, we're done
+ if (assumption) {
+ assert(decisionLevel() < assumptions.size());
+ analyzeFinal(p, conflict);
+ return l_False;
}
varDecayActivity();
@@ -699,12 +761,18 @@ lbool Solver::search(int nof_conflicts)
analyzeFinal(~p, conflict);
return l_False;
}else{
+ marker[var(p)] = 2;
next = p;
break;
}
}
if (next == lit_Undef){
+
+ if (only_bcp) {
+ return l_True;
+ }
+
// New variable decision:
decisions++;
next = pickBranchLit();
@@ -767,10 +835,12 @@ static double luby(double y, int x){
// NOTE: assumptions passed in member-variable 'assumptions'.
lbool Solver::solve_()
{
- Debug("bvminisat") <<"BVMinisat::Solving learned clauses " << learnts.size() <<"\n";
- Debug("bvminisat") <<"BVMinisat::Solving assumptions " << assumptions.size() <<"\n";
+ Debug("bvminisat") <<"BVMinisat::Solving learned clauses " << learnts.size() <<"\n";
+ Debug("bvminisat") <<"BVMinisat::Solving assumptions " << assumptions.size() <<"\n";
+
model.clear();
conflict.clear();
+
if (!ok) return l_False;
solves++;
@@ -799,19 +869,56 @@ lbool Solver::solve_()
if (verbosity >= 1)
printf("===============================================================================\n");
-
if (status == l_True){
// Extend & copy model:
- model.growTo(nVars());
- for (int i = 0; i < nVars(); i++) model[i] = value(i);
+ // model.growTo(nVars());
+ // for (int i = 0; i < nVars(); i++) model[i] = value(i);
}else if (status == l_False && conflict.size() == 0)
ok = false;
- cancelUntil(0);
return status;
}
//=================================================================================================
+// Bitvector propagations
+//
+
+void Solver::storeExplanation(Lit p) {
+}
+
+void Solver::explainPropagation(Lit p, std::vector<Lit>& explanation) {
+ vec<Lit> queue;
+ queue.push(p);
+
+ __gnu_cxx::hash_set<Var> visited;
+ visited.insert(var(p));
+ while(queue.size() > 0) {
+ Lit l = queue.last();
+ assert(value(l) == l_True);
+ queue.pop();
+ if (reason(var(l)) == CRef_Undef) {
+ if (marker[var(l)] == 2) {
+ explanation.push_back(l);
+ visited.insert(var(l));
+ }
+ } else {
+ Clause& c = ca[reason(var(l))];
+ for (int i = 1; i < c.size(); ++i) {
+ if (var(c[i]) >= vardata.size()) {
+ std::cerr << "BOOM" << std::endl;
+ }
+ if (visited.count(var(c[i])) == 0) {
+ queue.push(~c[i]);
+ visited.insert(var(c[i]));
+ }
+ }
+ }
+ }
+}
+
+
+
+//=================================================================================================
// Writing CNF to DIMACS:
//
// FIXME: this needs to be rewritten completely.
@@ -872,13 +979,13 @@ void Solver::toDimacs(FILE* f, const vec<Lit>& assumps)
}
// Assumptions are added as unit clauses:
- cnt += assumptions.size();
+ cnt += assumps.size();
fprintf(f, "p cnf %d %d\n", max, cnt);
- for (int i = 0; i < assumptions.size(); i++){
- assert(value(assumptions[i]) != l_False);
- fprintf(f, "%s%d 0\n", sign(assumptions[i]) ? "-" : "", mapVar(var(assumptions[i]), map, max)+1);
+ for (int i = 0; i < assumps.size(); i++){
+ assert(value(assumps[i]) != l_False);
+ fprintf(f, "%s%d 0\n", sign(assumps[i]) ? "-" : "", mapVar(var(assumps[i]), map, max)+1);
}
for (int i = 0; i < clauses.size(); i++)
@@ -940,4 +1047,3 @@ void Solver::garbageCollect()
ca.size()*ClauseAllocator::Unit_Size, to.size()*ClauseAllocator::Unit_Size);
to.moveTo(ca);
}
-
diff --git a/src/prop/bvminisat/core/Solver.h b/src/prop/bvminisat/core/Solver.h
index f364a2937..33d1900c9 100644
--- a/src/prop/bvminisat/core/Solver.h
+++ b/src/prop/bvminisat/core/Solver.h
@@ -27,6 +27,10 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
#include "prop/bvminisat/mtl/Alg.h"
#include "prop/bvminisat/utils/Options.h"
+#include "context/cdhashmap.h"
+
+#include <ext/hash_set>
+#include <vector>
namespace BVMinisat {
@@ -38,7 +42,7 @@ public:
// Constructor/Destructor:
//
- Solver();
+ Solver(CVC4::context::Context* c);
virtual ~Solver();
// Problem specification:
@@ -63,6 +67,8 @@ public:
bool solve (Lit p, Lit q); // Search for a model that respects two assumptions.
bool solve (Lit p, Lit q, Lit r); // Search for a model that respects three assumptions.
bool okay () const; // FALSE means solver is in a conflicting state
+ lbool assertAssumption(Lit p, bool propagate); // Assert a new assumption, start BCP if propagate = true
+ void popAssumption(); // Pop an assumption
void toDimacs (FILE* f, const vec<Lit>& assumps); // Write CNF to file in DIMACS-format.
void toDimacs (const char *file, const vec<Lit>& assumps);
@@ -138,7 +144,20 @@ public:
uint64_t solves, starts, decisions, rnd_decisions, propagations, conflicts;
uint64_t dec_vars, clauses_literals, learnts_literals, max_literals, tot_literals;
-
+ // Bitvector Propagations
+ //
+
+ void addMarkerLiteral(Var var) {
+ marker[var] = 1;
+ }
+
+ __gnu_cxx::hash_set<Var> assumptions_vars; // all the variables that appear in the current assumptions
+ vec<Lit> atom_propagations; // the atom literals implied by the last call to solve with assumptions
+ vec<int> atom_propagations_lim; // for backtracking
+
+ bool only_bcp; // solving mode in which only boolean constraint propagation is done
+ void setOnlyBCP (bool val) { only_bcp = val;}
+ void explainPropagation(Lit l, std::vector<Lit>& explanation);
protected:
// Helper structures:
@@ -179,6 +198,7 @@ protected:
watches; // 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true).
vec<lbool> assigns; // The current assignments.
vec<char> polarity; // The preferred polarity of each variable.
+ vec<char> marker; // Is the variable a marker literal
vec<char> decision; // Declares if a variable is eligible for selection in the decision heuristic.
vec<Lit> trail; // Assignment stack; stores all assigments made in the order they were made.
vec<int> trail_lim; // Separator indices for different decision levels in 'trail'.
@@ -220,10 +240,19 @@ protected:
bool enqueue (Lit p, CRef from = CRef_Undef); // Test if fact 'p' contradicts current state, enqueue otherwise.
CRef propagate (); // Perform unit propagation. Returns possibly conflicting clause.
void cancelUntil (int level); // Backtrack until a certain level.
- void analyze (CRef confl, vec<Lit>& out_learnt, int& out_btlevel); // (bt = backtrack)
+
+ enum UIP {
+ UIP_FIRST,
+ UIP_LAST
+ };
+
+ CVC4::context::CDHashMap<Lit, std::vector<Lit>, LitHashFunction> d_explanations;
+
+ void storeExplanation (Lit p); // make sure that the explanation of p is cached
+ void analyze (CRef confl, vec<Lit>& out_learnt, int& out_btlevel, UIP uip = UIP_FIRST); // (bt = backtrack)
void analyzeFinal (Lit p, vec<Lit>& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION?
bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()')
- lbool search (int nof_conflicts); // Search for a given number of conflicts.
+ lbool search (int nof_conflicts, UIP uip = UIP_FIRST); // Search for a given number of conflicts.
lbool solve_ (); // Main solve method (assumptions given in 'assumptions').
void reduceDB (); // Reduce the set of learnt clauses.
void removeSatisfied (vec<CRef>& cs); // Shrink 'cs' to contain only non-satisfied clauses.
@@ -275,8 +304,8 @@ protected:
//=================================================================================================
// Implementation of inline methods:
-inline CRef Solver::reason(Var x) const { return vardata[x].reason; }
-inline int Solver::level (Var x) const { return vardata[x].level; }
+inline CRef Solver::reason(Var x) const { assert(x < vardata.size()); return vardata[x].reason; }
+inline int Solver::level (Var x) const { assert(x < vardata.size()); return vardata[x].level; }
inline void Solver::insertVarOrder(Var x) {
if (!order_heap.inHeap(x) && decision[x]) order_heap.insert(x); }
@@ -315,7 +344,7 @@ inline bool Solver::addClause (Lit p) { add_tmp.clear(
inline bool Solver::addClause (Lit p, Lit q) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); return addClause_(add_tmp); }
inline bool Solver::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); }
inline bool Solver::locked (const Clause& c) const { return value(c[0]) == l_True && reason(var(c[0])) != CRef_Undef && ca.lea(reason(var(c[0]))) == &c; }
-inline void Solver::newDecisionLevel() { trail_lim.push(trail.size()); }
+inline void Solver::newDecisionLevel() { trail_lim.push(trail.size()); atom_propagations_lim.push(atom_propagations.size()); }
inline int Solver::decisionLevel () const { return trail_lim.size(); }
inline uint32_t Solver::abstractLevel (Var x) const { return 1 << (level(x) & 31); }
diff --git a/src/prop/bvminisat/core/SolverTypes.h b/src/prop/bvminisat/core/SolverTypes.h
index 0439a46c4..89ffc8a00 100644
--- a/src/prop/bvminisat/core/SolverTypes.h
+++ b/src/prop/bvminisat/core/SolverTypes.h
@@ -53,7 +53,6 @@ struct Lit {
bool operator < (Lit p) const { return x < p.x; } // '<' makes p, ~p adjacent in the ordering.
};
-
inline Lit mkLit (Var var, bool sign) { Lit p; p.x = var + var + (int)sign; return p; }
inline Lit operator ~(Lit p) { Lit q; q.x = p.x ^ 1; return q; }
inline Lit operator ^(Lit p, bool b) { Lit q; q.x = p.x ^ (unsigned int)b; return q; }
@@ -61,9 +60,15 @@ inline bool sign (Lit p) { return p.x & 1; }
inline int var (Lit p) { return p.x >> 1; }
// Mapping Literals to and from compact integers suitable for array indexing:
-inline int toInt (Var v) { return v; }
-inline int toInt (Lit p) { return p.x; }
-inline Lit toLit (int i) { Lit p; p.x = i; return p; }
+inline int toInt (Var v) { return v; }
+inline int toInt (Lit p) { return p.x; }
+inline Lit toLit (int i) { Lit p; p.x = i; return p; }
+
+struct LitHashFunction {
+ size_t operator () (const Lit& l) const {
+ return toInt(l);
+ }
+};
//const Lit lit_Undef = mkLit(var_Undef, false); // }- Useful special constants.
//const Lit lit_Error = mkLit(var_Undef, true ); // }
diff --git a/src/prop/bvminisat/simp/SimpSolver.cc b/src/prop/bvminisat/simp/SimpSolver.cc
index 4af756456..903ffa270 100644
--- a/src/prop/bvminisat/simp/SimpSolver.cc
+++ b/src/prop/bvminisat/simp/SimpSolver.cc
@@ -43,8 +43,9 @@ static DoubleOption opt_simp_garbage_frac(_cat, "simp-gc-frac", "The fraction of
// Constructor/Destructor:
-SimpSolver::SimpSolver() :
- grow (opt_grow)
+SimpSolver::SimpSolver(CVC4::context::Context* c) :
+ Solver(c)
+ , grow (opt_grow)
, clause_lim (opt_clause_lim)
, subsumption_lim (opt_subsumption_lim)
, simp_garbage_frac (opt_simp_garbage_frac)
@@ -99,7 +100,13 @@ Var SimpSolver::newVar(bool sign, bool dvar, bool freeze) {
lbool SimpSolver::solve_(bool do_simp, bool turn_off_simp)
{
+ vec<Lit> atom_propagations_backup;
+ atom_propagations.moveTo(atom_propagations_backup);
+ vec<int> atom_propagations_lim_backup;
+ atom_propagations_lim.moveTo(atom_propagations_lim_backup);
+ only_bcp = false;
+ cancelUntil(0);
vec<Var> extra_frozen;
lbool result = l_True;
@@ -128,8 +135,8 @@ lbool SimpSolver::solve_(bool do_simp, bool turn_off_simp)
else if (verbosity >= 1)
printf("===============================================================================\n");
- if (result == l_True)
- extendModel();
+ atom_propagations_backup.moveTo(atom_propagations);
+ atom_propagations_lim_backup.moveTo(atom_propagations_lim);
if (do_simp)
// Unfreeze the assumptions that were frozen:
diff --git a/src/prop/bvminisat/simp/SimpSolver.h b/src/prop/bvminisat/simp/SimpSolver.h
index e21a0a9ec..e3ef76212 100644
--- a/src/prop/bvminisat/simp/SimpSolver.h
+++ b/src/prop/bvminisat/simp/SimpSolver.h
@@ -24,6 +24,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
#include "prop/bvminisat/mtl/Queue.h"
#include "prop/bvminisat/core/Solver.h"
#include "util/stats.h"
+#include "context/context.h"
namespace BVMinisat {
@@ -34,7 +35,7 @@ class SimpSolver : public Solver {
public:
// Constructor/Destructor:
//
- SimpSolver();
+ SimpSolver(CVC4::context::Context* c);
~SimpSolver();
// Problem specification:
@@ -95,7 +96,8 @@ class SimpSolver : public Solver {
int merges;
int asymm_lits;
int eliminated_vars;
- CVC4::TimerStat total_eliminate_time;
+ CVC4::TimerStat total_eliminate_time;
+
protected:
// Helper structures:
@@ -181,12 +183,14 @@ inline bool SimpSolver::addClause (Lit p, Lit q) { add_tmp.clear();
inline bool SimpSolver::addClause (Lit p, Lit q, Lit r) { add_tmp.clear(); add_tmp.push(p); add_tmp.push(q); add_tmp.push(r); return addClause_(add_tmp); }
inline void SimpSolver::setFrozen (Var v, bool b) { frozen[v] = (char)b; if (use_simplification && !b) { updateElimHeap(v); } }
-inline bool SimpSolver::solve ( bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); return solve_(do_simp, turn_off_simp) == l_True; }
+inline bool SimpSolver::solve ( bool do_simp, bool turn_off_simp) { budgetOff(); return solve_(do_simp, turn_off_simp) == l_True; }
inline bool SimpSolver::solve (Lit p , bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); return solve_(do_simp, turn_off_simp) == l_True; }
inline bool SimpSolver::solve (Lit p, Lit q, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); return solve_(do_simp, turn_off_simp) == l_True; }
inline bool SimpSolver::solve (Lit p, Lit q, Lit r, bool do_simp, bool turn_off_simp) { budgetOff(); assumptions.clear(); assumptions.push(p); assumptions.push(q); assumptions.push(r); return solve_(do_simp, turn_off_simp) == l_True; }
-inline bool SimpSolver::solve (const vec<Lit>& assumps, bool do_simp, bool turn_off_simp){
- budgetOff(); assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp) == l_True; }
+inline bool SimpSolver::solve (const vec<Lit>& assumps, bool do_simp, bool turn_off_simp){
+ budgetOff(); assumps.copyTo(assumptions);
+ return solve_(do_simp, turn_off_simp) == l_True;
+}
inline lbool SimpSolver::solveLimited (const vec<Lit>& assumps, bool do_simp, bool turn_off_simp){
assumps.copyTo(assumptions); return solve_(do_simp, turn_off_simp); }
diff --git a/src/prop/cryptominisat/MTRand/Makefile.in b/src/prop/cryptominisat/MTRand/Makefile.in
index 8cc478cdf..1693a70f2 100644
--- a/src/prop/cryptominisat/MTRand/Makefile.in
+++ b/src/prop/cryptominisat/MTRand/Makefile.in
@@ -34,17 +34,36 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-subdir = MTRand
+target_triplet = @target@
+subdir = src/prop/cryptominisat/MTRand
DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/config/antlr.m4 \
+ $(top_srcdir)/config/ax_prog_doxygen.m4 \
+ $(top_srcdir)/config/ax_tls.m4 \
+ $(top_srcdir)/config/bindings.m4 $(top_srcdir)/config/boost.m4 \
+ $(top_srcdir)/config/cudd.m4 $(top_srcdir)/config/cvc4.m4 \
+ $(top_srcdir)/config/gcc_version.m4 \
+ $(top_srcdir)/config/libtool.m4 \
+ $(top_srcdir)/config/ltoptions.m4 \
+ $(top_srcdir)/config/ltsugar.m4 \
+ $(top_srcdir)/config/ltversion.m4 \
+ $(top_srcdir)/config/lt~obsolete.m4 \
+ $(top_srcdir)/config/pkg.m4 $(top_srcdir)/config/readline.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_HEADER = $(top_builddir)/cvc4autoconfig.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -75,54 +94,128 @@ CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANTLR = @ANTLR@
+ANTLR_HOME = @ANTLR_HOME@
+ANTLR_INCLUDES = @ANTLR_INCLUDES@
+ANTLR_LDFLAGS = @ANTLR_LDFLAGS@
AR = @AR@
+AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_THREAD_LDFLAGS = @BOOST_THREAD_LDFLAGS@
+BOOST_THREAD_LDPATH = @BOOST_THREAD_LDPATH@
+BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@
+BUILDING_SHARED = @BUILDING_SHARED@
+BUILDING_STATIC = @BUILDING_STATIC@
+CAMLP4O = @CAMLP4O@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLN_CFLAGS = @CLN_CFLAGS@
+CLN_LIBS = @CLN_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
+CSHARP_CPPFLAGS = @CSHARP_CPPFLAGS@
+CUDD_CPPFLAGS = @CUDD_CPPFLAGS@
+CUDD_LDFLAGS = @CUDD_LDFLAGS@
+CUDD_LIBS = @CUDD_LIBS@
+CVC4_BINDINGS_LIBRARY_VERSION = @CVC4_BINDINGS_LIBRARY_VERSION@
+CVC4_BUILD_LIBCOMPAT = @CVC4_BUILD_LIBCOMPAT@
+CVC4_COMPAT_LIBRARY_VERSION = @CVC4_COMPAT_LIBRARY_VERSION@
+CVC4_HAS_THREADS = @CVC4_HAS_THREADS@
+CVC4_LANGUAGE_BINDINGS = @CVC4_LANGUAGE_BINDINGS@
+CVC4_LIBRARY_VERSION = @CVC4_LIBRARY_VERSION@
+CVC4_PARSER_LIBRARY_VERSION = @CVC4_PARSER_LIBRARY_VERSION@
+CVC4_TLS = @CVC4_TLS@
+CVC4_TLS_SUPPORTED = @CVC4_TLS_SUPPORTED@
+CVC4_USE_CLN_IMP = @CVC4_USE_CLN_IMP@
+CVC4_USE_GMP_IMP = @CVC4_USE_GMP_IMP@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
+CXXTEST = @CXXTEST@
+CXXTESTGEN = @CXXTESTGEN@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
DLLTOOL = @DLLTOOL@
+DOXYGEN_EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+DOXYGEN_EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_DX_CURRENT_FEATURE = @DX_FLAG_DX_CURRENT_FEATURE@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+FLAG_VISIBILITY_HIDDEN = @FLAG_VISIBILITY_HIDDEN@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JAVA_CPPFLAGS = @JAVA_CPPFLAGS@
LD = @LD@
LDFLAGS = @LDFLAGS@
+LFSC = @LFSC@
+LFSCARGS = @LFSCARGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
+MAN_DATE = @MAN_DATE@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
-OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@
+OCAMLC = @OCAMLC@
+OCAMLFIND = @OCAMLFIND@
+OCAMLMKTOP = @OCAMLMKTOP@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
@@ -133,12 +226,33 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_CPPFLAGS = @PERL_CPPFLAGS@
+PHP_CPPFLAGS = @PHP_CPPFLAGS@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_CXXFLAGS = @PYTHON_CXXFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDE = @PYTHON_INCLUDE@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+RUBY_CPPFLAGS = @RUBY_CPPFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+STATIC_BINARY = @STATIC_BINARY@
STRIP = @STRIP@
+SWIG = @SWIG@
+TCL_CPPFLAGS = @TCL_CPPFLAGS@
+TEST_CPPFLAGS = @TEST_CPPFLAGS@
+TEST_CXXFLAGS = @TEST_CXXFLAGS@
+TEST_LDFLAGS = @TEST_LDFLAGS@
VERSION = @VERSION@
+WNO_CONVERSION_NULL = @WNO_CONVERSION_NULL@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -178,17 +292,26 @@ libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
+mk_include = @mk_include@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
+target = @target@
target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -197,7 +320,7 @@ pkgincludesub_HEADERS = MersenneTwister.h
all: all-am
.SUFFIXES:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -206,9 +329,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu MTRand/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/prop/cryptominisat/MTRand/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu MTRand/Makefile
+ $(AUTOMAKE) --foreign src/prop/cryptominisat/MTRand/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -222,9 +345,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
diff --git a/src/prop/cryptominisat/Makefile.in b/src/prop/cryptominisat/Makefile.in
index 2d9ee8bf8..a6806f0b4 100644
--- a/src/prop/cryptominisat/Makefile.in
+++ b/src/prop/cryptominisat/Makefile.in
@@ -33,21 +33,37 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/config.h.in \
- $(top_srcdir)/configure AUTHORS INSTALL NEWS TODO config.guess \
- config.sub depcomp install-sh ltmain.sh missing
+target_triplet = @target@
+subdir = src/prop/cryptominisat
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ AUTHORS INSTALL NEWS TODO config.guess config.sub depcomp \
+ install-sh ltmain.sh missing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/config/antlr.m4 \
+ $(top_srcdir)/config/ax_prog_doxygen.m4 \
+ $(top_srcdir)/config/ax_tls.m4 \
+ $(top_srcdir)/config/bindings.m4 $(top_srcdir)/config/boost.m4 \
+ $(top_srcdir)/config/cudd.m4 $(top_srcdir)/config/cvc4.m4 \
+ $(top_srcdir)/config/gcc_version.m4 \
+ $(top_srcdir)/config/libtool.m4 \
+ $(top_srcdir)/config/ltoptions.m4 \
+ $(top_srcdir)/config/ltsugar.m4 \
+ $(top_srcdir)/config/ltversion.m4 \
+ $(top_srcdir)/config/lt~obsolete.m4 \
+ $(top_srcdir)/config/pkg.m4 $(top_srcdir)/config/readline.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
+CONFIG_HEADER = $(top_builddir)/cvc4autoconfig.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
@@ -61,17 +77,11 @@ RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir dist dist-all distcheck
+ distdir
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
- { test ! -d "$(distdir)" \
- || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -fr "$(distdir)"; }; }
am__relativize = \
dir0=`pwd`; \
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -97,60 +107,130 @@ am__relativize = \
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
done; \
reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANTLR = @ANTLR@
+ANTLR_HOME = @ANTLR_HOME@
+ANTLR_INCLUDES = @ANTLR_INCLUDES@
+ANTLR_LDFLAGS = @ANTLR_LDFLAGS@
AR = @AR@
+AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_THREAD_LDFLAGS = @BOOST_THREAD_LDFLAGS@
+BOOST_THREAD_LDPATH = @BOOST_THREAD_LDPATH@
+BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@
+BUILDING_SHARED = @BUILDING_SHARED@
+BUILDING_STATIC = @BUILDING_STATIC@
+CAMLP4O = @CAMLP4O@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLN_CFLAGS = @CLN_CFLAGS@
+CLN_LIBS = @CLN_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
+CSHARP_CPPFLAGS = @CSHARP_CPPFLAGS@
+CUDD_CPPFLAGS = @CUDD_CPPFLAGS@
+CUDD_LDFLAGS = @CUDD_LDFLAGS@
+CUDD_LIBS = @CUDD_LIBS@
+CVC4_BINDINGS_LIBRARY_VERSION = @CVC4_BINDINGS_LIBRARY_VERSION@
+CVC4_BUILD_LIBCOMPAT = @CVC4_BUILD_LIBCOMPAT@
+CVC4_COMPAT_LIBRARY_VERSION = @CVC4_COMPAT_LIBRARY_VERSION@
+CVC4_HAS_THREADS = @CVC4_HAS_THREADS@
+CVC4_LANGUAGE_BINDINGS = @CVC4_LANGUAGE_BINDINGS@
+CVC4_LIBRARY_VERSION = @CVC4_LIBRARY_VERSION@
+CVC4_PARSER_LIBRARY_VERSION = @CVC4_PARSER_LIBRARY_VERSION@
+CVC4_TLS = @CVC4_TLS@
+CVC4_TLS_SUPPORTED = @CVC4_TLS_SUPPORTED@
+CVC4_USE_CLN_IMP = @CVC4_USE_CLN_IMP@
+CVC4_USE_GMP_IMP = @CVC4_USE_GMP_IMP@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
+CXXTEST = @CXXTEST@
+CXXTESTGEN = @CXXTESTGEN@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
DLLTOOL = @DLLTOOL@
+DOXYGEN_EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+DOXYGEN_EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_DX_CURRENT_FEATURE = @DX_FLAG_DX_CURRENT_FEATURE@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+FLAG_VISIBILITY_HIDDEN = @FLAG_VISIBILITY_HIDDEN@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JAVA_CPPFLAGS = @JAVA_CPPFLAGS@
LD = @LD@
LDFLAGS = @LDFLAGS@
+LFSC = @LFSC@
+LFSCARGS = @LFSCARGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
+MAN_DATE = @MAN_DATE@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
-OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@
+OCAMLC = @OCAMLC@
+OCAMLFIND = @OCAMLFIND@
+OCAMLMKTOP = @OCAMLMKTOP@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
@@ -161,12 +241,33 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_CPPFLAGS = @PERL_CPPFLAGS@
+PHP_CPPFLAGS = @PHP_CPPFLAGS@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_CXXFLAGS = @PYTHON_CXXFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDE = @PYTHON_INCLUDE@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+RUBY_CPPFLAGS = @RUBY_CPPFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+STATIC_BINARY = @STATIC_BINARY@
STRIP = @STRIP@
+SWIG = @SWIG@
+TCL_CPPFLAGS = @TCL_CPPFLAGS@
+TEST_CPPFLAGS = @TEST_CPPFLAGS@
+TEST_CXXFLAGS = @TEST_CXXFLAGS@
+TEST_LDFLAGS = @TEST_LDFLAGS@
VERSION = @VERSION@
+WNO_CONVERSION_NULL = @WNO_CONVERSION_NULL@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -206,17 +307,26 @@ libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
+mk_include = @mk_include@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
+target = @target@
target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -229,71 +339,46 @@ SUBDIRS = Solver mtl MTRand man
EXTRA_DIST = HOWTO_VisualCpp HOWTO_MinGW32 \
LICENSE-GPL LICENSE-MIT TODO
-all: config.h
- $(MAKE) $(AM_MAKEFLAGS) all-recursive
+all: all-recursive
.SUFFIXES:
-am--refresh:
- @:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
- echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
- $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
- && exit 0; \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/prop/cryptominisat/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --foreign Makefile
+ $(AUTOMAKE) --foreign src/prop/cryptominisat/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
- echo ' $(SHELL) ./config.status'; \
- $(SHELL) ./config.status;; \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- $(SHELL) ./config.status --recheck
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
- $(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
- $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
-config.h: stamp-h1
- @if test ! -f $@; then \
- rm -f stamp-h1; \
- $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
- else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
- @rm -f stamp-h1
- cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: $(am__configure_deps)
- ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
- rm -f stamp-h1
- touch $@
-
-distclean-hdr:
- -rm -f config.h stamp-h1
-
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
-distclean-libtool:
- -rm -f libtool config.lt
-
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
@@ -374,7 +459,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
mkid -fID $$unique
tags: TAGS
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
set x; \
here=`pwd`; \
@@ -391,7 +476,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
@@ -409,9 +494,9 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
fi; \
fi
ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
@@ -430,8 +515,6 @@ distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
- $(am__remove_distdir)
- test -d "$(distdir)" || mkdir "$(distdir)"
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
@@ -489,124 +572,9 @@ distdir: $(DISTFILES)
|| exit 1; \
fi; \
done
- -test -n "$(am__skip_mode_fix)" \
- || find "$(distdir)" -type d ! -perm -755 \
- -exec chmod u+rwx,go+rx {} \; -o \
- ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
- || chmod -R a+r "$(distdir)"
-dist-gzip: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
-
-dist-lzma: distdir
- tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
- $(am__remove_distdir)
-
-dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
- $(am__remove_distdir)
-
-dist-tarZ: distdir
- tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
- $(am__remove_distdir)
-
-dist-shar: distdir
- shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
- $(am__remove_distdir)
-
-dist-zip: distdir
- -rm -f $(distdir).zip
- zip -rq $(distdir).zip $(distdir)
- $(am__remove_distdir)
-
-dist dist-all: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration. Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
- case '$(DIST_ARCHIVES)' in \
- *.tar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
- *.tar.bz2*) \
- bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
- *.tar.lzma*) \
- lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
- *.tar.xz*) \
- xz -dc $(distdir).tar.xz | $(am__untar) ;;\
- *.tar.Z*) \
- uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
- *.shar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
- *.zip*) \
- unzip $(distdir).zip ;;\
- esac
- chmod -R a-w $(distdir); chmod a+w $(distdir)
- mkdir $(distdir)/_build
- mkdir $(distdir)/_inst
- chmod a-w $(distdir)
- test -d $(distdir)/_build || exit 0; \
- dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
- && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
- && am__cwd=`pwd` \
- && $(am__cd) $(distdir)/_build \
- && ../configure --srcdir=.. --prefix="$$dc_install_base" \
- $(DISTCHECK_CONFIGURE_FLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
- && $(MAKE) $(AM_MAKEFLAGS) check \
- && $(MAKE) $(AM_MAKEFLAGS) install \
- && $(MAKE) $(AM_MAKEFLAGS) installcheck \
- && $(MAKE) $(AM_MAKEFLAGS) uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
- distuninstallcheck \
- && chmod -R a-w "$$dc_install_base" \
- && ({ \
- (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
- distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
- } || { rm -rf "$$dc_destdir"; exit 1; }) \
- && rm -rf "$$dc_destdir" \
- && $(MAKE) $(AM_MAKEFLAGS) dist \
- && rm -rf $(DIST_ARCHIVES) \
- && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
- && cd "$$am__cwd" \
- || exit 1
- $(am__remove_distdir)
- @(echo "$(distdir) archives ready for distribution: "; \
- list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
- sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
- @$(am__cd) '$(distuninstallcheck_dir)' \
- && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
- || { echo "ERROR: files left after uninstall:" ; \
- if test -n "$(DESTDIR)"; then \
- echo " (check DESTDIR support)"; \
- fi ; \
- $(distuninstallcheck_listfiles) ; \
- exit 1; } >&2
-distcleancheck: distclean
- @if test '$(srcdir)' = . ; then \
- echo "ERROR: distcleancheck can only run from a VPATH build" ; \
- exit 1 ; \
- fi
- @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left in build directory after distclean:" ; \
- $(distcleancheck_listfiles) ; \
- exit 1; } >&2
check-am: all-am
check: check-recursive
-all-am: Makefile config.h all-local
+all-am: Makefile all-local
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
@@ -639,10 +607,8 @@ clean: clean-recursive
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-hdr \
- distclean-libtool distclean-tags
+distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-recursive
@@ -685,8 +651,6 @@ install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -704,25 +668,22 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
- ctags-recursive install-am install-strip tags-recursive
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+ install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am all-local am--refresh check check-am clean \
- clean-generic clean-libtool ctags ctags-recursive dist \
- dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \
- dist-xz dist-zip distcheck distclean distclean-generic \
- distclean-hdr distclean-libtool distclean-tags distcleancheck \
- distdir distuninstallcheck dvi dvi-am html html-am info \
- info-am install install-am install-data install-data-am \
- install-dvi install-dvi-am install-exec install-exec-am \
- install-html install-html-am install-info install-info-am \
- install-man install-pdf install-pdf-am install-ps \
- install-ps-am install-strip installcheck installcheck-am \
- installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
+ all all-am all-local check check-am clean clean-generic \
+ clean-libtool ctags ctags-recursive distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am
all-local: Solver
diff --git a/src/prop/cryptominisat/Solver/Makefile.in b/src/prop/cryptominisat/Solver/Makefile.in
index dd524fba2..02344edd7 100644
--- a/src/prop/cryptominisat/Solver/Makefile.in
+++ b/src/prop/cryptominisat/Solver/Makefile.in
@@ -36,16 +36,29 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
+target_triplet = @target@
bin_PROGRAMS = cryptominisat$(EXEEXT)
-subdir = Solver
+subdir = src/prop/cryptominisat/Solver
DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/config/antlr.m4 \
+ $(top_srcdir)/config/ax_prog_doxygen.m4 \
+ $(top_srcdir)/config/ax_tls.m4 \
+ $(top_srcdir)/config/bindings.m4 $(top_srcdir)/config/boost.m4 \
+ $(top_srcdir)/config/cudd.m4 $(top_srcdir)/config/cvc4.m4 \
+ $(top_srcdir)/config/gcc_version.m4 \
+ $(top_srcdir)/config/libtool.m4 \
+ $(top_srcdir)/config/ltoptions.m4 \
+ $(top_srcdir)/config/ltsugar.m4 \
+ $(top_srcdir)/config/ltversion.m4 \
+ $(top_srcdir)/config/lt~obsolete.m4 \
+ $(top_srcdir)/config/pkg.m4 $(top_srcdir)/config/readline.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_HEADER = $(top_builddir)/cvc4autoconfig.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -81,29 +94,47 @@ am_libcryptominisat_la_OBJECTS = ClauseCleaner.lo FailedLitSearcher.lo \
ClauseVivifier.lo CompleteDetachReattacher.lo DimacsParser.lo \
OnlyNonLearntBins.lo SolverConf.lo DataSync.lo BothCache.lo
libcryptominisat_la_OBJECTS = $(am_libcryptominisat_la_OBJECTS)
-libcryptominisat_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(libcryptominisat_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libcryptominisat_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(libcryptominisat_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
PROGRAMS = $(bin_PROGRAMS)
am_cryptominisat_OBJECTS = Main.$(OBJEXT)
cryptominisat_OBJECTS = $(am_cryptominisat_OBJECTS)
cryptominisat_DEPENDENCIES = libcryptominisat.la
-cryptominisat_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(cryptominisat_LDFLAGS) $(LDFLAGS) -o $@
+cryptominisat_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+ $(AM_CXXFLAGS) $(CXXFLAGS) $(cryptominisat_LDFLAGS) $(LDFLAGS) \
+ -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
am__depfiles_maybe = depfiles
am__mv = mv -f
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_$(V))
+am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
+am__v_CXX_0 = @echo " CXX " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_$(V))
+am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(libcryptominisat_la_SOURCES) $(cryptominisat_SOURCES)
DIST_SOURCES = $(libcryptominisat_la_SOURCES) $(cryptominisat_SOURCES)
HEADERS = $(pkgincludesub_HEADERS)
@@ -112,54 +143,128 @@ CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANTLR = @ANTLR@
+ANTLR_HOME = @ANTLR_HOME@
+ANTLR_INCLUDES = @ANTLR_INCLUDES@
+ANTLR_LDFLAGS = @ANTLR_LDFLAGS@
AR = @AR@
+AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_THREAD_LDFLAGS = @BOOST_THREAD_LDFLAGS@
+BOOST_THREAD_LDPATH = @BOOST_THREAD_LDPATH@
+BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@
+BUILDING_SHARED = @BUILDING_SHARED@
+BUILDING_STATIC = @BUILDING_STATIC@
+CAMLP4O = @CAMLP4O@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLN_CFLAGS = @CLN_CFLAGS@
+CLN_LIBS = @CLN_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
+CSHARP_CPPFLAGS = @CSHARP_CPPFLAGS@
+CUDD_CPPFLAGS = @CUDD_CPPFLAGS@
+CUDD_LDFLAGS = @CUDD_LDFLAGS@
+CUDD_LIBS = @CUDD_LIBS@
+CVC4_BINDINGS_LIBRARY_VERSION = @CVC4_BINDINGS_LIBRARY_VERSION@
+CVC4_BUILD_LIBCOMPAT = @CVC4_BUILD_LIBCOMPAT@
+CVC4_COMPAT_LIBRARY_VERSION = @CVC4_COMPAT_LIBRARY_VERSION@
+CVC4_HAS_THREADS = @CVC4_HAS_THREADS@
+CVC4_LANGUAGE_BINDINGS = @CVC4_LANGUAGE_BINDINGS@
+CVC4_LIBRARY_VERSION = @CVC4_LIBRARY_VERSION@
+CVC4_PARSER_LIBRARY_VERSION = @CVC4_PARSER_LIBRARY_VERSION@
+CVC4_TLS = @CVC4_TLS@
+CVC4_TLS_SUPPORTED = @CVC4_TLS_SUPPORTED@
+CVC4_USE_CLN_IMP = @CVC4_USE_CLN_IMP@
+CVC4_USE_GMP_IMP = @CVC4_USE_GMP_IMP@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
+CXXTEST = @CXXTEST@
+CXXTESTGEN = @CXXTESTGEN@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
DLLTOOL = @DLLTOOL@
+DOXYGEN_EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+DOXYGEN_EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_DX_CURRENT_FEATURE = @DX_FLAG_DX_CURRENT_FEATURE@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+FLAG_VISIBILITY_HIDDEN = @FLAG_VISIBILITY_HIDDEN@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JAVA_CPPFLAGS = @JAVA_CPPFLAGS@
LD = @LD@
LDFLAGS = @LDFLAGS@
+LFSC = @LFSC@
+LFSCARGS = @LFSCARGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
+MAN_DATE = @MAN_DATE@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
-OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@
+OCAMLC = @OCAMLC@
+OCAMLFIND = @OCAMLFIND@
+OCAMLMKTOP = @OCAMLMKTOP@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
@@ -170,12 +275,33 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_CPPFLAGS = @PERL_CPPFLAGS@
+PHP_CPPFLAGS = @PHP_CPPFLAGS@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_CXXFLAGS = @PYTHON_CXXFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDE = @PYTHON_INCLUDE@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+RUBY_CPPFLAGS = @RUBY_CPPFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+STATIC_BINARY = @STATIC_BINARY@
STRIP = @STRIP@
+SWIG = @SWIG@
+TCL_CPPFLAGS = @TCL_CPPFLAGS@
+TEST_CPPFLAGS = @TEST_CPPFLAGS@
+TEST_CXXFLAGS = @TEST_CXXFLAGS@
+TEST_LDFLAGS = @TEST_LDFLAGS@
VERSION = @VERSION@
+WNO_CONVERSION_NULL = @WNO_CONVERSION_NULL@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -215,17 +341,26 @@ libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
+mk_include = @mk_include@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
+target = @target@
target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -263,7 +398,7 @@ all: all-am
.SUFFIXES:
.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -272,9 +407,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Solver/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/prop/cryptominisat/Solver/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu Solver/Makefile
+ $(AUTOMAKE) --foreign src/prop/cryptominisat/Solver/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -288,9 +423,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@@ -325,7 +460,7 @@ clean-libLTLIBRARIES:
rm -f "$${dir}/so_locations"; \
done
libcryptominisat.la: $(libcryptominisat_la_OBJECTS) $(libcryptominisat_la_DEPENDENCIES)
- $(libcryptominisat_la_LINK) -rpath $(libdir) $(libcryptominisat_la_OBJECTS) $(libcryptominisat_la_LIBADD) $(LIBS)
+ $(AM_V_CXXLD)$(libcryptominisat_la_LINK) -rpath $(libdir) $(libcryptominisat_la_OBJECTS) $(libcryptominisat_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@@ -371,7 +506,7 @@ clean-binPROGRAMS:
rm -f $$list
cryptominisat$(EXEEXT): $(cryptominisat_OBJECTS) $(cryptominisat_DEPENDENCIES)
@rm -f cryptominisat$(EXEEXT)
- $(cryptominisat_LINK) $(cryptominisat_OBJECTS) $(cryptominisat_LDADD) $(LIBS)
+ $(AM_V_CXXLD)$(cryptominisat_LINK) $(cryptominisat_OBJECTS) $(cryptominisat_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -406,22 +541,25 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XorSubsumer.Plo@am__quote@
.cpp.o:
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
-@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.lo:
-@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
diff --git a/src/prop/cryptominisat/man/Makefile.in b/src/prop/cryptominisat/man/Makefile.in
index 5542511eb..7dc705cf1 100644
--- a/src/prop/cryptominisat/man/Makefile.in
+++ b/src/prop/cryptominisat/man/Makefile.in
@@ -33,16 +33,35 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-subdir = man
+target_triplet = @target@
+subdir = src/prop/cryptominisat/man
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/config/antlr.m4 \
+ $(top_srcdir)/config/ax_prog_doxygen.m4 \
+ $(top_srcdir)/config/ax_tls.m4 \
+ $(top_srcdir)/config/bindings.m4 $(top_srcdir)/config/boost.m4 \
+ $(top_srcdir)/config/cudd.m4 $(top_srcdir)/config/cvc4.m4 \
+ $(top_srcdir)/config/gcc_version.m4 \
+ $(top_srcdir)/config/libtool.m4 \
+ $(top_srcdir)/config/ltoptions.m4 \
+ $(top_srcdir)/config/ltsugar.m4 \
+ $(top_srcdir)/config/ltversion.m4 \
+ $(top_srcdir)/config/lt~obsolete.m4 \
+ $(top_srcdir)/config/pkg.m4 $(top_srcdir)/config/readline.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_HEADER = $(top_builddir)/cvc4autoconfig.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -73,54 +92,128 @@ MANS = $(man_MANS)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANTLR = @ANTLR@
+ANTLR_HOME = @ANTLR_HOME@
+ANTLR_INCLUDES = @ANTLR_INCLUDES@
+ANTLR_LDFLAGS = @ANTLR_LDFLAGS@
AR = @AR@
+AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_THREAD_LDFLAGS = @BOOST_THREAD_LDFLAGS@
+BOOST_THREAD_LDPATH = @BOOST_THREAD_LDPATH@
+BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@
+BUILDING_SHARED = @BUILDING_SHARED@
+BUILDING_STATIC = @BUILDING_STATIC@
+CAMLP4O = @CAMLP4O@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLN_CFLAGS = @CLN_CFLAGS@
+CLN_LIBS = @CLN_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
+CSHARP_CPPFLAGS = @CSHARP_CPPFLAGS@
+CUDD_CPPFLAGS = @CUDD_CPPFLAGS@
+CUDD_LDFLAGS = @CUDD_LDFLAGS@
+CUDD_LIBS = @CUDD_LIBS@
+CVC4_BINDINGS_LIBRARY_VERSION = @CVC4_BINDINGS_LIBRARY_VERSION@
+CVC4_BUILD_LIBCOMPAT = @CVC4_BUILD_LIBCOMPAT@
+CVC4_COMPAT_LIBRARY_VERSION = @CVC4_COMPAT_LIBRARY_VERSION@
+CVC4_HAS_THREADS = @CVC4_HAS_THREADS@
+CVC4_LANGUAGE_BINDINGS = @CVC4_LANGUAGE_BINDINGS@
+CVC4_LIBRARY_VERSION = @CVC4_LIBRARY_VERSION@
+CVC4_PARSER_LIBRARY_VERSION = @CVC4_PARSER_LIBRARY_VERSION@
+CVC4_TLS = @CVC4_TLS@
+CVC4_TLS_SUPPORTED = @CVC4_TLS_SUPPORTED@
+CVC4_USE_CLN_IMP = @CVC4_USE_CLN_IMP@
+CVC4_USE_GMP_IMP = @CVC4_USE_GMP_IMP@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
+CXXTEST = @CXXTEST@
+CXXTESTGEN = @CXXTESTGEN@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
DLLTOOL = @DLLTOOL@
+DOXYGEN_EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+DOXYGEN_EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_DX_CURRENT_FEATURE = @DX_FLAG_DX_CURRENT_FEATURE@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+FLAG_VISIBILITY_HIDDEN = @FLAG_VISIBILITY_HIDDEN@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JAVA_CPPFLAGS = @JAVA_CPPFLAGS@
LD = @LD@
LDFLAGS = @LDFLAGS@
+LFSC = @LFSC@
+LFSCARGS = @LFSCARGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
+MAN_DATE = @MAN_DATE@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
-OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@
+OCAMLC = @OCAMLC@
+OCAMLFIND = @OCAMLFIND@
+OCAMLMKTOP = @OCAMLMKTOP@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
@@ -131,12 +224,33 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_CPPFLAGS = @PERL_CPPFLAGS@
+PHP_CPPFLAGS = @PHP_CPPFLAGS@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_CXXFLAGS = @PYTHON_CXXFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDE = @PYTHON_INCLUDE@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+RUBY_CPPFLAGS = @RUBY_CPPFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+STATIC_BINARY = @STATIC_BINARY@
STRIP = @STRIP@
+SWIG = @SWIG@
+TCL_CPPFLAGS = @TCL_CPPFLAGS@
+TEST_CPPFLAGS = @TEST_CPPFLAGS@
+TEST_CXXFLAGS = @TEST_CXXFLAGS@
+TEST_LDFLAGS = @TEST_LDFLAGS@
VERSION = @VERSION@
+WNO_CONVERSION_NULL = @WNO_CONVERSION_NULL@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -176,17 +290,26 @@ libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
+mk_include = @mk_include@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
+target = @target@
target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -195,7 +318,7 @@ EXTRA_DIST = $(man_MANS)
all: all-am
.SUFFIXES:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -204,9 +327,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/prop/cryptominisat/man/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu man/Makefile
+ $(AUTOMAKE) --foreign src/prop/cryptominisat/man/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -220,9 +343,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
diff --git a/src/prop/cryptominisat/mtl/Makefile.in b/src/prop/cryptominisat/mtl/Makefile.in
index eb9b73e19..7d8c8ce1b 100644
--- a/src/prop/cryptominisat/mtl/Makefile.in
+++ b/src/prop/cryptominisat/mtl/Makefile.in
@@ -34,17 +34,36 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-subdir = mtl
+target_triplet = @target@
+subdir = src/prop/cryptominisat/mtl
DIST_COMMON = $(pkgincludesub_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/config/antlr.m4 \
+ $(top_srcdir)/config/ax_prog_doxygen.m4 \
+ $(top_srcdir)/config/ax_tls.m4 \
+ $(top_srcdir)/config/bindings.m4 $(top_srcdir)/config/boost.m4 \
+ $(top_srcdir)/config/cudd.m4 $(top_srcdir)/config/cvc4.m4 \
+ $(top_srcdir)/config/gcc_version.m4 \
+ $(top_srcdir)/config/libtool.m4 \
+ $(top_srcdir)/config/ltoptions.m4 \
+ $(top_srcdir)/config/ltsugar.m4 \
+ $(top_srcdir)/config/ltversion.m4 \
+ $(top_srcdir)/config/lt~obsolete.m4 \
+ $(top_srcdir)/config/pkg.m4 $(top_srcdir)/config/readline.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_HEADER = $(top_builddir)/cvc4autoconfig.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -75,54 +94,128 @@ CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+ANTLR = @ANTLR@
+ANTLR_HOME = @ANTLR_HOME@
+ANTLR_INCLUDES = @ANTLR_INCLUDES@
+ANTLR_LDFLAGS = @ANTLR_LDFLAGS@
AR = @AR@
+AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
+BOOST_CPPFLAGS = @BOOST_CPPFLAGS@
+BOOST_LDPATH = @BOOST_LDPATH@
+BOOST_ROOT = @BOOST_ROOT@
+BOOST_THREAD_LDFLAGS = @BOOST_THREAD_LDFLAGS@
+BOOST_THREAD_LDPATH = @BOOST_THREAD_LDPATH@
+BOOST_THREAD_LIBS = @BOOST_THREAD_LIBS@
+BUILDING_SHARED = @BUILDING_SHARED@
+BUILDING_STATIC = @BUILDING_STATIC@
+CAMLP4O = @CAMLP4O@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CLN_CFLAGS = @CLN_CFLAGS@
+CLN_LIBS = @CLN_LIBS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
+CSHARP_CPPFLAGS = @CSHARP_CPPFLAGS@
+CUDD_CPPFLAGS = @CUDD_CPPFLAGS@
+CUDD_LDFLAGS = @CUDD_LDFLAGS@
+CUDD_LIBS = @CUDD_LIBS@
+CVC4_BINDINGS_LIBRARY_VERSION = @CVC4_BINDINGS_LIBRARY_VERSION@
+CVC4_BUILD_LIBCOMPAT = @CVC4_BUILD_LIBCOMPAT@
+CVC4_COMPAT_LIBRARY_VERSION = @CVC4_COMPAT_LIBRARY_VERSION@
+CVC4_HAS_THREADS = @CVC4_HAS_THREADS@
+CVC4_LANGUAGE_BINDINGS = @CVC4_LANGUAGE_BINDINGS@
+CVC4_LIBRARY_VERSION = @CVC4_LIBRARY_VERSION@
+CVC4_PARSER_LIBRARY_VERSION = @CVC4_PARSER_LIBRARY_VERSION@
+CVC4_TLS = @CVC4_TLS@
+CVC4_TLS_SUPPORTED = @CVC4_TLS_SUPPORTED@
+CVC4_USE_CLN_IMP = @CVC4_USE_CLN_IMP@
+CVC4_USE_GMP_IMP = @CVC4_USE_GMP_IMP@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
+CXXTEST = @CXXTEST@
+CXXTESTGEN = @CXXTESTGEN@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
+DISTCHECK_CONFIGURE_FLAGS = @DISTCHECK_CONFIGURE_FLAGS@
DLLTOOL = @DLLTOOL@
+DOXYGEN_EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@
+DOXYGEN_EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@
+DOXYGEN_PAPER_SIZE = @DOXYGEN_PAPER_SIZE@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
+DX_CONFIG = @DX_CONFIG@
+DX_DOCDIR = @DX_DOCDIR@
+DX_DOT = @DX_DOT@
+DX_DOXYGEN = @DX_DOXYGEN@
+DX_DVIPS = @DX_DVIPS@
+DX_EGREP = @DX_EGREP@
+DX_ENV = @DX_ENV@
+DX_FLAG_DX_CURRENT_FEATURE = @DX_FLAG_DX_CURRENT_FEATURE@
+DX_FLAG_chi = @DX_FLAG_chi@
+DX_FLAG_chm = @DX_FLAG_chm@
+DX_FLAG_doc = @DX_FLAG_doc@
+DX_FLAG_dot = @DX_FLAG_dot@
+DX_FLAG_html = @DX_FLAG_html@
+DX_FLAG_man = @DX_FLAG_man@
+DX_FLAG_pdf = @DX_FLAG_pdf@
+DX_FLAG_ps = @DX_FLAG_ps@
+DX_FLAG_rtf = @DX_FLAG_rtf@
+DX_FLAG_xml = @DX_FLAG_xml@
+DX_HHC = @DX_HHC@
+DX_LATEX = @DX_LATEX@
+DX_MAKEINDEX = @DX_MAKEINDEX@
+DX_PDFLATEX = @DX_PDFLATEX@
+DX_PERL = @DX_PERL@
+DX_PROJECT = @DX_PROJECT@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
+FLAG_VISIBILITY_HIDDEN = @FLAG_VISIBILITY_HIDDEN@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JAVA_CPPFLAGS = @JAVA_CPPFLAGS@
LD = @LD@
LDFLAGS = @LDFLAGS@
+LFSC = @LFSC@
+LFSCARGS = @LFSCARGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
+MAN_DATE = @MAN_DATE@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
-OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@
+OCAMLC = @OCAMLC@
+OCAMLFIND = @OCAMLFIND@
+OCAMLMKTOP = @OCAMLMKTOP@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
@@ -133,12 +226,33 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_CPPFLAGS = @PERL_CPPFLAGS@
+PHP_CPPFLAGS = @PHP_CPPFLAGS@
+PKG_CONFIG = @PKG_CONFIG@
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_CXXFLAGS = @PYTHON_CXXFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDE = @PYTHON_INCLUDE@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+RUBY_CPPFLAGS = @RUBY_CPPFLAGS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+STATIC_BINARY = @STATIC_BINARY@
STRIP = @STRIP@
+SWIG = @SWIG@
+TCL_CPPFLAGS = @TCL_CPPFLAGS@
+TEST_CPPFLAGS = @TEST_CPPFLAGS@
+TEST_CXXFLAGS = @TEST_CXXFLAGS@
+TEST_LDFLAGS = @TEST_LDFLAGS@
VERSION = @VERSION@
+WNO_CONVERSION_NULL = @WNO_CONVERSION_NULL@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
@@ -178,17 +292,26 @@ libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
+mk_include = @mk_include@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
+target = @target@
target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
@@ -197,7 +320,7 @@ pkgincludesub_HEADERS = Alg.h Heap.h Vec.h
all: all-am
.SUFFIXES:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
@@ -206,9 +329,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mtl/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/prop/cryptominisat/mtl/Makefile'; \
$(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --gnu mtl/Makefile
+ $(AUTOMAKE) --foreign src/prop/cryptominisat/mtl/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@@ -222,9 +345,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(top_srcdir)/configure: $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
diff --git a/src/prop/minisat/core/Solver.cc b/src/prop/minisat/core/Solver.cc
index 3a16b0d19..c602d8b9c 100644
--- a/src/prop/minisat/core/Solver.cc
+++ b/src/prop/minisat/core/Solver.cc
@@ -195,6 +195,8 @@ CRef Solver::reason(Var x) {
if (varLevel > explLevel) {
explLevel = varLevel;
}
+ Assert(value(explanation[i]) != l_Undef);
+ Assert(i == 0 || trail_index(var(explanation[0])) > trail_index(var(explanation[i])));
}
// Construct the reason (level 0)
diff --git a/src/prop/sat_solver.h b/src/prop/sat_solver.h
index f18335048..4fe24fc60 100644
--- a/src/prop/sat_solver.h
+++ b/src/prop/sat_solver.h
@@ -72,11 +72,20 @@ public:
class BVSatSolverInterface: public SatSolver {
public:
- virtual SatValue solve(const context::CDList<SatLiteral> & assumptions) = 0;
virtual void markUnremovable(SatLiteral lit) = 0;
virtual void getUnsatCore(SatClause& unsatCore) = 0;
+
+ virtual void addMarkerLiteral(SatLiteral lit) = 0;
+
+ virtual bool getPropagations(std::vector<SatLiteral>& propagations) = 0;
+
+ virtual void explainPropagation(SatLiteral lit, std::vector<SatLiteral>& explanation) = 0;
+
+ virtual SatValue assertAssumption(SatLiteral lit, bool propagate = false) = 0;
+
+ virtual void popAssumption() = 0;
};
diff --git a/src/prop/sat_solver_factory.cpp b/src/prop/sat_solver_factory.cpp
index e6ae5d1e7..3b048af47 100644
--- a/src/prop/sat_solver_factory.cpp
+++ b/src/prop/sat_solver_factory.cpp
@@ -27,8 +27,8 @@ namespace prop {
template class SatSolverConstructor<MinisatSatSolver>;
template class SatSolverConstructor<BVMinisatSatSolver>;
-BVSatSolverInterface* SatSolverFactory::createMinisat() {
- return new BVMinisatSatSolver();
+BVSatSolverInterface* SatSolverFactory::createMinisat(context::Context* mainSatContext) {
+ return new BVMinisatSatSolver(mainSatContext);
}
DPLLSatSolverInterface* SatSolverFactory::createDPLLMinisat() {
diff --git a/src/prop/sat_solver_factory.h b/src/prop/sat_solver_factory.h
index 367397fdf..379141cc6 100644
--- a/src/prop/sat_solver_factory.h
+++ b/src/prop/sat_solver_factory.h
@@ -30,7 +30,7 @@ namespace prop {
class SatSolverFactory {
public:
- static BVSatSolverInterface* createMinisat();
+ static BVSatSolverInterface* createMinisat(context::Context* mainSatContext);
static DPLLSatSolverInterface* createDPLLMinisat();
static SatSolver* create(const char* id);
diff --git a/src/theory/bv/bitblast_strategies.cpp b/src/theory/bv/bitblast_strategies.cpp
index c0855122e..edaf8c154 100644
--- a/src/theory/bv/bitblast_strategies.cpp
+++ b/src/theory/bv/bitblast_strategies.cpp
@@ -106,7 +106,7 @@ void inline makeZero(Bits& bits, unsigned width) {
* @return the carry-out
*/
Node inline rippleCarryAdder(const Bits&a, const Bits& b, Bits& res, Node carry) {
- Assert(res.size() == 0 && a.size() == b.size());
+ Assert(a.size() == b.size() && res.size() == 0);
for (unsigned i = 0 ; i < a.size(); ++i) {
Node sum = mkXor(mkXor(a[i], b[i]), carry);
@@ -119,6 +119,24 @@ Node inline rippleCarryAdder(const Bits&a, const Bits& b, Bits& res, Node carry)
return carry;
}
+inline void shiftAddMultiplier(const Bits&a, const Bits&b, Bits& res) {
+
+ for (unsigned i = 0; i < a.size(); ++i) {
+ res.push_back(mkNode(kind::AND, b[0], a[i]));
+ }
+
+ for(unsigned k = 1; k < res.size(); ++k) {
+ Node carry_in = mkFalse();
+ Node carry_out;
+ for(unsigned j = 0; j < res.size() -k; ++j) {
+ Node aj = mkAnd(a[j], b[k]);
+ carry_out = mkOr(mkAnd(res[j+k], aj),
+ mkAnd( mkXor(res[j+k], aj), carry_in));
+ res[j+k] = mkXor(mkXor(res[j+k], aj), carry_in);
+ carry_in = carry_out;
+ }
+ }
+}
Node inline uLessThanBB(const Bits&a, const Bits& b, bool orEqual) {
Assert (a.size() && b.size());
@@ -175,13 +193,13 @@ Node inline sLessThanBB(const Bits&a, const Bits& b, bool orEqual) {
Node UndefinedAtomBBStrategy(TNode node, Bitblaster* bb) {
- Trace("bitvector") << "TheoryBV::Bitblaster Undefined bitblasting strategy for kind: "
+ BVDebug("bitvector") << "TheoryBV::Bitblaster Undefined bitblasting strategy for kind: "
<< node.getKind() << "\n";
Unreachable();
}
Node DefaultEqBB(TNode node, Bitblaster* bb) {
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Assert(node.getKind() == kind::EQUAL);
Bits lhs, rhs;
@@ -203,7 +221,7 @@ Node DefaultEqBB(TNode node, Bitblaster* bb) {
Node AdderUltBB(TNode node, Bitblaster* bb) {
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_ULT);
Bits a, b;
bb->bbTerm(node[0], a);
@@ -225,7 +243,7 @@ Node AdderUltBB(TNode node, Bitblaster* bb) {
Node DefaultUltBB(TNode node, Bitblaster* bb) {
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_ULT);
Bits a, b;
bb->bbTerm(node[0], a);
@@ -238,7 +256,7 @@ Node DefaultUltBB(TNode node, Bitblaster* bb) {
}
Node DefaultUleBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_ULE);
Bits a, b;
@@ -251,31 +269,31 @@ Node DefaultUleBB(TNode node, Bitblaster* bb){
}
Node DefaultUgtBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// should be rewritten
Unimplemented();
}
Node DefaultUgeBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// should be rewritten
Unimplemented();
}
// Node DefaultSltBB(TNode node, Bitblaster* bb){
-// Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+// BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// // shoudl be rewritten in terms of ult
// Unimplemented();
// }
// Node DefaultSleBB(TNode node, Bitblaster* bb){
-// Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+// BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// // shoudl be rewritten in terms of ule
// Unimplemented();
// }
Node DefaultSltBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Bits a, b;
bb->bbTerm(node[0], a);
@@ -287,7 +305,7 @@ Node DefaultSltBB(TNode node, Bitblaster* bb){
}
Node DefaultSleBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
Bits a, b;
bb->bbTerm(node[0], a);
@@ -299,13 +317,13 @@ Node DefaultSleBB(TNode node, Bitblaster* bb){
}
Node DefaultSgtBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// should be rewritten
Unimplemented();
}
Node DefaultSgeBB(TNode node, Bitblaster* bb){
- Debug("bitvector-bb") << "Bitblasting node " << node << "\n";
+ BVDebug("bitvector-bb") << "Bitblasting node " << node << "\n";
// should be rewritten
Unimplemented();
}
@@ -314,7 +332,7 @@ Node DefaultSgeBB(TNode node, Bitblaster* bb){
/// Term bitblasting strategies
void UndefinedTermBBStrategy(TNode node, Bits& bits, Bitblaster* bb) {
- Trace("bitvector") << "theory::bv:: Undefined bitblasting strategy for kind: "
+ BVDebug("bitvector") << "theory::bv:: Undefined bitblasting strategy for kind: "
<< node.getKind() << "\n";
Unreachable();
}
@@ -327,12 +345,12 @@ void DefaultVarBB (TNode node, Bits& bits, Bitblaster* bb) {
bits.push_back(utils::mkBitOf(node, i));
}
- Debug("bitvector-bb") << "theory::bv::DefaultVarBB bitblasting " << node << "\n";
- Debug("bitvector-bb") << " with bits " << toString(bits);
+ BVDebug("bitvector-bb") << "theory::bv::DefaultVarBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << " with bits " << toString(bits);
}
void DefaultConstBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultConstBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultConstBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::CONST_BITVECTOR);
Assert(bits.size() == 0);
@@ -345,12 +363,12 @@ void DefaultConstBB (TNode node, Bits& bits, Bitblaster* bb) {
bits.push_back(utils::mkTrue());
}
}
- Debug("bitvector-bb") << "with bits: " << toString(bits) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(bits) << "\n";
}
void DefaultNotBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultNotBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultNotBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_NOT);
Assert(bits.size() == 0);
Bits bv;
@@ -359,7 +377,7 @@ void DefaultNotBB (TNode node, Bits& bits, Bitblaster* bb) {
}
void DefaultConcatBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultConcatBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultConcatBB bitblasting " << node << "\n";
Assert(bits.size() == 0);
Assert (node.getKind() == kind::BITVECTOR_CONCAT);
@@ -373,64 +391,68 @@ void DefaultConcatBB (TNode node, Bits& bits, Bitblaster* bb) {
}
}
Assert (bits.size() == utils::getSize(node));
- Debug("bitvector-bb") << "with bits: " << toString(bits) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(bits) << "\n";
}
-
void DefaultAndBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultAndBB bitblasting " << node << "\n";
-
- Assert(node.getNumChildren() == 2 &&
- node.getKind() == kind::BITVECTOR_AND &&
+ BVDebug("bitvector-bb") << "theory::bv::DefaultAndBB bitblasting " << node << "\n";
+
+ Assert(node.getKind() == kind::BITVECTOR_AND &&
bits.size() == 0);
- Bits lhs, rhs;
- bb->bbTerm(node[0], rhs);
- bb->bbTerm(node[1], lhs);
-
- Assert (lhs.size() == rhs.size());
- for (unsigned i = 0; i < lhs.size(); ++i) {
- bits.push_back(utils::mkAnd(lhs[i], rhs[i]));
+ for(unsigned j = 0; j < utils::getSize(node); ++j) {
+ NodeBuilder<> andBuilder(kind::AND);
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ Bits current;
+ bb->bbTerm(node[i], current);
+ andBuilder << current[j];
+ Assert(utils::getSize(node) == current.size());
+ }
+ bits.push_back(andBuilder);
}
-
}
void DefaultOrBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultOrBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultOrBB bitblasting " << node << "\n";
- Assert(node.getNumChildren() == 2 &&
- node.getKind() == kind::BITVECTOR_OR &&
+ Assert(node.getKind() == kind::BITVECTOR_OR &&
bits.size() == 0);
- Bits lhs, rhs;
- bb->bbTerm(node[0], lhs);
- bb->bbTerm(node[1], rhs);
- Assert(lhs.size() == rhs.size());
-
- for (unsigned i = 0; i < lhs.size(); ++i) {
- bits.push_back(utils::mkOr(lhs[i], rhs[i]));
+ for(unsigned j = 0; j < utils::getSize(node); ++j) {
+ NodeBuilder<> orBuilder(kind::OR);
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ Bits current;
+ bb->bbTerm(node[i], current);
+ orBuilder << current[j];
+ Assert(utils::getSize(node) == current.size());
+ }
+ bits.push_back(orBuilder);
}
}
void DefaultXorBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultXorBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultXorBB bitblasting " << node << "\n";
- Assert(node.getNumChildren() == 2 &&
- node.getKind() == kind::BITVECTOR_XOR &&
+ Assert(node.getKind() == kind::BITVECTOR_XOR &&
bits.size() == 0);
- Bits lhs, rhs;
- bb->bbTerm(node[0], lhs);
- bb->bbTerm(node[1], rhs);
- Assert(lhs.size() == rhs.size());
-
- for (unsigned i = 0; i < lhs.size(); ++i) {
- bits.push_back(utils::mkXor(lhs[i], rhs[i]));
+ for(unsigned j = 0; j < utils::getSize(node); ++j) {
+ Bits first;
+ bb->bbTerm(node[0], first);
+ Node bitj = first[j];
+
+ for (unsigned i = 1; i < node.getNumChildren(); ++i) {
+ Bits current;
+ bb->bbTerm(node[i], current);
+ bitj = utils::mkNode(kind::XOR, bitj, current[j]);
+ Assert(utils::getSize(node) == current.size());
+ }
+ bits.push_back(bitj);
}
}
void DefaultXnorBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultXnorBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultXnorBB bitblasting " << node << "\n";
Assert(node.getNumChildren() == 2 &&
node.getKind() == kind::BITVECTOR_XNOR &&
@@ -447,17 +469,17 @@ void DefaultXnorBB (TNode node, Bits& bits, Bitblaster* bb) {
void DefaultNandBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultNorBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultCompBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: DefaultCompBB bitblasting "<< node << "\n";
+ BVDebug("bitvector") << "theory::bv:: DefaultCompBB bitblasting "<< node << "\n";
Assert(getSize(node) == 1 && bits.size() == 0 && node.getKind() == kind::BITVECTOR_COMP);
Bits a, b;
@@ -475,51 +497,50 @@ void DefaultCompBB (TNode node, Bits& bits, Bitblaster* bb) {
}
void DefaultMultBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: DefaultMultBB bitblasting "<< node << "\n";
+ BVDebug("bitvector") << "theory::bv:: DefaultMultBB bitblasting "<< node << "\n";
Assert(res.size() == 0 &&
node.getKind() == kind::BITVECTOR_MULT);
- Bits a, b;
- bb->bbTerm(node[0], a);
- bb->bbTerm(node[1], b);
- // constructs a simple shift and add multiplier building the result in
- // in res
-
- for (unsigned i = 0; i < a.size(); ++i) {
- res.push_back(mkNode(kind::AND, b[0], a[i]));
- }
-
- for(unsigned k = 1; k < res.size(); ++k) {
- Node carry_in = mkFalse();
- Node carry_out;
- for(unsigned j = 0; j < res.size() -k; ++j) {
- Node aj = mkAnd(a[j], b[k]);
- carry_out = mkOr(mkAnd(res[j+k], aj),
- mkAnd( mkXor(res[j+k], aj), carry_in));
- res[j+k] = mkXor(mkXor(res[j+k], aj), carry_in);
- carry_in = carry_out;
- }
+ Bits newres;
+ bb->bbTerm(node[0], res);
+ for(unsigned i = 1; i < node.getNumChildren(); ++i) {
+ Bits current;
+ bb->bbTerm(node[i], current);
+ newres.clear();
+ // constructs a simple shift and add multiplier building the result
+ // in res
+ shiftAddMultiplier(res, current, newres);
+ res = newres;
}
- Debug("bitvector-bb") << "with bits: " << toString(res) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(res) << "\n";
}
void DefaultPlusBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaulPlusBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaulPlusBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_PLUS &&
res.size() == 0);
- Bits a, b;
- bb->bbTerm(node[0], a);
- bb->bbTerm(node[1], b);
+ bb->bbTerm(node[0], res);
- Assert(a.size() == b.size() && utils::getSize(node) == a.size());
- rippleCarryAdder(a, b, res, mkFalse());
+ Bits newres;
+
+ for(unsigned i = 1; i < node.getNumChildren(); ++i) {
+ Bits current;
+ bb->bbTerm(node[i], current);
+ newres.clear();
+ rippleCarryAdder(res, current, newres, utils::mkFalse());
+ res = newres;
+ }
+
+ Assert(res.size() == utils::getSize(node));
}
void DefaultSubBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefautSubBB bitblasting " << node << "\n";
- Assert(node.getKind() == kind::BITVECTOR_SUB && bits.size() == 0);
+ BVDebug("bitvector-bb") << "theory::bv::DefautSubBB bitblasting " << node << "\n";
+ Assert(node.getKind() == kind::BITVECTOR_SUB &&
+ node.getNumChildren() == 2 &&
+ bits.size() == 0);
Bits a, b;
bb->bbTerm(node[0], a);
@@ -534,7 +555,7 @@ void DefaultSubBB (TNode node, Bits& bits, Bitblaster* bb) {
}
void DefaultNegBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefautNegBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefautNegBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_NEG);
Bits a;
@@ -612,7 +633,7 @@ void uDivModRec(const Bits& a, const Bits& b, Bits& q, Bits& r, unsigned rec_wid
}
void DefaultUdivBB (TNode node, Bits& q, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefautUdivBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefautUdivBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_UDIV && q.size() == 0);
Bits a, b;
@@ -628,7 +649,7 @@ void DefaultUdivBB (TNode node, Bits& q, Bitblaster* bb) {
}
void DefaultUremBB (TNode node, Bits& rem, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefautUremBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefautUremBB bitblasting " << node << "\n";
Assert(node.getKind() == kind::BITVECTOR_UREM && rem.size() == 0);
Bits a, b;
@@ -645,23 +666,23 @@ void DefaultUremBB (TNode node, Bits& rem, Bitblaster* bb) {
void DefaultSdivBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultSremBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultSmodBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultShlBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultShlBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultShlBB bitblasting " << node << "\n";
Assert (node.getKind() == kind::BITVECTOR_SHL &&
res.size() == 0);
Bits a, b;
@@ -688,11 +709,11 @@ void DefaultShlBB (TNode node, Bits& res, Bitblaster* bb) {
}
}
}
- Debug("bitvector-bb") << "with bits: " << toString(res) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(res) << "\n";
}
void DefaultLshrBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultLshrBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultLshrBB bitblasting " << node << "\n";
Assert (node.getKind() == kind::BITVECTOR_LSHR &&
res.size() == 0);
Bits a, b;
@@ -719,12 +740,12 @@ void DefaultLshrBB (TNode node, Bits& res, Bitblaster* bb) {
}
}
}
- Debug("bitvector-bb") << "with bits: " << toString(res) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(res) << "\n";
}
void DefaultAshrBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultAshrBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultAshrBB bitblasting " << node << "\n";
Assert (node.getKind() == kind::BITVECTOR_ASHR &&
res.size() == 0);
Bits a, b;
@@ -752,7 +773,7 @@ void DefaultAshrBB (TNode node, Bits& res, Bitblaster* bb) {
}
}
}
- Debug("bitvector-bb") << "with bits: " << toString(res) << "\n";
+ BVDebug("bitvector-bb") << "with bits: " << toString(res) << "\n";
}
@@ -770,14 +791,14 @@ void DefaultExtractBB (TNode node, Bits& bits, Bitblaster* bb) {
}
Assert (bits.size() == high - low + 1);
- Debug("bitvector-bb") << "theory::bv::DefaultExtractBB bitblasting " << node << "\n";
- Debug("bitvector-bb") << " with bits " << toString(bits);
+ BVDebug("bitvector-bb") << "theory::bv::DefaultExtractBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << " with bits " << toString(bits);
}
void DefaultRepeatBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
// this should be rewritten
Unimplemented();
@@ -785,7 +806,7 @@ void DefaultRepeatBB (TNode node, Bits& bits, Bitblaster* bb) {
void DefaultZeroExtendBB (TNode node, Bits& res_bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultZeroExtendBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultZeroExtendBB bitblasting " << node << "\n";
// this should be rewritten
Unimplemented();
@@ -793,7 +814,7 @@ void DefaultZeroExtendBB (TNode node, Bits& res_bits, Bitblaster* bb) {
}
void DefaultSignExtendBB (TNode node, Bits& res_bits, Bitblaster* bb) {
- Debug("bitvector-bb") << "theory::bv::DefaultSignExtendBB bitblasting " << node << "\n";
+ BVDebug("bitvector-bb") << "theory::bv::DefaultSignExtendBB bitblasting " << node << "\n";
Assert (node.getKind() == kind::BITVECTOR_SIGN_EXTEND &&
res_bits.size() == 0);
@@ -816,14 +837,14 @@ void DefaultSignExtendBB (TNode node, Bits& res_bits, Bitblaster* bb) {
}
void DefaultRotateRightBB (TNode node, Bits& res, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
void DefaultRotateLeftBB (TNode node, Bits& bits, Bitblaster* bb) {
- Debug("bitvector") << "theory::bv:: Unimplemented kind "
+ BVDebug("bitvector") << "theory::bv:: Unimplemented kind "
<< node.getKind() << "\n";
Unimplemented();
}
diff --git a/src/theory/bv/bv_sat.cpp b/src/theory/bv/bv_sat.cpp
index 6f91335ce..f5c43688a 100644
--- a/src/theory/bv/bv_sat.cpp
+++ b/src/theory/bv/bv_sat.cpp
@@ -23,6 +23,7 @@
#include "prop/cnf_stream.h"
#include "prop/sat_solver.h"
#include "prop/sat_solver_factory.h"
+#include "theory_bv_rewrite_rules_simplification.h"
using namespace std;
@@ -57,7 +58,7 @@ Bitblaster::Bitblaster(context::Context* c) :
d_assertedAtoms(c),
d_statistics()
{
- d_satSolver = prop::SatSolverFactory::createMinisat();
+ d_satSolver = prop::SatSolverFactory::createMinisat(c);
d_cnfStream = new TseitinCnfStream(d_satSolver, new NullRegistrar());
// initializing the bit-blasting strategies
@@ -83,7 +84,7 @@ void Bitblaster::bbAtom(TNode node) {
}
BVDebug("bitvector-bitblast") << "Bitblasting node " << node <<"\n";
-
+ ++d_statistics.d_numAtoms;
// the bitblasted definition of the atom
Node atom_bb = d_atomBBStrategies[node.getKind()](node, this);
// asserting that the atom is true iff the definition holds
@@ -101,14 +102,78 @@ void Bitblaster::bbTerm(TNode node, Bits& bits) {
return;
}
BVDebug("bitvector-bitblast") << "Bitblasting node " << node <<"\n";
- d_termBBStrategies[node.getKind()] (node, bits,this);
+ ++d_statistics.d_numTerms;
+
+ Node optimized = bbOptimize(node);
+
+ // if we already bitblasted the optimized version
+ if(hasBBTerm(optimized)) {
+ getBBTerm(optimized, bits);
+ // cache it as the same for this node
+ cacheTermDef(node, bits);
+ return;
+ }
+
+ d_termBBStrategies[optimized.getKind()] (optimized, bits,this);
- Assert (bits.size() == utils::getSize(node));
+ Assert (bits.size() == utils::getSize(node) &&
+ bits.size() == utils::getSize(optimized));
+
+ if(optimized != node) {
+ cacheTermDef(optimized, bits);
+ }
cacheTermDef(node, bits);
}
+Node Bitblaster::bbOptimize(TNode node) {
+ std::vector<Node> children;
+
+ if (node.getKind() == kind::BITVECTOR_PLUS) {
+ if (RewriteRule<BBPlusNeg>::applies(node)) {
+ Node res = RewriteRule<BBPlusNeg>::run<false>(node);
+ return res;
+ }
+ // if (RewriteRule<BBFactorOut>::applies(node)) {
+ // Node res = RewriteRule<BBFactorOut>::run<false>(node);
+ // return res;
+ // }
+
+ } else if (node.getKind() == kind::BITVECTOR_MULT) {
+ if (RewriteRule<MultPow2>::applies(node)) {
+ Node res = RewriteRule<MultPow2>::run<false>(node);
+ return res;
+ }
+ }
+
+ return node;
+}
+
/// Public methods
+void Bitblaster::addAtom(TNode atom) {
+ d_cnfStream->ensureLiteral(atom);
+ SatLiteral lit = d_cnfStream->getLiteral(atom);
+ d_satSolver->addMarkerLiteral(lit);
+}
+bool Bitblaster::getPropagations(std::vector<TNode>& propagations) {
+ std::vector<SatLiteral> propagated_literals;
+ if (d_satSolver->getPropagations(propagated_literals)) {
+ for (unsigned i = 0; i < propagated_literals.size(); ++i) {
+ propagations.push_back(d_cnfStream->getNode(propagated_literals[i]));
+ }
+ return true;
+ }
+ return false;
+}
+
+void Bitblaster::explainPropagation(TNode atom, std::vector<Node>& explanation) {
+ std::vector<SatLiteral> literal_explanation;
+ d_satSolver->explainPropagation(d_cnfStream->getLiteral(atom), literal_explanation);
+ for (unsigned i = 0; i < literal_explanation.size(); ++i) {
+ explanation.push_back(d_cnfStream->getNode(literal_explanation[i]));
+ }
+}
+
/**
* Called from preregistration bitblasts the node
*
@@ -153,7 +218,7 @@ void Bitblaster::bitblast(TNode node) {
*
*/
-void Bitblaster::assertToSat(TNode lit) {
+bool Bitblaster::assertToSat(TNode lit, bool propagate) {
// strip the not
TNode atom;
if (lit.getKind() == kind::NOT) {
@@ -163,17 +228,22 @@ void Bitblaster::assertToSat(TNode lit) {
}
Assert (hasBBAtom(atom));
- Node rewr_atom = Rewriter::rewrite(atom);
+
SatLiteral markerLit = d_cnfStream->getLiteral(atom);
if(lit.getKind() == kind::NOT) {
markerLit = ~markerLit;
}
- Debug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat asserting node: " << atom <<"\n";
- Debug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat with literal: " << markerLit << "\n";
+ BVDebug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat asserting node: " << atom <<"\n";
+ BVDebug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat with literal: " << markerLit << "\n";
+
+ SatValue ret = d_satSolver->assertAssumption(markerLit, propagate);
d_assertedAtoms.push_back(markerLit);
+
+ Assert(ret != prop::SAT_VALUE_UNKNOWN);
+ return ret == prop::SAT_VALUE_TRUE;
}
/**
@@ -183,9 +253,9 @@ void Bitblaster::assertToSat(TNode lit) {
* @return true for sat, and false for unsat
*/
-bool Bitblaster::solve() {
- Trace("bitvector") << "Bitblaster::solve() asserted atoms " << d_assertedAtoms.size() <<"\n";
- return SAT_VALUE_TRUE == d_satSolver->solve(d_assertedAtoms);
+bool Bitblaster::solve(bool quick_solve) {
+ BVDebug("bitvector") << "Bitblaster::solve() asserted atoms " << d_assertedAtoms.size() <<"\n";
+ return SAT_VALUE_TRUE == d_satSolver->solve();
}
void Bitblaster::getConflict(std::vector<TNode>& conflict) {
@@ -287,11 +357,15 @@ void Bitblaster::getBBTerm(TNode node, Bits& bits) {
Bitblaster::Statistics::Statistics() :
d_numTermClauses("theory::bv::NumberOfTermSatClauses", 0),
- d_numAtomClauses("theory::bv::NumberOfAtomSatClauses", 0),
+ d_numAtomClauses("theory::bv::NumberOfAtomSatClauses", 0),
+ d_numTerms("theory::bv::NumberOfBitblastedTerms", 0),
+ d_numAtoms("theory::bv::NumberOfBitblastedAtoms", 0),
d_bitblastTimer("theory::bv::BitblastTimer")
{
StatisticsRegistry::registerStat(&d_numTermClauses);
StatisticsRegistry::registerStat(&d_numAtomClauses);
+ StatisticsRegistry::registerStat(&d_numTerms);
+ StatisticsRegistry::registerStat(&d_numAtoms);
StatisticsRegistry::registerStat(&d_bitblastTimer);
}
@@ -299,6 +373,8 @@ Bitblaster::Statistics::Statistics() :
Bitblaster::Statistics::~Statistics() {
StatisticsRegistry::unregisterStat(&d_numTermClauses);
StatisticsRegistry::unregisterStat(&d_numAtomClauses);
+ StatisticsRegistry::unregisterStat(&d_numTerms);
+ StatisticsRegistry::unregisterStat(&d_numAtoms);
StatisticsRegistry::unregisterStat(&d_bitblastTimer);
}
diff --git a/src/theory/bv/bv_sat.h b/src/theory/bv/bv_sat.h
index c0f3b75ed..647e4fe9f 100644
--- a/src/theory/bv/bv_sat.h
+++ b/src/theory/bv/bv_sat.h
@@ -97,6 +97,8 @@ class Bitblaster {
void initAtomBBStrategies();
void initTermBBStrategies();
+ // returns a node that might be easier to bitblast
+ Node bbOptimize(TNode node);
void bbAtom(TNode node);
// division is bitblasted in terms of constraints
@@ -110,17 +112,20 @@ public:
public:
Bitblaster(context::Context* c);
~Bitblaster();
- void assertToSat(TNode node);
- bool solve();
+ bool assertToSat(TNode node, bool propagate = true);
+ bool solve(bool quick_solve = false);
void bitblast(TNode node);
void getConflict(std::vector<TNode>& conflict);
-
+ void addAtom(TNode atom);
+ bool getPropagations(std::vector<TNode>& propagations);
+ void explainPropagation(TNode atom, std::vector<Node>& explanation);
private:
class Statistics {
public:
- IntStat d_numTermClauses, d_numAtomClauses;
+ IntStat d_numTermClauses, d_numAtomClauses;
+ IntStat d_numTerms, d_numAtoms;
TimerStat d_bitblastTimer;
Statistics();
~Statistics();
diff --git a/src/theory/bv/kinds b/src/theory/bv/kinds
index 36d25de2a..6ef2cb0a9 100644
--- a/src/theory/bv/kinds
+++ b/src/theory/bv/kinds
@@ -28,16 +28,16 @@ constant CONST_BITVECTOR \
"a fixed-width bit-vector constant"
operator BITVECTOR_CONCAT 2: "bit-vector concatenation"
-operator BITVECTOR_AND 2 "bitwise and"
-operator BITVECTOR_OR 2 "bitwise or"
-operator BITVECTOR_XOR 2 "bitwise xor"
+operator BITVECTOR_AND 2: "bitwise and"
+operator BITVECTOR_OR 2: "bitwise or"
+operator BITVECTOR_XOR 2: "bitwise xor"
operator BITVECTOR_NOT 1 "bitwise not"
operator BITVECTOR_NAND 2 "bitwise nand"
operator BITVECTOR_NOR 2 "bitwise nor"
operator BITVECTOR_XNOR 2 "bitwise xnor"
operator BITVECTOR_COMP 2 "equality comparison (returns one bit)"
-operator BITVECTOR_MULT 2 "bit-vector multiplication"
-operator BITVECTOR_PLUS 2 "bit-vector addition"
+operator BITVECTOR_MULT 2: "bit-vector multiplication"
+operator BITVECTOR_PLUS 2: "bit-vector addition"
operator BITVECTOR_SUB 2 "bit-vector subtraction"
operator BITVECTOR_NEG 1 "bit-vector unary negation"
operator BITVECTOR_UDIV 2 "bit-vector unsigned division, truncating towards 0 (undefined if divisor is 0)"
diff --git a/src/theory/bv/theory_bv.cpp b/src/theory/bv/theory_bv.cpp
index 45d99f9c9..e8e1aead6 100644
--- a/src/theory/bv/theory_bv.cpp
+++ b/src/theory/bv/theory_bv.cpp
@@ -32,12 +32,13 @@ using namespace std;
using namespace CVC4::theory::bv::utils;
TheoryBV::TheoryBV(context::Context* c, context::UserContext* u, OutputChannel& out, Valuation valuation)
- : Theory(THEORY_BV, c, u, out, valuation),
+ : Theory(THEORY_BV, c, u, out, valuation),
d_context(c),
d_assertions(c),
d_bitblaster(new Bitblaster(c) ),
- d_statistics()
- {
+ d_statistics(),
+ d_alreadyPropagatedSet(c)
+ {
d_true = utils::mkTrue();
}
TheoryBV::~TheoryBV() {
@@ -61,35 +62,54 @@ TheoryBV::Statistics::~Statistics() {
void TheoryBV::preRegisterTerm(TNode node) {
BVDebug("bitvector-preregister") << "TheoryBV::preRegister(" << node << ")" << std::endl;
- //marker literal: bitblast all terms before we start
- //d_bitblaster->bitblast(node);
+ if (node.getKind() == kind::EQUAL ||
+ node.getKind() == kind::BITVECTOR_ULT ||
+ node.getKind() == kind::BITVECTOR_ULE ||
+ node.getKind() == kind::BITVECTOR_SLT ||
+ node.getKind() == kind::BITVECTOR_SLE) {
+ d_bitblaster->bitblast(node);
+ d_bitblaster->addAtom(node);
+ }
}
void TheoryBV::check(Effort e) {
- if (fullEffort(e) && !done()) {
- Trace("bitvector")<< "TheoryBV::check(" << e << ")" << std::endl;
- std::vector<TNode> assertions;
-
+ if (e == EFFORT_STANDARD) {
+ BVDebug("bitvector") << "TheoryBV::check " << e << "\n";
+ BVDebug("bitvector")<< "TheoryBV::check(" << e << ")" << std::endl;
while (!done()) {
TNode assertion = get();
- Trace("bitvector-assertions") << "TheoryBV::check assertion " << assertion << "\n";
- d_bitblaster->bitblast(assertion);
- d_bitblaster->assertToSat(assertion);
+ // make sure we do not assert things we propagated
+ if (!hasBeenPropagated(assertion)) {
+ BVDebug("bitvector-assertions") << "TheoryBV::check assertion " << assertion << "\n";
+ bool ok = d_bitblaster->assertToSat(assertion, true);
+ if (!ok) {
+ std::vector<TNode> conflictAtoms;
+ d_bitblaster->getConflict(conflictAtoms);
+ d_statistics.d_avgConflictSize.addEntry(conflictAtoms.size());
+ Node conflict = mkConjunction(conflictAtoms);
+ d_out->conflict(conflict);
+ BVDebug("bitvector") << "TheoryBV::check returns conflict: " <<conflict <<" \n ";
+ return;
+ }
+ }
}
+ }
- TimerStat::CodeTimer codeTimer(d_statistics.d_solveTimer);
- bool res = d_bitblaster->solve();
- if (res == false) {
+ if (e == EFFORT_FULL) {
+ BVDebug("bitvector") << "TheoryBV::check " << e << "\n";
+ // in standard effort we only do boolean constraint propagation
+ bool ok = d_bitblaster->solve(false);
+ if (!ok) {
std::vector<TNode> conflictAtoms;
d_bitblaster->getConflict(conflictAtoms);
d_statistics.d_avgConflictSize.addEntry(conflictAtoms.size());
-
Node conflict = mkConjunction(conflictAtoms);
d_out->conflict(conflict);
- Trace("bitvector") << "TheoryBV::check returns conflict. \n ";
+ BVDebug("bitvector") << "TheoryBV::check returns conflict: " <<conflict <<" \n ";
return;
}
}
+
}
@@ -109,19 +129,56 @@ Node TheoryBV::getValue(TNode n) {
}
}
-Node TheoryBV::explain(TNode node) {
- BVDebug("bitvector") << "TheoryBV::explain(" << node << ")" << std::endl;
+bool TheoryBV::hasBeenPropagated(TNode node) {
+ return d_alreadyPropagatedSet.count(node);
+}
- TNode equality = node.getKind() == kind::NOT ? node[0] : node;
- Assert(equality.getKind() == kind::EQUAL);
- Assert(0);
- return node;
+void TheoryBV::propagate(Effort e) {
+ BVDebug("bitvector") << "TheoryBV::propagate() \n";
+
+ // get new propagations from the sat solver
+ std::vector<TNode> propagations;
+ d_bitblaster->getPropagations(propagations);
+
+ // propagate the facts on the propagation queue
+ for (unsigned i = 0; i < propagations.size(); ++ i) {
+ TNode node = propagations[i];
+ BVDebug("bitvector") << "TheoryBV::propagate " << node <<" \n";
+ if (d_valuation.getSatValue(node) == Node::null()) {
+ vector<Node> explanation;
+ d_bitblaster->explainPropagation(node, explanation);
+ if (explanation.size() == 0) {
+ d_out->lemma(node);
+ } else {
+ NodeBuilder<> nb(kind::OR);
+ nb << node;
+ for (unsigned i = 0; i < explanation.size(); ++ i) {
+ nb << explanation[i].notNode();
+ }
+ Node lemma = nb;
+ d_out->lemma(lemma);
+ }
+ d_alreadyPropagatedSet.insert(node);
+ }
+ }
}
-// Node TheoryBV::preprocessTerm(TNode term) {
-// return term; //d_staticEqManager.find(term);
-// }
+Node TheoryBV::explain(TNode n) {
+ BVDebug("bitvector") << "TheoryBV::explain node " << n <<"\n";
+ std::vector<Node> explanation;
+ d_bitblaster->explainPropagation(n, explanation);
+ Node exp;
+
+ if (explanation.size() == 0) {
+ return utils::mkTrue();
+ }
+
+ exp = utils::mkAnd(explanation);
+
+ BVDebug("bitvector") << "TheoryBV::explain with " << exp <<"\n";
+ return exp;
+}
Theory::PPAssertStatus TheoryBV::ppAssert(TNode in, SubstitutionMap& outSubstitutions) {
switch(in.getKind()) {
diff --git a/src/theory/bv/theory_bv.h b/src/theory/bv/theory_bv.h
index 36ba17b52..d147c8bb5 100644
--- a/src/theory/bv/theory_bv.h
+++ b/src/theory/bv/theory_bv.h
@@ -24,6 +24,7 @@
#include "theory/theory.h"
#include "context/context.h"
#include "context/cdlist.h"
+#include "context/cdhashset.h"
#include "theory/bv/theory_bv_utils.h"
#include "util/stats.h"
@@ -41,7 +42,6 @@ class Bitblaster;
class TheoryBV : public Theory {
-public:
private:
@@ -54,7 +54,11 @@ private:
/** Bitblaster */
Bitblaster* d_bitblaster;
Node d_true;
-
+
+ /** Context dependent set of atoms we already propagated */
+ context::CDHashSet<TNode, TNodeHashFunction> d_alreadyPropagatedSet;
+
+ bool hasBeenPropagated(TNode node);
public:
TheoryBV(context::Context* c, context::UserContext* u, OutputChannel& out, Valuation valuation);
@@ -66,7 +70,7 @@ public:
void check(Effort e);
- void propagate(Effort e) { }
+ void propagate(Effort e);
Node explain(TNode n);
diff --git a/src/theory/bv/theory_bv_rewrite_rules.h b/src/theory/bv/theory_bv_rewrite_rules.h
index b01a0646c..30437a76e 100644
--- a/src/theory/bv/theory_bv_rewrite_rules.h
+++ b/src/theory/bv/theory_bv_rewrite_rules.h
@@ -87,7 +87,9 @@ enum RewriteRuleId {
EvalRotateLeft,
EvalRotateRight,
EvalNeg,
-
+ EvalSlt,
+ EvalSle,
+
/// simplification rules
/// all of these rules decrease formula size
ShlByConst,
@@ -136,12 +138,26 @@ enum RewriteRuleId {
ExtractArith,
ExtractArith2,
DoubleNeg,
+ NegMult,
+ NegSub,
+ NegPlus,
NotConcat,
NotAnd, // not sure why this would help (not done)
NotOr, // not sure why this would help (not done)
- NotXor // not sure why this would help (not done)
+ NotXor, // not sure why this would help (not done)
+ FlattenAssocCommut,
+ PlusCombineLikeTerms,
+ MultSimplify,
+ MultDistribConst,
+ AndSimplify,
+ OrSimplify,
+ XorSimplify,
+
+ // rules to simplify bitblasting
+ BBPlusNeg
};
+
inline std::ostream& operator << (std::ostream& out, RewriteRuleId ruleId) {
switch (ruleId) {
case EmptyRule: out << "EmptyRule"; return out;
@@ -183,6 +199,8 @@ inline std::ostream& operator << (std::ostream& out, RewriteRuleId ruleId) {
case EvalAshr : out << "EvalAshr"; return out;
case EvalUlt : out << "EvalUlt"; return out;
case EvalUle : out << "EvalUle"; return out;
+ case EvalSlt : out << "EvalSlt"; return out;
+ case EvalSle : out << "EvalSle"; return out;
case EvalExtract : out << "EvalExtract"; return out;
case EvalSignExtend : out << "EvalSignExtend"; return out;
case EvalRotateLeft : out << "EvalRotateLeft"; return out;
@@ -241,6 +259,17 @@ inline std::ostream& operator << (std::ostream& out, RewriteRuleId ruleId) {
case SignExtendEliminate : out << "SignExtendEliminate"; return out;
case NotIdemp : out << "NotIdemp"; return out;
case UleSelf: out << "UleSelf"; return out;
+ case FlattenAssocCommut: out << "FlattenAssocCommut"; return out;
+ case PlusCombineLikeTerms: out << "PlusCombineLikeTerms"; return out;
+ case MultSimplify: out << "MultSimplify"; return out;
+ case MultDistribConst: out << "MultDistribConst"; return out;
+ case NegMult : out << "NegMult"; return out;
+ case NegSub : out << "NegSub"; return out;
+ case AndSimplify : out << "AndSimplify"; return out;
+ case OrSimplify : out << "OrSimplify"; return out;
+ case XorSimplify : out << "XorSimplify"; return out;
+ case NegPlus : out << "NegPlus"; return out;
+ case BBPlusNeg : out << "BBPlusNeg"; return out;
default:
Unreachable();
}
@@ -346,6 +375,8 @@ struct AllRewriteRules {
RewriteRule<SgtEliminate> rule12;
RewriteRule<UgeEliminate> rule13;
RewriteRule<SgeEliminate> rule14;
+ RewriteRule<NegMult> rule15;
+ RewriteRule<NegSub> rule16;
RewriteRule<RepeatEliminate> rule17;
RewriteRule<RotateLeftEliminate> rule18;
RewriteRule<RotateRightEliminate> rule19;
@@ -359,8 +390,10 @@ struct AllRewriteRules {
RewriteRule<EvalOr> rule27;
RewriteRule<EvalXor> rule28;
RewriteRule<EvalNot> rule29;
+ RewriteRule<EvalSlt> rule30;
RewriteRule<EvalMult> rule31;
RewriteRule<EvalPlus> rule32;
+ RewriteRule<XorSimplify> rule33;
RewriteRule<EvalUdiv> rule34;
RewriteRule<EvalUrem> rule35;
RewriteRule<EvalShl> rule36;
@@ -368,6 +401,7 @@ struct AllRewriteRules {
RewriteRule<EvalAshr> rule38;
RewriteRule<EvalUlt> rule39;
RewriteRule<EvalUle> rule40;
+ RewriteRule<EvalSle> rule41;
RewriteRule<EvalExtract> rule43;
RewriteRule<EvalSignExtend> rule44;
RewriteRule<EvalRotateLeft> rule45;
@@ -428,14 +462,22 @@ struct AllRewriteRules {
RewriteRule<SignExtendEliminate> rule101;
RewriteRule<NotIdemp> rule102;
RewriteRule<UleSelf> rule103;
+ RewriteRule<FlattenAssocCommut> rule104;
+ RewriteRule<PlusCombineLikeTerms> rule105;
+ RewriteRule<MultSimplify> rule106;
+ RewriteRule<MultDistribConst> rule107;
+ RewriteRule<AndSimplify> rule108;
+ RewriteRule<OrSimplify> rule109;
+ RewriteRule<NegPlus> rule110;
+ RewriteRule<BBPlusNeg> rule111;
};
-template<>
+template<> inline
bool RewriteRule<EmptyRule>::applies(Node node) {
return false;
}
-template<>
+template<> inline
Node RewriteRule<EmptyRule>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EmptyRule> for " << node.getKind() <<"\n";
Unreachable();
diff --git a/src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h b/src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h
index 1dc053b5d..da3ef4485 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h
@@ -28,13 +28,13 @@ namespace CVC4 {
namespace theory {
namespace bv {
-template<>
+template<> inline
bool RewriteRule<EvalAnd>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_AND &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalAnd>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalAnd>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -44,13 +44,13 @@ Node RewriteRule<EvalAnd>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalOr>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_OR &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalOr>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalOr>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -60,13 +60,13 @@ Node RewriteRule<EvalOr>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalXor>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_XOR &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalXor>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalXor>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -76,13 +76,13 @@ Node RewriteRule<EvalXor>::apply(Node node) {
return utils::mkConst(res);
}
-// template<>
+// template<> inline
// bool RewriteRule<EvalXnor>::applies(Node node) {
// return (node.getKind() == kind::BITVECTOR_XNOR &&
// utils::isBVGroundTerm(node));
// }
-// template<>
+// template<> inline
// Node RewriteRule<EvalXnor>::apply(Node node) {
// BVDebug("bv-rewrite") << "RewriteRule<EvalXnor>(" << node << ")" << std::endl;
// BitVector a = node[0].getConst<BitVector>();
@@ -91,13 +91,13 @@ Node RewriteRule<EvalXor>::apply(Node node) {
// return utils::mkConst(res);
// }
-template<>
+template<> inline
bool RewriteRule<EvalNot>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_NOT &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalNot>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalNot>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -105,13 +105,13 @@ Node RewriteRule<EvalNot>::apply(Node node) {
return utils::mkConst(res);
}
-// template<>
+// template<> inline
// bool RewriteRule<EvalComp>::applies(Node node) {
// return (node.getKind() == kind::BITVECTOR_COMP &&
// utils::isBVGroundTerm(node));
// }
-// template<>
+// template<> inline
// Node RewriteRule<EvalComp>::apply(Node node) {
// BVDebug("bv-rewrite") << "RewriteRule<EvalComp>(" << node << ")" << std::endl;
// BitVector a = node[0].getConst<BitVector>();
@@ -126,13 +126,13 @@ Node RewriteRule<EvalNot>::apply(Node node) {
// return utils::mkConst(res);
// }
-template<>
+template<> inline
bool RewriteRule<EvalMult>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_MULT &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalMult>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalMult>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -142,13 +142,13 @@ Node RewriteRule<EvalMult>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalPlus>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_PLUS &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalPlus>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalPlus>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -158,13 +158,13 @@ Node RewriteRule<EvalPlus>::apply(Node node) {
return utils::mkConst(res);
}
-// template<>
+// template<> inline
// bool RewriteRule<EvalSub>::applies(Node node) {
// return (node.getKind() == kind::BITVECTOR_SUB &&
// utils::isBVGroundTerm(node));
// }
-// template<>
+// template<> inline
// Node RewriteRule<EvalSub>::apply(Node node) {
// BVDebug("bv-rewrite") << "RewriteRule<EvalSub>(" << node << ")" << std::endl;
// BitVector a = node[0].getConst<BitVector>();
@@ -173,13 +173,13 @@ Node RewriteRule<EvalPlus>::apply(Node node) {
// return utils::mkConst(res);
// }
-template<>
+template<> inline
bool RewriteRule<EvalNeg>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_NEG &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalNeg>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalNeg>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -187,13 +187,13 @@ Node RewriteRule<EvalNeg>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalUdiv>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UDIV &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalUdiv>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalUdiv>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -202,13 +202,13 @@ Node RewriteRule<EvalUdiv>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalUrem>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UREM &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalUrem>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalUrem>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -217,13 +217,13 @@ Node RewriteRule<EvalUrem>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalShl>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_SHL &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalShl>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalShl>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -233,13 +233,13 @@ Node RewriteRule<EvalShl>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalLshr>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_LSHR &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalLshr>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalLshr>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -249,13 +249,13 @@ Node RewriteRule<EvalLshr>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalAshr>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ASHR &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalAshr>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalAshr>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -265,13 +265,13 @@ Node RewriteRule<EvalAshr>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalUlt>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULT &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalUlt>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalUlt>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -283,32 +283,32 @@ Node RewriteRule<EvalUlt>::apply(Node node) {
return utils::mkFalse();
}
-// template<>
-// bool RewriteRule<EvalSlt>::applies(Node node) {
-// return (node.getKind() == kind::BITVECTOR_SLT &&
-// utils::isBVGroundTerm(node));
-// }
+template<> inline
+bool RewriteRule<EvalSlt>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_SLT &&
+ utils::isBVGroundTerm(node));
+}
-// template<>
-// Node RewriteRule<EvalSlt>::apply(Node node) {
-// BVDebug("bv-rewrite") << "RewriteRule<EvalSlt>(" << node << ")" << std::endl;
-// BitVector a = node[0].getConst<BitVector>();
-// BitVector b = node[1].getConst<BitVector>();
+template<> inline
+Node RewriteRule<EvalSlt>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<EvalSlt>(" << node << ")" << std::endl;
+ BitVector a = node[0].getConst<BitVector>();
+ BitVector b = node[1].getConst<BitVector>();
-// if (a.signedLessThan(b)) {
-// return utils::mkTrue();
-// }
-// return utils::mkFalse();
+ if (a.signedLessThan(b)) {
+ return utils::mkTrue();
+ }
+ return utils::mkFalse();
-// }
+}
-template<>
+template<> inline
bool RewriteRule<EvalUle>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULE &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalUle>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalUle>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -320,31 +320,31 @@ Node RewriteRule<EvalUle>::apply(Node node) {
return utils::mkFalse();
}
-// template<>
-// bool RewriteRule<EvalSle>::applies(Node node) {
-// return (node.getKind() == kind::BITVECTOR_SLE &&
-// utils::isBVGroundTerm(node));
-// }
+template<> inline
+bool RewriteRule<EvalSle>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_SLE &&
+ utils::isBVGroundTerm(node));
+}
-// template<>
-// Node RewriteRule<EvalSle>::apply(Node node) {
-// BVDebug("bv-rewrite") << "RewriteRule<EvalSle>(" << node << ")" << std::endl;
-// BitVector a = node[0].getConst<BitVector>();
-// BitVector b = node[1].getConst<BitVector>();
+template<> inline
+Node RewriteRule<EvalSle>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<EvalSle>(" << node << ")" << std::endl;
+ BitVector a = node[0].getConst<BitVector>();
+ BitVector b = node[1].getConst<BitVector>();
-// if (a.signedLessThanEq(b)) {
-// return utils::mkTrue();
-// }
-// return utils::mkFalse();
-// }
+ if (a.signedLessThanEq(b)) {
+ return utils::mkTrue();
+ }
+ return utils::mkFalse();
+}
-template<>
+template<> inline
bool RewriteRule<EvalExtract>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_EXTRACT &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalExtract>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalExtract>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -356,13 +356,13 @@ Node RewriteRule<EvalExtract>::apply(Node node) {
}
-template<>
+template<> inline
bool RewriteRule<EvalConcat>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_CONCAT &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalConcat>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalConcat>(" << node << ")" << std::endl;
unsigned num = node.getNumChildren();
@@ -374,13 +374,13 @@ Node RewriteRule<EvalConcat>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalSignExtend>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_SIGN_EXTEND &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalSignExtend>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalSignExtend>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
@@ -390,13 +390,13 @@ Node RewriteRule<EvalSignExtend>::apply(Node node) {
return utils::mkConst(res);
}
-template<>
+template<> inline
bool RewriteRule<EvalEquals>::applies(Node node) {
return (node.getKind() == kind::EQUAL &&
utils::isBVGroundTerm(node));
}
-template<>
+template<> inline
Node RewriteRule<EvalEquals>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<EvalEquals>(" << node << ")" << std::endl;
BitVector a = node[0].getConst<BitVector>();
diff --git a/src/theory/bv/theory_bv_rewrite_rules_core.h b/src/theory/bv/theory_bv_rewrite_rules_core.h
index 3240ef5f3..f3d28072e 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_core.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_core.h
@@ -28,12 +28,12 @@ namespace CVC4 {
namespace theory {
namespace bv {
-template<>
+template<> inline
bool RewriteRule<ConcatFlatten>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_CONCAT);
}
-template<>
+template<> inline
Node RewriteRule<ConcatFlatten>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ConcatFlatten>(" << node << ")" << std::endl;
NodeBuilder<> result(kind::BITVECTOR_CONCAT);
@@ -54,12 +54,12 @@ Node RewriteRule<ConcatFlatten>::apply(Node node) {
return resultNode;
}
-template<>
+template<> inline
bool RewriteRule<ConcatExtractMerge>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_CONCAT);
}
-template<>
+template<> inline
Node RewriteRule<ConcatExtractMerge>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ConcatExtractMerge>(" << node << ")" << std::endl;
@@ -115,12 +115,12 @@ Node RewriteRule<ConcatExtractMerge>::apply(Node node) {
return utils::mkConcat(mergedExtracts);
}
-template<>
+template<> inline
bool RewriteRule<ConcatConstantMerge>::applies(Node node) {
return node.getKind() == kind::BITVECTOR_CONCAT;
}
-template<>
+template<> inline
Node RewriteRule<ConcatConstantMerge>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ConcatConstantMerge>(" << node << ")" << std::endl;
@@ -157,7 +157,7 @@ Node RewriteRule<ConcatConstantMerge>::apply(Node node) {
return utils::mkConcat(mergedConstants);
}
-template<>
+template<> inline
bool RewriteRule<ExtractWhole>::applies(Node node) {
if (node.getKind() != kind::BITVECTOR_EXTRACT) return false;
unsigned length = utils::getSize(node[0]);
@@ -168,20 +168,20 @@ bool RewriteRule<ExtractWhole>::applies(Node node) {
return true;
}
-template<>
+template<> inline
Node RewriteRule<ExtractWhole>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractWhole>(" << node << ")" << std::endl;
return node[0];
}
-template<>
+template<> inline
bool RewriteRule<ExtractConstant>::applies(Node node) {
if (node.getKind() != kind::BITVECTOR_EXTRACT) return false;
if (node[0].getKind() != kind::CONST_BITVECTOR) return false;
return true;
}
-template<>
+template<> inline
Node RewriteRule<ExtractConstant>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractConstant>(" << node << ")" << std::endl;
Node child = node[0];
@@ -189,7 +189,7 @@ Node RewriteRule<ExtractConstant>::apply(Node node) {
return utils::mkConst(childValue.extract(utils::getExtractHigh(node), utils::getExtractLow(node)));
}
-template<>
+template<> inline
bool RewriteRule<ExtractConcat>::applies(Node node) {
//BVDebug("bv-rewrite") << "RewriteRule<ExtractConcat>(" << node << ")" << std::endl;
if (node.getKind() != kind::BITVECTOR_EXTRACT) return false;
@@ -197,7 +197,7 @@ bool RewriteRule<ExtractConcat>::applies(Node node) {
return true;
}
-template<>
+template<> inline
Node RewriteRule<ExtractConcat>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractConcat>(" << node << ")" << std::endl;
int extract_high = utils::getExtractHigh(node);
@@ -223,14 +223,14 @@ Node RewriteRule<ExtractConcat>::apply(Node node) {
return utils::mkConcat(resultChildren);
}
-template<>
+template<> inline
bool RewriteRule<ExtractExtract>::applies(Node node) {
if (node.getKind() != kind::BITVECTOR_EXTRACT) return false;
if (node[0].getKind() != kind::BITVECTOR_EXTRACT) return false;
return true;
}
-template<>
+template<> inline
Node RewriteRule<ExtractExtract>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractExtract>(" << node << ")" << std::endl;
@@ -244,7 +244,7 @@ Node RewriteRule<ExtractExtract>::apply(Node node) {
return result;
}
-template<>
+template<> inline
bool RewriteRule<FailEq>::applies(Node node) {
//BVDebug("bv-rewrite") << "RewriteRule<FailEq>(" << node << ")" << std::endl;
if (node.getKind() != kind::EQUAL) return false;
@@ -253,29 +253,29 @@ bool RewriteRule<FailEq>::applies(Node node) {
return node[0] != node[1];
}
-template<>
+template<> inline
Node RewriteRule<FailEq>::apply(Node node) {
return utils::mkFalse();
}
-template<>
+template<> inline
bool RewriteRule<SimplifyEq>::applies(Node node) {
if (node.getKind() != kind::EQUAL) return false;
return node[0] == node[1];
}
-template<>
+template<> inline
Node RewriteRule<SimplifyEq>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<SimplifyEq>(" << node << ")" << std::endl;
return utils::mkTrue();
}
-template<>
+template<> inline
bool RewriteRule<ReflexivityEq>::applies(Node node) {
return (node.getKind() == kind::EQUAL && node[0] < node[1]);
}
-template<>
+template<> inline
Node RewriteRule<ReflexivityEq>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ReflexivityEq>(" << node << ")" << std::endl;
return node[1].eqNode(node[0]);
diff --git a/src/theory/bv/theory_bv_rewrite_rules_normalization.h b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
index 4e974881c..5587e25eb 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_normalization.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_normalization.h
@@ -33,7 +33,7 @@ namespace bv {
* (x bvop y) [i:j] ==> x[i:j] bvop y[i:j]
* where bvop is bvand,bvor, bvxor
*/
-template<>
+template<> inline
bool RewriteRule<ExtractBitwise>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_EXTRACT &&
(node[0].getKind() == kind::BITVECTOR_AND ||
@@ -41,7 +41,7 @@ bool RewriteRule<ExtractBitwise>::applies(Node node) {
node[0].getKind() == kind::BITVECTOR_XOR ));
}
-template<>
+template<> inline
Node RewriteRule<ExtractBitwise>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractBitwise>(" << node << ")" << std::endl;
unsigned high = utils::getExtractHigh(node);
@@ -57,13 +57,13 @@ Node RewriteRule<ExtractBitwise>::apply(Node node) {
*
* (~ a) [i:j] ==> ~ (a[i:j])
*/
-template<>
+template<> inline
bool RewriteRule<ExtractNot>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_EXTRACT &&
node[0].getKind() == kind::BITVECTOR_NOT);
}
-template<>
+template<> inline
Node RewriteRule<ExtractNot>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractNot>(" << node << ")" << std::endl;
unsigned low = utils::getExtractLow(node);
@@ -78,7 +78,7 @@ Node RewriteRule<ExtractNot>::apply(Node node) {
* (a bvop b) [k:0] ==> (a[k:0] bvop b[k:0])
*/
-template<>
+template<> inline
bool RewriteRule<ExtractArith>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_EXTRACT &&
utils::getExtractLow(node) == 0 &&
@@ -86,7 +86,7 @@ bool RewriteRule<ExtractArith>::applies(Node node) {
node[0].getKind() == kind::BITVECTOR_MULT));
}
-template<>
+template<> inline
Node RewriteRule<ExtractArith>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractArith>(" << node << ")" << std::endl;
unsigned low = utils::getExtractLow(node);
@@ -107,14 +107,14 @@ Node RewriteRule<ExtractArith>::apply(Node node) {
*/
// careful not to apply in a loop
-template<>
+template<> inline
bool RewriteRule<ExtractArith2>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_EXTRACT &&
(node[0].getKind() == kind::BITVECTOR_PLUS ||
node[0].getKind() == kind::BITVECTOR_MULT));
}
-template<>
+template<> inline
Node RewriteRule<ExtractArith2>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ExtractArith2>(" << node << ")" << std::endl;
unsigned low = utils::getExtractLow(node);
@@ -128,13 +128,570 @@ Node RewriteRule<ExtractArith2>::apply(Node node) {
return utils::mkExtract(a_op_b, high, low);
}
+template<> inline
+bool RewriteRule<FlattenAssocCommut>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_PLUS ||
+ node.getKind() == kind::BITVECTOR_MULT ||
+ node.getKind() == kind::BITVECTOR_OR ||
+ node.getKind() == kind::BITVECTOR_XOR ||
+ node.getKind() == kind::BITVECTOR_AND);
+}
+
+
+template<> inline
+Node RewriteRule<FlattenAssocCommut>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<FlattenAssocCommut>(" << node << ")" << std::endl;
+ std::vector<Node> processingStack;
+ processingStack.push_back(node);
+ std::vector<Node> children;
+ Kind kind = node.getKind();
+
+ while (! processingStack.empty()) {
+ TNode current = processingStack.back();
+ processingStack.pop_back();
+
+ // flatten expression
+ if (current.getKind() == kind) {
+ for (unsigned i = 0; i < current.getNumChildren(); ++i) {
+ processingStack.push_back(current[i]);
+ }
+ } else {
+ children.push_back(current);
+ }
+ }
+ return utils::mkSortedNode(kind, children);
+}
+
+static inline void addToCoefMap(std::map<Node, BitVector>& map,
+ TNode term, const BitVector& coef) {
+ if (map.find(term) != map.end()) {
+ map[term] = map[term] + coef;
+ } else {
+ map[term] = coef;
+ }
+}
+
+
+template<> inline
+bool RewriteRule<PlusCombineLikeTerms>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_PLUS);
+}
+
+template<> inline
+Node RewriteRule<PlusCombineLikeTerms>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<PlusCombineLikeTerms>(" << node << ")" << std::endl;
+ unsigned size = utils::getSize(node);
+ BitVector constSum(size, (unsigned)0);
+ std::map<Node, BitVector> factorToCoefficient;
+
+ // combine like-terms
+ for(unsigned i= 0; i < node.getNumChildren(); ++i) {
+ TNode current = node[i];
+
+ // look for c * x, where c is a constant
+ if (current.getKind() == kind::BITVECTOR_MULT &&
+ (current[0].getKind() == kind::CONST_BITVECTOR ||
+ current[1].getKind() == kind::CONST_BITVECTOR)) {
+ // if we are multiplying by a constant
+ BitVector coeff;
+ TNode term;
+ // figure out which part is the constant
+ if (current[0].getKind() == kind::CONST_BITVECTOR) {
+ coeff = current[0].getConst<BitVector>();
+ term = current[1];
+ } else {
+ coeff = current[1].getConst<BitVector>();
+ term = current[0];
+ }
+ if(term.getKind() == kind::BITVECTOR_SUB) {
+ TNode a = term[0];
+ TNode b = term[1];
+ addToCoefMap(factorToCoefficient, a, coeff);
+ addToCoefMap(factorToCoefficient, b, -coeff);
+ }
+ else if(term.getKind() == kind::BITVECTOR_NEG) {
+ addToCoefMap(factorToCoefficient, term[0], -BitVector(size, coeff));
+ }
+ else {
+ addToCoefMap(factorToCoefficient, term, coeff);
+ }
+ }
+ else if (current.getKind() == kind::BITVECTOR_SUB) {
+ // turn into a + (-1)*b
+ addToCoefMap(factorToCoefficient, current[0], BitVector(size, (unsigned)1));
+ addToCoefMap(factorToCoefficient, current[1], -BitVector(size, (unsigned)1));
+ }
+ else if (current.getKind() == kind::BITVECTOR_NEG) {
+ addToCoefMap(factorToCoefficient, current[0], -BitVector(size, (unsigned)1));
+ }
+ else if (current.getKind() == kind::CONST_BITVECTOR) {
+ BitVector constValue = current.getConst<BitVector>();
+ constSum = constSum + constValue;
+ }
+ else {
+ // store as 1 * current
+ addToCoefMap(factorToCoefficient, current, BitVector(size, (unsigned)1));
+ }
+ }
+
+ std::vector<Node> children;
+ if ( constSum!= BitVector(size, (unsigned)0)) {
+ children.push_back(utils::mkConst(constSum));
+ }
+
+ // construct result
+ std::map<Node, BitVector>::const_iterator it = factorToCoefficient.begin();
+
+ for (; it != factorToCoefficient.end(); ++it) {
+ BitVector bv_coeff = it->second;
+ TNode term = it->first;
+ if(bv_coeff == BitVector(size, (unsigned)0)) {
+ continue;
+ }
+ else if (bv_coeff == BitVector(size, (unsigned)1)) {
+ children.push_back(term);
+ }
+ else if (bv_coeff == -BitVector(size, (unsigned)1)) {
+ // avoid introducing an extra multiplication
+ children.push_back(utils::mkNode(kind::BITVECTOR_NEG, term));
+ }
+ else {
+ Node coeff = utils::mkConst(bv_coeff);
+ Node product = utils::mkSortedNode(kind::BITVECTOR_MULT, coeff, term);
+ children.push_back(product);
+ }
+ }
+
+ if(children.size() == 0) {
+ return utils::mkConst(size, (unsigned)0);
+ }
+
+ return utils::mkSortedNode(kind::BITVECTOR_PLUS, children);
+}
+
+
+template<> inline
+bool RewriteRule<MultSimplify>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_MULT);
+}
+
+template<> inline
+Node RewriteRule<MultSimplify>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<MultSimplify>(" << node << ")" << std::endl;
+ unsigned size = utils::getSize(node);
+ BitVector constant(size, Integer(1));
+
+ std::vector<Node> children;
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ TNode current = node[i];
+ if (current.getKind() == kind::CONST_BITVECTOR) {
+ BitVector value = current.getConst<BitVector>();
+ if(value == BitVector(size, (unsigned) 0)) {
+ return utils::mkConst(size, 0);
+ }
+ constant = constant * current.getConst<BitVector>();
+ } else {
+ children.push_back(current);
+ }
+ }
+
+
+ if(constant != BitVector(size, (unsigned)1)) {
+ children.push_back(utils::mkConst(constant));
+ }
+
+
+ if(children.size() == 0) {
+ return utils::mkConst(size, (unsigned)1);
+ }
+
+ return utils::mkSortedNode(kind::BITVECTOR_MULT, children);
+}
+
+template<> inline
+bool RewriteRule<MultDistribConst>::applies(Node node) {
+ if (node.getKind() != kind::BITVECTOR_MULT)
+ return false;
+
+ TNode factor;
+ if (node[0].getKind() == kind::CONST_BITVECTOR) {
+ factor = node[1];
+ } else if (node[1].getKind() == kind::CONST_BITVECTOR) {
+ factor = node[0];
+ } else {
+ return false;
+ }
+
+ return (factor.getKind() == kind::BITVECTOR_PLUS ||
+ factor.getKind() == kind::BITVECTOR_SUB ||
+ factor.getKind() == kind::BITVECTOR_NEG);
+}
+
+template<> inline
+Node RewriteRule<MultDistribConst>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<MultDistribConst>(" << node << ")" << std::endl;
+
+ TNode constant;
+ TNode factor;
+ if (node[0].getKind() == kind::CONST_BITVECTOR) {
+ constant = node[0];
+ factor = node[1];
+ } else {
+ Assert(node[1].getKind() == kind::CONST_BITVECTOR);
+ constant = node[1];
+ factor = node[0];
+ }
+
+ if (factor.getKind() == kind::BITVECTOR_NEG) {
+ // push negation on the constant part
+ BitVector const_bv = constant.getConst<BitVector>();
+ return utils::mkSortedNode(kind::BITVECTOR_MULT,
+ utils::mkConst(-const_bv),
+ factor[0]);
+ }
+
+ std::vector<Node> children;
+ for(unsigned i = 0; i < factor.getNumChildren(); ++i) {
+ children.push_back(utils::mkSortedNode(kind::BITVECTOR_MULT, constant, factor[i]));
+ }
+
+ return utils::mkSortedNode(factor.getKind(), children);
+
+}
+
+
+/**
+ * -(c * expr) ==> (-c * expr)
+ * where c is a constant
+ */
+template<> inline
+bool RewriteRule<NegMult>::applies(Node node) {
+ if(node.getKind()!= kind::BITVECTOR_NEG ||
+ node[0].getKind() != kind::BITVECTOR_MULT) {
+ return false;
+ }
+ TNode mult = node[0];
+ for (unsigned i = 0; i < mult.getNumChildren(); ++i) {
+ if (mult[i].getKind() == kind::CONST_BITVECTOR) {
+ return true;
+ }
+ }
+ return false;
+}
+
+template<> inline
+Node RewriteRule<NegMult>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<NegMult>(" << node << ")" << std::endl;
+ TNode mult = node[0];
+ std::vector<Node> children;
+ bool has_const = false;
+ for(unsigned i = 0; i < mult.getNumChildren(); ++i) {
+ if(mult[i].getKind() == kind::CONST_BITVECTOR) {
+ Assert(has_const == false);
+ has_const = true;
+ BitVector bv = mult[i].getConst<BitVector>();
+ children.push_back(utils::mkConst(-bv));
+ } else {
+ children.push_back(mult[i]);
+ }
+ }
+ Assert (has_const);
+ return utils::mkSortedNode(kind::BITVECTOR_MULT, children);
+}
+
+template<> inline
+bool RewriteRule<NegSub>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_NEG &&
+ node[0].getKind() == kind::BITVECTOR_SUB);
+}
+
+template<> inline
+Node RewriteRule<NegSub>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<NegSub>(" << node << ")" << std::endl;
+ return utils::mkNode(kind::BITVECTOR_SUB, node[0][1], node[0][0]);
+}
+
+template<> inline
+bool RewriteRule<NegPlus>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_NEG &&
+ node[0].getKind() == kind::BITVECTOR_PLUS);
+}
+
+template<> inline
+Node RewriteRule<NegPlus>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<NegPlus>(" << node << ")" << std::endl;
+ std::vector<Node> children;
+ for (unsigned i = 0; i < node[0].getNumChildren(); ++i) {
+ children.push_back(utils::mkNode(kind::BITVECTOR_NEG, node[0][i]));
+ }
+ return utils::mkSortedNode(kind::BITVECTOR_PLUS, children);
+}
+
+
+
+
+struct Count {
+ unsigned pos;
+ unsigned neg;
+ Count() : pos(0), neg(0) {}
+ Count(unsigned p, unsigned n):
+ pos(p),
+ neg(n)
+ {}
+};
+
+inline static void insert(std::hash_map<TNode, Count, TNodeHashFunction>& map, TNode node, bool neg) {
+ if(map.find(node) == map.end()) {
+ Count c = neg? Count(0,1) : Count(1, 0);
+ map[node] = c;
+ } else {
+ if (neg) {
+ ++(map[node].neg);
+ } else {
+ ++(map[node].pos);
+ }
+ }
+}
+
+template<> inline
+bool RewriteRule<AndSimplify>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_AND);
+}
+
+template<> inline
+Node RewriteRule<AndSimplify>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<AndSimplify>(" << node << ")" << std::endl;
+
+ // this will remove duplicates
+ std::hash_map<TNode, Count, TNodeHashFunction> subterms;
+ unsigned size = utils::getSize(node);
+ BitVector constant = utils::mkBitVectorOnes(size);
+
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ TNode current = node[i];
+ // simplify constants
+ if (current.getKind() == kind::CONST_BITVECTOR) {
+ BitVector bv = current.getConst<BitVector>();
+ constant = constant & bv;
+ } else {
+ if (current.getKind() == kind::BITVECTOR_NOT) {
+ insert(subterms, current[0], true);
+ } else {
+ insert(subterms, current, false);
+ }
+ }
+ }
+
+ std::vector<Node> children;
+
+ if (constant == BitVector(size, (unsigned)0)) {
+ return utils::mkConst(BitVector(size, (unsigned)0));
+ }
+
+ if (constant != utils::mkBitVectorOnes(size)) {
+ children.push_back(utils::mkConst(constant));
+ }
+
+ std::hash_map<TNode, Count, TNodeHashFunction>::const_iterator it = subterms.begin();
+
+ for (; it != subterms.end(); ++it) {
+ if (it->second.pos > 0 && it->second.neg > 0) {
+ // if we have a and ~a
+ return utils::mkConst(BitVector(size, (unsigned)0));
+ } else {
+ // idempotence
+ if (it->second.neg > 0) {
+ // if it only occured negated
+ children.push_back(utils::mkNode(kind::BITVECTOR_NOT, it->first));
+ } else {
+ // if it only occured positive
+ children.push_back(it->first);
+ }
+ }
+ }
+ if (children.size() == 0) {
+ return utils::mkOnes(size);
+ }
+
+ return utils::mkSortedNode(kind::BITVECTOR_AND, children);
+}
+
+template<> inline
+bool RewriteRule<OrSimplify>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_OR);
+}
+
+template<> inline
+Node RewriteRule<OrSimplify>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<OrSimplify>(" << node << ")" << std::endl;
+
+ // this will remove duplicates
+ std::hash_map<TNode, Count, TNodeHashFunction> subterms;
+ unsigned size = utils::getSize(node);
+ BitVector constant(size, (unsigned)0);
+
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ TNode current = node[i];
+ // simplify constants
+ if (current.getKind() == kind::CONST_BITVECTOR) {
+ BitVector bv = current.getConst<BitVector>();
+ constant = constant | bv;
+ } else {
+ if (current.getKind() == kind::BITVECTOR_NOT) {
+ insert(subterms, current[0], true);
+ } else {
+ insert(subterms, current, false);
+ }
+ }
+ }
+
+ std::vector<Node> children;
+
+ if (constant == utils::mkBitVectorOnes(size)) {
+ return utils::mkOnes(size);
+ }
+
+ if (constant != BitVector(size, (unsigned)0)) {
+ children.push_back(utils::mkConst(constant));
+ }
+
+ std::hash_map<TNode, Count, TNodeHashFunction>::const_iterator it = subterms.begin();
+
+ for (; it != subterms.end(); ++it) {
+ if (it->second.pos > 0 && it->second.neg > 0) {
+ // if we have a or ~a
+ return utils::mkOnes(size);
+ } else {
+ // idempotence
+ if (it->second.neg > 0) {
+ // if it only occured negated
+ children.push_back(utils::mkNode(kind::BITVECTOR_NOT, it->first));
+ } else {
+ // if it only occured positive
+ children.push_back(it->first);
+ }
+ }
+ }
+
+ if (children.size() == 0) {
+ return utils::mkConst(BitVector(size, (unsigned)0));
+ }
+ return utils::mkSortedNode(kind::BITVECTOR_OR, children);
+}
+
+template<> inline
+bool RewriteRule<XorSimplify>::applies(Node node) {
+ return (node.getKind() == kind::BITVECTOR_XOR);
+}
+
+template<> inline
+Node RewriteRule<XorSimplify>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<XorSimplify>(" << node << ")" << std::endl;
+
+
+ std::hash_map<TNode, Count, TNodeHashFunction> subterms;
+ unsigned size = utils::getSize(node);
+ BitVector constant;
+ bool const_set = false;
+
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ TNode current = node[i];
+ // simplify constants
+ if (current.getKind() == kind::CONST_BITVECTOR) {
+ BitVector bv = current.getConst<BitVector>();
+ if (const_set) {
+ constant = constant ^ bv;
+ } else {
+ const_set = true;
+ constant = bv;
+ }
+ } else {
+ // collect number of occurances of each term and its negation
+ if (current.getKind() == kind::BITVECTOR_NOT) {
+ insert(subterms, current[0], true);
+ } else {
+ insert(subterms, current, false);
+ }
+ }
+ }
+
+ std::vector<Node> children;
+
+ std::hash_map<TNode, Count, TNodeHashFunction>::const_iterator it = subterms.begin();
+ unsigned true_count = 0;
+ bool seen_false = false;
+ for (; it != subterms.end(); ++it) {
+ unsigned pos = it->second.pos; // number of positive occurances
+ unsigned neg = it->second.neg; // number of negated occurances
+
+ // remove duplicates using the following rules
+ // a xor a ==> false
+ // false xor false ==> false
+ seen_false = seen_false? seen_false : (pos > 1 || neg > 1);
+ // check what did not reduce
+ if (pos % 2 && neg % 2) {
+ // we have a xor ~a ==> true
+ ++true_count;
+ } else if (pos % 2) {
+ // we had a positive occurence left
+ children.push_back(it->first);
+ } else if (neg % 2) {
+ // we had a negative occurence left
+ children.push_back(utils::mkNode(kind::BITVECTOR_NOT, it->first));
+ }
+ // otherwise both reduced to false
+ }
+
+ std::vector<BitVector> xorConst;
+ BitVector true_bv = utils::mkBitVectorOnes(size);
+ BitVector false_bv(size, (unsigned)0);
+
+ if (true_count) {
+ // true xor ... xor true ==> true (odd)
+ // ==> false (even)
+ xorConst.push_back(true_count % 2? true_bv : false_bv);
+ }
+ if (seen_false) {
+ xorConst.push_back(false_bv);
+ }
+ if(const_set) {
+ xorConst.push_back(constant);
+ }
+
+ if (xorConst.size() > 0) {
+ BitVector result = xorConst[0];
+ for (unsigned i = 1; i < xorConst.size(); ++i) {
+ result = result ^ xorConst[i];
+ }
+ children.push_back(utils::mkConst(result));
+ }
+
+ Assert(children.size());
+
+ return utils::mkSortedNode(kind::BITVECTOR_XOR, children);
+}
+
+
+
+
+// template<> inline
+// bool RewriteRule<AndSimplify>::applies(Node node) {
+// return (node.getKind() == kind::BITVECTOR_AND);
+// }
+
+// template<> inline
+// Node RewriteRule<AndSimplify>::apply(Node node) {
+// BVDebug("bv-rewrite") << "RewriteRule<AndSimplify>(" << node << ")" << std::endl;
+// return resultNode;
+// }
+
-// template<>
+// template<> inline
// bool RewriteRule<>::applies(Node node) {
// return (node.getKind() == kind::BITVECTOR_CONCAT);
// }
-// template<>
+// template<> inline
// Node RewriteRule<>::apply(Node node) {
// BVDebug("bv-rewrite") << "RewriteRule<>(" << node << ")" << std::endl;
// return resultNode;
diff --git a/src/theory/bv/theory_bv_rewrite_rules_simplification.h b/src/theory/bv/theory_bv_rewrite_rules_simplification.h
index 507f98c91..cf8310e5a 100644
--- a/src/theory/bv/theory_bv_rewrite_rules_simplification.h
+++ b/src/theory/bv/theory_bv_rewrite_rules_simplification.h
@@ -36,14 +36,14 @@ namespace bv {
*
* Left Shift by constant amount
*/
-template<>
+template<> inline
bool RewriteRule<ShlByConst>::applies(Node node) {
// if the shift amount is constant
return (node.getKind() == kind::BITVECTOR_SHL &&
node[1].getKind() == kind::CONST_BITVECTOR);
}
-template<>
+template<> inline
Node RewriteRule<ShlByConst>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ShlByConst>(" << node << ")" << std::endl;
Integer amount = node[1].getConst<BitVector>().toInteger();
@@ -72,14 +72,14 @@ Node RewriteRule<ShlByConst>::apply(Node node) {
* Right Logical Shift by constant amount
*/
-template<>
+template<> inline
bool RewriteRule<LshrByConst>::applies(Node node) {
// if the shift amount is constant
return (node.getKind() == kind::BITVECTOR_LSHR &&
node[1].getKind() == kind::CONST_BITVECTOR);
}
-template<>
+template<> inline
Node RewriteRule<LshrByConst>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<LshrByConst>(" << node << ")" << std::endl;
Integer amount = node[1].getConst<BitVector>().toInteger();
@@ -108,14 +108,14 @@ Node RewriteRule<LshrByConst>::apply(Node node) {
* Right Arithmetic Shift by constant amount
*/
-template<>
+template<> inline
bool RewriteRule<AshrByConst>::applies(Node node) {
// if the shift amount is constant
return (node.getKind() == kind::BITVECTOR_ASHR &&
node[1].getKind() == kind::CONST_BITVECTOR);
}
-template<>
+template<> inline
Node RewriteRule<AshrByConst>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<AshrByConst>(" << node << ")" << std::endl;
Integer amount = node[1].getConst<BitVector>().toInteger();
@@ -150,14 +150,14 @@ Node RewriteRule<AshrByConst>::apply(Node node) {
* (a bvor a) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<BitwiseIdemp>::applies(Node node) {
return ((node.getKind() == kind::BITVECTOR_AND ||
node.getKind() == kind::BITVECTOR_OR) &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<BitwiseIdemp>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<BitwiseIdemp>(" << node << ")" << std::endl;
return node[0];
@@ -169,7 +169,7 @@ Node RewriteRule<BitwiseIdemp>::apply(Node node) {
* (a bvand 0) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<AndZero>::applies(Node node) {
unsigned size = utils::getSize(node);
return (node.getKind() == kind::BITVECTOR_AND &&
@@ -177,7 +177,7 @@ bool RewriteRule<AndZero>::applies(Node node) {
node[1] == utils::mkConst(size, 0)));
}
-template<>
+template<> inline
Node RewriteRule<AndZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<AndZero>(" << node << ")" << std::endl;
return utils::mkConst(utils::getSize(node), 0);
@@ -189,7 +189,7 @@ Node RewriteRule<AndZero>::apply(Node node) {
* (a bvand 1) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<AndOne>::applies(Node node) {
unsigned size = utils::getSize(node);
Node ones = utils::mkOnes(size);
@@ -198,7 +198,7 @@ bool RewriteRule<AndOne>::applies(Node node) {
node[1] == ones));
}
-template<>
+template<> inline
Node RewriteRule<AndOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<AndOne>(" << node << ")" << std::endl;
unsigned size = utils::getSize(node);
@@ -217,7 +217,7 @@ Node RewriteRule<AndOne>::apply(Node node) {
* (a bvor 0) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<OrZero>::applies(Node node) {
unsigned size = utils::getSize(node);
return (node.getKind() == kind::BITVECTOR_OR &&
@@ -225,7 +225,7 @@ bool RewriteRule<OrZero>::applies(Node node) {
node[1] == utils::mkConst(size, 0)));
}
-template<>
+template<> inline
Node RewriteRule<OrZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<OrZero>(" << node << ")" << std::endl;
@@ -244,7 +244,7 @@ Node RewriteRule<OrZero>::apply(Node node) {
* (a bvor 1) ==> 1
*/
-template<>
+template<> inline
bool RewriteRule<OrOne>::applies(Node node) {
unsigned size = utils::getSize(node);
Node ones = utils::mkOnes(size);
@@ -253,7 +253,7 @@ bool RewriteRule<OrOne>::applies(Node node) {
node[1] == ones));
}
-template<>
+template<> inline
Node RewriteRule<OrOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<OrOne>(" << node << ")" << std::endl;
return utils::mkOnes(utils::getSize(node));
@@ -266,13 +266,13 @@ Node RewriteRule<OrOne>::apply(Node node) {
* (a bvxor a) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<XorDuplicate>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_XOR &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<XorDuplicate>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorDuplicate>(" << node << ")" << std::endl;
return utils::mkConst(BitVector(utils::getSize(node), Integer(0)));
@@ -284,27 +284,39 @@ Node RewriteRule<XorDuplicate>::apply(Node node) {
* (a bvxor 1) ==> ~a
*/
-template<>
+template<> inline
bool RewriteRule<XorOne>::applies(Node node) {
- Node ones = utils::mkOnes(utils::getSize(node));
- return (node.getKind() == kind::BITVECTOR_XOR &&
- (node[0] == ones ||
- node[1] == ones));
+ if (node.getKind() != kind::BITVECTOR_XOR) {
+ return false;
+ }
+ Node ones = utils::mkOnes(utils::getSize(node));
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i] == ones) {
+ return true;
+ }
+ }
+ return false;
}
-template<>
+template<> inline
Node RewriteRule<XorOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorOne>(" << node << ")" << std::endl;
Node ones = utils::mkOnes(utils::getSize(node));
- Node a;
- if (node[0] == ones) {
- a = node[1];
- } else {
- Assert(node[1] == ones);
- a = node[0];
+ std::vector<Node> children;
+ bool found_ones = false;
+ // XorSimplify should have been called before
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i] == ones) {
+ // make sure only ones occurs only once
+ Assert(!found_ones);
+ found_ones = true;
+ } else {
+ children.push_back(node[i]);
+ }
}
- return utils::mkNode(kind::BITVECTOR_NOT, a);
+ children[0] = utils::mkNode(kind::BITVECTOR_NOT, children[0]);
+ return utils::mkSortedNode(kind::BITVECTOR_XOR, children);
}
@@ -314,24 +326,39 @@ Node RewriteRule<XorOne>::apply(Node node) {
* (a bvxor 0) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<XorZero>::applies(Node node) {
- Node zero = utils::mkConst(utils::getSize(node), 0);
- return (node.getKind() == kind::BITVECTOR_XOR &&
- (node[0] == zero ||
- node[1] == zero));
+ if (node.getKind() != kind::BITVECTOR_XOR) {
+ return false;
+ }
+ Node zero = utils::mkConst(utils::getSize(node), 0);
+ for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i] == zero) {
+ return true;
+ }
+ }
+ return false;
}
-template<>
+template<> inline
Node RewriteRule<XorZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorZero>(" << node << ")" << std::endl;
- Node zero = utils::mkConst(utils::getSize(node), 0);
- if (node[0] == zero) {
- return node[1];
+ std::vector<Node> children;
+ bool found_zero = false;
+ Node zero = utils::mkConst(utils::getSize(node), 0);
+
+ // XorSimplify should have been called before
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i] == zero) {
+ // make sure zero occurs only once
+ Assert(!found_zero);
+ found_zero = true;
+ } else {
+ children.push_back(node[i]);
+ }
}
-
- Assert(node[1] == zero);
- return node[0];
+
+ return utils::mkNode(kind::BITVECTOR_XOR, children);
}
@@ -341,14 +368,14 @@ Node RewriteRule<XorZero>::apply(Node node) {
* (a bvand (~ a)) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<BitwiseNotAnd>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_AND &&
((node[0].getKind() == kind::BITVECTOR_NOT && node[0][0] == node[1]) ||
(node[1].getKind() == kind::BITVECTOR_NOT && node[1][0] == node[0])));
}
-template<>
+template<> inline
Node RewriteRule<BitwiseNotAnd>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<BitwiseNegAnd>(" << node << ")" << std::endl;
return utils::mkConst(BitVector(utils::getSize(node), Integer(0)));
@@ -360,14 +387,14 @@ Node RewriteRule<BitwiseNotAnd>::apply(Node node) {
* (a bvor (~ a)) ==> 1
*/
-template<>
+template<> inline
bool RewriteRule<BitwiseNotOr>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_OR &&
((node[0].getKind() == kind::BITVECTOR_NOT && node[0][0] == node[1]) ||
(node[1].getKind() == kind::BITVECTOR_NOT && node[1][0] == node[0])));
}
-template<>
+template<> inline
Node RewriteRule<BitwiseNotOr>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<BitwiseNotOr>(" << node << ")" << std::endl;
uint32_t size = utils::getSize(node);
@@ -381,14 +408,14 @@ Node RewriteRule<BitwiseNotOr>::apply(Node node) {
* ((~ a) bvxor (~ b)) ==> (a bvxor b)
*/
-template<>
+template<> inline
bool RewriteRule<XorNot>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_XOR &&
node[0].getKind() == kind::BITVECTOR_NOT &&
node[1].getKind() == kind::BITVECTOR_NOT);
}
-template<>
+template<> inline
Node RewriteRule<XorNot>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorNot>(" << node << ")" << std::endl;
Node a = node[0][0];
@@ -402,19 +429,19 @@ Node RewriteRule<XorNot>::apply(Node node) {
* ~(a bvxor b) ==> (~ a bvxor b)
*/
-template<>
+template<> inline
bool RewriteRule<NotXor>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_NOT &&
node[0].getKind() == kind::BITVECTOR_XOR);
}
-template<>
+template<> inline
Node RewriteRule<NotXor>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorNot>(" << node << ")" << std::endl;
Node a = node[0][0];
Node b = node[0][1];
Node nota = utils::mkNode(kind::BITVECTOR_NOT, a);
- return utils::mkNode(kind::BITVECTOR_XOR, nota, b);
+ return utils::mkSortedNode(kind::BITVECTOR_XOR, nota, b);
}
/**
@@ -423,13 +450,13 @@ Node RewriteRule<NotXor>::apply(Node node) {
* ~ (~ a) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<NotIdemp>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_NOT &&
node[0].getKind() == kind::BITVECTOR_NOT);
}
-template<>
+template<> inline
Node RewriteRule<NotIdemp>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<XorIdemp>(" << node << ")" << std::endl;
return node[0][0];
@@ -443,14 +470,14 @@ Node RewriteRule<NotIdemp>::apply(Node node) {
* a < a ==> false
*/
-template<>
+template<> inline
bool RewriteRule<LtSelf>::applies(Node node) {
return ((node.getKind() == kind::BITVECTOR_ULT ||
node.getKind() == kind::BITVECTOR_SLT) &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<LtSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<LtSelf>(" << node << ")" << std::endl;
return utils::mkFalse();
@@ -462,14 +489,14 @@ Node RewriteRule<LtSelf>::apply(Node node) {
* a <= a ==> true
*/
-template<>
+template<> inline
bool RewriteRule<LteSelf>::applies(Node node) {
return ((node.getKind() == kind::BITVECTOR_ULE ||
node.getKind() == kind::BITVECTOR_SLE) &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<LteSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<LteSelf>(" << node << ")" << std::endl;
return utils::mkTrue();
@@ -481,13 +508,13 @@ Node RewriteRule<LteSelf>::apply(Node node) {
* a < 0 ==> false
*/
-template<>
+template<> inline
bool RewriteRule<UltZero>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULT &&
node[1] == utils::mkConst(BitVector(utils::getSize(node[0]), Integer(0))));
}
-template<>
+template<> inline
Node RewriteRule<UltZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UltZero>(" << node << ")" << std::endl;
return utils::mkFalse();
@@ -499,13 +526,13 @@ Node RewriteRule<UltZero>::apply(Node node) {
* a < a ==> false
*/
-template<>
+template<> inline
bool RewriteRule<UltSelf>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULT &&
node[1] == node[0]);
}
-template<>
+template<> inline
Node RewriteRule<UltSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UltSelf>(" << node << ")" << std::endl;
return utils::mkFalse();
@@ -518,13 +545,13 @@ Node RewriteRule<UltSelf>::apply(Node node) {
* a <= 0 ==> a = 0
*/
-template<>
+template<> inline
bool RewriteRule<UleZero>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULE &&
node[1] == utils::mkConst(BitVector(utils::getSize(node[0]), Integer(0))));
}
-template<>
+template<> inline
Node RewriteRule<UleZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UleZero>(" << node << ")" << std::endl;
return utils::mkNode(kind::EQUAL, node[0], node[1]);
@@ -536,13 +563,13 @@ Node RewriteRule<UleZero>::apply(Node node) {
* a <= a ==> true
*/
-template<>
+template<> inline
bool RewriteRule<UleSelf>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULE &&
node[1] == node[0]);
}
-template<>
+template<> inline
Node RewriteRule<UleSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UleSelf>(" << node << ")" << std::endl;
return utils::mkTrue();
@@ -555,13 +582,13 @@ Node RewriteRule<UleSelf>::apply(Node node) {
* 0 <= a ==> true
*/
-template<>
+template<> inline
bool RewriteRule<ZeroUle>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_ULE &&
node[0] == utils::mkConst(BitVector(utils::getSize(node[0]), Integer(0))));
}
-template<>
+template<> inline
Node RewriteRule<ZeroUle>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ZeroUle>(" << node << ")" << std::endl;
return utils::mkTrue();
@@ -573,7 +600,7 @@ Node RewriteRule<ZeroUle>::apply(Node node) {
* a <= 11..1 ==> true
*/
-template<>
+template<> inline
bool RewriteRule<UleMax>::applies(Node node) {
if (node.getKind()!= kind::BITVECTOR_ULE) {
return false;
@@ -584,7 +611,7 @@ bool RewriteRule<UleMax>::applies(Node node) {
node[1] == utils::mkConst(BitVector(size, ones)));
}
-template<>
+template<> inline
Node RewriteRule<UleMax>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UleMax>(" << node << ")" << std::endl;
return utils::mkTrue();
@@ -596,13 +623,13 @@ Node RewriteRule<UleMax>::apply(Node node) {
* ~ ( a < b) ==> b <= a
*/
-template<>
+template<> inline
bool RewriteRule<NotUlt>::applies(Node node) {
return (node.getKind() == kind::NOT &&
node[0].getKind() == kind::BITVECTOR_ULT);
}
-template<>
+template<> inline
Node RewriteRule<NotUlt>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<NotUlt>(" << node << ")" << std::endl;
Node ult = node[0];
@@ -617,13 +644,13 @@ Node RewriteRule<NotUlt>::apply(Node node) {
* ~ ( a <= b) ==> b < a
*/
-template<>
+template<> inline
bool RewriteRule<NotUle>::applies(Node node) {
return (node.getKind() == kind::NOT &&
node[0].getKind() == kind::BITVECTOR_ULE);
}
-template<>
+template<> inline
Node RewriteRule<NotUle>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<NotUle>(" << node << ")" << std::endl;
Node ult = node[0];
@@ -638,7 +665,7 @@ Node RewriteRule<NotUle>::apply(Node node) {
* (a * 1) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<MultOne>::applies(Node node) {
unsigned size = utils::getSize(node);
return (node.getKind() == kind::BITVECTOR_MULT &&
@@ -646,7 +673,7 @@ bool RewriteRule<MultOne>::applies(Node node) {
node[1] == utils::mkConst(size, 1)));
}
-template<>
+template<> inline
Node RewriteRule<MultOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<MultOne>(" << node << ")" << std::endl;
unsigned size = utils::getSize(node);
@@ -663,7 +690,7 @@ Node RewriteRule<MultOne>::apply(Node node) {
* (a * 0) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<MultZero>::applies(Node node) {
unsigned size = utils::getSize(node);
return (node.getKind() == kind::BITVECTOR_MULT &&
@@ -671,7 +698,7 @@ bool RewriteRule<MultZero>::applies(Node node) {
node[1] == utils::mkConst(size, 0)));
}
-template<>
+template<> inline
Node RewriteRule<MultZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<MultZero>(" << node << ")" << std::endl;
return utils::mkConst(utils::getSize(node), 0);
@@ -683,33 +710,39 @@ Node RewriteRule<MultZero>::apply(Node node) {
* (a * 2^k) ==> a[n-k-1:0] 0_k
*/
-template<>
+template<> inline
bool RewriteRule<MultPow2>::applies(Node node) {
- return (node.getKind() == kind::BITVECTOR_MULT &&
- (utils::isPow2Const(node[0]) ||
- utils::isPow2Const(node[1])));
+ if (node.getKind() != kind::BITVECTOR_MULT)
+ return false;
+
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (utils::isPow2Const(node[i])) {
+ return true;
+ }
+ }
+ return false;
}
-template<>
+template<> inline
Node RewriteRule<MultPow2>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<MultPow2>(" << node << ")" << std::endl;
- Node a;
- unsigned power;
- power = utils::isPow2Const(node[0]);
-
- if (power != 0) {
- a = node[1];
- // isPow2Const returns the power + 1
- --power;
- } else {
- power = utils::isPow2Const(node[1]);
- Assert(power != 0);
- a = node[0];
- power--;
+
+ std::vector<Node> children;
+ unsigned exponent = 0;
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ unsigned exp = utils::isPow2Const(node[i]);
+ if (exp) {
+ exponent += exp - 1;
+ }
+ else {
+ children.push_back(node[i]);
+ }
}
- Node extract = utils::mkExtract(a, utils::getSize(node) - power - 1, 0);
- Node zeros = utils::mkConst(power, 0);
+ Node a = utils::mkSortedNode(kind::BITVECTOR_MULT, children);
+
+ Node extract = utils::mkExtract(a, utils::getSize(node) - exponent - 1, 0);
+ Node zeros = utils::mkConst(exponent, 0);
return utils::mkConcat(extract, zeros);
}
@@ -719,7 +752,7 @@ Node RewriteRule<MultPow2>::apply(Node node) {
* (a + 0) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<PlusZero>::applies(Node node) {
Node zero = utils::mkConst(utils::getSize(node), 0);
return (node.getKind() == kind::BITVECTOR_PLUS &&
@@ -727,7 +760,7 @@ bool RewriteRule<PlusZero>::applies(Node node) {
node[1] == zero));
}
-template<>
+template<> inline
Node RewriteRule<PlusZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<PlusZero>(" << node << ")" << std::endl;
Node zero = utils::mkConst(utils::getSize(node), 0);
@@ -744,13 +777,13 @@ Node RewriteRule<PlusZero>::apply(Node node) {
* -(-a) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<NegIdemp>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_NEG &&
node[0].getKind() == kind::BITVECTOR_NEG);
}
-template<>
+template<> inline
Node RewriteRule<NegIdemp>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<NegIdemp>(" << node << ")" << std::endl;
return node[0][0];
@@ -762,13 +795,13 @@ Node RewriteRule<NegIdemp>::apply(Node node) {
* (a udiv 2^k) ==> 0_k a[n-1: k]
*/
-template<>
+template<> inline
bool RewriteRule<UdivPow2>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UDIV &&
utils::isPow2Const(node[1]));
}
-template<>
+template<> inline
Node RewriteRule<UdivPow2>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UdivPow2>(" << node << ")" << std::endl;
Node a = node[0];
@@ -786,13 +819,13 @@ Node RewriteRule<UdivPow2>::apply(Node node) {
* (a udiv 1) ==> a
*/
-template<>
+template<> inline
bool RewriteRule<UdivOne>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UDIV &&
node[1] == utils::mkConst(utils::getSize(node), 1));
}
-template<>
+template<> inline
Node RewriteRule<UdivOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UdivOne>(" << node << ")" << std::endl;
return node[0];
@@ -804,13 +837,13 @@ Node RewriteRule<UdivOne>::apply(Node node) {
* (a udiv a) ==> 1
*/
-template<>
+template<> inline
bool RewriteRule<UdivSelf>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UDIV &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<UdivSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UdivSelf>(" << node << ")" << std::endl;
return utils::mkConst(utils::getSize(node), 1);
@@ -822,13 +855,13 @@ Node RewriteRule<UdivSelf>::apply(Node node) {
* (a urem 2^k) ==> 0_(n-k) a[k-1:0]
*/
-template<>
+template<> inline
bool RewriteRule<UremPow2>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UREM &&
utils::isPow2Const(node[1]));
}
-template<>
+template<> inline
Node RewriteRule<UremPow2>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UremPow2>(" << node << ")" << std::endl;
TNode a = node[0];
@@ -844,13 +877,13 @@ Node RewriteRule<UremPow2>::apply(Node node) {
* (a urem 1) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<UremOne>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UREM &&
node[1] == utils::mkConst(utils::getSize(node), 1));
}
-template<>
+template<> inline
Node RewriteRule<UremOne>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UremOne>(" << node << ")" << std::endl;
return utils::mkConst(utils::getSize(node), 0);
@@ -862,13 +895,13 @@ Node RewriteRule<UremOne>::apply(Node node) {
* (a urem a) ==> 0
*/
-template<>
+template<> inline
bool RewriteRule<UremSelf>::applies(Node node) {
return (node.getKind() == kind::BITVECTOR_UREM &&
node[0] == node[1]);
}
-template<>
+template<> inline
Node RewriteRule<UremSelf>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<UremSelf>(" << node << ")" << std::endl;
return utils::mkConst(utils::getSize(node), 0);
@@ -880,7 +913,7 @@ Node RewriteRule<UremSelf>::apply(Node node) {
* (0_k >> a) ==> 0_k
*/
-template<>
+template<> inline
bool RewriteRule<ShiftZero>::applies(Node node) {
return ((node.getKind() == kind::BITVECTOR_SHL ||
node.getKind() == kind::BITVECTOR_LSHR ||
@@ -888,24 +921,110 @@ bool RewriteRule<ShiftZero>::applies(Node node) {
node[0] == utils::mkConst(utils::getSize(node), 0));
}
-template<>
+template<> inline
Node RewriteRule<ShiftZero>::apply(Node node) {
BVDebug("bv-rewrite") << "RewriteRule<ShiftZero>(" << node << ")" << std::endl;
return node[0];
}
+/**
+ * BBPlusNeg
+ *
+ * -a1 - a2 - ... - an + ak + .. ==> - (a1 + a2 + ... + an) + ak
+ *
+ */
+
+template<> inline
+bool RewriteRule<BBPlusNeg>::applies(Node node) {
+ if (node.getKind() != kind::BITVECTOR_PLUS) {
+ return false;
+ }
+
+ unsigned neg_count = 0;
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i].getKind()== kind::BITVECTOR_NEG) {
+ ++neg_count;
+ }
+ }
+ return neg_count > 1;
+}
+
+template<> inline
+Node RewriteRule<BBPlusNeg>::apply(Node node) {
+ BVDebug("bv-rewrite") << "RewriteRule<BBPlusNeg>(" << node << ")" << std::endl;
+
+ std::vector<Node> children;
+ unsigned neg_count = 0;
+ for(unsigned i = 0; i < node.getNumChildren(); ++i) {
+ if (node[i].getKind() == kind::BITVECTOR_NEG) {
+ ++neg_count;
+ children.push_back(utils::mkNode(kind::BITVECTOR_NOT, node[i][0]));
+ } else {
+ children.push_back(node[i]);
+ }
+ }
+ Assert(neg_count!= 0);
+ children.push_back(utils::mkConst(utils::getSize(node), neg_count));
+
+ return utils::mkSortedNode(kind::BITVECTOR_PLUS, children);
+}
+
+// /**
+// *
+// *
+// *
+// */
+
+// template<> inline
+// bool RewriteRule<BBFactorOut>::applies(Node node) {
+// if (node.getKind() != kind::BITVECTOR_PLUS) {
+// return false;
+// }
+
+// for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+// if (node[i].getKind() != kind::BITVECTOR_MULT) {
+// return false;
+// }
+// }
+// }
+
+// template<> inline
+// Node RewriteRule<BBFactorOut>::apply(Node node) {
+// BVDebug("bv-rewrite") << "RewriteRule<BBFactorOut>(" << node << ")" << std::endl;
+// std::hash_set<TNode, TNodeHashFunction> factors;
+
+// for (unsigned i = 0; i < node.getNumChildren(); ++i) {
+// Assert (node[i].getKind() == kind::BITVECTOR_MULT);
+// for (unsigned j = 0; j < node[i].getNumChildren(); ++j) {
+// factors.insert(node[i][j]);
+// }
+// }
+
+// std::vector<TNode> gcd;
+// std::hash_set<TNode, TNodeHashFunction>::const_iterator it;
+// for (it = factors.begin(); it != factors.end(); ++it) {
+// // for each factor check if it occurs in all children
+// TNode f = *it;
+// for (unsigned i = 0; i < node.getNumChildren
+
+// }
+// }
+// return ;
+// }
+
+
// /**
// *
// *
// *
// */
-// template<>
+// template<> inline
// bool RewriteRule<>::applies(Node node) {
// return (node.getKind() == );
// }
-// template<>
+// template<> inline
// Node RewriteRule<>::apply(Node node) {
// BVDebug("bv-rewrite") << "RewriteRule<>(" << node << ")" << std::endl;
// return ;
diff --git a/src/theory/bv/theory_bv_rewriter.cpp b/src/theory/bv/theory_bv_rewriter.cpp
index 2b48977b6..c2649e881 100644
--- a/src/theory/bv/theory_bv_rewriter.cpp
+++ b/src/theory/bv/theory_bv_rewriter.cpp
@@ -49,19 +49,31 @@ void TheoryBVRewriter::shutdown() {
}
RewriteResponse TheoryBVRewriter::preRewrite(TNode node) {
- Debug("bitvector-rewrite") << "TheoryBV::preRewrite(" << node << ")" << std::endl;
- //return d_rewriteTable[node.getKind()](node);
- return RewriteResponse(REWRITE_DONE, node);
+ RewriteResponse res = d_rewriteTable[node.getKind()](node, true);
+ if(res.node != node) {
+ Debug("bitvector-rewrite") << "TheoryBV::preRewrite " << node << std::endl;
+ Debug("bitvector-rewrite") << "TheoryBV::preRewrite to " << res.node << std::endl;
+ }
+ return res;
}
RewriteResponse TheoryBVRewriter::postRewrite(TNode node) {
- //TimerStat::CodeTimer codeTimer(*d_rewriteTimer);
- Debug("bitvector-rewrite") << "TheoryBV::postRewrite(" << node << ")" << std::endl;
- RewriteResponse res = d_rewriteTable[node.getKind()](node);
+ RewriteResponse res = d_rewriteTable[node.getKind()](node, false);
+ if(res.node!= node) {
+ Debug("bitvector-rewrite") << "TheoryBV::postRewrite " << node << std::endl;
+ Debug("bitvector-rewrite") << "TheoryBV::postRewrite to " << res.node << std::endl;
+ }
+ // if (res.status == REWRITE_DONE) {
+ // Node rewr = res.node;
+ // Node rerewr = d_rewriteTable[rewr.getKind()](rewr, false).node;
+ // Assert(rewr == rerewr);
+ // }
+
return res;
}
-RewriteResponse TheoryBVRewriter::RewriteUlt(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteUlt(TNode node, bool preregister) {
+ // reduce common subexpressions on both sides
Node resultNode = LinearRewriteStrategy
< RewriteRule<EvalUlt>,
// if both arguments are constants evaluates
@@ -72,8 +84,13 @@ RewriteResponse TheoryBVRewriter::RewriteUlt(TNode node) {
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSlt(TNode node){
- return RewriteResponse(REWRITE_DONE, node);
+RewriteResponse TheoryBVRewriter::RewriteSlt(TNode node, bool preregister){
+ Node resultNode = LinearRewriteStrategy
+ < RewriteRule < EvalSlt >
+ >::apply(node);
+
+ return RewriteResponse(REWRITE_DONE, resultNode);
+
// Node resultNode = LinearRewriteStrategy
// < RewriteRule < SltEliminate >
// // a <_s b ==> a + 2^{n-1} <_u b + 2^{n-1}
@@ -82,7 +99,7 @@ RewriteResponse TheoryBVRewriter::RewriteSlt(TNode node){
// return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteUle(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteUle(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<EvalUle>,
RewriteRule<UleMax>,
@@ -93,16 +110,15 @@ RewriteResponse TheoryBVRewriter::RewriteUle(TNode node){
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSle(TNode node){
- return RewriteResponse(REWRITE_DONE, node);
- // Node resultNode = LinearRewriteStrategy
- // < RewriteRule<SleEliminate>
- // >::apply(node);
+RewriteResponse TheoryBVRewriter::RewriteSle(TNode node, bool preregister){
+ Node resultNode = LinearRewriteStrategy
+ < RewriteRule < EvalSle >
+ >::apply(node);
- // return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteUgt(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteUgt(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<UgtEliminate>
>::apply(node);
@@ -110,16 +126,16 @@ RewriteResponse TheoryBVRewriter::RewriteUgt(TNode node){
return RewriteResponse(REWRITE_AGAIN, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSgt(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteSgt(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<SgtEliminate>
//RewriteRule<SltEliminate>
>::apply(node);
- return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ return RewriteResponse(REWRITE_AGAIN, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteUge(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteUge(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<UgeEliminate>
>::apply(node);
@@ -127,7 +143,7 @@ RewriteResponse TheoryBVRewriter::RewriteUge(TNode node){
return RewriteResponse(REWRITE_AGAIN, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSge(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteSge(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<SgeEliminate>
// RewriteRule<SleEliminate>
@@ -136,8 +152,9 @@ RewriteResponse TheoryBVRewriter::RewriteSge(TNode node){
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteNot(TNode node){
- Node resultNode = node;
+RewriteResponse TheoryBVRewriter::RewriteNot(TNode node, bool preregister){
+ Node resultNode = node;
+
if(RewriteRule<NotXor>::applies(node)) {
resultNode = RewriteRule<NotXor>::run<false>(node);
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
@@ -150,8 +167,9 @@ RewriteResponse TheoryBVRewriter::RewriteNot(TNode node){
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteExtract(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteExtract(TNode node, bool preregister) {
Node resultNode = node;
+
if (RewriteRule<ExtractConcat>::applies(node)) {
resultNode = RewriteRule<ExtractConcat>::run<false>(node);
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
@@ -184,7 +202,8 @@ RewriteResponse TheoryBVRewriter::RewriteExtract(TNode node) {
}
-RewriteResponse TheoryBVRewriter::RewriteConcat(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteConcat(TNode node, bool preregister) {
+
Node resultNode = LinearRewriteStrategy
< RewriteRule<ConcatFlatten>,
// Flatten the top level concatenations
@@ -197,45 +216,53 @@ RewriteResponse TheoryBVRewriter::RewriteConcat(TNode node) {
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteAnd(TNode node){
- Node resultNode = LinearRewriteStrategy
- < RewriteRule<EvalAnd>,
- RewriteRule<BitwiseIdemp>,
- RewriteRule<AndZero>,
- RewriteRule<AndOne>
+RewriteResponse TheoryBVRewriter::RewriteAnd(TNode node, bool preregister){
+ Node resultNode = node;
+
+ resultNode = LinearRewriteStrategy
+ < RewriteRule<FlattenAssocCommut>,
+ RewriteRule<AndSimplify>
+ // RewriteRule<EvalAnd>,
+ // RewriteRule<BitwiseIdemp>,
+ // //RewriteRule<BitwiseSlice>, -> might need rw again
+ // RewriteRule<AndZero>,
+ // RewriteRule<AndOne>
>::apply(node);
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteOr(TNode node){
- Node resultNode = LinearRewriteStrategy
- < RewriteRule<EvalOr>,
- RewriteRule<BitwiseIdemp>,
- RewriteRule<OrZero>,
- RewriteRule<OrOne>
+RewriteResponse TheoryBVRewriter::RewriteOr(TNode node, bool preregister){
+ Node resultNode = node;
+
+ resultNode = LinearRewriteStrategy
+ < RewriteRule<FlattenAssocCommut>,
+ RewriteRule<OrSimplify>
>::apply(node);
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteXor(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteXor(TNode node, bool preregister) {
Node resultNode = node;
- if (RewriteRule<XorOne>::applies(node)) {
- resultNode = RewriteRule<XorOne>::run<false> (node);
- return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
- }
+
resultNode = LinearRewriteStrategy
- < RewriteRule<XorNot>,
- RewriteRule<EvalXor>,
- RewriteRule<XorDuplicate>,
- RewriteRule<XorZero>
+ < RewriteRule<FlattenAssocCommut>, // flatten the expression
+ RewriteRule<XorSimplify>, // simplify duplicates and constants
+ RewriteRule<XorZero> // checks if the constant part is zero and eliminates it
>::apply(node);
-
+
+ // this simplification introduces new terms and might require further
+ // rewriting
+ if (RewriteRule<XorOne>::applies(resultNode)) {
+ resultNode = RewriteRule<XorOne>::run<false> (resultNode);
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
+
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteXnor(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteXnor(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<XnorEliminate>
>::apply(node);
@@ -243,7 +270,7 @@ RewriteResponse TheoryBVRewriter::RewriteXnor(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteNand(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteNand(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<NandEliminate>
>::apply(node);
@@ -251,7 +278,7 @@ RewriteResponse TheoryBVRewriter::RewriteNand(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteNor(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteNor(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<NorEliminate>
>::apply(node);
@@ -259,7 +286,7 @@ RewriteResponse TheoryBVRewriter::RewriteNor(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteComp(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteComp(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<CompEliminate>
>::apply(node);
@@ -267,54 +294,81 @@ RewriteResponse TheoryBVRewriter::RewriteComp(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteMult(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteMult(TNode node, bool preregister) {
Node resultNode = node;
- if(RewriteRule<MultPow2>::applies(node)) {
- resultNode = RewriteRule<MultPow2>::run <false> (node);
- return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
- }
resultNode = LinearRewriteStrategy
- < RewriteRule<EvalMult>,
- RewriteRule<MultOne>,
- RewriteRule<MultZero>
+ < RewriteRule<FlattenAssocCommut>, // flattens and sorts
+ RewriteRule<MultSimplify> // multiplies constant part and checks for 0
>::apply(node);
+ // only apply if every subterm was already rewritten
+ if (!preregister) {
+ // distributes multiplication by constant over +, - and unary -
+ if(RewriteRule<MultDistribConst>::applies(resultNode)) {
+ resultNode = RewriteRule<MultDistribConst>::run<false>(resultNode);
+ // creating new terms that might simplify further
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
+ }
+
+ if(resultNode == node) {
+ return RewriteResponse(REWRITE_DONE, resultNode);
+ }
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewritePlus(TNode node) {
- Node resultNode = LinearRewriteStrategy
- < RewriteRule<EvalPlus>,
- RewriteRule<PlusZero>
- // RewriteRule<PlusSelf>,
- // RewriteRule<PlusNegSelf>
- // RewriteRule<PlusLiftConcat>
- >::apply(node);
+RewriteResponse TheoryBVRewriter::RewritePlus(TNode node, bool preregister) {
+ Node resultNode = node;
- return RewriteResponse(REWRITE_DONE, resultNode);
+ resultNode = LinearRewriteStrategy
+ < RewriteRule<FlattenAssocCommut>,
+ RewriteRule<PlusCombineLikeTerms>
+ // RewriteRule<PlusLiftConcat>
+ >::apply(resultNode);
+ if (resultNode == node) {
+ return RewriteResponse(REWRITE_DONE, resultNode);
+ } else {
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
}
-RewriteResponse TheoryBVRewriter::RewriteSub(TNode node){
- return RewriteResponse(REWRITE_DONE, node);
- // Node resultNode = LinearRewriteStrategy
- // < RewriteRule<SubEliminate>
- // >::apply(node);
+RewriteResponse TheoryBVRewriter::RewriteSub(TNode node, bool preregister){
+ // return RewriteResponse(REWRITE_DONE, node);
+ Node resultNode = LinearRewriteStrategy
+ < RewriteRule<SubEliminate>
+ >::apply(node);
- // return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteNeg(TNode node) {
- Node resultNode = LinearRewriteStrategy
+RewriteResponse TheoryBVRewriter::RewriteNeg(TNode node, bool preregister) {
+ Node resultNode = node;
+
+ resultNode = LinearRewriteStrategy
< RewriteRule<EvalNeg>,
- RewriteRule<NegIdemp>
- >::apply(node);
+ RewriteRule<NegIdemp>,
+ RewriteRule<NegSub>
+ >::apply(node);
+
+ if (RewriteRule<NegPlus>::applies(node)) {
+ resultNode = RewriteRule<NegPlus>::run<false>(node);
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
+ if(!preregister) {
+ if (RewriteRule<NegMult>::applies(node)) {
+ resultNode = RewriteRule<NegMult>::run<false>(node);
+ return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
+ }
+ }
+
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteUdiv(TNode node){
- Node resultNode = node;
+RewriteResponse TheoryBVRewriter::RewriteUdiv(TNode node, bool preregister){
+ Node resultNode = node;
+
if(RewriteRule<UdivPow2>::applies(node)) {
resultNode = RewriteRule<UdivPow2>::run <false> (node);
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
@@ -329,8 +383,10 @@ RewriteResponse TheoryBVRewriter::RewriteUdiv(TNode node){
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteUrem(TNode node) {
- Node resultNode = node;
+RewriteResponse TheoryBVRewriter::RewriteUrem(TNode node, bool preregister) {
+ Node resultNode = node;
+ return RewriteResponse(REWRITE_DONE, resultNode);
+
if(RewriteRule<UremPow2>::applies(node)) {
resultNode = RewriteRule<UremPow2>::run <false> (node);
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
@@ -344,7 +400,7 @@ RewriteResponse TheoryBVRewriter::RewriteUrem(TNode node) {
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSmod(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteSmod(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<SmodEliminate>
>::apply(node);
@@ -352,7 +408,7 @@ RewriteResponse TheoryBVRewriter::RewriteSmod(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSdiv(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteSdiv(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<SdivEliminate>
>::apply(node);
@@ -360,14 +416,14 @@ RewriteResponse TheoryBVRewriter::RewriteSdiv(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSrem(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteSrem(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<SremEliminate>
>::apply(node);
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteShl(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteShl(TNode node, bool preregister) {
Node resultNode = node;
if(RewriteRule<ShlByConst>::applies(node)) {
resultNode = RewriteRule<ShlByConst>::run <false> (node);
@@ -382,7 +438,7 @@ RewriteResponse TheoryBVRewriter::RewriteShl(TNode node) {
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteLshr(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteLshr(TNode node, bool preregister) {
Node resultNode = node;
if(RewriteRule<LshrByConst>::applies(node)) {
resultNode = RewriteRule<LshrByConst>::run <false> (node);
@@ -397,7 +453,7 @@ RewriteResponse TheoryBVRewriter::RewriteLshr(TNode node) {
return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteAshr(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteAshr(TNode node, bool preregister) {
Node resultNode = node;
if(RewriteRule<AshrByConst>::applies(node)) {
resultNode = RewriteRule<AshrByConst>::run <false> (node);
@@ -413,7 +469,7 @@ RewriteResponse TheoryBVRewriter::RewriteAshr(TNode node) {
}
-RewriteResponse TheoryBVRewriter::RewriteRepeat(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteRepeat(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<RepeatEliminate >
>::apply(node);
@@ -421,7 +477,7 @@ RewriteResponse TheoryBVRewriter::RewriteRepeat(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteZeroExtend(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteZeroExtend(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<ZeroExtendEliminate >
>::apply(node);
@@ -429,17 +485,17 @@ RewriteResponse TheoryBVRewriter::RewriteZeroExtend(TNode node){
return RewriteResponse(REWRITE_AGAIN, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteSignExtend(TNode node) {
- // Node resultNode = LinearRewriteStrategy
- // < RewriteRule<SignExtendEliminate >
- // >::apply(node);
+RewriteResponse TheoryBVRewriter::RewriteSignExtend(TNode node, bool preregister) {
+ Node resultNode = LinearRewriteStrategy
+ < RewriteRule<EvalSignExtend>
+ >::apply(node);
// return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
- return RewriteResponse(REWRITE_DONE, node);
+ return RewriteResponse(REWRITE_DONE, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteRotateRight(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteRotateRight(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<RotateRightEliminate >
>::apply(node);
@@ -447,7 +503,7 @@ RewriteResponse TheoryBVRewriter::RewriteRotateRight(TNode node) {
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteRotateLeft(TNode node){
+RewriteResponse TheoryBVRewriter::RewriteRotateLeft(TNode node, bool preregister){
Node resultNode = LinearRewriteStrategy
< RewriteRule<RotateLeftEliminate >
>::apply(node);
@@ -455,7 +511,7 @@ RewriteResponse TheoryBVRewriter::RewriteRotateLeft(TNode node){
return RewriteResponse(REWRITE_AGAIN_FULL, resultNode);
}
-RewriteResponse TheoryBVRewriter::RewriteEqual(TNode node) {
+RewriteResponse TheoryBVRewriter::RewriteEqual(TNode node, bool preregister) {
Node resultNode = LinearRewriteStrategy
< RewriteRule<FailEq>,
RewriteRule<SimplifyEq>,
@@ -466,11 +522,11 @@ RewriteResponse TheoryBVRewriter::RewriteEqual(TNode node) {
}
-RewriteResponse TheoryBVRewriter::IdentityRewrite(TNode node) {
+RewriteResponse TheoryBVRewriter::IdentityRewrite(TNode node, bool prerewrite) {
return RewriteResponse(REWRITE_DONE, node);
}
-RewriteResponse TheoryBVRewriter::UndefinedRewrite(TNode node) {
+RewriteResponse TheoryBVRewriter::UndefinedRewrite(TNode node, bool prerewrite) {
Debug("bv-rewrite") << "TheoryBV::UndefinedRewrite for" << node;
Unimplemented();
}
diff --git a/src/theory/bv/theory_bv_rewriter.h b/src/theory/bv/theory_bv_rewriter.h
index 7ce914477..0ce3fa303 100644
--- a/src/theory/bv/theory_bv_rewriter.h
+++ b/src/theory/bv/theory_bv_rewriter.h
@@ -30,7 +30,7 @@ namespace theory {
namespace bv {
struct AllRewriteRules;
-typedef RewriteResponse (*RewriteFunction) (TNode);
+typedef RewriteResponse (*RewriteFunction) (TNode, bool);
class TheoryBVRewriter {
// static CVC4_THREADLOCAL(AllRewriteRules*) s_allRules;
@@ -39,47 +39,47 @@ class TheoryBVRewriter {
#warning "TODO: Double check thread safety and make sure the fix compiles on mac."
static RewriteFunction d_rewriteTable[kind::LAST_KIND];
- static RewriteResponse IdentityRewrite(TNode node);
- static RewriteResponse UndefinedRewrite(TNode node);
+ static RewriteResponse IdentityRewrite(TNode node, bool prerewrite = false);
+ static RewriteResponse UndefinedRewrite(TNode node, bool prerewrite = false);
static void initializeRewrites();
- static RewriteResponse RewriteEqual(TNode node);
- static RewriteResponse RewriteUlt(TNode node);
- static RewriteResponse RewriteSlt(TNode node);
- static RewriteResponse RewriteUle(TNode node);
- static RewriteResponse RewriteSle(TNode node);
- static RewriteResponse RewriteUgt(TNode node);
- static RewriteResponse RewriteSgt(TNode node);
- static RewriteResponse RewriteUge(TNode node);
- static RewriteResponse RewriteSge(TNode node);
- static RewriteResponse RewriteNot(TNode node);
- static RewriteResponse RewriteConcat(TNode node);
- static RewriteResponse RewriteAnd(TNode node);
- static RewriteResponse RewriteOr(TNode node);
- static RewriteResponse RewriteXnor(TNode node);
- static RewriteResponse RewriteXor(TNode node);
- static RewriteResponse RewriteNand(TNode node);
- static RewriteResponse RewriteNor(TNode node);
- static RewriteResponse RewriteComp(TNode node);
- static RewriteResponse RewriteMult(TNode node);
- static RewriteResponse RewritePlus(TNode node);
- static RewriteResponse RewriteSub(TNode node);
- static RewriteResponse RewriteNeg(TNode node);
- static RewriteResponse RewriteUdiv(TNode node);
- static RewriteResponse RewriteUrem(TNode node);
- static RewriteResponse RewriteSmod(TNode node);
- static RewriteResponse RewriteSdiv(TNode node);
- static RewriteResponse RewriteSrem(TNode node);
- static RewriteResponse RewriteShl(TNode node);
- static RewriteResponse RewriteLshr(TNode node);
- static RewriteResponse RewriteAshr(TNode node);
- static RewriteResponse RewriteExtract(TNode node);
- static RewriteResponse RewriteRepeat(TNode node);
- static RewriteResponse RewriteZeroExtend(TNode node);
- static RewriteResponse RewriteSignExtend(TNode node);
- static RewriteResponse RewriteRotateRight(TNode node);
- static RewriteResponse RewriteRotateLeft(TNode node);
+ static RewriteResponse RewriteEqual(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUlt(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSlt(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUle(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSle(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUgt(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSgt(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUge(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSge(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteNot(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteConcat(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteAnd(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteOr(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteXnor(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteXor(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteNand(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteNor(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteComp(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteMult(TNode node, bool prerewrite = false);
+ static RewriteResponse RewritePlus(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSub(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteNeg(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUdiv(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteUrem(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSmod(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSdiv(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSrem(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteShl(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteLshr(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteAshr(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteExtract(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteRepeat(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteZeroExtend(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteSignExtend(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteRotateRight(TNode node, bool prerewrite = false);
+ static RewriteResponse RewriteRotateLeft(TNode node, bool prerewrite = false);
public:
diff --git a/src/theory/bv/theory_bv_utils.h b/src/theory/bv/theory_bv_utils.h
index 60e459958..8b5dd0499 100644
--- a/src/theory/bv/theory_bv_utils.h
+++ b/src/theory/bv/theory_bv_utils.h
@@ -79,6 +79,27 @@ inline Node mkAnd(std::vector<TNode>& children) {
}
}
+inline Node mkSortedNode(Kind kind, std::vector<Node>& children) {
+ Assert (kind == kind::BITVECTOR_PLUS ||
+ kind == kind::BITVECTOR_MULT ||
+ kind == kind::BITVECTOR_AND ||
+ kind == kind::BITVECTOR_OR ||
+ kind == kind::BITVECTOR_XOR);
+
+ if (children.size() == 1) {
+ return children[0];
+ }
+ std::sort(children.begin(), children.end());
+ return NodeManager::currentNM()->mkNode(kind, children);
+}
+
+
+inline Node mkNode(Kind kind, std::vector<Node>& children) {
+ if (children.size() == 1) {
+ return children[0];
+ }
+ return NodeManager::currentNM()->mkNode(kind, children);
+}
inline Node mkNode(Kind kind, TNode child) {
return NodeManager::currentNM()->mkNode(kind, child);
@@ -88,6 +109,21 @@ inline Node mkNode(Kind kind, TNode child1, TNode child2) {
return NodeManager::currentNM()->mkNode(kind, child1, child2);
}
+
+inline Node mkSortedNode(Kind kind, TNode child1, TNode child2) {
+ Assert (kind == kind::BITVECTOR_PLUS ||
+ kind == kind::BITVECTOR_MULT ||
+ kind == kind::BITVECTOR_AND ||
+ kind == kind::BITVECTOR_OR ||
+ kind == kind::BITVECTOR_XOR);
+
+ if (child1 < child2) {
+ return NodeManager::currentNM()->mkNode(kind, child1, child2);
+ } else {
+ return NodeManager::currentNM()->mkNode(kind, child2, child1);
+ }
+}
+
inline Node mkNode(Kind kind, TNode child1, TNode child2, TNode child3) {
return NodeManager::currentNM()->mkNode(kind, child1, child2, child3);
}
@@ -156,8 +192,14 @@ inline Node mkConcat(TNode t1, TNode t2) {
return NodeManager::currentNM()->mkNode(kind::BITVECTOR_CONCAT, t1, t2);
}
+
+inline BitVector mkBitVectorOnes(unsigned size) {
+ Assert(size > 0);
+ return BitVector(1, Integer(1)).signExtend(size - 1);
+}
+
inline Node mkOnes(unsigned size) {
- BitVector val = BitVector(1, Integer(1)).signExtend(size-1);
+ BitVector val = mkBitVectorOnes(size);
return NodeManager::currentNM()->mkConst<BitVector>(val);
}
@@ -276,6 +318,7 @@ inline Node mkConjunction(const std::vector<TNode>& nodes) {
std::vector<TNode>::const_iterator it_end = nodes.end();
while (it != it_end) {
TNode current = *it;
+
if (current != mkTrue()) {
Assert(isBVPredicate(current));
expandedNodes.push_back(current);
diff --git a/src/util/bitvector.h b/src/util/bitvector.h
index 7429ac8c9..512f23136 100644
--- a/src/util/bitvector.h
+++ b/src/util/bitvector.h
@@ -337,9 +337,9 @@ public:
}
/**
- Returns k is the integer is equal to 2^k and zero
+ Returns k is the integer is equal to 2^{k-1} and zero
otherwise
- @return k if the integer is equal to 2^k and zero otherwise
+ @return k if the integer is equal to 2^{k-1} and zero otherwise
*/
unsigned isPow2() {
return d_value.isPow2();
diff --git a/test/regress/regress0/bv/fuzz01.smt b/test/regress/regress0/bv/fuzz01.smt
new file mode 100644
index 000000000..df6b54394
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz01.smt
@@ -0,0 +1,183 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[16]))
+:extrafuns ((v1 BitVec[2]))
+:extrafuns ((v2 BitVec[11]))
+:extrafuns ((v3 BitVec[5]))
+:extrafuns ((v4 BitVec[15]))
+:formula
+(let (?e5 bv0[1])
+(let (?e6 (ite (bvult v4 (sign_extend[13] v1)) bv1[1] bv0[1]))
+(let (?e7 (bvadd (sign_extend[9] v1) v2))
+(let (?e8 (bvcomp v4 v4))
+(let (?e9 (bvadd ?e7 (zero_extend[10] ?e6)))
+(let (?e10 (bvand v0 (sign_extend[11] v3)))
+(let (?e11 (ite (bvsge (zero_extend[11] v3) v0) bv1[1] bv0[1]))
+(let (?e12 (ite (bvsge (zero_extend[9] v1) ?e9) bv1[1] bv0[1]))
+(let (?e13 (repeat[1] v0))
+(let (?e14 (bvshl ?e6 ?e12))
+(let (?e15 (ite (= bv1[1] (extract[0:0] v0)) ?e9 (zero_extend[10] ?e6)))
+(let (?e16 (ite (bvsle (sign_extend[9] v1) v2) bv1[1] bv0[1]))
+(let (?e17 (ite (bvsge v4 (zero_extend[14] ?e6)) bv1[1] bv0[1]))
+(let (?e18 (bvcomp (sign_extend[10] ?e6) ?e9))
+(let (?e19 (ite (bvsle ?e15 ?e15) bv1[1] bv0[1]))
+(let (?e20 (ite (bvule ?e10 (zero_extend[15] ?e5)) bv1[1] bv0[1]))
+(flet ($e21 (= (zero_extend[10] ?e18) ?e9))
+(flet ($e22 (= ?e7 ?e7))
+(flet ($e23 (= ?e17 ?e6))
+(flet ($e24 (= (zero_extend[15] ?e17) ?e10))
+(flet ($e25 (= (zero_extend[10] ?e16) ?e7))
+(flet ($e26 (= (sign_extend[13] v1) v4))
+(flet ($e27 (= (sign_extend[15] ?e16) v0))
+(flet ($e28 (= (sign_extend[15] ?e18) ?e10))
+(flet ($e29 (= ?e7 (sign_extend[10] ?e18)))
+(flet ($e30 (= ?e9 (sign_extend[9] v1)))
+(flet ($e31 (= ?e11 ?e18))
+(flet ($e32 (= (sign_extend[15] ?e20) ?e10))
+(flet ($e33 (= ?e18 ?e8))
+(flet ($e34 (= ?e14 ?e6))
+(flet ($e35 (= (zero_extend[15] ?e20) v0))
+(flet ($e36 (= v4 (sign_extend[14] ?e11)))
+(flet ($e37 (= (sign_extend[1] v4) ?e13))
+(flet ($e38 (= ?e20 ?e16))
+(flet ($e39 (= v1 (sign_extend[1] ?e14)))
+(flet ($e40 (= ?e5 ?e19))
+(flet ($e41 (= ?e7 (sign_extend[10] ?e14)))
+(flet ($e42 (= ?e15 (sign_extend[6] v3)))
+(flet ($e43 (= ?e18 ?e18))
+(flet ($e44 (= ?e16 ?e8))
+(flet ($e45 (= (sign_extend[15] ?e8) v0))
+(flet ($e46 (= (zero_extend[4] ?e15) v4))
+(flet ($e47 (= (sign_extend[14] ?e20) v4))
+(flet ($e48 (= v3 (sign_extend[4] ?e17)))
+(flet ($e49 (= ?e17 ?e6))
+(flet ($e50 (= ?e10 (sign_extend[15] ?e16)))
+(flet ($e51 (= ?e16 ?e18))
+(flet ($e52 (= (sign_extend[10] ?e12) ?e9))
+(flet ($e53 (= ?e8 ?e19))
+(flet ($e54 (= (zero_extend[1] ?e14) v1))
+(flet ($e55 (= v1 (sign_extend[1] ?e6)))
+(flet ($e56 (= v4 (zero_extend[14] ?e14)))
+(flet ($e57 (= ?e17 ?e20))
+(flet ($e58 (= ?e20 ?e11))
+(flet ($e59 (= (zero_extend[4] ?e6) v3))
+(flet ($e60 (= v0 (zero_extend[5] ?e9)))
+(flet ($e61 (= v0 (sign_extend[15] ?e17)))
+(flet ($e62 (= ?e15 ?e9))
+(flet ($e63 (= (sign_extend[4] ?e15) v4))
+(flet ($e64 (= (zero_extend[10] ?e16) ?e15))
+(flet ($e65 (= v4 (zero_extend[14] ?e18)))
+(flet ($e66 (= (sign_extend[10] ?e14) ?e9))
+(flet ($e67 (= ?e20 ?e17))
+(flet ($e68 (= ?e14 ?e18))
+(flet ($e69 (= ?e10 (sign_extend[5] ?e9)))
+(flet ($e70 (= ?e5 ?e16))
+(flet ($e71 (= (zero_extend[10] ?e19) ?e15))
+(flet ($e72 (= ?e15 ?e9))
+(flet ($e73 (= ?e12 ?e11))
+(flet ($e74 (= (sign_extend[10] ?e14) ?e7))
+(flet ($e75 (= ?e20 ?e20))
+(flet ($e76 (= ?e12 ?e18))
+(flet ($e77 (= ?e20 ?e16))
+(flet ($e78 (= ?e17 ?e16))
+(flet ($e79 (= (zero_extend[14] ?e17) v4))
+(flet ($e80 (= ?e7 (sign_extend[10] ?e8)))
+(flet ($e81 (= ?e11 ?e20))
+(flet ($e82 (= ?e9 (sign_extend[10] ?e8)))
+(flet ($e83 (= v0 (zero_extend[15] ?e18)))
+(flet ($e84 (= ?e17 ?e12))
+(flet ($e85 (= (zero_extend[4] ?e18) v3))
+(flet ($e86 (= v1 (sign_extend[1] ?e5)))
+(flet ($e87 (= ?e14 ?e5))
+(flet ($e88 (= ?e13 (zero_extend[15] ?e14)))
+(flet ($e89 (= ?e19 ?e16))
+(flet ($e90 (= ?e20 ?e17))
+(flet ($e91 (= ?e15 v2))
+(flet ($e92 (or $e72 $e38))
+(flet ($e93 (if_then_else $e58 $e65 $e60))
+(flet ($e94 (not $e71))
+(flet ($e95 (and $e75 $e63))
+(flet ($e96 (and $e82 $e53))
+(flet ($e97 (iff $e22 $e59))
+(flet ($e98 (if_then_else $e96 $e41 $e29))
+(flet ($e99 (not $e46))
+(flet ($e100 (not $e39))
+(flet ($e101 (not $e62))
+(flet ($e102 (iff $e91 $e83))
+(flet ($e103 (implies $e51 $e61))
+(flet ($e104 (not $e33))
+(flet ($e105 (xor $e84 $e45))
+(flet ($e106 (implies $e54 $e50))
+(flet ($e107 (iff $e40 $e57))
+(flet ($e108 (xor $e30 $e89))
+(flet ($e109 (implies $e68 $e103))
+(flet ($e110 (if_then_else $e101 $e52 $e99))
+(flet ($e111 (or $e80 $e110))
+(flet ($e112 (iff $e108 $e88))
+(flet ($e113 (xor $e86 $e78))
+(flet ($e114 (not $e48))
+(flet ($e115 (if_then_else $e67 $e92 $e49))
+(flet ($e116 (implies $e77 $e93))
+(flet ($e117 (and $e26 $e25))
+(flet ($e118 (or $e47 $e117))
+(flet ($e119 (or $e87 $e21))
+(flet ($e120 (not $e64))
+(flet ($e121 (not $e119))
+(flet ($e122 (and $e106 $e118))
+(flet ($e123 (or $e114 $e43))
+(flet ($e124 (implies $e100 $e74))
+(flet ($e125 (iff $e123 $e109))
+(flet ($e126 (iff $e23 $e37))
+(flet ($e127 (not $e121))
+(flet ($e128 (and $e70 $e98))
+(flet ($e129 (if_then_else $e76 $e90 $e122))
+(flet ($e130 (iff $e81 $e111))
+(flet ($e131 (implies $e24 $e24))
+(flet ($e132 (iff $e130 $e42))
+(flet ($e133 (if_then_else $e79 $e34 $e94))
+(flet ($e134 (implies $e102 $e56))
+(flet ($e135 (or $e66 $e27))
+(flet ($e136 (and $e131 $e55))
+(flet ($e137 (iff $e105 $e120))
+(flet ($e138 (if_then_else $e129 $e85 $e32))
+(flet ($e139 (xor $e44 $e132))
+(flet ($e140 (xor $e133 $e139))
+(flet ($e141 (and $e134 $e128))
+(flet ($e142 (or $e127 $e113))
+(flet ($e143 (implies $e136 $e136))
+(flet ($e144 (iff $e143 $e36))
+(flet ($e145 (not $e144))
+(flet ($e146 (if_then_else $e35 $e137 $e142))
+(flet ($e147 (if_then_else $e116 $e126 $e112))
+(flet ($e148 (and $e141 $e97))
+(flet ($e149 (implies $e146 $e115))
+(flet ($e150 (not $e140))
+(flet ($e151 (and $e150 $e95))
+(flet ($e152 (if_then_else $e147 $e138 $e147))
+(flet ($e153 (or $e135 $e31))
+(flet ($e154 (iff $e148 $e73))
+(flet ($e155 (or $e152 $e69))
+(flet ($e156 (not $e107))
+(flet ($e157 (if_then_else $e149 $e28 $e104))
+(flet ($e158 (iff $e157 $e124))
+(flet ($e159 (iff $e125 $e151))
+(flet ($e160 (if_then_else $e154 $e159 $e145))
+(flet ($e161 (iff $e155 $e155))
+(flet ($e162 (iff $e160 $e160))
+(flet ($e163 (iff $e158 $e156))
+(flet ($e164 (iff $e162 $e162))
+(flet ($e165 (and $e163 $e161))
+(flet ($e166 (xor $e164 $e165))
+(flet ($e167 (or $e166 $e166))
+(flet ($e168 (or $e167 $e167))
+(flet ($e169 (iff $e153 $e153))
+(flet ($e170 (or $e168 $e168))
+(flet ($e171 (or $e169 $e169))
+(flet ($e172 (not $e171))
+(flet ($e173 (implies $e170 $e170))
+(flet ($e174 (not $e172))
+(flet ($e175 (iff $e173 $e174))
+$e175
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz02.smt b/test/regress/regress0/bv/fuzz02.smt
new file mode 100644
index 000000000..41b616ef0
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz02.smt
@@ -0,0 +1,122 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[3]))
+:extrafuns ((v1 BitVec[12]))
+:extrafuns ((v2 BitVec[9]))
+:formula
+(let (?e3 bv10[9])
+(let (?e4 (extract[6:6] ?e3))
+(let (?e5 (ite (bvult v2 v2) bv1[1] bv0[1]))
+(let (?e6 (ite (bvsgt ?e4 ?e4) bv1[1] bv0[1]))
+(let (?e7 (sign_extend[5] ?e6))
+(let (?e8 (concat ?e7 ?e5))
+(let (?e9 (bvcomp ?e8 (zero_extend[1] ?e7)))
+(let (?e10 (ite (bvule ?e7 (zero_extend[5] ?e9)) bv1[1] bv0[1]))
+(let (?e11 (bvadd (sign_extend[2] ?e10) v0))
+(let (?e12 (extract[1:0] v0))
+(let (?e13 (ite (bvslt ?e12 ?e12) bv1[1] bv0[1]))
+(let (?e14 (ite (bvult ?e7 (sign_extend[4] ?e12)) bv1[1] bv0[1]))
+(let (?e15 (bvlshr (sign_extend[8] ?e4) v2))
+(let (?e16 (repeat[2] v0))
+(let (?e17 (rotate_right[4] ?e15))
+(let (?e18 (bvxor ?e14 ?e14))
+(let (?e19 (bvand v2 (sign_extend[7] ?e12)))
+(let (?e20 (bvnot v1))
+(flet ($e21 (= ?e15 ?e3))
+(flet ($e22 (= (sign_extend[6] ?e9) ?e8))
+(flet ($e23 (= ?e6 ?e4))
+(flet ($e24 (= ?e11 (zero_extend[2] ?e13)))
+(flet ($e25 (= v0 (zero_extend[2] ?e13)))
+(flet ($e26 (= (sign_extend[1] ?e4) ?e12))
+(flet ($e27 (= ?e15 ?e3))
+(flet ($e28 (= ?e3 ?e19))
+(flet ($e29 (= (zero_extend[8] ?e14) ?e15))
+(flet ($e30 (= v0 (sign_extend[2] ?e6)))
+(flet ($e31 (= ?e11 (sign_extend[2] ?e4)))
+(flet ($e32 (= ?e7 (zero_extend[5] ?e6)))
+(flet ($e33 (= ?e5 ?e5))
+(flet ($e34 (= (zero_extend[8] ?e6) v2))
+(flet ($e35 (= ?e20 (zero_extend[3] ?e3)))
+(flet ($e36 (= (zero_extend[8] ?e4) ?e15))
+(flet ($e37 (= ?e3 (sign_extend[8] ?e5)))
+(flet ($e38 (= (sign_extend[11] ?e9) v1))
+(flet ($e39 (= (zero_extend[1] ?e9) ?e12))
+(flet ($e40 (= (sign_extend[6] v0) ?e15))
+(flet ($e41 (= ?e7 (zero_extend[5] ?e14)))
+(flet ($e42 (= ?e6 ?e14))
+(flet ($e43 (= ?e16 (zero_extend[5] ?e4)))
+(flet ($e44 (= (zero_extend[8] ?e9) v2))
+(flet ($e45 (= v1 (zero_extend[11] ?e5)))
+(flet ($e46 (= ?e8 (zero_extend[6] ?e4)))
+(flet ($e47 (= (sign_extend[1] ?e13) ?e12))
+(flet ($e48 (= (zero_extend[11] ?e18) v1))
+(flet ($e49 (= (zero_extend[11] ?e5) v1))
+(flet ($e50 (= ?e15 (sign_extend[8] ?e4)))
+(flet ($e51 (= ?e13 ?e14))
+(flet ($e52 (= (zero_extend[2] ?e5) ?e11))
+(flet ($e53 (= (sign_extend[11] ?e9) v1))
+(flet ($e54 (= ?e8 (sign_extend[6] ?e5)))
+(flet ($e55 (= (sign_extend[7] ?e12) v2))
+(flet ($e56 (= ?e20 (sign_extend[3] ?e15)))
+(flet ($e57 (= ?e15 (sign_extend[6] ?e11)))
+(flet ($e58 (= ?e6 ?e4))
+(flet ($e59 (= (sign_extend[8] ?e10) v2))
+(flet ($e60 (= (zero_extend[8] ?e10) ?e19))
+(flet ($e61 (= ?e9 ?e6))
+(flet ($e62 (= ?e11 (sign_extend[2] ?e9)))
+(flet ($e63 (= v2 (zero_extend[8] ?e18)))
+(flet ($e64 (= (sign_extend[2] ?e10) ?e11))
+(flet ($e65 (= ?e5 ?e5))
+(flet ($e66 (= (zero_extend[3] ?e16) ?e17))
+(flet ($e67 (if_then_else $e34 $e37 $e22))
+(flet ($e68 (xor $e61 $e63))
+(flet ($e69 (iff $e55 $e53))
+(flet ($e70 (not $e51))
+(flet ($e71 (or $e70 $e56))
+(flet ($e72 (or $e23 $e54))
+(flet ($e73 (or $e43 $e39))
+(flet ($e74 (implies $e58 $e32))
+(flet ($e75 (and $e21 $e59))
+(flet ($e76 (implies $e33 $e38))
+(flet ($e77 (and $e41 $e57))
+(flet ($e78 (if_then_else $e77 $e74 $e64))
+(flet ($e79 (iff $e36 $e52))
+(flet ($e80 (or $e29 $e25))
+(flet ($e81 (iff $e68 $e62))
+(flet ($e82 (xor $e78 $e76))
+(flet ($e83 (xor $e66 $e69))
+(flet ($e84 (or $e45 $e27))
+(flet ($e85 (xor $e83 $e79))
+(flet ($e86 (if_then_else $e72 $e72 $e65))
+(flet ($e87 (iff $e28 $e75))
+(flet ($e88 (if_then_else $e26 $e73 $e47))
+(flet ($e89 (xor $e60 $e60))
+(flet ($e90 (xor $e49 $e42))
+(flet ($e91 (iff $e44 $e48))
+(flet ($e92 (and $e71 $e80))
+(flet ($e93 (not $e88))
+(flet ($e94 (iff $e35 $e35))
+(flet ($e95 (iff $e81 $e90))
+(flet ($e96 (xor $e89 $e85))
+(flet ($e97 (xor $e82 $e94))
+(flet ($e98 (or $e92 $e40))
+(flet ($e99 (implies $e93 $e24))
+(flet ($e100 (if_then_else $e46 $e31 $e50))
+(flet ($e101 (or $e86 $e97))
+(flet ($e102 (and $e101 $e67))
+(flet ($e103 (if_then_else $e87 $e96 $e30))
+(flet ($e104 (not $e100))
+(flet ($e105 (xor $e91 $e104))
+(flet ($e106 (if_then_else $e84 $e102 $e84))
+(flet ($e107 (implies $e106 $e98))
+(flet ($e108 (implies $e107 $e103))
+(flet ($e109 (or $e95 $e95))
+(flet ($e110 (implies $e108 $e109))
+(flet ($e111 (not $e99))
+(flet ($e112 (or $e110 $e105))
+(flet ($e113 (or $e112 $e112))
+(flet ($e114 (xor $e111 $e113))
+$e114
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz03.smt b/test/regress/regress0/bv/fuzz03.smt
new file mode 100644
index 000000000..fe0b5b129
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz03.smt
@@ -0,0 +1,81 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[1]))
+:extrafuns ((v1 BitVec[4]))
+:extrafuns ((v2 BitVec[11]))
+:extrafuns ((v3 BitVec[9]))
+:formula
+(let (?e4 bv0[1])
+(let (?e5 bv125[7])
+(let (?e6 (bvxor v2 (zero_extend[2] v3)))
+(let (?e7 (ite (bvule (zero_extend[2] v3) ?e6) bv1[1] bv0[1]))
+(let (?e8 (ite (= ?e6 v2) bv1[1] bv0[1]))
+(let (?e9 (ite (= bv1[1] (extract[0:0] ?e8)) (zero_extend[10] ?e4) ?e6))
+(let (?e10 (ite (bvule (sign_extend[4] ?e5) ?e6) bv1[1] bv0[1]))
+(let (?e11 (bvnor (zero_extend[8] ?e10) v3))
+(let (?e12 (ite (bvugt (sign_extend[8] ?e7) ?e11) bv1[1] bv0[1]))
+(let (?e13 (bvor ?e6 (zero_extend[10] ?e12)))
+(let (?e14 (bvor ?e4 v0))
+(let (?e15 (bvnor ?e13 (zero_extend[2] ?e11)))
+(let (?e16 (sign_extend[5] ?e15))
+(let (?e17 (zero_extend[5] ?e6))
+(let (?e18 (ite (bvugt (sign_extend[8] v0) ?e11) bv1[1] bv0[1]))
+(let (?e19 (rotate_right[0] v1))
+(flet ($e20 (= ?e18 ?e12))
+(flet ($e21 (= (sign_extend[10] ?e8) ?e13))
+(flet ($e22 (= ?e16 ?e16))
+(flet ($e23 (= (sign_extend[10] ?e14) ?e9))
+(flet ($e24 (= v3 (zero_extend[8] ?e14)))
+(flet ($e25 (= v0 ?e10))
+(flet ($e26 (= (sign_extend[8] ?e7) v3))
+(flet ($e27 (= (sign_extend[5] ?e9) ?e16))
+(flet ($e28 (= ?e14 ?e7))
+(flet ($e29 (= ?e12 ?e18))
+(flet ($e30 (= ?e6 ?e13))
+(flet ($e31 (= ?e9 (zero_extend[10] ?e12)))
+(flet ($e32 (= ?e16 (sign_extend[5] v2)))
+(flet ($e33 (= v1 v1))
+(flet ($e34 (= (sign_extend[12] v1) ?e16))
+(flet ($e35 (= (sign_extend[5] ?e15) ?e16))
+(flet ($e36 (= v2 (zero_extend[7] ?e19)))
+(flet ($e37 (= ?e13 (sign_extend[4] ?e5)))
+(flet ($e38 (= (zero_extend[10] ?e14) ?e15))
+(flet ($e39 (= (sign_extend[5] v1) ?e11))
+(flet ($e40 (= (zero_extend[3] ?e7) v1))
+(flet ($e41 (= (sign_extend[7] v1) ?e13))
+(flet ($e42 (= v2 (zero_extend[10] v0)))
+(flet ($e43 (= ?e13 (zero_extend[10] ?e4)))
+(flet ($e44 (= ?e9 (sign_extend[7] ?e19)))
+(flet ($e45 (= ?e15 (sign_extend[10] v0)))
+(flet ($e46 (= ?e17 (zero_extend[5] ?e6)))
+(flet ($e47 (iff $e38 $e44))
+(flet ($e48 (and $e23 $e36))
+(flet ($e49 (not $e25))
+(flet ($e50 (xor $e32 $e39))
+(flet ($e51 (if_then_else $e30 $e26 $e29))
+(flet ($e52 (not $e24))
+(flet ($e53 (if_then_else $e43 $e34 $e41))
+(flet ($e54 (iff $e47 $e33))
+(flet ($e55 (iff $e28 $e37))
+(flet ($e56 (or $e27 $e53))
+(flet ($e57 (and $e52 $e56))
+(flet ($e58 (if_then_else $e48 $e50 $e50))
+(flet ($e59 (if_then_else $e21 $e40 $e57))
+(flet ($e60 (implies $e58 $e55))
+(flet ($e61 (implies $e54 $e45))
+(flet ($e62 (implies $e35 $e61))
+(flet ($e63 (iff $e22 $e62))
+(flet ($e64 (or $e63 $e59))
+(flet ($e65 (and $e42 $e60))
+(flet ($e66 (or $e20 $e51))
+(flet ($e67 (or $e49 $e65))
+(flet ($e68 (not $e31))
+(flet ($e69 (xor $e64 $e68))
+(flet ($e70 (implies $e66 $e66))
+(flet ($e71 (iff $e46 $e69))
+(flet ($e72 (implies $e70 $e71))
+(flet ($e73 (implies $e72 $e67))
+$e73
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz04.smt b/test/regress/regress0/bv/fuzz04.smt
new file mode 100644
index 000000000..c5598a23a
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz04.smt
@@ -0,0 +1,249 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[3]))
+:extrafuns ((v1 BitVec[9]))
+:extrafuns ((v2 BitVec[15]))
+:extrafuns ((v3 BitVec[5]))
+:formula
+(let (?e4 bv111[9])
+(let (?e5 bv6[3])
+(let (?e6 (bvor v1 (zero_extend[6] v0)))
+(let (?e7 (bvxor (sign_extend[4] v3) v1))
+(let (?e8 (bvlshr v1 ?e6))
+(let (?e9 (bvnot v0))
+(let (?e10 (bvshl v1 (sign_extend[6] v0)))
+(let (?e11 (bvnot v1))
+(let (?e12 (bvmul ?e7 ?e7))
+(let (?e13 (ite (bvsgt ?e10 (zero_extend[4] v3)) bv1[1] bv0[1]))
+(let (?e14 (bvnor ?e11 ?e6))
+(let (?e15 (bvnor v2 (zero_extend[6] ?e7)))
+(let (?e16 (ite (= bv1[1] (extract[0:0] v3)) v1 ?e6))
+(let (?e17 (ite (bvule ?e10 ?e14) bv1[1] bv0[1]))
+(let (?e18 (ite (bvuge (sign_extend[2] ?e17) ?e5) bv1[1] bv0[1]))
+(let (?e19 (bvnot ?e10))
+(let (?e20 (ite (bvuge ?e13 ?e18) bv1[1] bv0[1]))
+(let (?e21 (bvneg ?e15))
+(let (?e22 (bvmul ?e7 ?e10))
+(let (?e23 (rotate_left[2] v1))
+(let (?e24 (bvneg ?e13))
+(let (?e25 (sign_extend[7] ?e22))
+(let (?e26 (bvnand (sign_extend[6] v0) v1))
+(let (?e27 (bvxnor (zero_extend[1] ?e21) ?e25))
+(let (?e28 (bvnand ?e9 v0))
+(let (?e29 (bvor ?e15 (sign_extend[6] ?e26)))
+(let (?e30 (bvsub ?e16 (sign_extend[8] ?e20)))
+(let (?e31 (bvand (sign_extend[2] ?e13) ?e28))
+(let (?e32 (rotate_right[2] ?e12))
+(let (?e33 (repeat[1] ?e25))
+(let (?e34 (ite (= bv1[1] (extract[4:4] ?e19)) (zero_extend[6] ?e9) ?e23))
+(let (?e35 (bvlshr ?e8 (zero_extend[6] ?e31)))
+(let (?e36 (rotate_left[5] ?e4))
+(flet ($e37 (= (sign_extend[8] ?e24) ?e12))
+(flet ($e38 (= (sign_extend[10] v3) v2))
+(flet ($e39 (= ?e29 (sign_extend[6] ?e32)))
+(flet ($e40 (= ?e19 (sign_extend[6] ?e9)))
+(flet ($e41 (= (zero_extend[6] ?e9) ?e6))
+(flet ($e42 (= ?e25 (zero_extend[15] ?e17)))
+(flet ($e43 (= ?e25 (sign_extend[15] ?e17)))
+(flet ($e44 (= ?e25 ?e25))
+(flet ($e45 (= v2 (sign_extend[12] ?e31)))
+(flet ($e46 (= (sign_extend[15] ?e17) ?e25))
+(flet ($e47 (= ?e12 (zero_extend[6] ?e9)))
+(flet ($e48 (= ?e29 (zero_extend[6] ?e4)))
+(flet ($e49 (= (zero_extend[8] ?e24) ?e26))
+(flet ($e50 (= (zero_extend[4] ?e17) v3))
+(flet ($e51 (= ?e7 ?e23))
+(flet ($e52 (= (sign_extend[8] ?e18) ?e4))
+(flet ($e53 (= v1 ?e26))
+(flet ($e54 (= (sign_extend[8] ?e18) ?e16))
+(flet ($e55 (= ?e16 ?e36))
+(flet ($e56 (= ?e35 v1))
+(flet ($e57 (= ?e11 ?e36))
+(flet ($e58 (= ?e16 (sign_extend[6] ?e5)))
+(flet ($e59 (= ?e22 ?e35))
+(flet ($e60 (= ?e33 (sign_extend[7] ?e6)))
+(flet ($e61 (= v2 (sign_extend[12] ?e9)))
+(flet ($e62 (= ?e12 ?e12))
+(flet ($e63 (= v0 (zero_extend[2] ?e18)))
+(flet ($e64 (= ?e16 ?e7))
+(flet ($e65 (= ?e22 (sign_extend[8] ?e13)))
+(flet ($e66 (= (zero_extend[7] ?e8) ?e33))
+(flet ($e67 (= v1 ?e35))
+(flet ($e68 (= ?e30 (zero_extend[6] ?e28)))
+(flet ($e69 (= ?e6 (sign_extend[6] ?e31)))
+(flet ($e70 (= ?e23 ?e35))
+(flet ($e71 (= ?e11 ?e14))
+(flet ($e72 (= (zero_extend[2] ?e20) v0))
+(flet ($e73 (= (sign_extend[8] ?e18) ?e26))
+(flet ($e74 (= (zero_extend[10] v3) ?e21))
+(flet ($e75 (= ?e19 (zero_extend[8] ?e20)))
+(flet ($e76 (= ?e26 (sign_extend[8] ?e20)))
+(flet ($e77 (= ?e29 (sign_extend[6] ?e16)))
+(flet ($e78 (= (sign_extend[2] ?e17) ?e28))
+(flet ($e79 (= ?e30 ?e10))
+(flet ($e80 (= ?e20 ?e20))
+(flet ($e81 (= ?e15 (zero_extend[6] ?e19)))
+(flet ($e82 (= ?e10 (zero_extend[8] ?e18)))
+(flet ($e83 (= (zero_extend[14] ?e24) v2))
+(flet ($e84 (= (sign_extend[8] ?e17) ?e4))
+(flet ($e85 (= ?e21 (sign_extend[14] ?e24)))
+(flet ($e86 (= ?e22 (sign_extend[8] ?e24)))
+(flet ($e87 (= (zero_extend[8] ?e18) ?e23))
+(flet ($e88 (= (sign_extend[6] ?e31) ?e10))
+(flet ($e89 (= ?e21 (sign_extend[6] ?e7)))
+(flet ($e90 (= ?e30 (sign_extend[6] v0)))
+(flet ($e91 (= ?e33 (sign_extend[7] ?e36)))
+(flet ($e92 (= ?e34 (sign_extend[6] ?e9)))
+(flet ($e93 (= (zero_extend[2] ?e17) ?e9))
+(flet ($e94 (= ?e15 (zero_extend[6] ?e16)))
+(flet ($e95 (= ?e25 (sign_extend[7] ?e8)))
+(flet ($e96 (= ?e12 ?e8))
+(flet ($e97 (= v1 (sign_extend[8] ?e13)))
+(flet ($e98 (= ?e32 ?e8))
+(flet ($e99 (= v0 v0))
+(flet ($e100 (= ?e14 (sign_extend[6] ?e5)))
+(flet ($e101 (= (sign_extend[6] ?e34) ?e29))
+(flet ($e102 (= ?e35 (sign_extend[8] ?e13)))
+(flet ($e103 (= ?e6 ?e12))
+(flet ($e104 (= (zero_extend[8] ?e18) ?e36))
+(flet ($e105 (= ?e36 (zero_extend[8] ?e17)))
+(flet ($e106 (= (zero_extend[6] ?e5) ?e4))
+(flet ($e107 (= ?e34 (zero_extend[6] ?e5)))
+(flet ($e108 (= (sign_extend[8] ?e17) ?e6))
+(flet ($e109 (= (sign_extend[8] ?e20) ?e4))
+(flet ($e110 (= ?e21 (zero_extend[6] ?e32)))
+(flet ($e111 (= (zero_extend[6] ?e9) ?e19))
+(flet ($e112 (= ?e6 (zero_extend[8] ?e13)))
+(flet ($e113 (= ?e25 (zero_extend[15] ?e24)))
+(flet ($e114 (= (sign_extend[8] ?e20) ?e10))
+(flet ($e115 (= (sign_extend[6] v1) v2))
+(flet ($e116 (= (sign_extend[6] v0) ?e7))
+(flet ($e117 (= v1 ?e8))
+(flet ($e118 (= (zero_extend[6] ?e11) ?e15))
+(flet ($e119 (= (sign_extend[6] ?e22) v2))
+(flet ($e120 (= (zero_extend[4] ?e18) v3))
+(flet ($e121 (= ?e10 v1))
+(flet ($e122 (= ?e10 ?e32))
+(flet ($e123 (= v1 (zero_extend[6] ?e28)))
+(flet ($e124 (= ?e25 ?e25))
+(flet ($e125 (= (zero_extend[2] ?e31) v3))
+(flet ($e126 (= ?e10 ?e8))
+(flet ($e127 (= ?e29 (sign_extend[12] v0)))
+(flet ($e128 (= ?e30 (zero_extend[6] ?e9)))
+(flet ($e129 (= v2 v2))
+(flet ($e130 (= (sign_extend[8] ?e18) ?e4))
+(flet ($e131 (= (sign_extend[8] ?e20) ?e36))
+(flet ($e132 (= ?e32 ?e22))
+(flet ($e133 (= ?e8 ?e16))
+(flet ($e134 (= (zero_extend[13] ?e5) ?e33))
+(flet ($e135 (= v2 (sign_extend[14] ?e20)))
+(flet ($e136 (= ?e27 ?e27))
+(flet ($e137 (xor $e68 $e88))
+(flet ($e138 (and $e111 $e56))
+(flet ($e139 (and $e39 $e84))
+(flet ($e140 (if_then_else $e139 $e116 $e75))
+(flet ($e141 (xor $e108 $e110))
+(flet ($e142 (xor $e78 $e44))
+(flet ($e143 (xor $e131 $e133))
+(flet ($e144 (and $e97 $e95))
+(flet ($e145 (or $e80 $e124))
+(flet ($e146 (xor $e58 $e45))
+(flet ($e147 (or $e99 $e42))
+(flet ($e148 (or $e67 $e118))
+(flet ($e149 (if_then_else $e47 $e102 $e102))
+(flet ($e150 (and $e106 $e43))
+(flet ($e151 (iff $e82 $e86))
+(flet ($e152 (if_then_else $e61 $e109 $e81))
+(flet ($e153 (iff $e120 $e150))
+(flet ($e154 (not $e144))
+(flet ($e155 (xor $e49 $e69))
+(flet ($e156 (iff $e48 $e115))
+(flet ($e157 (not $e57))
+(flet ($e158 (and $e154 $e94))
+(flet ($e159 (not $e113))
+(flet ($e160 (and $e126 $e89))
+(flet ($e161 (or $e157 $e159))
+(flet ($e162 (and $e77 $e98))
+(flet ($e163 (not $e85))
+(flet ($e164 (implies $e55 $e137))
+(flet ($e165 (xor $e148 $e100))
+(flet ($e166 (not $e60))
+(flet ($e167 (implies $e153 $e65))
+(flet ($e168 (implies $e76 $e141))
+(flet ($e169 (if_then_else $e51 $e165 $e149))
+(flet ($e170 (not $e70))
+(flet ($e171 (xor $e92 $e37))
+(flet ($e172 (and $e104 $e134))
+(flet ($e173 (xor $e130 $e64))
+(flet ($e174 (not $e138))
+(flet ($e175 (implies $e174 $e145))
+(flet ($e176 (iff $e38 $e101))
+(flet ($e177 (or $e146 $e122))
+(flet ($e178 (or $e123 $e172))
+(flet ($e179 (and $e63 $e114))
+(flet ($e180 (xor $e117 $e41))
+(flet ($e181 (or $e136 $e161))
+(flet ($e182 (implies $e121 $e151))
+(flet ($e183 (iff $e52 $e53))
+(flet ($e184 (implies $e79 $e103))
+(flet ($e185 (or $e87 $e183))
+(flet ($e186 (not $e50))
+(flet ($e187 (iff $e173 $e186))
+(flet ($e188 (if_then_else $e170 $e156 $e112))
+(flet ($e189 (implies $e179 $e142))
+(flet ($e190 (not $e71))
+(flet ($e191 (iff $e164 $e93))
+(flet ($e192 (if_then_else $e143 $e191 $e127))
+(flet ($e193 (and $e59 $e189))
+(flet ($e194 (if_then_else $e178 $e132 $e129))
+(flet ($e195 (and $e152 $e167))
+(flet ($e196 (if_then_else $e171 $e62 $e162))
+(flet ($e197 (xor $e192 $e192))
+(flet ($e198 (and $e188 $e135))
+(flet ($e199 (iff $e175 $e196))
+(flet ($e200 (xor $e73 $e193))
+(flet ($e201 (and $e168 $e176))
+(flet ($e202 (iff $e185 $e201))
+(flet ($e203 (xor $e190 $e91))
+(flet ($e204 (iff $e74 $e182))
+(flet ($e205 (xor $e194 $e147))
+(flet ($e206 (and $e128 $e187))
+(flet ($e207 (iff $e83 $e169))
+(flet ($e208 (iff $e177 $e197))
+(flet ($e209 (if_then_else $e166 $e199 $e96))
+(flet ($e210 (or $e119 $e46))
+(flet ($e211 (xor $e200 $e207))
+(flet ($e212 (xor $e205 $e209))
+(flet ($e213 (iff $e212 $e184))
+(flet ($e214 (or $e105 $e180))
+(flet ($e215 (and $e181 $e210))
+(flet ($e216 (xor $e155 $e204))
+(flet ($e217 (and $e213 $e66))
+(flet ($e218 (implies $e214 $e211))
+(flet ($e219 (if_then_else $e206 $e208 $e198))
+(flet ($e220 (xor $e215 $e216))
+(flet ($e221 (if_then_else $e218 $e90 $e203))
+(flet ($e222 (xor $e202 $e160))
+(flet ($e223 (xor $e125 $e158))
+(flet ($e224 (or $e220 $e195))
+(flet ($e225 (or $e219 $e54))
+(flet ($e226 (not $e223))
+(flet ($e227 (if_then_else $e140 $e217 $e140))
+(flet ($e228 (not $e226))
+(flet ($e229 (or $e222 $e224))
+(flet ($e230 (iff $e225 $e221))
+(flet ($e231 (and $e72 $e163))
+(flet ($e232 (and $e227 $e40))
+(flet ($e233 (not $e107))
+(flet ($e234 (and $e232 $e231))
+(flet ($e235 (and $e228 $e228))
+(flet ($e236 (not $e235))
+(flet ($e237 (iff $e229 $e230))
+(flet ($e238 (and $e236 $e233))
+(flet ($e239 (xor $e237 $e238))
+(flet ($e240 (not $e234))
+(flet ($e241 (and $e239 $e240))
+$e241
+)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz05.smt b/test/regress/regress0/bv/fuzz05.smt
new file mode 100644
index 000000000..6a64a7218
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz05.smt
@@ -0,0 +1,282 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[12]))
+:extrafuns ((v1 BitVec[2]))
+:extrafuns ((v2 BitVec[13]))
+:extrafuns ((v3 BitVec[10]))
+:formula
+(let (?e4 bv47[10])
+(let (?e5 (bvshl (zero_extend[8] v1) v3))
+(let (?e6 (bvcomp v2 (zero_extend[11] v1)))
+(let (?e7 (ite (bvslt ?e5 ?e4) bv1[1] bv0[1]))
+(let (?e8 (ite (bvsgt ?e4 (zero_extend[9] ?e6)) bv1[1] bv0[1]))
+(let (?e9 (bvadd v1 (zero_extend[1] ?e6)))
+(let (?e10 (ite (bvsle (zero_extend[9] ?e7) ?e4) bv1[1] bv0[1]))
+(let (?e11 (rotate_left[0] ?e8))
+(let (?e12 (ite (= bv1[1] (extract[0:0] ?e7)) (zero_extend[1] ?e8) ?e9))
+(let (?e13 (bvadd ?e9 ?e9))
+(let (?e14 (rotate_right[0] ?e7))
+(let (?e15 (ite (bvslt (sign_extend[9] ?e6) ?e5) bv1[1] bv0[1]))
+(let (?e16 (ite (distinct ?e7 ?e6) bv1[1] bv0[1]))
+(let (?e17 (bvor ?e7 ?e8))
+(let (?e18 (bvand (zero_extend[1] ?e6) ?e9))
+(let (?e19 (ite (bvuge ?e18 (sign_extend[1] ?e16)) bv1[1] bv0[1]))
+(let (?e20 (ite (bvsgt ?e18 (sign_extend[1] ?e17)) bv1[1] bv0[1]))
+(let (?e21 (ite (= (sign_extend[3] v3) v2) bv1[1] bv0[1]))
+(let (?e22 (bvxor ?e10 ?e19))
+(let (?e23 (bvxor (zero_extend[1] ?e19) v1))
+(let (?e24 (ite (bvule v1 (sign_extend[1] ?e19)) bv1[1] bv0[1]))
+(let (?e25 (ite (bvuge ?e8 ?e17) bv1[1] bv0[1]))
+(let (?e26 (ite (bvsge ?e20 ?e22) bv1[1] bv0[1]))
+(let (?e27 (zero_extend[1] ?e22))
+(let (?e28 (bvsub (sign_extend[1] ?e10) v1))
+(let (?e29 (bvlshr ?e27 (sign_extend[1] ?e17)))
+(let (?e30 (concat ?e17 ?e4))
+(let (?e31 (bvnand (zero_extend[11] ?e23) v2))
+(let (?e32 (bvashr (zero_extend[9] ?e19) ?e5))
+(let (?e33 (bvmul ?e23 (zero_extend[1] ?e25)))
+(let (?e34 (repeat[1] ?e27))
+(let (?e35 (ite (bvuge ?e27 (zero_extend[1] ?e11)) bv1[1] bv0[1]))
+(let (?e36 (ite (= (sign_extend[1] ?e11) v1) bv1[1] bv0[1]))
+(let (?e37 (bvneg ?e31))
+(let (?e38 (ite (bvsgt ?e22 ?e14) bv1[1] bv0[1]))
+(let (?e39 (ite (bvsge ?e36 ?e8) bv1[1] bv0[1]))
+(let (?e40 (bvand ?e8 ?e14))
+(let (?e41 (bvand (zero_extend[12] ?e17) v2))
+(let (?e42 (ite (bvsle ?e35 ?e26) bv1[1] bv0[1]))
+(let (?e43 (ite (bvsle v2 (sign_extend[12] ?e21)) bv1[1] bv0[1]))
+(let (?e44 (bvshl ?e16 ?e42))
+(let (?e45 (ite (= ?e23 ?e29) bv1[1] bv0[1]))
+(let (?e46 (repeat[1] ?e41))
+(let (?e47 (bvcomp ?e10 ?e21))
+(let (?e48 (ite (= (zero_extend[9] ?e47) ?e4) bv1[1] bv0[1]))
+(let (?e49 (bvnand (zero_extend[11] ?e33) ?e41))
+(let (?e50 (ite (bvslt ?e44 ?e20) bv1[1] bv0[1]))
+(let (?e51 (ite (bvsgt ?e31 (sign_extend[12] ?e21)) bv1[1] bv0[1]))
+(let (?e52 (ite (bvslt v0 (zero_extend[11] ?e38)) bv1[1] bv0[1]))
+(flet ($e53 (= v1 ?e29))
+(flet ($e54 (= (zero_extend[1] ?e44) ?e13))
+(flet ($e55 (= ?e17 ?e44))
+(flet ($e56 (= ?e4 (zero_extend[9] ?e39)))
+(flet ($e57 (= (sign_extend[11] ?e14) v0))
+(flet ($e58 (= (zero_extend[12] ?e42) ?e37))
+(flet ($e59 (= ?e40 ?e36))
+(flet ($e60 (= ?e23 ?e33))
+(flet ($e61 (= (zero_extend[1] ?e24) ?e29))
+(flet ($e62 (= ?e28 (zero_extend[1] ?e50)))
+(flet ($e63 (= ?e6 ?e25))
+(flet ($e64 (= ?e49 (sign_extend[12] ?e21)))
+(flet ($e65 (= ?e20 ?e38))
+(flet ($e66 (= (zero_extend[1] ?e16) ?e18))
+(flet ($e67 (= ?e50 ?e16))
+(flet ($e68 (= ?e20 ?e48))
+(flet ($e69 (= ?e17 ?e21))
+(flet ($e70 (= (sign_extend[12] ?e44) ?e46))
+(flet ($e71 (= ?e51 ?e47))
+(flet ($e72 (= ?e5 (sign_extend[9] ?e16)))
+(flet ($e73 (= ?e16 ?e21))
+(flet ($e74 (= ?e5 (sign_extend[8] ?e27)))
+(flet ($e75 (= (zero_extend[9] ?e21) ?e5))
+(flet ($e76 (= (sign_extend[8] ?e28) ?e5))
+(flet ($e77 (= (sign_extend[9] ?e10) ?e32))
+(flet ($e78 (= ?e28 (sign_extend[1] ?e11)))
+(flet ($e79 (= ?e29 (sign_extend[1] ?e17)))
+(flet ($e80 (= ?e36 ?e15))
+(flet ($e81 (= (sign_extend[11] ?e45) v0))
+(flet ($e82 (= ?e27 (sign_extend[1] ?e40)))
+(flet ($e83 (= ?e28 (zero_extend[1] ?e44)))
+(flet ($e84 (= v2 (zero_extend[1] v0)))
+(flet ($e85 (= ?e32 (sign_extend[9] ?e47)))
+(flet ($e86 (= v3 (sign_extend[9] ?e24)))
+(flet ($e87 (= ?e46 (sign_extend[12] ?e52)))
+(flet ($e88 (= ?e46 ?e46))
+(flet ($e89 (= v2 (sign_extend[12] ?e20)))
+(flet ($e90 (= v0 (sign_extend[10] ?e23)))
+(flet ($e91 (= (zero_extend[9] ?e11) ?e4))
+(flet ($e92 (= ?e52 ?e17))
+(flet ($e93 (= v2 (zero_extend[12] ?e40)))
+(flet ($e94 (= ?e35 ?e51))
+(flet ($e95 (= ?e42 ?e10))
+(flet ($e96 (= ?e47 ?e43))
+(flet ($e97 (= (zero_extend[1] ?e11) v1))
+(flet ($e98 (= (zero_extend[1] ?e32) ?e30))
+(flet ($e99 (= ?e23 (zero_extend[1] ?e11)))
+(flet ($e100 (= ?e44 ?e22))
+(flet ($e101 (= ?e31 (sign_extend[12] ?e16)))
+(flet ($e102 (= ?e32 (zero_extend[8] ?e27)))
+(flet ($e103 (= (zero_extend[9] ?e45) ?e5))
+(flet ($e104 (= ?e27 ?e13))
+(flet ($e105 (= (zero_extend[1] ?e7) ?e13))
+(flet ($e106 (= ?e33 (zero_extend[1] ?e26)))
+(flet ($e107 (= ?e13 (zero_extend[1] ?e51)))
+(flet ($e108 (= ?e32 (zero_extend[9] ?e40)))
+(flet ($e109 (= ?e29 v1))
+(flet ($e110 (= ?e35 ?e20))
+(flet ($e111 (= ?e34 (sign_extend[1] ?e19)))
+(flet ($e112 (= ?e52 ?e52))
+(flet ($e113 (= (sign_extend[12] ?e40) ?e49))
+(flet ($e114 (= ?e47 ?e47))
+(flet ($e115 (= (zero_extend[12] ?e35) ?e46))
+(flet ($e116 (= (sign_extend[11] ?e35) v0))
+(flet ($e117 (= ?e4 (zero_extend[9] ?e38)))
+(flet ($e118 (= v2 (sign_extend[12] ?e7)))
+(flet ($e119 (= ?e47 ?e20))
+(flet ($e120 (= (zero_extend[1] ?e11) ?e9))
+(flet ($e121 (= ?e29 (zero_extend[1] ?e16)))
+(flet ($e122 (= v0 (zero_extend[11] ?e24)))
+(flet ($e123 (= ?e51 ?e36))
+(flet ($e124 (= (sign_extend[8] ?e13) v3))
+(flet ($e125 (= v1 (zero_extend[1] ?e45)))
+(flet ($e126 (= (sign_extend[1] ?e48) ?e33))
+(flet ($e127 (= ?e45 ?e7))
+(flet ($e128 (= ?e26 ?e47))
+(flet ($e129 (= (zero_extend[11] v1) ?e41))
+(flet ($e130 (= (sign_extend[1] v0) v2))
+(flet ($e131 (= ?e5 (sign_extend[9] ?e26)))
+(flet ($e132 (= (sign_extend[11] ?e48) v0))
+(flet ($e133 (= ?e38 ?e50))
+(flet ($e134 (= ?e13 v1))
+(flet ($e135 (= (sign_extend[1] ?e42) ?e23))
+(flet ($e136 (= ?e20 ?e7))
+(flet ($e137 (= ?e39 ?e19))
+(flet ($e138 (= ?e52 ?e38))
+(flet ($e139 (= ?e5 (zero_extend[9] ?e11)))
+(flet ($e140 (= (sign_extend[11] ?e34) ?e49))
+(flet ($e141 (= ?e18 ?e28))
+(flet ($e142 (= ?e43 ?e26))
+(flet ($e143 (= ?e14 ?e16))
+(flet ($e144 (= ?e10 ?e40))
+(flet ($e145 (= ?e6 ?e45))
+(flet ($e146 (= ?e29 ?e18))
+(flet ($e147 (= ?e5 (sign_extend[9] ?e48)))
+(flet ($e148 (= (zero_extend[9] ?e19) v3))
+(flet ($e149 (= ?e33 (sign_extend[1] ?e22)))
+(flet ($e150 (= ?e50 ?e10))
+(flet ($e151 (= (sign_extend[9] ?e35) v3))
+(flet ($e152 (= ?e23 (zero_extend[1] ?e21)))
+(flet ($e153 (= v2 (zero_extend[12] ?e15)))
+(flet ($e154 (= v1 (sign_extend[1] ?e38)))
+(flet ($e155 (= ?e23 (zero_extend[1] ?e22)))
+(flet ($e156 (= ?e34 (zero_extend[1] ?e42)))
+(flet ($e157 (= (zero_extend[9] ?e15) ?e4))
+(flet ($e158 (= v3 (sign_extend[9] ?e8)))
+(flet ($e159 (= (sign_extend[9] ?e14) ?e32))
+(flet ($e160 (= (sign_extend[10] ?e13) v0))
+(flet ($e161 (= (zero_extend[1] ?e35) ?e12))
+(flet ($e162 (iff $e69 $e132))
+(flet ($e163 (and $e62 $e124))
+(flet ($e164 (iff $e152 $e133))
+(flet ($e165 (not $e65))
+(flet ($e166 (and $e159 $e57))
+(flet ($e167 (and $e163 $e56))
+(flet ($e168 (and $e129 $e90))
+(flet ($e169 (if_then_else $e54 $e102 $e91))
+(flet ($e170 (xor $e127 $e61))
+(flet ($e171 (iff $e137 $e59))
+(flet ($e172 (implies $e87 $e78))
+(flet ($e173 (iff $e77 $e81))
+(flet ($e174 (if_then_else $e170 $e161 $e171))
+(flet ($e175 (if_then_else $e174 $e94 $e92))
+(flet ($e176 (or $e168 $e55))
+(flet ($e177 (and $e121 $e88))
+(flet ($e178 (or $e167 $e131))
+(flet ($e179 (or $e126 $e125))
+(flet ($e180 (or $e151 $e79))
+(flet ($e181 (not $e122))
+(flet ($e182 (or $e112 $e83))
+(flet ($e183 (or $e130 $e136))
+(flet ($e184 (xor $e105 $e153))
+(flet ($e185 (if_then_else $e148 $e128 $e66))
+(flet ($e186 (iff $e109 $e154))
+(flet ($e187 (and $e119 $e96))
+(flet ($e188 (if_then_else $e179 $e64 $e140))
+(flet ($e189 (xor $e134 $e123))
+(flet ($e190 (implies $e97 $e165))
+(flet ($e191 (or $e188 $e71))
+(flet ($e192 (and $e145 $e185))
+(flet ($e193 (or $e191 $e99))
+(flet ($e194 (implies $e53 $e89))
+(flet ($e195 (iff $e180 $e116))
+(flet ($e196 (and $e84 $e117))
+(flet ($e197 (or $e135 $e75))
+(flet ($e198 (xor $e82 $e197))
+(flet ($e199 (if_then_else $e142 $e195 $e177))
+(flet ($e200 (implies $e181 $e73))
+(flet ($e201 (or $e169 $e70))
+(flet ($e202 (or $e150 $e106))
+(flet ($e203 (xor $e110 $e115))
+(flet ($e204 (or $e60 $e60))
+(flet ($e205 (implies $e138 $e187))
+(flet ($e206 (and $e194 $e156))
+(flet ($e207 (not $e114))
+(flet ($e208 (if_then_else $e147 $e63 $e118))
+(flet ($e209 (not $e86))
+(flet ($e210 (xor $e202 $e178))
+(flet ($e211 (if_then_else $e210 $e58 $e100))
+(flet ($e212 (implies $e113 $e166))
+(flet ($e213 (iff $e120 $e141))
+(flet ($e214 (and $e157 $e196))
+(flet ($e215 (if_then_else $e72 $e199 $e68))
+(flet ($e216 (not $e146))
+(flet ($e217 (and $e215 $e95))
+(flet ($e218 (not $e139))
+(flet ($e219 (xor $e214 $e176))
+(flet ($e220 (or $e175 $e211))
+(flet ($e221 (if_then_else $e162 $e198 $e172))
+(flet ($e222 (xor $e221 $e189))
+(flet ($e223 (xor $e213 $e104))
+(flet ($e224 (not $e206))
+(flet ($e225 (and $e203 $e108))
+(flet ($e226 (iff $e200 $e155))
+(flet ($e227 (if_then_else $e111 $e208 $e144))
+(flet ($e228 (implies $e227 $e85))
+(flet ($e229 (not $e223))
+(flet ($e230 (implies $e217 $e205))
+(flet ($e231 (iff $e204 $e80))
+(flet ($e232 (implies $e107 $e143))
+(flet ($e233 (if_then_else $e209 $e220 $e209))
+(flet ($e234 (or $e74 $e225))
+(flet ($e235 (or $e103 $e103))
+(flet ($e236 (implies $e67 $e234))
+(flet ($e237 (xor $e232 $e182))
+(flet ($e238 (xor $e190 $e235))
+(flet ($e239 (or $e231 $e233))
+(flet ($e240 (implies $e212 $e186))
+(flet ($e241 (iff $e218 $e237))
+(flet ($e242 (not $e238))
+(flet ($e243 (xor $e193 $e240))
+(flet ($e244 (implies $e228 $e222))
+(flet ($e245 (not $e230))
+(flet ($e246 (iff $e224 $e93))
+(flet ($e247 (and $e158 $e207))
+(flet ($e248 (if_then_else $e229 $e245 $e183))
+(flet ($e249 (iff $e98 $e184))
+(flet ($e250 (iff $e244 $e242))
+(flet ($e251 (if_then_else $e149 $e101 $e250))
+(flet ($e252 (xor $e236 $e173))
+(flet ($e253 (xor $e248 $e226))
+(flet ($e254 (and $e249 $e192))
+(flet ($e255 (if_then_else $e246 $e254 $e247))
+(flet ($e256 (if_then_else $e76 $e255 $e239))
+(flet ($e257 (not $e256))
+(flet ($e258 (or $e257 $e164))
+(flet ($e259 (or $e243 $e258))
+(flet ($e260 (iff $e219 $e216))
+(flet ($e261 (xor $e160 $e201))
+(flet ($e262 (not $e241))
+(flet ($e263 (not $e252))
+(flet ($e264 (not $e259))
+(flet ($e265 (and $e261 $e251))
+(flet ($e266 (if_then_else $e253 $e260 $e253))
+(flet ($e267 (implies $e264 $e264))
+(flet ($e268 (if_then_else $e266 $e266 $e265))
+(flet ($e269 (iff $e263 $e267))
+(flet ($e270 (if_then_else $e262 $e269 $e269))
+(flet ($e271 (and $e270 $e270))
+(flet ($e272 (not $e271))
+(flet ($e273 (xor $e272 $e272))
+(flet ($e274 (iff $e273 $e268))
+$e274
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz06.smt b/test/regress/regress0/bv/fuzz06.smt
new file mode 100644
index 000000000..6fc41f3c4
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz06.smt
@@ -0,0 +1,218 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[9]))
+:extrafuns ((v1 BitVec[2]))
+:extrafuns ((v2 BitVec[1]))
+:extrafuns ((v3 BitVec[3]))
+:formula
+(let (?e4 bv256[9])
+(let (?e5 bv68[7])
+(let (?e6 (extract[0:0] v1))
+(let (?e7 (extract[1:0] v1))
+(let (?e8 (bvsub ?e4 (sign_extend[8] ?e6)))
+(let (?e9 (zero_extend[1] v3))
+(let (?e10 (rotate_right[1] v1))
+(let (?e11 (ite (bvult ?e7 ?e7) bv1[1] bv0[1]))
+(let (?e12 (extract[1:1] ?e9))
+(let (?e13 (extract[3:1] ?e9))
+(let (?e14 (ite (bvule (sign_extend[2] ?e12) v3) bv1[1] bv0[1]))
+(let (?e15 (rotate_left[0] v2))
+(let (?e16 (bvadd ?e14 ?e6))
+(let (?e17 (extract[0:0] ?e16))
+(let (?e18 (bvxnor ?e10 (zero_extend[1] v2)))
+(let (?e19 (bvnot v2))
+(let (?e20 (bvadd ?e18 ?e18))
+(let (?e21 (bvnand v3 (sign_extend[2] v2)))
+(let (?e22 (bvnot ?e9))
+(let (?e23 (ite (bvslt ?e15 ?e14) bv1[1] bv0[1]))
+(let (?e24 (bvcomp (sign_extend[2] ?e10) ?e9))
+(let (?e25 (bvor (zero_extend[1] ?e17) ?e10))
+(let (?e26 (bvand (zero_extend[1] ?e15) ?e25))
+(let (?e27 (ite (distinct (sign_extend[1] ?e26) ?e21) bv1[1] bv0[1]))
+(let (?e28 (ite (bvult ?e11 ?e11) bv1[1] bv0[1]))
+(let (?e29 (ite (bvugt ?e26 ?e10) bv1[1] bv0[1]))
+(let (?e30 (bvadd ?e18 (sign_extend[1] ?e19)))
+(let (?e31 (ite (= bv1[1] (extract[0:0] ?e5)) ?e9 (sign_extend[3] ?e19)))
+(let (?e32 (bvmul (zero_extend[3] ?e24) ?e31))
+(let (?e33 (ite (bvslt ?e10 (zero_extend[1] ?e12)) bv1[1] bv0[1]))
+(let (?e34 (ite (= bv1[1] (extract[0:0] ?e16)) ?e21 (zero_extend[2] ?e15)))
+(let (?e35 (ite (bvslt v3 (zero_extend[2] ?e23)) bv1[1] bv0[1]))
+(let (?e36 (rotate_right[0] ?e23))
+(let (?e37 (extract[1:1] ?e10))
+(let (?e38 (bvcomp (sign_extend[3] ?e19) ?e31))
+(let (?e39 (bvmul (sign_extend[8] ?e6) v0))
+(flet ($e40 (= ?e15 ?e27))
+(flet ($e41 (= v1 (sign_extend[1] ?e33)))
+(flet ($e42 (= ?e36 ?e35))
+(flet ($e43 (= ?e22 (zero_extend[2] ?e30)))
+(flet ($e44 (= (sign_extend[1] ?e33) ?e25))
+(flet ($e45 (= ?e18 ?e26))
+(flet ($e46 (= (zero_extend[5] ?e20) ?e5))
+(flet ($e47 (= ?e9 ?e32))
+(flet ($e48 (= (zero_extend[2] ?e37) ?e34))
+(flet ($e49 (= ?e32 (sign_extend[2] ?e25)))
+(flet ($e50 (= (sign_extend[2] ?e20) ?e22))
+(flet ($e51 (= v0 (sign_extend[5] ?e9)))
+(flet ($e52 (= ?e5 (sign_extend[6] ?e15)))
+(flet ($e53 (= ?e11 ?e36))
+(flet ($e54 (= ?e6 ?e15))
+(flet ($e55 (= (zero_extend[8] ?e23) ?e8))
+(flet ($e56 (= ?e8 (zero_extend[8] ?e14)))
+(flet ($e57 (= ?e20 ?e25))
+(flet ($e58 (= ?e11 ?e38))
+(flet ($e59 (= ?e11 ?e12))
+(flet ($e60 (= (zero_extend[5] ?e22) ?e4))
+(flet ($e61 (= (sign_extend[5] ?e32) ?e4))
+(flet ($e62 (= (sign_extend[1] ?e35) ?e7))
+(flet ($e63 (= ?e39 ?e39))
+(flet ($e64 (= ?e16 ?e11))
+(flet ($e65 (= ?e29 ?e14))
+(flet ($e66 (= (sign_extend[7] ?e30) v0))
+(flet ($e67 (= ?e4 (zero_extend[5] ?e22)))
+(flet ($e68 (= ?e26 ?e18))
+(flet ($e69 (= ?e8 (zero_extend[7] ?e26)))
+(flet ($e70 (= (sign_extend[3] ?e33) ?e31))
+(flet ($e71 (= ?e38 v2))
+(flet ($e72 (= (sign_extend[1] ?e24) ?e10))
+(flet ($e73 (= (zero_extend[8] ?e27) ?e4))
+(flet ($e74 (= (sign_extend[1] ?e28) ?e7))
+(flet ($e75 (= (sign_extend[8] v2) ?e8))
+(flet ($e76 (= ?e15 ?e24))
+(flet ($e77 (= ?e22 ?e31))
+(flet ($e78 (= ?e23 ?e6))
+(flet ($e79 (= ?e6 ?e27))
+(flet ($e80 (= ?e18 (sign_extend[1] ?e27)))
+(flet ($e81 (= (sign_extend[1] ?e18) v3))
+(flet ($e82 (= ?e5 (zero_extend[6] ?e16)))
+(flet ($e83 (= ?e23 ?e12))
+(flet ($e84 (= ?e30 (zero_extend[1] ?e37)))
+(flet ($e85 (= (zero_extend[1] ?e38) ?e20))
+(flet ($e86 (= (sign_extend[8] ?e19) ?e8))
+(flet ($e87 (= ?e39 (zero_extend[6] ?e21)))
+(flet ($e88 (= ?e21 (zero_extend[2] ?e6)))
+(flet ($e89 (= (zero_extend[3] ?e28) ?e31))
+(flet ($e90 (= ?e32 (zero_extend[2] ?e25)))
+(flet ($e91 (= ?e22 (zero_extend[1] ?e34)))
+(flet ($e92 (= (zero_extend[6] ?e21) ?e39))
+(flet ($e93 (= ?e18 (sign_extend[1] ?e15)))
+(flet ($e94 (= (zero_extend[1] ?e28) ?e20))
+(flet ($e95 (= ?e7 v1))
+(flet ($e96 (= (sign_extend[5] ?e31) ?e4))
+(flet ($e97 (= ?e17 ?e37))
+(flet ($e98 (= (zero_extend[3] ?e6) ?e31))
+(flet ($e99 (= ?e21 (sign_extend[2] ?e24)))
+(flet ($e100 (= (zero_extend[3] ?e19) ?e22))
+(flet ($e101 (= ?e22 (sign_extend[3] ?e15)))
+(flet ($e102 (= ?e11 ?e24))
+(flet ($e103 (= ?e34 (zero_extend[2] ?e16)))
+(flet ($e104 (= ?e12 v2))
+(flet ($e105 (= ?e12 ?e37))
+(flet ($e106 (= ?e26 (zero_extend[1] ?e15)))
+(flet ($e107 (= (zero_extend[2] ?e26) ?e22))
+(flet ($e108 (= (zero_extend[3] v2) ?e9))
+(flet ($e109 (= (sign_extend[5] ?e32) ?e8))
+(flet ($e110 (= ?e24 ?e17))
+(flet ($e111 (= ?e20 (sign_extend[1] ?e28)))
+(flet ($e112 (= (sign_extend[6] ?e27) ?e5))
+(flet ($e113 (= (zero_extend[6] ?e34) ?e8))
+(flet ($e114 (= (sign_extend[7] ?e25) ?e8))
+(flet ($e115 (= ?e8 (zero_extend[7] ?e20)))
+(flet ($e116 (= ?e20 (sign_extend[1] ?e36)))
+(flet ($e117 (= ?e20 (sign_extend[1] ?e37)))
+(flet ($e118 (= (sign_extend[7] ?e10) ?e39))
+(flet ($e119 (= ?e36 ?e16))
+(flet ($e120 (= ?e21 (zero_extend[1] ?e10)))
+(flet ($e121 (= ?e38 ?e11))
+(flet ($e122 (= (sign_extend[1] ?e20) ?e34))
+(flet ($e123 (= ?e5 (zero_extend[4] ?e13)))
+(flet ($e124 (not $e79))
+(flet ($e125 (if_then_else $e50 $e63 $e115))
+(flet ($e126 (if_then_else $e54 $e120 $e40))
+(flet ($e127 (if_then_else $e85 $e117 $e87))
+(flet ($e128 (iff $e127 $e95))
+(flet ($e129 (and $e76 $e46))
+(flet ($e130 (if_then_else $e93 $e42 $e65))
+(flet ($e131 (implies $e113 $e92))
+(flet ($e132 (not $e125))
+(flet ($e133 (implies $e62 $e61))
+(flet ($e134 (iff $e74 $e110))
+(flet ($e135 (and $e66 $e56))
+(flet ($e136 (if_then_else $e78 $e64 $e83))
+(flet ($e137 (if_then_else $e84 $e124 $e43))
+(flet ($e138 (if_then_else $e128 $e89 $e67))
+(flet ($e139 (not $e136))
+(flet ($e140 (or $e73 $e121))
+(flet ($e141 (if_then_else $e129 $e138 $e101))
+(flet ($e142 (and $e131 $e139))
+(flet ($e143 (if_then_else $e41 $e123 $e130))
+(flet ($e144 (xor $e100 $e81))
+(flet ($e145 (implies $e98 $e97))
+(flet ($e146 (xor $e71 $e143))
+(flet ($e147 (xor $e126 $e80))
+(flet ($e148 (if_then_else $e99 $e111 $e103))
+(flet ($e149 (implies $e47 $e88))
+(flet ($e150 (not $e140))
+(flet ($e151 (xor $e146 $e86))
+(flet ($e152 (and $e119 $e148))
+(flet ($e153 (not $e106))
+(flet ($e154 (xor $e114 $e104))
+(flet ($e155 (and $e58 $e91))
+(flet ($e156 (xor $e44 $e57))
+(flet ($e157 (if_then_else $e141 $e154 $e135))
+(flet ($e158 (if_then_else $e134 $e102 $e132))
+(flet ($e159 (iff $e108 $e109))
+(flet ($e160 (or $e90 $e53))
+(flet ($e161 (not $e77))
+(flet ($e162 (not $e157))
+(flet ($e163 (implies $e55 $e82))
+(flet ($e164 (implies $e69 $e51))
+(flet ($e165 (and $e164 $e116))
+(flet ($e166 (and $e133 $e161))
+(flet ($e167 (not $e165))
+(flet ($e168 (or $e159 $e162))
+(flet ($e169 (or $e112 $e153))
+(flet ($e170 (iff $e149 $e94))
+(flet ($e171 (or $e156 $e49))
+(flet ($e172 (and $e105 $e170))
+(flet ($e173 (and $e168 $e48))
+(flet ($e174 (iff $e172 $e151))
+(flet ($e175 (or $e60 $e118))
+(flet ($e176 (if_then_else $e155 $e142 $e175))
+(flet ($e177 (implies $e150 $e137))
+(flet ($e178 (if_then_else $e173 $e158 $e158))
+(flet ($e179 (not $e152))
+(flet ($e180 (not $e176))
+(flet ($e181 (xor $e144 $e59))
+(flet ($e182 (not $e171))
+(flet ($e183 (implies $e70 $e75))
+(flet ($e184 (and $e166 $e182))
+(flet ($e185 (and $e184 $e169))
+(flet ($e186 (not $e183))
+(flet ($e187 (not $e68))
+(flet ($e188 (implies $e185 $e180))
+(flet ($e189 (and $e122 $e188))
+(flet ($e190 (not $e181))
+(flet ($e191 (not $e174))
+(flet ($e192 (or $e145 $e72))
+(flet ($e193 (not $e160))
+(flet ($e194 (if_then_else $e177 $e178 $e45))
+(flet ($e195 (xor $e193 $e147))
+(flet ($e196 (or $e190 $e190))
+(flet ($e197 (xor $e179 $e192))
+(flet ($e198 (iff $e52 $e195))
+(flet ($e199 (or $e187 $e196))
+(flet ($e200 (implies $e194 $e96))
+(flet ($e201 (not $e189))
+(flet ($e202 (or $e191 $e167))
+(flet ($e203 (if_then_else $e198 $e186 $e202))
+(flet ($e204 (iff $e163 $e201))
+(flet ($e205 (if_then_else $e199 $e199 $e200))
+(flet ($e206 (implies $e197 $e204))
+(flet ($e207 (or $e203 $e107))
+(flet ($e208 (and $e205 $e206))
+(flet ($e209 (and $e208 $e208))
+(flet ($e210 (and $e209 $e207))
+$e210
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz07.smt b/test/regress/regress0/bv/fuzz07.smt
new file mode 100644
index 000000000..c813a31be
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz07.smt
@@ -0,0 +1,395 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[5]))
+:extrafuns ((v1 BitVec[2]))
+:extrafuns ((v2 BitVec[4]))
+:formula
+(let (?e3 bv2[2])
+(let (?e4 bv2[2])
+(let (?e5 (bvnot ?e3))
+(let (?e6 (bvadd ?e4 v1))
+(let (?e7 (bvand ?e5 ?e6))
+(let (?e8 (bvashr v0 (sign_extend[3] ?e5)))
+(let (?e9 (bvshl ?e4 ?e4))
+(let (?e10 (ite (bvsle ?e3 ?e6) bv1[1] bv0[1]))
+(let (?e11 (bvxor ?e3 (sign_extend[1] ?e10)))
+(let (?e12 (ite (= (sign_extend[3] ?e7) ?e8) bv1[1] bv0[1]))
+(let (?e13 (bvor (zero_extend[1] ?e10) ?e5))
+(let (?e14 (concat ?e12 v0))
+(let (?e15 (bvand (zero_extend[1] ?e12) ?e6))
+(let (?e16 (bvnot ?e15))
+(let (?e17 (ite (bvsgt ?e8 (zero_extend[3] ?e13)) bv1[1] bv0[1]))
+(let (?e18 (extract[0:0] ?e9))
+(let (?e19 (repeat[1] ?e7))
+(let (?e20 (ite (distinct ?e5 (zero_extend[1] ?e17)) bv1[1] bv0[1]))
+(let (?e21 (bvlshr ?e3 (zero_extend[1] ?e12)))
+(let (?e22 (bvcomp (zero_extend[1] ?e10) ?e6))
+(let (?e23 (sign_extend[2] ?e10))
+(let (?e24 (ite (bvule ?e16 ?e11) bv1[1] bv0[1]))
+(let (?e25 (bvcomp ?e20 ?e10))
+(let (?e26 (bvshl (sign_extend[1] ?e17) ?e21))
+(let (?e27 (bvnot ?e11))
+(let (?e28 (bvsub (sign_extend[4] ?e16) ?e14))
+(let (?e29 (bvlshr ?e21 ?e27))
+(let (?e30 (bvneg ?e14))
+(let (?e31 (ite (bvugt ?e22 ?e17) bv1[1] bv0[1]))
+(let (?e32 (ite (bvsge ?e19 ?e6) bv1[1] bv0[1]))
+(let (?e33 (bvlshr ?e15 (sign_extend[1] ?e31)))
+(let (?e34 (bvcomp (sign_extend[4] ?e15) ?e28))
+(let (?e35 (bvcomp (zero_extend[4] ?e26) ?e14))
+(let (?e36 (ite (bvsge ?e16 ?e13) bv1[1] bv0[1]))
+(let (?e37 (rotate_right[0] ?e22))
+(let (?e38 (rotate_left[0] ?e35))
+(let (?e39 (bvsub ?e15 (sign_extend[1] ?e35)))
+(let (?e40 (ite (= bv1[1] (extract[0:0] ?e31)) ?e6 ?e5))
+(let (?e41 (bvand (sign_extend[1] ?e31) ?e33))
+(let (?e42 (bvxor (zero_extend[3] ?e41) ?e8))
+(let (?e43 (bvmul ?e3 (zero_extend[1] ?e12)))
+(let (?e44 (ite (bvsle (sign_extend[1] ?e18) ?e41) bv1[1] bv0[1]))
+(let (?e45 (bvnand ?e26 ?e3))
+(let (?e46 (ite (bvsgt ?e23 (zero_extend[1] ?e4)) bv1[1] bv0[1]))
+(let (?e47 (bvand ?e38 ?e37))
+(let (?e48 (bvneg ?e27))
+(let (?e49 (ite (= bv1[1] (extract[1:1] ?e13)) ?e3 (sign_extend[1] ?e24)))
+(let (?e50 (concat ?e5 ?e38))
+(let (?e51 (bvadd ?e13 (sign_extend[1] ?e10)))
+(let (?e52 (bvxnor (zero_extend[1] ?e6) ?e50))
+(let (?e53 (concat v1 ?e35))
+(let (?e54 (bvlshr ?e27 ?e41))
+(let (?e55 (ite (bvsle ?e29 ?e40) bv1[1] bv0[1]))
+(let (?e56 (ite (bvugt (sign_extend[3] ?e45) ?e42) bv1[1] bv0[1]))
+(let (?e57 (zero_extend[12] ?e5))
+(let (?e58 (bvcomp (sign_extend[3] ?e40) v0))
+(let (?e59 (ite (distinct ?e23 (zero_extend[2] ?e35)) bv1[1] bv0[1]))
+(let (?e60 (bvor (sign_extend[1] ?e17) ?e26))
+(let (?e61 (ite (distinct ?e55 ?e38) bv1[1] bv0[1]))
+(let (?e62 (bvnot ?e21))
+(let (?e63 (ite (bvuge (zero_extend[1] ?e32) ?e21) bv1[1] bv0[1]))
+(let (?e64 (bvneg ?e17))
+(let (?e65 (rotate_right[0] ?e20))
+(let (?e66 (sign_extend[13] ?e15))
+(let (?e67 (ite (= ?e61 ?e55) bv1[1] bv0[1]))
+(let (?e68 (bvor (sign_extend[1] ?e65) ?e49))
+(let (?e69 (zero_extend[4] ?e64))
+(let (?e70 (ite (bvugt ?e23 (zero_extend[1] ?e19)) bv1[1] bv0[1]))
+(let (?e71 (bvneg ?e68))
+(let (?e72 (sign_extend[14] ?e54))
+(let (?e73 (ite (bvslt ?e14 (zero_extend[5] ?e37)) bv1[1] bv0[1]))
+(let (?e74 (bvshl ?e53 (zero_extend[1] ?e7)))
+(let (?e75 (repeat[4] ?e16))
+(let (?e76 (repeat[3] ?e51))
+(let (?e77 (ite (bvsle ?e28 ?e76) bv1[1] bv0[1]))
+(let (?e78 (rotate_right[1] ?e42))
+(let (?e79 (bvor ?e65 ?e20))
+(let (?e80 (bvashr ?e19 ?e3))
+(let (?e81 (ite (distinct ?e23 (zero_extend[2] ?e44)) bv1[1] bv0[1]))
+(let (?e82 (rotate_right[0] ?e15))
+(let (?e83 (bvashr ?e35 ?e35))
+(let (?e84 (bvsub ?e78 (sign_extend[2] ?e53)))
+(let (?e85 (bvsub ?e11 (zero_extend[1] ?e36)))
+(let (?e86 (ite (bvugt ?e53 (zero_extend[1] ?e33)) bv1[1] bv0[1]))
+(let (?e87 (ite (bvugt (zero_extend[6] ?e48) ?e75) bv1[1] bv0[1]))
+(let (?e88 (bvmul (zero_extend[3] ?e3) v0))
+(let (?e89 (concat ?e9 ?e14))
+(let (?e90 (ite (bvsle v2 v2) bv1[1] bv0[1]))
+(flet ($e91 (= ?e54 ?e26))
+(flet ($e92 (= ?e3 (sign_extend[1] ?e77)))
+(flet ($e93 (= ?e49 (sign_extend[1] ?e10)))
+(flet ($e94 (= ?e85 (sign_extend[1] ?e73)))
+(flet ($e95 (= ?e52 (sign_extend[2] ?e73)))
+(flet ($e96 (= (sign_extend[1] ?e47) v1))
+(flet ($e97 (= (zero_extend[7] ?e20) ?e75))
+(flet ($e98 (= ?e57 (zero_extend[12] ?e15)))
+(flet ($e99 (= ?e25 ?e90))
+(flet ($e100 (= ?e26 (sign_extend[1] ?e46)))
+(flet ($e101 (= v1 (sign_extend[1] ?e31)))
+(flet ($e102 (= ?e89 (zero_extend[7] ?e77)))
+(flet ($e103 (= (zero_extend[4] ?e41) ?e30))
+(flet ($e104 (= ?e71 v1))
+(flet ($e105 (= (sign_extend[1] ?e83) ?e51))
+(flet ($e106 (= ?e32 ?e56))
+(flet ($e107 (= ?e25 ?e24))
+(flet ($e108 (= (sign_extend[1] ?e27) ?e74))
+(flet ($e109 (= ?e7 ?e15))
+(flet ($e110 (= (zero_extend[1] ?e70) ?e49))
+(flet ($e111 (= (sign_extend[1] ?e44) ?e15))
+(flet ($e112 (= ?e24 ?e63))
+(flet ($e113 (= ?e39 (sign_extend[1] ?e83)))
+(flet ($e114 (= v1 (sign_extend[1] ?e70)))
+(flet ($e115 (= ?e76 (sign_extend[1] v0)))
+(flet ($e116 (= ?e77 ?e22))
+(flet ($e117 (= v1 (sign_extend[1] ?e59)))
+(flet ($e118 (= ?e3 (sign_extend[1] ?e67)))
+(flet ($e119 (= ?e39 ?e45))
+(flet ($e120 (= ?e42 (zero_extend[2] ?e50)))
+(flet ($e121 (= (zero_extend[8] ?e14) ?e57))
+(flet ($e122 (= ?e28 (sign_extend[3] ?e23)))
+(flet ($e123 (= (zero_extend[1] ?e37) ?e40))
+(flet ($e124 (= (sign_extend[5] ?e63) ?e30))
+(flet ($e125 (= ?e16 (sign_extend[1] ?e37)))
+(flet ($e126 (= ?e81 ?e24))
+(flet ($e127 (= (zero_extend[1] ?e46) ?e54))
+(flet ($e128 (= ?e3 (sign_extend[1] ?e90)))
+(flet ($e129 (= (zero_extend[1] ?e12) ?e21))
+(flet ($e130 (= ?e89 (zero_extend[3] ?e88)))
+(flet ($e131 (= ?e31 ?e63))
+(flet ($e132 (= ?e15 ?e16))
+(flet ($e133 (= ?e72 (zero_extend[15] ?e81)))
+(flet ($e134 (= ?e27 ?e41))
+(flet ($e135 (= ?e67 ?e12))
+(flet ($e136 (= (sign_extend[1] ?e65) ?e41))
+(flet ($e137 (= ?e69 (sign_extend[4] ?e81)))
+(flet ($e138 (= ?e40 (zero_extend[1] ?e87)))
+(flet ($e139 (= ?e59 ?e44))
+(flet ($e140 (= (zero_extend[5] ?e67) ?e28))
+(flet ($e141 (= ?e68 (sign_extend[1] ?e86)))
+(flet ($e142 (= (zero_extend[2] ?e37) ?e23))
+(flet ($e143 (= (zero_extend[13] ?e6) ?e66))
+(flet ($e144 (= (zero_extend[5] ?e25) ?e76))
+(flet ($e145 (= ?e14 (zero_extend[4] ?e71)))
+(flet ($e146 (= ?e5 ?e26))
+(flet ($e147 (= ?e17 ?e44))
+(flet ($e148 (= ?e64 ?e81))
+(flet ($e149 (= ?e60 (zero_extend[1] ?e83)))
+(flet ($e150 (= ?e28 (sign_extend[5] ?e22)))
+(flet ($e151 (= ?e50 (zero_extend[2] ?e87)))
+(flet ($e152 (= ?e34 ?e47))
+(flet ($e153 (= (zero_extend[1] ?e65) ?e60))
+(flet ($e154 (= (zero_extend[1] ?e44) ?e5))
+(flet ($e155 (= ?e40 (sign_extend[1] ?e31)))
+(flet ($e156 (= ?e78 ?e78))
+(flet ($e157 (= ?e76 (zero_extend[4] ?e49)))
+(flet ($e158 (= ?e34 ?e67))
+(flet ($e159 (= ?e33 ?e45))
+(flet ($e160 (= ?e26 ?e4))
+(flet ($e161 (= ?e89 (sign_extend[6] ?e11)))
+(flet ($e162 (= ?e86 ?e47))
+(flet ($e163 (= ?e32 ?e46))
+(flet ($e164 (= (zero_extend[2] ?e58) ?e23))
+(flet ($e165 (= ?e24 ?e64))
+(flet ($e166 (= ?e10 ?e24))
+(flet ($e167 (= ?e78 (zero_extend[3] ?e19)))
+(flet ($e168 (= (sign_extend[6] ?e54) ?e89))
+(flet ($e169 (= ?e89 (sign_extend[7] ?e37)))
+(flet ($e170 (= ?e42 (zero_extend[3] ?e13)))
+(flet ($e171 (= ?e54 (sign_extend[1] ?e56)))
+(flet ($e172 (= ?e27 ?e62))
+(flet ($e173 (= ?e75 (sign_extend[6] ?e4)))
+(flet ($e174 (= ?e33 ?e80))
+(flet ($e175 (= (sign_extend[1] ?e17) ?e16))
+(flet ($e176 (= ?e17 ?e17))
+(flet ($e177 (= ?e80 ?e68))
+(flet ($e178 (= ?e15 ?e26))
+(flet ($e179 (= ?e82 (zero_extend[1] ?e22)))
+(flet ($e180 (= (zero_extend[1] ?e79) ?e45))
+(flet ($e181 (= ?e50 (sign_extend[2] ?e90)))
+(flet ($e182 (= ?e62 ?e80))
+(flet ($e183 (= ?e4 (zero_extend[1] ?e18)))
+(flet ($e184 (= ?e60 (sign_extend[1] ?e36)))
+(flet ($e185 (= ?e56 ?e32))
+(flet ($e186 (= ?e15 (sign_extend[1] ?e61)))
+(flet ($e187 (= ?e59 ?e37))
+(flet ($e188 (= ?e36 ?e65))
+(flet ($e189 (= (sign_extend[2] v2) ?e14))
+(flet ($e190 (= ?e36 ?e35))
+(flet ($e191 (= (zero_extend[5] ?e53) ?e75))
+(flet ($e192 (= (sign_extend[13] ?e55) ?e57))
+(flet ($e193 (= (sign_extend[3] ?e84) ?e89))
+(flet ($e194 (= ?e27 (zero_extend[1] ?e77)))
+(flet ($e195 (= (sign_extend[2] ?e43) v2))
+(flet ($e196 (= ?e62 (zero_extend[1] ?e47)))
+(flet ($e197 (= ?e14 (zero_extend[5] ?e59)))
+(flet ($e198 (= ?e75 (sign_extend[6] ?e43)))
+(flet ($e199 (= (zero_extend[12] v1) ?e57))
+(flet ($e200 (= ?e23 ?e50))
+(flet ($e201 (= (sign_extend[1] ?e70) ?e54))
+(flet ($e202 (= ?e45 ?e26))
+(flet ($e203 (= v2 (sign_extend[2] ?e41)))
+(flet ($e204 (= ?e45 ?e62))
+(flet ($e205 (= (zero_extend[1] ?e32) ?e19))
+(flet ($e206 (= ?e49 (zero_extend[1] ?e81)))
+(flet ($e207 (= ?e89 (zero_extend[6] ?e26)))
+(flet ($e208 (= (sign_extend[4] ?e87) v0))
+(flet ($e209 (= ?e13 ?e4))
+(flet ($e210 (= v2 (sign_extend[2] ?e33)))
+(flet ($e211 (= ?e66 (zero_extend[14] ?e61)))
+(flet ($e212 (= (zero_extend[1] ?e24) ?e80))
+(flet ($e213 (= ?e5 ?e21))
+(flet ($e214 (= ?e21 ?e16))
+(flet ($e215 (= (zero_extend[13] ?e22) ?e57))
+(flet ($e216 (= ?e33 (zero_extend[1] ?e47)))
+(flet ($e217 (= (sign_extend[4] ?e71) ?e76))
+(flet ($e218 (= (zero_extend[4] ?e86) ?e69))
+(flet ($e219 (= ?e63 ?e63))
+(flet ($e220 (= (zero_extend[1] ?e44) ?e33))
+(flet ($e221 (= ?e8 (zero_extend[3] ?e62)))
+(flet ($e222 (= ?e71 ?e60))
+(flet ($e223 (= ?e56 ?e55))
+(flet ($e224 (= ?e48 ?e85))
+(flet ($e225 (= ?e52 (zero_extend[1] ?e27)))
+(flet ($e226 (= ?e4 (sign_extend[1] ?e36)))
+(flet ($e227 (= (sign_extend[1] ?e38) ?e49))
+(flet ($e228 (= ?e7 ?e11))
+(flet ($e229 (= (zero_extend[3] ?e44) v2))
+(flet ($e230 (= (zero_extend[4] ?e58) ?e88))
+(flet ($e231 (= ?e85 ?e5))
+(flet ($e232 (= ?e16 (zero_extend[1] ?e86)))
+(flet ($e233 (= ?e75 (sign_extend[7] ?e12)))
+(flet ($e234 (= ?e9 ?e9))
+(flet ($e235 (= ?e4 (sign_extend[1] ?e22)))
+(flet ($e236 (= ?e84 (zero_extend[4] ?e70)))
+(flet ($e237 (= ?e41 ?e29))
+(flet ($e238 (and $e142 $e200))
+(flet ($e239 (xor $e187 $e214))
+(flet ($e240 (or $e136 $e160))
+(flet ($e241 (xor $e144 $e224))
+(flet ($e242 (and $e151 $e181))
+(flet ($e243 (if_then_else $e158 $e141 $e148))
+(flet ($e244 (iff $e218 $e164))
+(flet ($e245 (iff $e92 $e156))
+(flet ($e246 (xor $e183 $e155))
+(flet ($e247 (xor $e134 $e185))
+(flet ($e248 (xor $e219 $e178))
+(flet ($e249 (if_then_else $e174 $e132 $e212))
+(flet ($e250 (implies $e152 $e246))
+(flet ($e251 (or $e194 $e215))
+(flet ($e252 (iff $e204 $e137))
+(flet ($e253 (and $e249 $e135))
+(flet ($e254 (xor $e115 $e171))
+(flet ($e255 (implies $e192 $e105))
+(flet ($e256 (or $e201 $e95))
+(flet ($e257 (or $e250 $e175))
+(flet ($e258 (xor $e213 $e113))
+(flet ($e259 (if_then_else $e248 $e143 $e248))
+(flet ($e260 (implies $e179 $e163))
+(flet ($e261 (and $e220 $e227))
+(flet ($e262 (xor $e261 $e193))
+(flet ($e263 (iff $e190 $e233))
+(flet ($e264 (or $e239 $e159))
+(flet ($e265 (or $e221 $e149))
+(flet ($e266 (not $e150))
+(flet ($e267 (or $e103 $e109))
+(flet ($e268 (implies $e139 $e262))
+(flet ($e269 (implies $e231 $e217))
+(flet ($e270 (not $e138))
+(flet ($e271 (or $e235 $e147))
+(flet ($e272 (and $e131 $e166))
+(flet ($e273 (xor $e207 $e191))
+(flet ($e274 (or $e123 $e91))
+(flet ($e275 (implies $e259 $e222))
+(flet ($e276 (not $e275))
+(flet ($e277 (if_then_else $e114 $e165 $e276))
+(flet ($e278 (and $e243 $e264))
+(flet ($e279 (implies $e154 $e273))
+(flet ($e280 (if_then_else $e119 $e236 $e226))
+(flet ($e281 (or $e228 $e176))
+(flet ($e282 (not $e229))
+(flet ($e283 (not $e208))
+(flet ($e284 (not $e128))
+(flet ($e285 (or $e230 $e254))
+(flet ($e286 (xor $e118 $e253))
+(flet ($e287 (not $e146))
+(flet ($e288 (not $e98))
+(flet ($e289 (or $e210 $e121))
+(flet ($e290 (not $e189))
+(flet ($e291 (and $e279 $e157))
+(flet ($e292 (implies $e117 $e281))
+(flet ($e293 (iff $e206 $e282))
+(flet ($e294 (iff $e101 $e172))
+(flet ($e295 (iff $e184 $e173))
+(flet ($e296 (or $e272 $e257))
+(flet ($e297 (and $e104 $e244))
+(flet ($e298 (if_then_else $e122 $e284 $e202))
+(flet ($e299 (not $e140))
+(flet ($e300 (not $e145))
+(flet ($e301 (not $e274))
+(flet ($e302 (implies $e170 $e205))
+(flet ($e303 (xor $e153 $e97))
+(flet ($e304 (if_then_else $e265 $e300 $e96))
+(flet ($e305 (xor $e255 $e296))
+(flet ($e306 (and $e294 $e267))
+(flet ($e307 (xor $e297 $e209))
+(flet ($e308 (or $e127 $e278))
+(flet ($e309 (if_then_else $e238 $e232 $e280))
+(flet ($e310 (or $e129 $e182))
+(flet ($e311 (iff $e100 $e216))
+(flet ($e312 (implies $e295 $e203))
+(flet ($e313 (if_then_else $e309 $e309 $e167))
+(flet ($e314 (iff $e162 $e289))
+(flet ($e315 (if_then_else $e130 $e234 $e304))
+(flet ($e316 (if_then_else $e251 $e94 $e195))
+(flet ($e317 (xor $e285 $e112))
+(flet ($e318 (or $e93 $e308))
+(flet ($e319 (or $e252 $e168))
+(flet ($e320 (not $e292))
+(flet ($e321 (if_then_else $e111 $e198 $e196))
+(flet ($e322 (not $e277))
+(flet ($e323 (if_then_else $e268 $e319 $e293))
+(flet ($e324 (or $e161 $e245))
+(flet ($e325 (or $e317 $e177))
+(flet ($e326 (if_then_else $e311 $e197 $e323))
+(flet ($e327 (or $e241 $e266))
+(flet ($e328 (and $e327 $e288))
+(flet ($e329 (not $e124))
+(flet ($e330 (and $e126 $e302))
+(flet ($e331 (if_then_else $e169 $e240 $e326))
+(flet ($e332 (if_then_else $e225 $e269 $e328))
+(flet ($e333 (and $e99 $e314))
+(flet ($e334 (not $e298))
+(flet ($e335 (implies $e263 $e283))
+(flet ($e336 (and $e313 $e331))
+(flet ($e337 (or $e258 $e325))
+(flet ($e338 (iff $e120 $e299))
+(flet ($e339 (xor $e211 $e306))
+(flet ($e340 (not $e106))
+(flet ($e341 (iff $e301 $e320))
+(flet ($e342 (if_then_else $e223 $e287 $e223))
+(flet ($e343 (or $e188 $e307))
+(flet ($e344 (xor $e247 $e199))
+(flet ($e345 (if_then_else $e260 $e286 $e318))
+(flet ($e346 (implies $e256 $e337))
+(flet ($e347 (and $e329 $e186))
+(flet ($e348 (if_then_else $e291 $e339 $e107))
+(flet ($e349 (not $e316))
+(flet ($e350 (if_then_else $e305 $e116 $e348))
+(flet ($e351 (not $e125))
+(flet ($e352 (and $e335 $e321))
+(flet ($e353 (not $e338))
+(flet ($e354 (iff $e336 $e180))
+(flet ($e355 (and $e345 $e347))
+(flet ($e356 (not $e350))
+(flet ($e357 (iff $e102 $e237))
+(flet ($e358 (if_then_else $e312 $e322 $e133))
+(flet ($e359 (or $e344 $e333))
+(flet ($e360 (xor $e332 $e315))
+(flet ($e361 (implies $e110 $e324))
+(flet ($e362 (implies $e360 $e349))
+(flet ($e363 (or $e342 $e330))
+(flet ($e364 (implies $e270 $e270))
+(flet ($e365 (and $e361 $e108))
+(flet ($e366 (and $e341 $e346))
+(flet ($e367 (xor $e352 $e343))
+(flet ($e368 (iff $e353 $e362))
+(flet ($e369 (iff $e310 $e357))
+(flet ($e370 (if_then_else $e355 $e303 $e354))
+(flet ($e371 (iff $e364 $e370))
+(flet ($e372 (not $e367))
+(flet ($e373 (if_then_else $e368 $e371 $e366))
+(flet ($e374 (or $e340 $e351))
+(flet ($e375 (xor $e334 $e271))
+(flet ($e376 (and $e373 $e374))
+(flet ($e377 (if_then_else $e369 $e242 $e358))
+(flet ($e378 (implies $e363 $e363))
+(flet ($e379 (xor $e365 $e378))
+(flet ($e380 (iff $e375 $e377))
+(flet ($e381 (or $e372 $e372))
+(flet ($e382 (xor $e380 $e356))
+(flet ($e383 (implies $e379 $e359))
+(flet ($e384 (implies $e376 $e290))
+(flet ($e385 (iff $e384 $e383))
+(flet ($e386 (implies $e382 $e385))
+(flet ($e387 (or $e381 $e386))
+$e387
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
diff --git a/test/regress/regress0/bv/fuzz08.smt b/test/regress/regress0/bv/fuzz08.smt
new file mode 100644
index 000000000..e2a73db50
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz08.smt
@@ -0,0 +1,19 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:extrafuns ((v1 BitVec[9]))
+:status sat
+:formula
+(let (?n1 bv0[6])
+(let (?n2 bv0[9])
+(flet ($n3 (bvult ?n2 v1))
+(let (?n4 bv1[1])
+(let (?n5 bv0[1])
+(let (?n6 (ite $n3 ?n4 ?n5))
+(let (?n7 (sign_extend[5] ?n6))
+(flet ($n8 (bvsgt ?n1 ?n7))
+(let (?n9 (ite $n8 ?n4 ?n5))
+(let (?n10 (sign_extend[8] ?n9))
+(let (?n11 (bvcomp v1 ?n10))
+(flet ($n12 (= ?n9 ?n11))
+$n12
+)))))))))))))
diff --git a/test/regress/regress0/bv/fuzz09.smt b/test/regress/regress0/bv/fuzz09.smt
new file mode 100644
index 000000000..ce8e9bfd6
--- /dev/null
+++ b/test/regress/regress0/bv/fuzz09.smt
@@ -0,0 +1,370 @@
+(benchmark fuzzsmt
+:logic QF_BV
+:status sat
+:extrafuns ((v0 BitVec[7]))
+:extrafuns ((v1 BitVec[5]))
+:extrafuns ((v2 BitVec[13]))
+:extrafuns ((v3 BitVec[16]))
+:formula
+(let (?e4 bv15872[14])
+(let (?e5 bv148[12])
+(let (?e6 (repeat[1] v2))
+(let (?e7 (ite (bvugt (sign_extend[6] v0) ?e6) bv1[1] bv0[1]))
+(let (?e8 (bvnor (sign_extend[2] v1) v0))
+(let (?e9 (sign_extend[1] v2))
+(let (?e10 (ite (bvsgt (sign_extend[6] v0) v2) bv1[1] bv0[1]))
+(let (?e11 (concat v0 v1))
+(let (?e12 (bvneg ?e6))
+(let (?e13 (bvsub (sign_extend[8] v1) v2))
+(let (?e14 (ite (bvule (sign_extend[13] ?e7) ?e9) bv1[1] bv0[1]))
+(let (?e15 (ite (bvult v1 (zero_extend[4] ?e7)) bv1[1] bv0[1]))
+(let (?e16 (bvnand (sign_extend[1] ?e5) v2))
+(let (?e17 (bvor ?e9 (sign_extend[9] v1)))
+(let (?e18 (bvxnor ?e9 (sign_extend[7] v0)))
+(let (?e19 (bvmul (sign_extend[1] ?e11) ?e16))
+(let (?e20 (bvand ?e18 (sign_extend[13] ?e14)))
+(let (?e21 (bvsub (zero_extend[12] ?e7) v2))
+(let (?e22 (bvmul ?e18 (zero_extend[7] v0)))
+(let (?e23 (rotate_right[13] ?e20))
+(let (?e24 (ite (bvult ?e22 (zero_extend[1] v2)) bv1[1] bv0[1]))
+(let (?e25 (bvneg ?e19))
+(let (?e26 (ite (bvult ?e5 (zero_extend[11] ?e10)) bv1[1] bv0[1]))
+(let (?e27 (bvxor ?e22 ?e4))
+(let (?e28 (ite (distinct (sign_extend[1] ?e5) ?e21) bv1[1] bv0[1]))
+(let (?e29 (bvlshr ?e6 (zero_extend[6] v0)))
+(let (?e30 (bvashr ?e10 ?e28))
+(let (?e31 (bvmul ?e24 ?e26))
+(let (?e32 (bvnand (sign_extend[2] ?e5) ?e20))
+(let (?e33 (bvxor v1 (sign_extend[4] ?e31)))
+(let (?e34 (bvor ?e26 ?e7))
+(let (?e35 (bvnot ?e6))
+(let (?e36 (extract[10:5] ?e21))
+(let (?e37 (ite (= ?e31 ?e15) bv1[1] bv0[1]))
+(let (?e38 (bvnot ?e11))
+(let (?e39 (extract[5:5] ?e13))
+(let (?e40 (bvadd (zero_extend[12] ?e24) ?e29))
+(let (?e41 (bvshl ?e13 (zero_extend[12] ?e7)))
+(let (?e42 (ite (bvuge ?e4 (zero_extend[1] ?e13)) bv1[1] bv0[1]))
+(let (?e43 (bvor (sign_extend[13] ?e15) ?e22))
+(let (?e44 (ite (bvsle ?e25 (zero_extend[6] v0)) bv1[1] bv0[1]))
+(let (?e45 (ite (bvslt ?e19 (sign_extend[8] v1)) bv1[1] bv0[1]))
+(let (?e46 (bvshl (zero_extend[1] ?e35) ?e22))
+(let (?e47 (sign_extend[4] ?e7))
+(let (?e48 (bvxor ?e6 (zero_extend[12] ?e30)))
+(let (?e49 (bvand v0 v0))
+(let (?e50 (bvand (sign_extend[12] ?e28) ?e16))
+(let (?e51 (bvmul (sign_extend[12] ?e34) ?e21))
+(let (?e52 (sign_extend[15] ?e45))
+(let (?e53 (bvnot ?e23))
+(let (?e54 (extract[5:3] ?e12))
+(let (?e55 (ite (bvslt (zero_extend[15] ?e42) ?e52) bv1[1] bv0[1]))
+(let (?e56 (bvneg ?e6))
+(let (?e57 (repeat[3] ?e47))
+(let (?e58 (ite (bvsle ?e38 (sign_extend[11] ?e44)) bv1[1] bv0[1]))
+(let (?e59 (sign_extend[0] ?e21))
+(let (?e60 (ite (bvsle ?e22 (zero_extend[13] ?e58)) bv1[1] bv0[1]))
+(let (?e61 (bvadd ?e7 ?e37))
+(let (?e62 (bvnor v3 (zero_extend[3] ?e50)))
+(flet ($e63 (= ?e46 (zero_extend[13] ?e7)))
+(flet ($e64 (= (zero_extend[12] ?e30) ?e29))
+(flet ($e65 (= (zero_extend[10] ?e54) ?e6))
+(flet ($e66 (= ?e20 (sign_extend[13] ?e44)))
+(flet ($e67 (= ?e43 (zero_extend[1] ?e19)))
+(flet ($e68 (= ?e9 (sign_extend[8] ?e36)))
+(flet ($e69 (= ?e56 (zero_extend[6] ?e49)))
+(flet ($e70 (= ?e52 (sign_extend[3] v2)))
+(flet ($e71 (= ?e6 (zero_extend[8] ?e47)))
+(flet ($e72 (= ?e56 (zero_extend[6] v0)))
+(flet ($e73 (= ?e33 (zero_extend[4] ?e34)))
+(flet ($e74 (= ?e32 ?e27))
+(flet ($e75 (= ?e12 (sign_extend[12] ?e34)))
+(flet ($e76 (= ?e21 ?e6))
+(flet ($e77 (= (sign_extend[12] ?e37) v2))
+(flet ($e78 (= ?e36 (sign_extend[5] ?e30)))
+(flet ($e79 (= v2 ?e13))
+(flet ($e80 (= (zero_extend[12] ?e55) ?e56))
+(flet ($e81 (= ?e52 (zero_extend[2] ?e9)))
+(flet ($e82 (= (sign_extend[12] ?e55) ?e13))
+(flet ($e83 (= ?e57 (sign_extend[1] ?e23)))
+(flet ($e84 (= (zero_extend[7] v0) ?e27))
+(flet ($e85 (= (sign_extend[15] ?e14) v3))
+(flet ($e86 (= ?e62 (sign_extend[2] ?e9)))
+(flet ($e87 (= (zero_extend[13] ?e31) ?e23))
+(flet ($e88 (= (zero_extend[2] ?e5) ?e46))
+(flet ($e89 (= ?e12 (zero_extend[1] ?e38)))
+(flet ($e90 (= ?e13 (zero_extend[12] ?e61)))
+(flet ($e91 (= (zero_extend[12] ?e30) ?e12))
+(flet ($e92 (= (zero_extend[4] ?e61) ?e33))
+(flet ($e93 (= ?e32 (sign_extend[1] ?e12)))
+(flet ($e94 (= ?e40 (sign_extend[12] ?e31)))
+(flet ($e95 (= (sign_extend[11] ?e28) ?e38))
+(flet ($e96 (= ?e36 (sign_extend[5] ?e26)))
+(flet ($e97 (= ?e6 ?e35))
+(flet ($e98 (= ?e52 (zero_extend[9] ?e8)))
+(flet ($e99 (= (sign_extend[7] ?e8) ?e53))
+(flet ($e100 (= (zero_extend[12] ?e42) ?e21))
+(flet ($e101 (= ?e46 (sign_extend[1] ?e51)))
+(flet ($e102 (= ?e46 (zero_extend[13] ?e26)))
+(flet ($e103 (= ?e31 ?e15))
+(flet ($e104 (= ?e59 (sign_extend[12] ?e7)))
+(flet ($e105 (= (sign_extend[12] ?e45) ?e48))
+(flet ($e106 (= ?e4 ?e4))
+(flet ($e107 (= ?e52 (sign_extend[4] ?e38)))
+(flet ($e108 (= ?e62 (sign_extend[3] ?e56)))
+(flet ($e109 (= ?e37 ?e60))
+(flet ($e110 (= (sign_extend[1] ?e36) ?e8))
+(flet ($e111 (= (sign_extend[1] ?e29) ?e22))
+(flet ($e112 (= ?e53 (sign_extend[13] ?e44)))
+(flet ($e113 (= ?e27 (sign_extend[13] ?e31)))
+(flet ($e114 (= (sign_extend[1] ?e59) ?e9))
+(flet ($e115 (= (zero_extend[1] ?e16) ?e22))
+(flet ($e116 (= (zero_extend[13] ?e7) ?e9))
+(flet ($e117 (= ?e40 ?e35))
+(flet ($e118 (= (zero_extend[13] ?e60) ?e22))
+(flet ($e119 (= ?e50 (sign_extend[1] ?e38)))
+(flet ($e120 (= ?e56 ?e35))
+(flet ($e121 (= ?e16 (sign_extend[12] ?e7)))
+(flet ($e122 (= (zero_extend[1] ?e5) ?e59))
+(flet ($e123 (= (sign_extend[7] ?e8) ?e22))
+(flet ($e124 (= ?e9 (sign_extend[1] v2)))
+(flet ($e125 (= (zero_extend[2] ?e39) ?e54))
+(flet ($e126 (= ?e36 (sign_extend[5] ?e34)))
+(flet ($e127 (= (zero_extend[9] ?e8) v3))
+(flet ($e128 (= ?e23 (zero_extend[2] ?e11)))
+(flet ($e129 (= (sign_extend[12] ?e55) ?e56))
+(flet ($e130 (= ?e57 (sign_extend[10] ?e33)))
+(flet ($e131 (= ?e23 ?e32))
+(flet ($e132 (= ?e62 (zero_extend[15] ?e58)))
+(flet ($e133 (= ?e30 ?e42))
+(flet ($e134 (= ?e26 ?e7))
+(flet ($e135 (= v2 ?e21))
+(flet ($e136 (= ?e53 ?e23))
+(flet ($e137 (= ?e23 (sign_extend[13] ?e37)))
+(flet ($e138 (= (sign_extend[13] ?e24) ?e53))
+(flet ($e139 (= (zero_extend[1] ?e13) ?e17))
+(flet ($e140 (= ?e58 ?e7))
+(flet ($e141 (= ?e6 (zero_extend[12] ?e14)))
+(flet ($e142 (= ?e15 ?e37))
+(flet ($e143 (= ?e16 (sign_extend[12] ?e39)))
+(flet ($e144 (= (zero_extend[12] ?e58) ?e59))
+(flet ($e145 (= ?e52 (sign_extend[2] ?e27)))
+(flet ($e146 (= (zero_extend[15] ?e15) ?e52))
+(flet ($e147 (= ?e43 (sign_extend[1] ?e56)))
+(flet ($e148 (= (zero_extend[10] ?e54) ?e35))
+(flet ($e149 (= ?e20 (zero_extend[13] ?e34)))
+(flet ($e150 (= (sign_extend[12] ?e44) ?e41))
+(flet ($e151 (= ?e41 (sign_extend[12] ?e34)))
+(flet ($e152 (= ?e18 (zero_extend[13] ?e55)))
+(flet ($e153 (= (zero_extend[2] ?e9) v3))
+(flet ($e154 (= (sign_extend[13] ?e45) ?e43))
+(flet ($e155 (= ?e40 ?e35))
+(flet ($e156 (= ?e19 (zero_extend[12] ?e61)))
+(flet ($e157 (= (zero_extend[1] ?e5) ?e59))
+(flet ($e158 (= ?e35 (zero_extend[12] ?e37)))
+(flet ($e159 (= ?e53 ?e43))
+(flet ($e160 (= ?e32 (zero_extend[2] ?e5)))
+(flet ($e161 (= ?e54 (sign_extend[2] ?e55)))
+(flet ($e162 (= ?e51 ?e12))
+(flet ($e163 (= (sign_extend[12] ?e34) ?e6))
+(flet ($e164 (= ?e17 ?e53))
+(flet ($e165 (= ?e53 ?e9))
+(flet ($e166 (= ?e8 (sign_extend[6] ?e10)))
+(flet ($e167 (= ?e10 ?e24))
+(flet ($e168 (= (sign_extend[11] ?e47) ?e62))
+(flet ($e169 (= (zero_extend[12] ?e42) v2))
+(flet ($e170 (= (sign_extend[11] ?e15) ?e5))
+(flet ($e171 (= (zero_extend[12] ?e45) v2))
+(flet ($e172 (= (zero_extend[1] ?e56) ?e20))
+(flet ($e173 (= ?e5 (sign_extend[7] v1)))
+(flet ($e174 (= ?e36 (sign_extend[3] ?e54)))
+(flet ($e175 (= ?e6 (sign_extend[12] ?e31)))
+(flet ($e176 (= (sign_extend[13] ?e42) ?e22))
+(flet ($e177 (= (sign_extend[2] ?e17) ?e62))
+(flet ($e178 (= (sign_extend[7] ?e33) ?e11))
+(flet ($e179 (= ?e27 (zero_extend[13] ?e14)))
+(flet ($e180 (= (zero_extend[2] v2) ?e57))
+(flet ($e181 (= v3 (zero_extend[3] ?e40)))
+(flet ($e182 (= ?e30 ?e24))
+(flet ($e183 (= (sign_extend[11] ?e30) ?e11))
+(flet ($e184 (= ?e17 (zero_extend[9] ?e33)))
+(flet ($e185 (= (sign_extend[7] ?e36) ?e51))
+(flet ($e186 (= (zero_extend[13] ?e61) ?e23))
+(flet ($e187 (= (sign_extend[15] ?e44) ?e52))
+(flet ($e188 (= ?e39 ?e34))
+(flet ($e189 (= ?e59 (sign_extend[12] ?e55)))
+(flet ($e190 (= v2 ?e16))
+(flet ($e191 (= ?e36 (zero_extend[5] ?e24)))
+(flet ($e192 (= (sign_extend[12] ?e10) ?e41))
+(flet ($e193 (= ?e57 (zero_extend[2] ?e6)))
+(flet ($e194 (= ?e31 ?e10))
+(flet ($e195 (= ?e38 (zero_extend[11] ?e58)))
+(flet ($e196 (= ?e27 (zero_extend[13] ?e58)))
+(flet ($e197 (= (zero_extend[13] ?e60) ?e4))
+(flet ($e198 (= ?e50 (sign_extend[12] ?e39)))
+(flet ($e199 (= ?e20 ?e32))
+(flet ($e200 (= (zero_extend[1] ?e12) ?e22))
+(flet ($e201 (= ?e51 (sign_extend[12] ?e14)))
+(flet ($e202 (= (sign_extend[2] ?e4) v3))
+(flet ($e203 (= (sign_extend[8] ?e36) ?e20))
+(flet ($e204 (= ?e62 (zero_extend[15] ?e42)))
+(flet ($e205 (= ?e21 (sign_extend[8] v1)))
+(flet ($e206 (= ?e33 (zero_extend[4] ?e60)))
+(flet ($e207 (= ?e55 ?e45))
+(flet ($e208 (= ?e55 ?e45))
+(flet ($e209 (= (zero_extend[13] ?e44) ?e20))
+(flet ($e210 (= (zero_extend[1] ?e11) ?e51))
+(flet ($e211 (= v3 (zero_extend[2] ?e27)))
+(flet ($e212 (= ?e25 ?e21))
+(flet ($e213 (iff $e200 $e110))
+(flet ($e214 (iff $e209 $e138))
+(flet ($e215 (if_then_else $e204 $e156 $e75))
+(flet ($e216 (xor $e191 $e126))
+(flet ($e217 (and $e175 $e151))
+(flet ($e218 (xor $e80 $e196))
+(flet ($e219 (xor $e202 $e187))
+(flet ($e220 (and $e114 $e163))
+(flet ($e221 (or $e63 $e203))
+(flet ($e222 (implies $e131 $e134))
+(flet ($e223 (iff $e152 $e108))
+(flet ($e224 (xor $e119 $e85))
+(flet ($e225 (not $e184))
+(flet ($e226 (implies $e88 $e213))
+(flet ($e227 (not $e161))
+(flet ($e228 (if_then_else $e201 $e103 $e112))
+(flet ($e229 (not $e118))
+(flet ($e230 (and $e82 $e122))
+(flet ($e231 (implies $e90 $e149))
+(flet ($e232 (implies $e120 $e193))
+(flet ($e233 (xor $e109 $e140))
+(flet ($e234 (or $e190 $e113))
+(flet ($e235 (or $e228 $e150))
+(flet ($e236 (or $e76 $e220))
+(flet ($e237 (iff $e144 $e155))
+(flet ($e238 (or $e142 $e159))
+(flet ($e239 (if_then_else $e222 $e158 $e100))
+(flet ($e240 (not $e129))
+(flet ($e241 (and $e164 $e179))
+(flet ($e242 (implies $e73 $e226))
+(flet ($e243 (xor $e166 $e66))
+(flet ($e244 (iff $e168 $e102))
+(flet ($e245 (not $e86))
+(flet ($e246 (if_then_else $e244 $e183 $e83))
+(flet ($e247 (if_then_else $e137 $e225 $e236))
+(flet ($e248 (if_then_else $e79 $e171 $e239))
+(flet ($e249 (xor $e217 $e176))
+(flet ($e250 (xor $e249 $e145))
+(flet ($e251 (implies $e194 $e195))
+(flet ($e252 (iff $e197 $e206))
+(flet ($e253 (xor $e95 $e243))
+(flet ($e254 (xor $e98 $e218))
+(flet ($e255 (not $e157))
+(flet ($e256 (if_then_else $e182 $e221 $e115))
+(flet ($e257 (or $e216 $e177))
+(flet ($e258 (iff $e139 $e235))
+(flet ($e259 (not $e172))
+(flet ($e260 (not $e77))
+(flet ($e261 (and $e180 $e125))
+(flet ($e262 (or $e91 $e87))
+(flet ($e263 (not $e135))
+(flet ($e264 (implies $e130 $e232))
+(flet ($e265 (if_then_else $e240 $e111 $e123))
+(flet ($e266 (not $e121))
+(flet ($e267 (xor $e199 $e147))
+(flet ($e268 (xor $e74 $e170))
+(flet ($e269 (implies $e192 $e267))
+(flet ($e270 (implies $e245 $e65))
+(flet ($e271 (implies $e230 $e148))
+(flet ($e272 (implies $e264 $e205))
+(flet ($e273 (and $e143 $e78))
+(flet ($e274 (not $e257))
+(flet ($e275 (xor $e261 $e167))
+(flet ($e276 (not $e268))
+(flet ($e277 (iff $e93 $e260))
+(flet ($e278 (if_then_else $e242 $e258 $e247))
+(flet ($e279 (if_then_else $e252 $e116 $e214))
+(flet ($e280 (implies $e259 $e189))
+(flet ($e281 (not $e141))
+(flet ($e282 (if_then_else $e96 $e208 $e127))
+(flet ($e283 (iff $e211 $e165))
+(flet ($e284 (implies $e255 $e185))
+(flet ($e285 (if_then_else $e278 $e162 $e272))
+(flet ($e286 (and $e128 $e282))
+(flet ($e287 (or $e263 $e273))
+(flet ($e288 (or $e106 $e215))
+(flet ($e289 (not $e71))
+(flet ($e290 (iff $e207 $e250))
+(flet ($e291 (or $e68 $e68))
+(flet ($e292 (implies $e72 $e212))
+(flet ($e293 (implies $e254 $e277))
+(flet ($e294 (not $e280))
+(flet ($e295 (not $e274))
+(flet ($e296 (implies $e256 $e233))
+(flet ($e297 (implies $e275 $e64))
+(flet ($e298 (or $e234 $e248))
+(flet ($e299 (or $e153 $e223))
+(flet ($e300 (if_then_else $e286 $e224 $e276))
+(flet ($e301 (or $e94 $e124))
+(flet ($e302 (or $e279 $e287))
+(flet ($e303 (if_then_else $e302 $e292 $e174))
+(flet ($e304 (if_then_else $e265 $e104 $e294))
+(flet ($e305 (or $e186 $e173))
+(flet ($e306 (if_then_else $e270 $e133 $e288))
+(flet ($e307 (and $e81 $e305))
+(flet ($e308 (xor $e293 $e291))
+(flet ($e309 (iff $e84 $e303))
+(flet ($e310 (xor $e262 $e284))
+(flet ($e311 (iff $e297 $e178))
+(flet ($e312 (iff $e198 $e132))
+(flet ($e313 (if_then_else $e169 $e304 $e146))
+(flet ($e314 (if_then_else $e306 $e285 $e307))
+(flet ($e315 (and $e281 $e289))
+(flet ($e316 (if_then_else $e309 $e299 $e97))
+(flet ($e317 (or $e266 $e117))
+(flet ($e318 (and $e227 $e301))
+(flet ($e319 (or $e300 $e317))
+(flet ($e320 (iff $e313 $e237))
+(flet ($e321 (or $e241 $e318))
+(flet ($e322 (and $e308 $e188))
+(flet ($e323 (xor $e269 $e154))
+(flet ($e324 (xor $e69 $e246))
+(flet ($e325 (or $e310 $e296))
+(flet ($e326 (implies $e136 $e311))
+(flet ($e327 (or $e326 $e160))
+(flet ($e328 (if_then_else $e295 $e238 $e229))
+(flet ($e329 (or $e316 $e322))
+(flet ($e330 (and $e319 $e89))
+(flet ($e331 (not $e298))
+(flet ($e332 (or $e219 $e92))
+(flet ($e333 (implies $e324 $e271))
+(flet ($e334 (iff $e251 $e323))
+(flet ($e335 (xor $e181 $e327))
+(flet ($e336 (implies $e331 $e210))
+(flet ($e337 (implies $e231 $e290))
+(flet ($e338 (iff $e312 $e99))
+(flet ($e339 (implies $e105 $e337))
+(flet ($e340 (implies $e325 $e339))
+(flet ($e341 (xor $e335 $e101))
+(flet ($e342 (iff $e253 $e330))
+(flet ($e343 (iff $e328 $e341))
+(flet ($e344 (and $e321 $e340))
+(flet ($e345 (and $e314 $e343))
+(flet ($e346 (iff $e333 $e329))
+(flet ($e347 (not $e70))
+(flet ($e348 (or $e283 $e107))
+(flet ($e349 (or $e336 $e345))
+(flet ($e350 (not $e332))
+(flet ($e351 (and $e315 $e342))
+(flet ($e352 (xor $e349 $e348))
+(flet ($e353 (xor $e67 $e344))
+(flet ($e354 (not $e334))
+(flet ($e355 (and $e354 $e352))
+(flet ($e356 (if_then_else $e351 $e355 $e347))
+(flet ($e357 (and $e346 $e320))
+(flet ($e358 (iff $e350 $e338))
+(flet ($e359 (not $e353))
+(flet ($e360 (or $e359 $e357))
+(flet ($e361 (xor $e360 $e356))
+(flet ($e362 (implies $e361 $e358))
+$e362
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback