* added propagation as lemmas to TheoryBV:
authorLiana Hadarean <lianahady@gmail.com>
Wed, 4 Apr 2012 02:02:06 +0000 (02:02 +0000)
committerLiana Hadarean <lianahady@gmail.com>
Wed, 4 Apr 2012 02:02:06 +0000 (02:02 +0000)
   * modified BVMinisat to work incrementally
   * added more bv regressions

40 files changed:
src/prop/bvminisat/bvminisat.cpp
src/prop/bvminisat/bvminisat.h
src/prop/bvminisat/core/Solver.cc
src/prop/bvminisat/core/Solver.h
src/prop/bvminisat/core/SolverTypes.h
src/prop/bvminisat/simp/SimpSolver.cc
src/prop/bvminisat/simp/SimpSolver.h
src/prop/cryptominisat/MTRand/Makefile.in
src/prop/cryptominisat/Makefile.in
src/prop/cryptominisat/Solver/Makefile.in
src/prop/cryptominisat/man/Makefile.in
src/prop/cryptominisat/mtl/Makefile.in
src/prop/minisat/core/Solver.cc
src/prop/sat_solver.h
src/prop/sat_solver_factory.cpp
src/prop/sat_solver_factory.h
src/theory/bv/bitblast_strategies.cpp
src/theory/bv/bv_sat.cpp
src/theory/bv/bv_sat.h
src/theory/bv/kinds
src/theory/bv/theory_bv.cpp
src/theory/bv/theory_bv.h
src/theory/bv/theory_bv_rewrite_rules.h
src/theory/bv/theory_bv_rewrite_rules_constant_evaluation.h
src/theory/bv/theory_bv_rewrite_rules_core.h
src/theory/bv/theory_bv_rewrite_rules_normalization.h
src/theory/bv/theory_bv_rewrite_rules_simplification.h
src/theory/bv/theory_bv_rewriter.cpp
src/theory/bv/theory_bv_rewriter.h
src/theory/bv/theory_bv_utils.h
src/util/bitvector.h
test/regress/regress0/bv/fuzz01.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz02.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz03.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz04.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz05.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz06.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz07.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz08.smt [new file with mode: 0644]
test/regress/regress0/bv/fuzz09.smt [new file with mode: 0644]

index b32483cbea0709cb0534eb7c0b3963505e2d656c..232502696f87148e32ff63fbcbad16cdbefc4e9d 100644 (file)
 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){
index 4ca1164c0ad05244d24ac8117f322ca05c4dbb16..19b6050671d6e75ee8ac88f335add36ad18e2ec4 100644 (file)
 #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);
index 7ff7b50dbd924565f9128214828f85a40bc3c386..5066d5d8f5b1ca454a7d3fef994d6567cd67f384 100644 (file)
@@ -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,18 +869,55 @@ 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:
 // 
@@ -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);
 }
-
index f364a2937e58a0cb74ae37e255bed3bf569a5935..33d1900c9a7acd831f8bcb8e8003f49a33c5bc04 100644 (file)
@@ -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); }
index 0439a46c4b330c11983996ae7e317f7ba14e0b66..89ffc8a000ad6697edebc7a151fd30cea02260d0 100644 (file)
@@ -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 );  // }
index 4af756456465771f9d5d08e1a0b6ae2bd8f4f98f..903ffa27035084e9d7e9832b209b82052f40bb4a 100644 (file)
@@ -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:
index e21a0a9ec5733cfe94bcfcd545457d36719c01f5..e3ef76212fea85d829515e0d054bbe83c8be2259 100644 (file)
@@ -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); }
index 8cc478cdfadebe2469bcc04144717b43a88046ea..1693a70f2b7e7c7442fd37c020f0d9585f787c4d 100644 (file)
@@ -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):
 
index 2d9ee8bf8bc30220846a0237366367c18467ec9e..a6806f0b44987fc8658ad7c1a6949841025f7409 100644 (file)
@@ -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
index dd524fba25b1d4a6db98ec369fb6d8f6573505ce..02344edd7c0bf7572c8497ed5d6c3688344967c7 100644 (file)
@@ -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 $@ $<
index 5542511ebd85d60abcaceece68e5147fba6c8323..7dc705cf11ecbc0b9d5c9dd67e9a7ce86bf5790f 100644 (file)
@@ -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):
 
