30#define RW_INT_MAX ABC_INT_MAX
31#define Rw_MaxInt Abc_MaxInt
32#define Rw_MinInt Abc_MinInt
33#define Rw_Var2Lit Abc_Var2Lit
34#define Rw_Lit2Var Abc_Lit2Var
35#define Rw_LitIsCompl Abc_LitIsCompl
36#define Rw_LitNot Abc_LitNot
37#define Rw_LitNotCond Abc_LitNotCond
38#define Rw_LitRegular Abc_LitRegular
41typedef unsigned __int64
word;
43typedef long long unsigned word;
48typedef long long iword;
50#define RW_INT_MAX (2147483647)
51static inline int Rw_MaxInt(
int a,
int b ) {
return a > b ? a : b; }
52static inline int Rw_MinInt(
int a,
int b ) {
return a < b ? a : b; }
54static inline int Rw_Lit2Var(
int Lit ) {
assert(Lit >= 0);
return Lit >> 1; }
56static inline int Rw_LitNot(
int Lit ) {
assert(Lit >= 0);
return Lit ^ 1; }
57static inline int Rw_LitNotCond(
int Lit,
int c ) {
assert(Lit >= 0);
return Lit ^ (int)(c > 0); }
76#if defined __riscv && !defined __riscv_atomic
78static inline int RW_XADD(
int *addr,
int delta) {
83#elif defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32)
85#define RW_XADD(addr, delta) \
86 (int)_InterlockedExchangeAdd( \
87 const_cast<void *>(reinterpret_cast<volatile void *>(addr)), delta)
89#if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__)
90#ifdef __ATOMIC_ACQ_REL
91#define RW_XADD(addr, delta) \
92 __c11_atomic_fetch_add((_Atomic(int) *)(addr), delta, __ATOMIC_ACQ_REL)
94#define RW_XADD(addr, delta) \
95 __atomic_fetch_add((_Atomic(int) *)(addr), delta, 4)
98#if defined __ATOMIC_ACQ_REL && !defined __clang__
100#define RW_XADD(addr, delta) \
101 (int)__atomic_fetch_add((unsigned *)(addr), (unsigned)(delta), \
104#define RW_XADD(addr, delta) \
105 (int)__sync_fetch_and_add((unsigned *)(addr), (unsigned)(delta))
108#elif defined _MSC_VER && !defined RC_INVOKED
109#define RW_XADD(addr, delta) \
110 (int)_InterlockedExchangeAdd((long volatile *)addr, delta)
113static inline int RW_XADD(
int *addr,
int delta) {
120static inline int RW_XADD(
int *addr,
int delta) {
127#define Miaig_CustomForEachConstInput(p, i) for (i = 0; i <= p->nIns; i++)
128#define Miaig_CustomForEachInput(p, i) for (i = 1; i <= p->nIns; i++)
129#define Miaig_CustomForEachNode(p, i) for (i = 1 + p->nIns; i < p->nObjs - p->nOuts; i++)
130#define Miaig_CustomForEachNodeReverse(p, i) for (i = p->nObjs - p->nOuts - 1; i > 1 + p->nIns; i--)
131#define Miaig_CustomForEachInputNode(p, i) for (i = 1; i < p->nObjs - p->nOuts; i++)
132#define Miaig_CustomForEachNodeStart(p, i, s) for (i = s; i < p->nObjs - p->nOuts; i++)
133#define Miaig_CustomForEachOutput(p, i) for (i = p->nObjs - p->nOuts; i < p->nObjs; i++)
134#define Miaig_CustomForEachNodeOutput(p, i) for (i = 1 + p->nIns; i < p->nObjs; i++)
135#define Miaig_CustomForEachNodeOutputStart(p, i, s) for (i = s; i < p->nObjs; i++)
136#define Miaig_CustomForEachObj(p, i) for (i = 0; i < p->nObjs; i++)
137#define Miaig_CustomForEachObjFanin(p, i, iLit, k) Vi_ForEachEntry(&p->pvFans[i], iLit, k)
139#define Miaig_ForEachConstInput(i) for (i = 0; i <= _data->nIns; i++)
140#define Miaig_ForEachInput(i) for (i = 1; i <= _data->nIns; i++)
141#define Miaig_ForEachNode(i) for (i = 1 + _data->nIns; i < _data->nObjs - _data->nOuts; i++)
142#define Miaig_ForEachNodeReverse(i) for (i = _data->nObjs - p->nOuts - 1; i > 1 + _data->nIns; i--)
143#define Miaig_ForEachInputNode(i) for (i = 1; i < _data->nObjs - _data->nOuts; i++)
144#define Miaig_ForEachNodeStart(i, s) for (i = s; i < _data->nObjs - _data->nOuts; i++)
145#define Miaig_ForEachOutput(i) for (i = _data->nObjs - _data->nOuts; i < _data->nObjs; i++)
146#define Miaig_ForEachNodeOutput(i) for (i = 1 + _data->nIns; i < _data->nObjs; i++)
147#define Miaig_ForEachNodeOutputStart(i, s) for (i = s; i < _data->nObjs; i++)
148#define Miaig_ForEachObj(i) for (i = 0; i < _data->nObjs; i++)
149#define Miaig_ForEachObjFanin(i, iLit, k) Vi_ForEachEntry(&_data->pvFans[i], iLit, k)
150#define Miaig_ForEachObjFaninStart(i, iLit, k, s) Vi_ForEachEntryStart(&_data->pvFans[i], iLit, k, s)
152static inline int Rw_Lit2LitV(
int *pMapV2V,
int Lit) {
157static inline int Rw_Lit2LitL(
int *pMapV2L,
int Lit) {
253 int initializeLevels_rec(
int iObj);
254 void initializeLevels(
void);
255 void initializeRefs(
void);
256 void verifyRefs(
void);
257 void initializeTruth(
void);
258 void initializeDists(
void);
261 void markDfs_rec(
int iObj);
263 void markDistanceN_rec(
int iObj,
int n,
int limit);
264 void markDistanceN(
int Obj,
int n);
265 void markCritical(
void);
266 void markCritical_rec(
int iObj);
267 void topoCollect_rec(
int iObj);
268 vi *topoCollect(
void);
269 void reduceFanins(
vi *v);
270 int *createStops(
void);
271 void collectSuper_rec(
int iLit,
int *pStop,
vi *vSuper);
272 int checkConst(
int iObj,
word *pCare,
word *pExc,
int fCheck,
int fVerbose);
273 void truthSimNode(
int i);
274 word *truthSimNodeSubset(
int i,
int m);
275 word *truthSimNodeSubset2(
int i,
vi *vFanins,
int nFanins);
276 void truthUpdate(
vi *vTfo,
word *pExc = NULL,
int fCheck = 0);
277 int computeTfo_rec(
int iObj);
278 vi *computeTfo(
int iObj);
279 word *computeCareSet(
int iObj,
word *pExc = NULL);
280 vi *createRandomOrder(
void);
281 void addPair(
vi *vPair,
int iFan1,
int iFan2);
282 int findPair(
vi *vPair);
283 int updateFanins(
vi *vFans,
int iFan1,
int iFan2,
int iLit);
284 void extractBest(
vi *vPairs);
286 int findShared(
int nNewNodesMax);
287 int hashTwo(
int l0,
int l1,
int TableSize);
288 int *hashLookup(
int *pTable,
int l0,
int l1,
int TableSize);
291 float countAnd2(
int reset = 0,
int fDummy = 0);
297 void dupDfs_rec(
Miaig &pNew,
int iObj);
298 int buildNodeBalance_rec(
Miaig &pNew,
vi *vFanins,
int begin,
int end,
int fCprop,
int fStrash);
301 int buildNode(
int l0,
int l1,
int fCprop,
int fStrash);
302 int buildNodeBalance(
Miaig &pNew,
vi *vFanins,
int fCprop,
int fStrash);
303 int buildNodeCascade(
Miaig &pNew,
vi *vFanins,
int fCprop,
int fStrash);
306 int expandOne(
int iObj,
int nAddedMax,
int nDist,
int nExpandableLevel,
word *pExc,
int fCheck,
int fVerbose);
307 int reduceOne(
int iObj,
int fOnlyConst,
int fOnlyBuffer,
int fHeuristic,
word *pExc,
int fCheck,
int fVerbose);
308 int expandThenReduceOne(
int iNode,
int nFaninAddLimit,
int nDist,
int nExpandableLevel,
word *pExc,
int fCheck,
int fVerbose);
311 Miaig dup(
int fRemDangle,
int fMapped = 0);
315 Miaig expand(
int nFaninAddLimitAll,
int nDist,
int nExpandableLevel,
word *pExc,
int fCheck,
int nVerbose);
319 Miaig expandShareReduce(
int nFaninAddLimitAll,
int nDivs,
int nDist,
int nExpandableLevel,
word *pExc,
int fCheck,
int nVerbose);
320 Miaig rewire(
int nIters,
float levelGrowRatio,
int nExpands,
int nGrowth,
int nDivs,
int nFaninMax,
int nTimeOut,
int nMode,
int nMappedMode,
int nDist,
int fCheck,
Gia_ChMan_t *pChMan,
int nVerbose);
333 : _refcount(nullptr), _data(nullptr) {
349 Mini_AigStop(pMiniAig);
362 : _refcount(m._refcount), _data(m._data) {
372 RW_XADD(m._refcount, 1);
377 _refcount = m._refcount;
385 RW_XADD(_refcount, 1);
390 if (_refcount && RW_XADD(_refcount, -1) == 1) {
392 if (_data->pName)
free(_data->pName);
393 for (
int i = 0; i < _data->nObjsAlloc; ++i)
394 if (_data->pvFans[i].ptr)
395 free(_data->pvFans[i].ptr);
397 Vi_Free(_data->vOrder);
398 Vi_Free(_data->vOrderF);
399 Vi_Free(_data->vOrderF2);
400 Vi_Free(_data->vTfo);
401 free(_data->pTravIds);
404 free(_data->pTruths[0]);
405 if (_data->pCare)
free(_data->pCare);
406 if (_data->pProd)
free(_data->pProd);
407 if (_data->pExc)
free(_data->pExc);
408 if (_data->pLevel)
free(_data->pLevel);
409 if (_data->pDist)
free(_data->pDist);
410 if (_data->pTable)
free(_data->pTable);
411 if (_data->pNtkMapped) Vi_Free(_data->pNtkMapped);
421 return (_data == m._data);
437 return _data->nObjsAlloc;
441 return i > 0 && i <=
nIns();
485 return _data->pLevel[i];
489 return _data->pRefs[i];
493 return _data->pTravIds[i];
497 return _data->pCopy[i];
501 return _data->pDist[i];
505 return _data->nTravIds;
509 return _data->nWords;
525 Level = compareFunc(Level,
objLevel(i));
531 return _data->pTruths[n] +
nWords() * i;
535 return _data->pvFans + i;
struct Abc_Ntk_t_ Abc_Ntk_t
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
void derefObj_rec(int iObj, int iLitSkip)
Miaig dup(int fRemDangle, int fMapped=0)
Miaig share(int nNewNodesMax)
int fromGia(Gia_Man_t *pGia)
word * objTruth(int i, int n)
int countLevel(int min=0)
void appendFanin(int i, int iLit)
Mini_Aig_t * toMiniAig(void)
float countAnd2(int reset=0, int fDummy=0)
Miaig expandShareReduce(int nFaninAddLimitAll, int nDivs, int nDist, int nExpandableLevel, word *pExc, int fCheck, int nVerbose)
bool operator==(const Miaig &m) const
Miaig expandThenReduce(int nFaninAddLimit, int nDist, int nExpandableLevel, word *pExc, int fCheck, int fVerbose)
Miaig rewire(int nIters, float levelGrowRatio, int nExpands, int nGrowth, int nDivs, int nFaninMax, int nTimeOut, int nMode, int nMappedMode, int nDist, int fCheck, Gia_ChMan_t *pChMan, int nVerbose)
void setExc(Gia_Man_t *pExc)
Abc_Ntk_t * toNtk(int fMapped=0)
Miaig dupMulti(int nFaninMax_, int nGrowth)
int fromMiniAig(Mini_Aig_t *pMiniAig)
void setName(char *pName)
Miaig & operator=(const Miaig &m)
Miaig dupStrash(int fCprop, int fStrash, int fCascade)
float countTransistors(int reset=0, int nMode=0)
struct Gia_Man_t_ Gia_Man_t
struct Gia_ChMan_t_ Gia_ChMan_t
unsigned __int64 word
DECLARATIONS ///.
struct Mini_Aig_t_ Mini_Aig_t
BASIC TYPES ///.
Mini_Aig_t * Abc_ManRewireMiniAigFromNtk(Abc_Ntk_t *pNtk)
#define Miaig_ForEachOutput(i)
#define Miaig_ForEachNode(i)