diff options
Diffstat (limited to 'src/theory/bv/bitblast')
-rw-r--r-- | src/theory/bv/bitblast/eager_bitblaster.cpp | 29 | ||||
-rw-r--r-- | src/theory/bv/bitblast/eager_bitblaster.h | 4 |
2 files changed, 28 insertions, 5 deletions
diff --git a/src/theory/bv/bitblast/eager_bitblaster.cpp b/src/theory/bv/bitblast/eager_bitblaster.cpp index 7b12c3465..01437cb64 100644 --- a/src/theory/bv/bitblast/eager_bitblaster.cpp +++ b/src/theory/bv/bitblast/eager_bitblaster.cpp @@ -30,8 +30,9 @@ namespace CVC4 { namespace theory { namespace bv { -EagerBitblaster::EagerBitblaster(TheoryBV* theory_bv) +EagerBitblaster::EagerBitblaster(TheoryBV* theory_bv, context::Context* c) : TBitblaster<Node>(), + d_context(c), d_nullContext(new context::Context()), d_satSolver(), d_bitblastingRegistrar(new BitblastingRegistrar(this)), @@ -75,9 +76,18 @@ EagerBitblaster::EagerBitblaster(TheoryBV* theory_bv) EagerBitblaster::~EagerBitblaster() {} -void EagerBitblaster::bbFormula(TNode node) { - d_cnfStream->convertAndAssert(node, false, false, RULE_INVALID, - TNode::null()); +void EagerBitblaster::bbFormula(TNode node) +{ + /* For incremental eager solving we assume formulas at context levels > 1. */ + if (options::incrementalSolving() && d_context->getLevel() > 1) + { + d_cnfStream->ensureLiteral(node); + } + else + { + d_cnfStream->convertAndAssert( + node, false, false, RULE_INVALID, TNode::null()); + } } /** @@ -185,6 +195,17 @@ bool EagerBitblaster::solve() { return prop::SAT_VALUE_TRUE == d_satSolver->solve(); } +bool EagerBitblaster::solve(const std::vector<Node>& assumptions) +{ + std::vector<prop::SatLiteral> assumpts; + for (const Node& assumption : assumptions) + { + Assert(d_cnfStream->hasLiteral(assumption)); + assumpts.push_back(d_cnfStream->getLiteral(assumption)); + } + return prop::SAT_VALUE_TRUE == d_satSolver->solve(assumpts); +} + /** * Returns the value a is currently assigned to in the SAT solver * or null if the value is completely unassigned. diff --git a/src/theory/bv/bitblast/eager_bitblaster.h b/src/theory/bv/bitblast/eager_bitblaster.h index fbf1a4ddb..3e6190d76 100644 --- a/src/theory/bv/bitblast/eager_bitblaster.h +++ b/src/theory/bv/bitblast/eager_bitblaster.h @@ -36,7 +36,7 @@ class TheoryBV; class EagerBitblaster : public TBitblaster<Node> { public: - EagerBitblaster(TheoryBV* theory_bv); + EagerBitblaster(TheoryBV* theory_bv, context::Context* context); ~EagerBitblaster(); void addAtom(TNode atom); @@ -51,10 +51,12 @@ class EagerBitblaster : public TBitblaster<Node> bool assertToSat(TNode node, bool propagate = true); bool solve(); + bool solve(const std::vector<Node>& assumptions); bool collectModelInfo(TheoryModel* m, bool fullModel); void setProofLog(BitVectorProof* bvp); private: + context::Context* d_context; std::unique_ptr<context::Context> d_nullContext; typedef std::unordered_set<TNode, TNodeHashFunction> TNodeSet; |