index eb9b73e196885611334d538133a6a629c78fbdd8..7d8c8ce1b14d5fc6ca96bb4c9becf04c6d51f24d 100644 (file)
@@ -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):
 
index 3a16b0d19d8015b9fc3956568b1e320a096a5eaf..c602d8b9c6a5daef387d9e15af7a05f69c91084c 100644 (file)
@@ -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)
index f18335048ed217a2ee9591c20a8863f29a8b80e5..4fe24fc609733f94b309719dc4c7251c99ab0513 100644 (file)
@@ -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;
 }; 
 
 
index e6ae5d1e7f2c4eb8b2ff108109bfe8ef647b61a4..3b048af4791e6f41eb56996619ac29462377f715 100644 (file)
@@ -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() {
index 367397fdf0e3c2b8491a52211c3efc7b8a3180a5..379141cc65e85007211dc9630fd1c280f85e722e 100644 (file)
@@ -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);
index c0855122e46a384a62f624702a15f213948aa052..edaf8c154d287daad11126c47673046068bf9ffb 100644 (file)
@@ -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(); 
 }
index 6f91335ce1725ca0b6aa935f18050597c84f65fe..f5c43688aa91c1117caa69dc2f9c25f7e744be7b 100644 (file)
@@ -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);
 }
 
index c0f3b75ed5bc287545358c08b7e62d0a7cc03d26..647e4fe9fd884a42ff9acf158698fb4508546cad 100644 (file)
@@ -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(); 
index 36d25de2aa0eb34c4337c10d08ba98169d40cc10..6ef2cb0a9cbf54577a5f892214e5325a1cc9270b 100644 (file)
@@ -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)"
index 45d99f9c9aa4dce16de51a053b623de74fc3cd61..e8e1aead66137bce44c13a31f94e7a68a5157d45 100644 (file)
@@ -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()) {
index 36ba17b52a249375b006d33651b97554ec812973..d147c8bb5cfe904bc9ec11e12d0e8a74387ad178 100644 (file)
@@ -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);
 
index b01a0646cba582a33a9c0821fc48341eaeeebe71..30437a76e07aeee053f08faa6ed951a56d41b266 100644 (file)
@@ -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();
index 1dc053b5d9c429d694918eed9bacedd19add3d0f..da3ef448589f4449446413d0a0a9786b1d1da21a 100644 (file)
@@ -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>();
index 3240ef5f3ddc90b3c577944e1994f14b00f56c32..f3d28072e7cdf9400360d408600e2ec8962c0e14 100644 (file)
@@ -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]);
index 4e974881cc9ac4251d96132c89cc5c61801ac18c..5587e25ebbe5f6566231f10c980900234cdf61c5 100644 (file)
@@ -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;
index 507f98c9127e95f23b84070e0e2434e4efc2511b..cf8310e5af7e9c6e7afcd378af3a5798762b14bb 100644 (file)
@@ -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 ; 
index 2b48977b63c4e2ecb3ac3c0f46cc062eefe02b96..c2649e88153a8b42b21d11c670829c3439689392 100644 (file)
@@ -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(); 
 } 
index 7ce914477ab014a5900dec7def4444da306982d7..0ce3fa3035c2f2140fca5b200da1b8c3a0b2937c 100644 (file)
@@ -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:
 
index 60e4599580a98595f0770d3613fefae045952351..8b5dd049990039983a1f3bbb7e8f2ac2a5f04ba1 100644 (file)
@@ -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);
index 7429ac8c983b7f98fd75b28bfbaad418a9ab4bf6..512f23136e4a8b80fbdc3ec9e5c137d2a0ea068d 100644 (file)
@@ -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 (file)
index 0000000..df6b543
--- /dev/null
@@ -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 (file)
index 0000000..41b616e
--- /dev/null
@@ -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 (file)
index 0000000..fe0b5b1
--- /dev/null
@@ -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 (file)
index 0000000..c5598a2
--- /dev/null
@@ -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 (file)
index 0000000..6a64a72
--- /dev/null
@@ -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 (file)
index 0000000..6fc41f3
--- /dev/null
@@ -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 (file)
index 0000000..c813a31
--- /dev/null
@@ -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 (file)
index 0000000..e2a73db
--- /dev/null
@@ -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 (file)
index 0000000..ce8e9bf
--- /dev/null
@@ -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
+))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
+