ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
synthesisEngine.hpp
Go to the documentation of this file.
1
20
21#ifndef ABC__OPT__ESLIM__SYNTHESISENGINE_h
22#define ABC__OPT__ESLIM__SYNTHESISENGINE_h
23
24#include <vector>
25#include <unordered_set>
26#include <unordered_map>
27#include <memory>
28
30#include "aig/miniaig/miniaig.h"
31#include "misc/vec/vec.h"
32
33#include "satInterfaces.hpp"
34
36
37#define MAJ_NOBJS 64 // Const0 + Const1 + nVars + nNodes
38
39namespace eSLIM {
40
41 // Based on Exa6_ManGenStart
42 template<class Derived>
43 class exactSynthesisEngine {
44
45 private:
46 Vec_Wrd_t * vSimsIn; // input signatures (nWords = 1, nIns <= 64)
47 Vec_Wrd_t * vSimsOut; // output signatures (nWords = 1, nOuts <= 6)
48 int nIns;
49 int nDivs; // divisors (const + inputs + tfi + sidedivs)
50 int nNodes;
51 int nOuts;
52 int nObjs;
53 int VarMarks[MAJ_NOBJS][2][MAJ_NOBJS] = {}; // default init the array
54 int nCnfVars;
55 int nCnfVars2;
56 int nCnfClauses;
57
58 // Assign outputs to their connectivity variables
59 std::unordered_map<int, std::vector<int>> connection_variables;
60 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs;
61 eSLIMLog& log;
62 const eSLIMConfig& cfg;
63
64 exactSynthesisEngine( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes,
65 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
66 int addClause(int lit1, int lit2, int lit3, int lit4);
67 static bool isNormalized( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut );
68 int markup();
69 int findFanin( Vec_Int_t * vValues, int i, int k, int nof_objs);
70 Mini_Aig_t * getAig(Vec_Int_t * assignment, int size);
71 Mini_Aig_t * getAig(Vec_Int_t * assignment);
72 void generateCNF(int fOrderNodes, int fUniqFans);
73 int startEncoding(int fOrderNodes, int fUniqFans );
74 void generateMinterm( int iMint);
75
76 int getGateEnablingLiteral(int index, bool negated);
77 int getAuxilaryVariableCount();
78
79 void introduceConnectionVariables();
80 void setupConnectionVariables();
81 void addConnectivityConstraints();
82 void addCombinedCycleConstraints();
83 std::unordered_map<int, std::unordered_set<int>> computeNotInPair(const std::unordered_map<int, std::unordered_set<int>>& pairs);
84
85 int prepareLits(int * pLits, int& nLits);
86
87 friend Derived;
88 };
89
90 // applies Cadical incrementally
91 class CadicalEngine : public exactSynthesisEngine<CadicalEngine> {
92
93 public:
94 CadicalEngine(Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes,
95 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
96 Mini_Aig_t* getCircuit(int size, double timeout);
97
98 private:
99 using exactSynthesisEngine::addClause;
100 std::vector<int> gate_enabling_assumptions;
101 CadicalSolver solver;
102
103
104 int addClause( int * pLits, int nLits );
105 Vec_Int_t * solve(int size, double timeout);
106 int getAuxilaryVariableCountDerived();
107 int getGateEnablingLiteralImpl(int index, bool negated);
108 void addAssumptions(int size);
109 void addGateDeactivatedConstraint(int out);
110
111 std::vector<int> getAssumptions(int size);
112
113 friend exactSynthesisEngine<CadicalEngine>;
114 };
115
117 protected:
119 int getGateEnablingLiteralImpl(int index, bool negated) {return 0;};
120 // void addAssumptions(int size) {};
122 };
123
124 template <typename T>
126 public:
127 OneshotManager(Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int maxnNodes,
128 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
129 Mini_Aig_t* getCircuit(int size, double timeout);
130
131 private:
132 T getOneshotEngine(int size);
133
134 Vec_Wrd_t * vSimsIn; // input signatures (nWords = 1, nIns <= 64)
135 Vec_Wrd_t * vSimsOut; // output signatures (nWords = 1, nOuts <= 6)
136 int nIns;
137 int nDivs; // divisors (const + inputs + tfi + sidedivs)
138 int maxnNodes;
139 int nOuts;
140
141 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs;
142 eSLIMLog& log;
143 const eSLIMConfig& cfg;
144 };
145
146 class CadicalEngineOneShot : public exactSynthesisEngine<CadicalEngineOneShot>, public OneshotEngine {
147
148 public:
149 CadicalEngineOneShot( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes,
150 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
151 Mini_Aig_t* getCircuit(int size, double timeout);
152
153 private:
154 using exactSynthesisEngine::addClause;
155
156 int addClause( int * pLits, int nLits );
157 Vec_Int_t * solve(int size, double timeout);
158
159 CadicalSolver solver;
160
161 friend exactSynthesisEngine<CadicalEngineOneShot>;
162 };
163
164 class KissatEngineOneShot : public exactSynthesisEngine<KissatEngineOneShot>, public OneshotEngine {
165
166 public:
167 KissatEngineOneShot( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes,
168 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
169 Mini_Aig_t* getCircuit(int size, double timeout);
170
171 private:
172 using exactSynthesisEngine::addClause;
173
174 int addClause( int * pLits, int nLits );
175 Vec_Int_t * solve(int size, double timeout);
176
177 KissatSolver solver;
178
179 friend exactSynthesisEngine<KissatEngineOneShot>;
180 };
181
182
183 class KissatCmdEngine : public exactSynthesisEngine<KissatCmdEngine>, public OneshotEngine {
184
185 public:
186 KissatCmdEngine( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes,
187 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs, eSLIMLog& log, const eSLIMConfig& cfg);
188 Mini_Aig_t* getCircuit(int size, double timeout);
189
190 private:
191 using exactSynthesisEngine::addClause;
192
193
194 int addClause( int * pLits, int nLits );
195 Vec_Int_t * solve(int size, double timeout);
196
197 FILE * encoding_file;
198
199 // Ensure that there is no file with the same name in the diretory
200 constexpr static char * pFileNameIn = "_temp_.cnf";
201 constexpr static char * pFileNameOut = "_temp_out.cnf";
202
203 #ifdef WIN32
204 constexpr static char * pKissat = "kissat.exe";
205 #else
206 constexpr static char * pKissat = "kissat";
207 #endif
208
209 friend exactSynthesisEngine<KissatCmdEngine>;
210 };
211
212
213 template <typename T>
214 inline int exactSynthesisEngine<T>::addClause(int lit1, int lit2, int lit3, int lit4) {
215 int clause[4] = {lit1, lit2, lit3, lit4};
216 return static_cast<T*>(this)->addClause(clause, 4);
217 }
218
219 template <typename T>
220 inline int exactSynthesisEngine<T>::getGateEnablingLiteral(int index, bool negated) {
221 return static_cast<T*>(this)->getGateEnablingLiteralImpl(index, negated);
222 }
223
224 template <typename T>
225 inline int exactSynthesisEngine<T>::getAuxilaryVariableCount() {
226 int ncvars = connection_variables.empty() ? 0 : connection_variables.begin()->second.size() * connection_variables.size();
227 return ncvars + static_cast<T*>(this)->getAuxilaryVariableCountDerived();
228 }
229
233
234}
235
237
238#include "synthesisEngine.tpp"
239
240#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
Mini_Aig_t * getCircuit(int size, double timeout)
CadicalEngineOneShot(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, const std::unordered_map< int, std::unordered_set< int > > &forbidden_pairs, eSLIMLog &log, const eSLIMConfig &cfg)
Mini_Aig_t * getCircuit(int size, double timeout)
CadicalEngine(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, const std::unordered_map< int, std::unordered_set< int > > &forbidden_pairs, eSLIMLog &log, const eSLIMConfig &cfg)
Mini_Aig_t * getCircuit(int size, double timeout)
KissatCmdEngine(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, const std::unordered_map< int, std::unordered_set< int > > &forbidden_pairs, eSLIMLog &log, const eSLIMConfig &cfg)
Mini_Aig_t * getCircuit(int size, double timeout)
KissatEngineOneShot(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, const std::unordered_map< int, std::unordered_set< int > > &forbidden_pairs, eSLIMLog &log, const eSLIMConfig &cfg)
int getGateEnablingLiteralImpl(int index, bool negated)
void addGateDeactivatedConstraint(int idx)
Mini_Aig_t * getCircuit(int size, double timeout)
OneshotManager(Vec_Wrd_t *vSimsIn, Vec_Wrd_t *vSimsOut, int nIns, int nDivs, int nOuts, int maxnNodes, const std::unordered_map< int, std::unordered_set< int > > &forbidden_pairs, eSLIMLog &log, const eSLIMConfig &cfg)
struct Mini_Aig_t_ Mini_Aig_t
BASIC TYPES ///.
Definition miniaig.h:48
OneshotManager< KissatEngineOneShot > KissatOneShot
OneshotManager< CadicalEngineOneShot > CadicalOneShot
OneshotManager< KissatCmdEngine > KissatCmdOneShot
unsigned size
Definition clause.h:37
#define MAJ_NOBJS
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42