21#ifndef ABC__aig__ivy__ivy_h
22#define ABC__aig__ivy__ivy_h
152#define IVY_CUT_LIMIT 256
153#define IVY_CUT_INPUT 6
175#define IVY_LEAF_MASK 255
176#define IVY_LEAF_BITS 8
182#define IVY_MIN(a,b) (((a) < (b))? (a) : (b))
183#define IVY_MAX(a,b) (((a) > (b))? (a) : (b))
187static inline int Ivy_BitWordNum(
int nBits ) {
return (nBits>>5) + ((nBits&31) > 0); }
188static inline int Ivy_TruthWordNum(
int nVars ) {
return nVars <= 5 ? 1 : (1 << (nVars - 5)); }
189static inline int Ivy_InfoHasBit(
unsigned *
p,
int i ) {
return (
p[(i)>>5] & (1<<((i) & 31))) > 0; }
190static inline void Ivy_InfoSetBit(
unsigned *
p,
int i ) {
p[(i)>>5] |= (1<<((i) & 31)); }
191static inline void Ivy_InfoXorBit(
unsigned *
p,
int i ) {
p[(i)>>5] ^= (1<<((i) & 31)); }
196static inline int Ivy_IsComplement(
Ivy_Obj_t *
p ) {
return (
int)((ABC_PTRUINT_T)(
p) & 01); }
205static inline Ivy_Edge_t Ivy_EdgeCreate(
int Id,
int fCompl ) {
return (Id << 1) | fCompl; }
206static inline int Ivy_EdgeId(
Ivy_Edge_t Edge ) {
return Edge >> 1; }
207static inline int Ivy_EdgeIsComplement(
Ivy_Edge_t Edge ) {
return Edge & 1; }
211static inline Ivy_Edge_t Ivy_EdgeFromNode(
Ivy_Obj_t * pNode ) {
return Ivy_EdgeCreate( Ivy_Regular(pNode)->Id, Ivy_IsComplement(pNode) ); }
212static inline Ivy_Obj_t * Ivy_EdgeToNode(
Ivy_Man_t *
p,
Ivy_Edge_t Edge ){
return Ivy_NotCond( Ivy_ManObj(
p, Ivy_EdgeId(Edge)), Ivy_EdgeIsComplement(Edge) ); }
214static inline int Ivy_LeafCreate(
int Id,
int Lat ) {
return (Id <<
IVY_LEAF_BITS) | Lat; }
215static inline int Ivy_LeafId(
int Leaf ) {
return Leaf >>
IVY_LEAF_BITS; }
216static inline int Ivy_LeafLat(
int Leaf ) {
return Leaf &
IVY_LEAF_MASK; }
225static inline int Ivy_ManObjNum(
Ivy_Man_t *
p ) {
return p->nCreated -
p->nDeleted; }
226static inline int Ivy_ManObjIdMax(
Ivy_Man_t *
p ) {
return Vec_PtrSize(
p->vObjs)-1; }
233static inline int Ivy_ObjIsConst1(
Ivy_Obj_t * pObj ) {
return pObj->
Id == 0; }
234static inline int Ivy_ObjIsGhost(
Ivy_Obj_t * pObj ) {
return pObj->
Id < 0; }
250static inline int Ivy_ObjIsMarkA(
Ivy_Obj_t * pObj ) {
return pObj->
fMarkA; }
251static inline void Ivy_ObjSetMarkA(
Ivy_Obj_t * pObj ) { pObj->
fMarkA = 1; }
252static inline void Ivy_ObjClearMarkA(
Ivy_Obj_t * pObj ) { pObj->
fMarkA = 0; }
254static inline void Ivy_ObjSetTravId(
Ivy_Obj_t * pObj,
int TravId ) { pObj->
TravId = TravId; }
257static inline int Ivy_ObjIsTravIdCurrent(
Ivy_Man_t *
p,
Ivy_Obj_t * pObj ) {
return (
int )((int)pObj->
TravId ==
p->nTravIds); }
258static inline int Ivy_ObjIsTravIdPrevious(
Ivy_Man_t *
p,
Ivy_Obj_t * pObj ) {
return (
int )((int)pObj->
TravId ==
p->nTravIds - 1); }
260static inline int Ivy_ObjId(
Ivy_Obj_t * pObj ) {
return pObj->
Id; }
261static inline int Ivy_ObjTravId(
Ivy_Obj_t * pObj ) {
return pObj->
TravId; }
262static inline int Ivy_ObjPhase(
Ivy_Obj_t * pObj ) {
return pObj->
fPhase; }
263static inline int Ivy_ObjExorFanout(
Ivy_Obj_t * pObj ) {
return pObj->
fExFan; }
264static inline int Ivy_ObjRefs(
Ivy_Obj_t * pObj ) {
return pObj->
nRefs; }
265static inline void Ivy_ObjRefsInc(
Ivy_Obj_t * pObj ) { pObj->
nRefs++; }
267static inline int Ivy_ObjFaninId0(
Ivy_Obj_t * pObj ) {
return pObj->
pFanin0? Ivy_ObjId(Ivy_Regular(pObj->
pFanin0)) : 0; }
268static inline int Ivy_ObjFaninId1(
Ivy_Obj_t * pObj ) {
return pObj->
pFanin1? Ivy_ObjId(Ivy_Regular(pObj->
pFanin1)) : 0; }
269static inline int Ivy_ObjFaninC0(
Ivy_Obj_t * pObj ) {
return Ivy_IsComplement(pObj->
pFanin0); }
270static inline int Ivy_ObjFaninC1(
Ivy_Obj_t * pObj ) {
return Ivy_IsComplement(pObj->
pFanin1); }
275static inline Ivy_Obj_t * Ivy_ObjChild0Equiv(
Ivy_Obj_t * pObj ) {
assert( !Ivy_IsComplement(pObj) );
return Ivy_ObjFanin0(pObj)? Ivy_NotCond(Ivy_ObjFanin0(pObj)->pEquiv, Ivy_ObjFaninC0(pObj)) : NULL; }
276static inline Ivy_Obj_t * Ivy_ObjChild1Equiv(
Ivy_Obj_t * pObj ) {
assert( !Ivy_IsComplement(pObj) );
return Ivy_ObjFanin1(pObj)? Ivy_NotCond(Ivy_ObjFanin1(pObj)->pEquiv, Ivy_ObjFaninC1(pObj)) : NULL; }
277static inline Ivy_Obj_t * Ivy_ObjEquiv(
Ivy_Obj_t * pObj ) {
return Ivy_Regular(pObj)->pEquiv? Ivy_NotCond(Ivy_Regular(pObj)->pEquiv, Ivy_IsComplement(pObj)) : NULL; }
278static inline int Ivy_ObjLevel(
Ivy_Obj_t * pObj ) {
return pObj->
Level; }
279static inline int Ivy_ObjLevelNew(
Ivy_Obj_t * pObj ) {
return 1 + Ivy_ObjIsExor(pObj) +
IVY_MAX(Ivy_ObjFanin0(pObj)->Level, Ivy_ObjFanin1(pObj)->Level); }
280static inline int Ivy_ObjFaninPhase(
Ivy_Obj_t * pObj ) {
return Ivy_IsComplement(pObj)? !Ivy_Regular(pObj)->fPhase : pObj->
fPhase; }
282static inline void Ivy_ObjClean(
Ivy_Obj_t * pObj )
284 int IdSaved = pObj->
Id;
290 int IdSaved = pBase->
Id;
296 if ( Ivy_ObjFanin0(pObj) == pFanin )
return 0;
297 if ( Ivy_ObjFanin1(pObj) == pFanin )
return 1;
302 if ( Ivy_ObjFanin0(pFanout) == pObj )
return Ivy_ObjFaninC0(pObj);
303 if ( Ivy_ObjFanin1(pFanout) == pObj )
return Ivy_ObjFaninC1(pObj);
311 assert( Type !=
IVY_AND || !Ivy_ObjIsConst1(Ivy_Regular(p0)) );
312 assert( p1 == NULL || !Ivy_ObjIsConst1(Ivy_Regular(p1)) );
313 assert( Type ==
IVY_PI || Ivy_Regular(p0) != Ivy_Regular(p1) );
316 pGhost = Ivy_ManGhost(
p);
321 if ( p1 && Ivy_ObjFaninId0(pGhost) > Ivy_ObjFaninId1(pGhost) )
367 if (
p->pListFree == NULL )
369 pTemp =
p->pListFree;
378 p->pListFree = pEntry;
387#define Ivy_ManForEachPi( p, pObj, i ) \
388 Vec_PtrForEachEntry( Ivy_Obj_t *, p->vPis, pObj, i )
390#define Ivy_ManForEachPo( p, pObj, i ) \
391 Vec_PtrForEachEntry( Ivy_Obj_t *, p->vPos, pObj, i )
393#define Ivy_ManForEachObj( p, pObj, i ) \
394 Vec_PtrForEachEntry( Ivy_Obj_t *, p->vObjs, pObj, i ) if ( (pObj) == NULL ) {} else
396#define Ivy_ManForEachCi( p, pObj, i ) \
397 Ivy_ManForEachObj( p, pObj, i ) if ( !Ivy_ObjIsCi(pObj) ) {} else
399#define Ivy_ManForEachCo( p, pObj, i ) \
400 Ivy_ManForEachObj( p, pObj, i ) if ( !Ivy_ObjIsCo(pObj) ) {} else
402#define Ivy_ManForEachNode( p, pObj, i ) \
403 Ivy_ManForEachObj( p, pObj, i ) if ( !Ivy_ObjIsNode(pObj) ) {} else
405#define Ivy_ManForEachLatch( p, pObj, i ) \
406 Ivy_ManForEachObj( p, pObj, i ) if ( !Ivy_ObjIsLatch(pObj) ) {} else
408#define Ivy_ManForEachNodeVec( p, vIds, pObj, i ) \
409 for ( i = 0; i < Vec_IntSize(vIds) && ((pObj) = Ivy_ManObj(p, Vec_IntEntry(vIds,i))); i++ )
411#define Ivy_ObjForEachFanout( p, pObj, vArray, pFanout, i ) \
412 for ( i = 0, Ivy_ObjCollectFanouts(p, pObj, vArray); \
413 i < Vec_PtrSize(vArray) && ((pFanout) = (Ivy_Obj_t *)Vec_PtrEntry(vArray,i)); i++ )
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Ivy_MultiPlus(Ivy_Man_t *p, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vCone, Ivy_Type_t Type, int nLimit, Vec_Ptr_t *vSol)
FUNCTION DEFINITIONS ///.
Ivy_Man_t * Ivy_ManResyn0(Ivy_Man_t *p, int fUpdateLevel, int fVerbose)
DECLARATIONS ///.
Ivy_Man_t * Ivy_FraigPerform(Ivy_Man_t *pManAig, Ivy_FraigParams_t *pParams)
void Ivy_ManStopMemory(Ivy_Man_t *p)
Vec_Int_t * Ivy_ManLatches(Ivy_Man_t *p)
int Ivy_ManCheck(Ivy_Man_t *p)
DECLARATIONS ///.
struct Ivy_Cut_t_ Ivy_Cut_t
int Ivy_ObjMffcLabel(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_Multi_rec(Ivy_Man_t *p, Ivy_Obj_t **ppObjs, int nObjs, Ivy_Type_t Type)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
int Ivy_ManCheckFanouts(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_NodeBalanceBuildSuper(Ivy_Man_t *p, Vec_Ptr_t *vSuper, Ivy_Type_t Type, int fUpdateLevel)
void Ivy_TruthDsdPrint(FILE *pFile, Vec_Int_t *vTree)
Ivy_Obj_t * Ivy_MultiBalance_rec(Ivy_Man_t *p, Ivy_Obj_t **pArgs, int nArgs, Ivy_Type_t Type)
void Ivy_ObjDelete(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
Vec_Int_t * Ivy_ManRequiredLevels(Ivy_Man_t *p)
int Ivy_ManRewriteSeq(Ivy_Man_t *p, int fUseZeroCost, int fVerbose)
FUNCTION DEFINITIONS ///.
int Ivy_CutTruthPrint(Ivy_Man_t *p, Ivy_Cut_t *pCut, unsigned uTruth)
void Ivy_ManIncrementTravId(Ivy_Man_t *p)
DECLARATIONS ///.
Ivy_Obj_t * Ivy_Multi1(Ivy_Man_t *p, Ivy_Obj_t **pArgs, int nArgs, Ivy_Type_t Type)
void Ivy_FastMapStop(Ivy_Man_t *pAig)
Ivy_Obj_t * Ivy_Multi(Ivy_Man_t *p, Ivy_Obj_t **pArgs, int nArgs, Ivy_Type_t Type)
Ivy_Obj_t * Ivy_Mux(Ivy_Man_t *p, Ivy_Obj_t *pC, Ivy_Obj_t *p1, Ivy_Obj_t *p0)
void Ivy_ManMakeSeq(Ivy_Man_t *p, int nLatches, int *pInits)
void Ivy_ObjDisconnect(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_Latch(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Init_t Init)
Ivy_Obj_t * Ivy_CanonAnd(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
void Ivy_TableInsert(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ManHaigSimulate(Ivy_Man_t *p)
void Ivy_ManShow(Ivy_Man_t *pMan, int fHaig, Vec_Ptr_t *vBold)
FUNCTION DEFINITIONS ///.
Ivy_Man_t * Ivy_ManRwsat(Ivy_Man_t *pMan, int fVerbose)
int Ivy_ManIsAcyclic(Ivy_Man_t *p)
void Ivy_ManHaigTrasfer(Ivy_Man_t *p, Ivy_Man_t *pNew)
void Ivy_ObjDeleteFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFanout)
Ivy_Obj_t * Ivy_TableLookup(Ivy_Man_t *p, Ivy_Obj_t *pObj)
FUNCTION DEFINITIONS ///.
Ivy_Man_t * Ivy_ManResyn(Ivy_Man_t *p, int fUpdateLevel, int fVerbose)
void Ivy_ManAddMemory(Ivy_Man_t *p)
void Ivy_ManResetLevels(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_Exor(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
int Ivy_ManCleanup(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_ObjCreate(Ivy_Man_t *p, Ivy_Obj_t *pGhost)
Vec_Int_t * Ivy_ManDfsSeq(Ivy_Man_t *p, Vec_Int_t **pvLatches)
Ivy_Obj_t * Ivy_CanonLatch(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Init_t Init)
Ivy_Man_t * Ivy_ManStart()
DECLARATIONS ///.
void Ivy_FastMapReverseLevel(Ivy_Man_t *pAig)
void Ivy_TableDelete(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_FraigParamsDefault(Ivy_FraigParams_t *pParams)
FUNCTION DEFINITIONS ///.
Ivy_Obj_t * Ivy_ObjCreatePo(Ivy_Man_t *p, Ivy_Obj_t *pDriver)
struct Ivy_Store_t_ Ivy_Store_t
Ivy_Obj_t * Ivy_ObjReal(Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_Oper(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1, Ivy_Type_t Type)
FUNCTION DEFINITIONS ///.
void Ivy_TableUpdate(Ivy_Man_t *p, Ivy_Obj_t *pObj, int ObjIdNew)
struct Ivy_FraigParams_t_ Ivy_FraigParams_t
Ivy_Obj_t * Ivy_Maj(Ivy_Man_t *p, Ivy_Obj_t *pA, Ivy_Obj_t *pB, Ivy_Obj_t *pC)
int Ivy_TruthDsd(unsigned uTruth, Vec_Int_t *vTree)
FUNCTION DEFINITIONS ///.
Vec_Int_t * Ivy_ManDfs(Ivy_Man_t *p)
void Ivy_ManStop(Ivy_Man_t *p)
struct Ivy_Obj_t_ Ivy_Obj_t
Ivy_Obj_t * Ivy_Or(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
void Ivy_ObjReplace(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew, int fDeleteOld, int fFreeTop, int fUpdateLevel)
Ivy_Obj_t * Ivy_Miter(Ivy_Man_t *p, Vec_Ptr_t *vPairs)
void Ivy_ManHaigStop(Ivy_Man_t *p)
int Ivy_ObjIsMuxType(Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_ObjRecognizeMux(Ivy_Obj_t *pObj, Ivy_Obj_t **ppObjT, Ivy_Obj_t **ppObjE)
void Ivy_ManHaigStart(Ivy_Man_t *p, int fVerbose)
FUNCTION DEFINITIONS ///.
void Ivy_ManPrintStats(Ivy_Man_t *p)
int Ivy_ManPropagateBuffers(Ivy_Man_t *p, int fUpdateLevel)
Ivy_Obj_t * Ivy_ManDsdConstruct(Ivy_Man_t *p, Vec_Int_t *vFront, Vec_Int_t *vTree)
unsigned * Ivy_ManCutTruth(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Int_t *vLeaves, Vec_Int_t *vNodes, Vec_Int_t *vTruth)
int Ivy_ManSeqRewrite(Ivy_Man_t *p, int fUpdateLevel, int fUseZeroCost)
Ivy_Obj_t * Ivy_CanonExor(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
void Ivy_ManPrintVerbose(Ivy_Man_t *p, int fHaig)
Vec_Vec_t * Ivy_ManLevelize(Ivy_Man_t *p)
void Ivy_TableProfile(Ivy_Man_t *p)
void Ivy_ManCollectCut(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Int_t *vLeaves, Vec_Int_t *vNodes)
int Ivy_ManRewriteAlg(Ivy_Man_t *p, int fUpdateLevel, int fUseZeroCost)
FUNCTION DEFINITIONS ///.
int Ivy_ManCheckFanoutNums(Ivy_Man_t *p)
Ivy_Man_t * Ivy_ManStartFrom(Ivy_Man_t *p)
int Ivy_ObjFanoutNum(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ObjPatchFanin0(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFaninNew)
void Ivy_ManHaigCreateChoice(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew)
void Ivy_ObjUpdateLevel_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ManSeqFindCut(Ivy_Man_t *p, Ivy_Obj_t *pNode, Vec_Int_t *vFront, Vec_Int_t *vInside, int nSize)
Ivy_Man_t * Ivy_ManFrames(Ivy_Man_t *pMan, int nLatches, int nFrames, int fInit, Vec_Ptr_t **pvMapping)
Ivy_Store_t * Ivy_NodeFindCutsAll(Ivy_Man_t *p, Ivy_Obj_t *pObj, int nLeaves)
void Ivy_ManStartMemory(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
Ivy_Obj_t * Ivy_ObjCreatePi(Ivy_Man_t *p)
DECLARATIONS ///.
void Ivy_ObjCollectFanouts(Ivy_Man_t *p, Ivy_Obj_t *pObj, Vec_Ptr_t *vArray)
void Ivy_FastMapReadSupp(Ivy_Man_t *pAig, Ivy_Obj_t *pObj, Vec_Int_t *vLeaves)
int Ivy_ManRewritePre(Ivy_Man_t *p, int fUpdateLevel, int fUseZeroCost, int fVerbose)
FUNCTION DEFINITIONS ///.
void Ivy_ObjPrintVerbose(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fHaig)
void Ivy_FastMapPerform(Ivy_Man_t *pAig, int nLimit, int fRecovery, int fVerbose)
FUNCTION DEFINITIONS ///.
void Ivy_ManStopFanout(Ivy_Man_t *p)
unsigned Ivy_TruthDsdCompute(Vec_Int_t *vTree)
void Ivy_TruthDsdComputePrint(unsigned uTruth)
void Ivy_ManCleanTravId(Ivy_Man_t *p)
void Ivy_ObjPatchFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFanoutOld, Ivy_Obj_t *pFanoutNew)
int Ivy_ManSetLevels(Ivy_Man_t *p, int fHaig)
void Ivy_ObjAddFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFanout)
Ivy_Obj_t * Ivy_ObjReadFirstFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_NodeFixBufferFanins(Ivy_Man_t *p, Ivy_Obj_t *pNode, int fUpdateLevel)
int Ivy_TableCountEntries(Ivy_Man_t *p)
void Ivy_ManStartFanout(Ivy_Man_t *p)
FUNCTION DEFINITIONS ///.
void Ivy_ObjDelete_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
void Ivy_ObjConnect(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFan0, Ivy_Obj_t *pFan1)
void Ivy_ManHaigCreateObj(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Ivy_Man_t * Ivy_ManBalance(Ivy_Man_t *p, int fUpdateLevel)
FUNCTION DECLARATIONS ///.
void Ivy_ObjUpdateLevelR_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int ReqNew)
Ivy_Man_t * Ivy_FraigMiter(Ivy_Man_t *pManAig, Ivy_FraigParams_t *pParams)
void Ivy_ManCollectCone(Ivy_Obj_t *pObj, Vec_Ptr_t *vFront, Vec_Ptr_t *vCone)
void Ivy_ManHaigPostprocess(Ivy_Man_t *p, int fVerbose)
Ivy_Man_t * Ivy_ManDup(Ivy_Man_t *p)
int Ivy_ManCheckChoices(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_And(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
int Ivy_FraigProve(Ivy_Man_t **ppManAig, void *pPars)
int Ivy_ManLevels(Ivy_Man_t *p)
int pArray[IVY_CUT_INPUT]
Ivy_Cut_t pCuts[IVY_CUT_LIMIT]
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.