1 /******************************************************************************
2 * Top contributors (to current version):
3 * Mathias Preiner, Liana Hadarean, Tim King
5 * This file is part of the cvc5 project.
7 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8 * in the top-level source directory and their institutional affiliations.
9 * All rights reserved. See the file COPYING in the top-level source
10 * directory for licensing information.
11 * ****************************************************************************
13 * Eager bit-blasting solver.
16 #include "theory/bv/bv_eager_solver.h"
18 #include "options/base_options.h"
19 #include "options/bv_options.h"
20 #include "options/smt_options.h"
21 #include "theory/bv/bitblast/aig_bitblaster.h"
22 #include "theory/bv/bitblast/eager_bitblaster.h"
30 EagerBitblastSolver::EagerBitblastSolver(context::Context
* c
, BVSolverLazy
* bv
)
36 d_useAig(options::bitvectorAig()),
41 EagerBitblastSolver::~EagerBitblastSolver() {}
43 void EagerBitblastSolver::turnOffAig() {
44 Assert(d_aigBitblaster
== nullptr && d_bitblaster
== nullptr);
48 void EagerBitblastSolver::initialize() {
49 Assert(!isInitialized());
52 d_aigBitblaster
.reset(new AigBitblaster());
57 d_bitblaster
.reset(new EagerBitblaster(d_bv
, d_context
));
61 bool EagerBitblastSolver::isInitialized() {
62 const bool init
= d_aigBitblaster
!= nullptr || d_bitblaster
!= nullptr;
63 Assert(!init
|| !d_useAig
|| d_aigBitblaster
);
64 Assert(!init
|| d_useAig
|| d_bitblaster
);
68 void EagerBitblastSolver::assertFormula(TNode formula
) {
69 d_bv
->spendResource(Resource::BvEagerAssertStep
);
70 Assert(isInitialized());
71 Debug("bitvector-eager") << "EagerBitblastSolver::assertFormula " << formula
73 if (options::incrementalSolving() && d_context
->getLevel() > 1)
75 d_assumptionSet
.insert(formula
);
77 d_assertionSet
.insert(formula
);
78 // ensures all atoms are bit-blasted and converted to AIG
81 d_aigBitblaster
->bbFormula(formula
);
88 d_bitblaster
->bbFormula(formula
);
92 bool EagerBitblastSolver::checkSat() {
93 Assert(isInitialized());
94 if (d_assertionSet
.empty()) {
100 const std::vector
<Node
> assertions
= {d_assertionSet
.key_begin(),
101 d_assertionSet
.key_end()};
102 Assert(!assertions
.empty());
104 Node query
= utils::mkAnd(assertions
);
105 return d_aigBitblaster
->solve(query
);
111 if (options::incrementalSolving())
113 const std::vector
<Node
> assumptions
= {d_assumptionSet
.key_begin(),
114 d_assumptionSet
.key_end()};
115 return d_bitblaster
->solve(assumptions
);
117 return d_bitblaster
->solve();
120 bool EagerBitblastSolver::collectModelInfo(TheoryModel
* m
, bool fullModel
)
122 AlwaysAssert(!d_useAig
&& d_bitblaster
);
123 return d_bitblaster
->collectModelInfo(m
, fullModel
);
127 } // namespace theory