13#ifndef CIRCT_SUPPORT_SATSOLVER_H
14#define CIRCT_SUPPORT_SATSOLVER_H
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/STLFunctionalExtras.h"
18#include "llvm/ADT/StringRef.h"
37 for (
int lit : assumptions)
43 virtual int val(
int v)
const = 0;
64 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause);
67void addOrClauses(
int outVar, llvm::ArrayRef<int> inputLits,
68 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause);
72 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause);
76 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause,
77 llvm::function_ref<
int()> newVar);
83 llvm::ArrayRef<int> inputLits,
84 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause,
85 llvm::function_ref<
int()> newVar);
89 llvm::ArrayRef<int> inputLits,
90 llvm::function_ref<
void(llvm::ArrayRef<int>)> addClause,
91 llvm::function_ref<
int()> newVar);
105std::unique_ptr<IncrementalSATSolver>
112std::unique_ptr<IncrementalSATSolver>
Abstract interface for incremental SAT solvers with an IPASIR-style API.
virtual Result solve(llvm::ArrayRef< int > assumptions)
virtual void reserveVars(int maxVar)
Reserve storage for variables in the range [1, maxVar].
virtual void addClause(llvm::ArrayRef< int > lits)
Add a complete clause in one call.
virtual ~IncrementalSATSolver()=default
virtual void add(int lit)=0
Add one literal to the clause currently under construction.
virtual void setConflictLimit(int limit)
Set the per-solve() conflict budget.
virtual int newVar()=0
Add a fresh variable for safe incremental SAT solving.
virtual int val(int v) const =0
Return the satisfying assignment for variable v from the last SAT result.
virtual Result solve()=0
Solve under the previously added clauses and current assumptions.
virtual void assume(int lit)=0
Add an assumption literal for the next solve() call only.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
bool hasIncrementalSATSolverBackend()
Return true when at least one incremental SAT backend is available.
void addExactlyOneClauses(llvm::ArrayRef< int > inputLits, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause, llvm::function_ref< int()> newVar)
Emit clauses encoding that exactly one literal in inputLits is true.
void addAndClauses(int outVar, llvm::ArrayRef< int > inputLits, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause)
Emit clauses encoding outVar <=> and(inputLits).
void addXorClauses(int outVar, int lhsLit, int rhsLit, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause)
Emit clauses encoding outVar <=> (lhsLit xor rhsLit).
std::unique_ptr< IncrementalSATSolver > createZ3SATSolver()
Construct a Z3-backed incremental IPASIR-style SAT solver.
std::unique_ptr< IncrementalSATSolver > createCadicalSATSolver(const CadicalSATSolverOptions &options={})
Construct a CaDiCaL-backed incremental IPASIR-style SAT solver.
void addOrClauses(int outVar, llvm::ArrayRef< int > inputLits, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause)
Emit clauses encoding outVar <=> or(inputLits).
void addParityClauses(int outVar, llvm::ArrayRef< int > inputLits, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause, llvm::function_ref< int()> newVar)
Emit clauses encoding outVar <=> parity(inputLits).
void addAtMostOneClauses(llvm::ArrayRef< int > inputLits, llvm::function_ref< void(llvm::ArrayRef< int >)> addClause, llvm::function_ref< int()> newVar)
Emit clauses encoding that at most one literal in inputLits can be true.
std::unique_ptr< IncrementalSATSolver > createSATSolver(llvm::StringRef backend="auto")
Construct an incremental SAT solver using the requested backend.
CadicalSolverConfig config