summaryrefslogtreecommitdiff
path: root/src/theory/bv/bv_sat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/theory/bv/bv_sat.cpp')
-rw-r--r--src/theory/bv/bv_sat.cpp100
1 files changed, 88 insertions, 12 deletions
diff --git a/src/theory/bv/bv_sat.cpp b/src/theory/bv/bv_sat.cpp
index 6f91335ce..f5c43688a 100644
--- a/src/theory/bv/bv_sat.cpp
+++ b/src/theory/bv/bv_sat.cpp
@@ -23,6 +23,7 @@
#include "prop/cnf_stream.h"
#include "prop/sat_solver.h"
#include "prop/sat_solver_factory.h"
+#include "theory_bv_rewrite_rules_simplification.h"
using namespace std;
@@ -57,7 +58,7 @@ Bitblaster::Bitblaster(context::Context* c) :
d_assertedAtoms(c),
d_statistics()
{
- d_satSolver = prop::SatSolverFactory::createMinisat();
+ d_satSolver = prop::SatSolverFactory::createMinisat(c);
d_cnfStream = new TseitinCnfStream(d_satSolver, new NullRegistrar());
// initializing the bit-blasting strategies
@@ -83,7 +84,7 @@ void Bitblaster::bbAtom(TNode node) {
}
BVDebug("bitvector-bitblast") << "Bitblasting node " << node <<"\n";
-
+ ++d_statistics.d_numAtoms;
// the bitblasted definition of the atom
Node atom_bb = d_atomBBStrategies[node.getKind()](node, this);
// asserting that the atom is true iff the definition holds
@@ -101,14 +102,78 @@ void Bitblaster::bbTerm(TNode node, Bits& bits) {
return;
}
BVDebug("bitvector-bitblast") << "Bitblasting node " << node <<"\n";
- d_termBBStrategies[node.getKind()] (node, bits,this);
+ ++d_statistics.d_numTerms;
+
+ Node optimized = bbOptimize(node);
+
+ // if we already bitblasted the optimized version
+ if(hasBBTerm(optimized)) {
+ getBBTerm(optimized, bits);
+ // cache it as the same for this node
+ cacheTermDef(node, bits);
+ return;
+ }
+
+ d_termBBStrategies[optimized.getKind()] (optimized, bits,this);
- Assert (bits.size() == utils::getSize(node));
+ Assert (bits.size() == utils::getSize(node) &&
+ bits.size() == utils::getSize(optimized));
+
+ if(optimized != node) {
+ cacheTermDef(optimized, bits);
+ }
cacheTermDef(node, bits);
}
+Node Bitblaster::bbOptimize(TNode node) {
+ std::vector<Node> children;
+
+ if (node.getKind() == kind::BITVECTOR_PLUS) {
+ if (RewriteRule<BBPlusNeg>::applies(node)) {
+ Node res = RewriteRule<BBPlusNeg>::run<false>(node);
+ return res;
+ }
+ // if (RewriteRule<BBFactorOut>::applies(node)) {
+ // Node res = RewriteRule<BBFactorOut>::run<false>(node);
+ // return res;
+ // }
+
+ } else if (node.getKind() == kind::BITVECTOR_MULT) {
+ if (RewriteRule<MultPow2>::applies(node)) {
+ Node res = RewriteRule<MultPow2>::run<false>(node);
+ return res;
+ }
+ }
+
+ return node;
+}
+
/// Public methods
+void Bitblaster::addAtom(TNode atom) {
+ d_cnfStream->ensureLiteral(atom);
+ SatLiteral lit = d_cnfStream->getLiteral(atom);
+ d_satSolver->addMarkerLiteral(lit);
+}
+bool Bitblaster::getPropagations(std::vector<TNode>& propagations) {
+ std::vector<SatLiteral> propagated_literals;
+ if (d_satSolver->getPropagations(propagated_literals)) {
+ for (unsigned i = 0; i < propagated_literals.size(); ++i) {
+ propagations.push_back(d_cnfStream->getNode(propagated_literals[i]));
+ }
+ return true;
+ }
+ return false;
+}
+
+void Bitblaster::explainPropagation(TNode atom, std::vector<Node>& explanation) {
+ std::vector<SatLiteral> literal_explanation;
+ d_satSolver->explainPropagation(d_cnfStream->getLiteral(atom), literal_explanation);
+ for (unsigned i = 0; i < literal_explanation.size(); ++i) {
+ explanation.push_back(d_cnfStream->getNode(literal_explanation[i]));
+ }
+}
+
/**
* Called from preregistration bitblasts the node
*
@@ -153,7 +218,7 @@ void Bitblaster::bitblast(TNode node) {
*
*/
-void Bitblaster::assertToSat(TNode lit) {
+bool Bitblaster::assertToSat(TNode lit, bool propagate) {
// strip the not
TNode atom;
if (lit.getKind() == kind::NOT) {
@@ -163,17 +228,22 @@ void Bitblaster::assertToSat(TNode lit) {
}
Assert (hasBBAtom(atom));
- Node rewr_atom = Rewriter::rewrite(atom);
+
SatLiteral markerLit = d_cnfStream->getLiteral(atom);
if(lit.getKind() == kind::NOT) {
markerLit = ~markerLit;
}
- Debug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat asserting node: " << atom <<"\n";
- Debug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat with literal: " << markerLit << "\n";
+ BVDebug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat asserting node: " << atom <<"\n";
+ BVDebug("bitvector-bb") << "TheoryBV::Bitblaster::assertToSat with literal: " << markerLit << "\n";
+
+ SatValue ret = d_satSolver->assertAssumption(markerLit, propagate);
d_assertedAtoms.push_back(markerLit);
+
+ Assert(ret != prop::SAT_VALUE_UNKNOWN);
+ return ret == prop::SAT_VALUE_TRUE;
}
/**
@@ -183,9 +253,9 @@ void Bitblaster::assertToSat(TNode lit) {
* @return true for sat, and false for unsat
*/
-bool Bitblaster::solve() {
- Trace("bitvector") << "Bitblaster::solve() asserted atoms " << d_assertedAtoms.size() <<"\n";
- return SAT_VALUE_TRUE == d_satSolver->solve(d_assertedAtoms);
+bool Bitblaster::solve(bool quick_solve) {
+ BVDebug("bitvector") << "Bitblaster::solve() asserted atoms " << d_assertedAtoms.size() <<"\n";
+ return SAT_VALUE_TRUE == d_satSolver->solve();
}
void Bitblaster::getConflict(std::vector<TNode>& conflict) {
@@ -287,11 +357,15 @@ void Bitblaster::getBBTerm(TNode node, Bits& bits) {
Bitblaster::Statistics::Statistics() :
d_numTermClauses("theory::bv::NumberOfTermSatClauses", 0),
- d_numAtomClauses("theory::bv::NumberOfAtomSatClauses", 0),
+ d_numAtomClauses("theory::bv::NumberOfAtomSatClauses", 0),
+ d_numTerms("theory::bv::NumberOfBitblastedTerms", 0),
+ d_numAtoms("theory::bv::NumberOfBitblastedAtoms", 0),
d_bitblastTimer("theory::bv::BitblastTimer")
{
StatisticsRegistry::registerStat(&d_numTermClauses);
StatisticsRegistry::registerStat(&d_numAtomClauses);
+ StatisticsRegistry::registerStat(&d_numTerms);
+ StatisticsRegistry::registerStat(&d_numAtoms);
StatisticsRegistry::registerStat(&d_bitblastTimer);
}
@@ -299,6 +373,8 @@ Bitblaster::Statistics::Statistics() :
Bitblaster::Statistics::~Statistics() {
StatisticsRegistry::unregisterStat(&d_numTermClauses);
StatisticsRegistry::unregisterStat(&d_numAtomClauses);
+ StatisticsRegistry::unregisterStat(&d_numTerms);
+ StatisticsRegistry::unregisterStat(&d_numAtoms);
StatisticsRegistry::unregisterStat(&d_bitblastTimer);
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback