ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
satInterfaces.hpp
Go to the documentation of this file.
1
20
21#ifndef ABC__OPT__ESLIM__SATINTERFACE_h
22#define ABC__OPT__ESLIM__SATINTERFACE_h
23
24#include <vector>
25#include <chrono>
26#include <iostream>
27
29#include "misc/vec/vec.h"
30#include "sat/kissat/kissat.h"
32
34
35namespace eSLIM {
36
38 public:
39 void addClause(int * pLits, int nLits );
40 void assume(const std::vector<int>& assumptions);
41 int solve(double timeout);
42 int solve();
44 double getRunTime() const;
45
46 private:
47 int val(int variable);
48 double last_runtime;
49 CaDiCaL::Solver solver;
50
51 public:
53 public:
54 TimeoutTerminator(double max_runtime);
55 bool terminate();
56
57 private:
58 double max_runtime; //in seconds
59 std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
60 };
61 };
62
64 public:
67 void init(int max_var);
68 void addClause(int * pLits, int nLits );
69 int solve();
70 // int solve(int timeout);
72
73 private:
74
75 int max_var = 0;
76 int val(int variable);
77 kissat * solver = nullptr;
78 };
79
80 inline CadicalSolver::TimeoutTerminator::TimeoutTerminator(double max_runtime) : max_runtime(max_runtime) {}
81
83 auto current_time = std::chrono::steady_clock::now();
84 std::chrono::duration<double> elapsed_seconds = current_time - start;
85 return elapsed_seconds.count() > max_runtime;
86 }
87
88 inline double CadicalSolver::getRunTime() const {
89 return last_runtime;
90 }
91
92 inline void CadicalSolver::addClause(int * pLits, int nLits ) {
93 for ( int i = 0; i < nLits; i++ ) {
94 if (pLits[i] == 0) {
95 continue;;
96 }
97 solver.add(Abc_LitIsCompl(pLits[i]) ? -Abc_Lit2Var(pLits[i]) : Abc_Lit2Var(pLits[i]));
98 }
99 solver.add(0);
100 }
101
102 inline void CadicalSolver::assume(const std::vector<int>& assumptions) {
103 for (auto& l: assumptions) {
104 solver.assume(l);
105 }
106 }
107
108 inline int CadicalSolver::solve() {
109 std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
110 int status = solver.solve();
111 last_runtime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count();
112 return status;
113 }
114
115 inline int CadicalSolver::solve(double timeout) {
116 std::chrono::time_point<std::chrono::steady_clock> start = std::chrono::steady_clock::now();
117 TimeoutTerminator terminator(timeout);
118 solver.connect_terminator(&terminator);
119 int status = solver.solve();
120 last_runtime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count();
121 if (solver.state() == CaDiCaL::INVALID) {
122 std::cerr<<"Solver is in invalid state"<<std::endl;
123 return -1;
124 }
125 solver.disconnect_terminator();
126 return status;
127 }
128
130 Vec_Int_t* assignment = Vec_IntAlloc( solver.vars() );
131 for (int v = 1; v <= solver.vars(); v++) {
132 Vec_IntSetEntryFull( assignment, Abc_AbsInt(val(v)), val(v) > 0 );
133 }
134 return assignment;
135 }
136
137 inline int CadicalSolver::val(int variable) {
138 auto l = solver.val(variable);
139 auto v = abs(l);
140 if (v == variable) {
141 return l;
142 } else {
143 return variable;
144 }
145 }
146
148 solver = kissat_init();
149 }
150
152 kissat_release(solver);
153 }
154
155 inline void KissatSolver::init(int max_var) {
156 this->max_var = max_var;
157 kissat_reserve(solver, max_var);
158 }
159
160 inline void KissatSolver::addClause(int * pLits, int nLits ) {
161 for ( int i = 0; i < nLits; i++ ) {
162 if (pLits[i] == 0) {
163 continue;
164 }
165 kissat_add (solver, Abc_LitIsCompl(pLits[i]) ? -Abc_Lit2Var(pLits[i]) : Abc_Lit2Var(pLits[i]));
166 }
167 kissat_add (solver, 0);
168 }
169
170 inline int KissatSolver::solve() {
171 int status = kissat_solve(solver);
172 return status;
173 }
174
175 inline int KissatSolver::val(int variable) {
176 int l = kissat_value (solver, variable);
177 auto v = abs(l);
178 if (v == variable) {
179 return l;
180 } else {
181 return variable;
182 }
183 }
184
186 Vec_Int_t* assignment = Vec_IntAlloc( max_var );
187 for (int v = 1; v <= max_var; v++) {
188 Vec_IntSetEntryFull( assignment, Abc_AbsInt(val(v)), val(v) > 0 );
189 }
190 return assignment;
191 }
192}
193
195
196#endif
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
void addClause(int *pLits, int nLits)
void assume(const std::vector< int > &assumptions)
double getRunTime() const
Vec_Int_t * getModelVec()
void addClause(int *pLits, int nLits)
Vec_Int_t * getModelVec()
void init(int max_var)
int kissat_value(kissat *solver, int elit)
Definition internal.c:498
int kissat_solve(kissat *solver)
Definition internal.c:477
kissat * kissat_init(void)
Definition internal.c:27
void kissat_add(kissat *solver, int elit)
Definition internal.c:268
void kissat_release(kissat *solver)
Definition internal.c:81
void kissat_reserve(kissat *solver, int max_var)
Definition internal.c:169
#define solver
Definition kitten.c:211
int * variable
Definition main.h:107