21#ifndef ABC__OPT__ESLIM__SYNTHESISENGINE_h
22#define ABC__OPT__ESLIM__SYNTHESISENGINE_h
25#include <unordered_set>
26#include <unordered_map>
42 template<
class Derived>
43 class exactSynthesisEngine {
59 std::unordered_map<int, std::vector<int>> connection_variables;
60 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs;
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);
69 int findFanin(
Vec_Int_t * vValues,
int i,
int k,
int nof_objs);
72 void generateCNF(
int fOrderNodes,
int fUniqFans);
73 int startEncoding(
int fOrderNodes,
int fUniqFans );
74 void generateMinterm(
int iMint);
76 int getGateEnablingLiteral(
int index,
bool negated);
77 int getAuxilaryVariableCount();
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);
85 int prepareLits(
int * pLits,
int& nLits);
95 const std::unordered_map<
int, std::unordered_set<int>>& forbidden_pairs,
eSLIMLog& log,
const eSLIMConfig& cfg);
99 using exactSynthesisEngine::addClause;
100 std::vector<int> gate_enabling_assumptions;
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);
111 std::vector<int> getAssumptions(
int size);
113 friend exactSynthesisEngine<CadicalEngine>;
124 template <
typename T>
128 const std::unordered_map<
int, std::unordered_set<int>>& forbidden_pairs,
eSLIMLog& log,
const eSLIMConfig& cfg);
132 T getOneshotEngine(
int size);
141 const std::unordered_map<int, std::unordered_set<int>>& forbidden_pairs;
150 const std::unordered_map<
int, std::unordered_set<int>>& forbidden_pairs,
eSLIMLog& log,
const eSLIMConfig& cfg);
154 using exactSynthesisEngine::addClause;
156 int addClause(
int * pLits,
int nLits );
157 Vec_Int_t * solve(
int size,
double timeout);
161 friend exactSynthesisEngine<CadicalEngineOneShot>;
168 const std::unordered_map<
int, std::unordered_set<int>>& forbidden_pairs,
eSLIMLog& log,
const eSLIMConfig& cfg);
172 using exactSynthesisEngine::addClause;
174 int addClause(
int * pLits,
int nLits );
175 Vec_Int_t * solve(
int size,
double timeout);
179 friend exactSynthesisEngine<KissatEngineOneShot>;
187 const std::unordered_map<
int, std::unordered_set<int>>& forbidden_pairs,
eSLIMLog& log,
const eSLIMConfig& cfg);
191 using exactSynthesisEngine::addClause;
194 int addClause(
int * pLits,
int nLits );
195 Vec_Int_t * solve(
int size,
double timeout);
197 FILE * encoding_file;
200 constexpr static char * pFileNameIn =
"_temp_.cnf";
201 constexpr static char * pFileNameOut =
"_temp_out.cnf";
204 constexpr static char * pKissat =
"kissat.exe";
206 constexpr static char * pKissat =
"kissat";
209 friend exactSynthesisEngine<KissatCmdEngine>;
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);
219 template <
typename T>
220 inline int exactSynthesisEngine<T>::getGateEnablingLiteral(
int index,
bool negated) {
221 return static_cast<T*
>(
this)->getGateEnablingLiteralImpl(index, negated);
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();
238#include "synthesisEngine.tpp"
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
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 getAuxilaryVariableCountDerived()
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 ///.
OneshotManager< KissatEngineOneShot > KissatOneShot
OneshotManager< CadicalEngineOneShot > CadicalOneShot
OneshotManager< KissatCmdEngine > KissatCmdOneShot
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.