80 assert( !Ivy_IsComplement(pGhost) );
81 assert( Ivy_ObjIsGhost(pGhost) );
84 pObj = Ivy_ManFetchMemory(
p );
85 assert( Ivy_ObjIsNone(pObj) );
86 pObj->
Id = Vec_PtrSize(
p->vObjs);
87 Vec_PtrPush(
p->vObjs, pObj );
94 if ( Ivy_ObjIsNode(pObj) )
95 pObj->
Level = Ivy_ObjLevelNew(pObj);
96 else if ( Ivy_ObjIsLatch(pObj) )
98 else if ( Ivy_ObjIsOneFanin(pObj) )
99 pObj->
Level = Ivy_ObjFanin0(pObj)->Level;
100 else if ( !Ivy_ObjIsPi(pObj) )
103 if ( Ivy_ObjIsNode(pObj) )
104 pObj->
fPhase = Ivy_ObjFaninPhase(Ivy_ObjChild0(pObj)) & Ivy_ObjFaninPhase(Ivy_ObjChild1(pObj));
105 else if ( Ivy_ObjIsOneFanin(pObj) )
106 pObj->
fPhase = Ivy_ObjFaninPhase(Ivy_ObjChild0(pObj));
108 if ( Ivy_ObjIsNode(pObj) )
109 pObj->
fFailTfo = Ivy_ObjFanin0(pObj)->fFailTfo | Ivy_ObjFanin1(pObj)->fFailTfo;
111 if ( Ivy_ObjIsExor(pObj) )
113 Ivy_ObjFanin0(pObj)->fExFan = 1;
114 Ivy_ObjFanin1(pObj)->fExFan = 1;
117 if ( Ivy_ObjIsPi(pObj) )
118 Vec_PtrPush(
p->vPis, pObj );
119 else if ( Ivy_ObjIsPo(pObj) )
120 Vec_PtrPush(
p->vPos, pObj );
123 if (
p->vRequired && Vec_IntSize(
p->vRequired) <= pObj->
Id )
124 Vec_IntFillExtra(
p->vRequired, 2 * Vec_IntSize(
p->vRequired), 1000000 );
126 p->nObjs[Ivy_ObjType(pObj)]++;
152 assert( !Ivy_IsComplement(pObj) );
153 assert( Ivy_ObjIsPi(pObj) || Ivy_ObjIsOneFanin(pObj) || pFan1 != NULL );
158 if ( Ivy_ObjFanin0(pObj) != NULL )
160 Ivy_ObjRefsInc( Ivy_ObjFanin0(pObj) );
164 if ( Ivy_ObjFanin1(pObj) != NULL )
166 Ivy_ObjRefsInc( Ivy_ObjFanin1(pObj) );
187 assert( !Ivy_IsComplement(pObj) );
188 assert( Ivy_ObjIsPi(pObj) || Ivy_ObjIsOneFanin(pObj) || Ivy_ObjFanin1(pObj) != NULL );
192 Ivy_ObjRefsDec(Ivy_ObjFanin0(pObj));
198 Ivy_ObjRefsDec(Ivy_ObjFanin1(pObj));
227 assert( !Ivy_IsComplement(pObj) );
228 pFaninOld = Ivy_ObjFanin0(pObj);
230 Ivy_ObjRefsDec( pFaninOld );
236 Ivy_ObjRefsInc( Ivy_Regular(pFaninNew) );
240 if ( !Ivy_ObjIsPi(pFaninOld) && !Ivy_ObjIsConst1(pFaninOld) && Ivy_ObjRefs(pFaninOld) == 0 )
257 assert( !Ivy_IsComplement(pObj) );
258 assert( Ivy_ObjRefs(pObj) == 0 || !fFreeTop );
260 p->nObjs[pObj->
Type]--;
265 if ( Ivy_ObjIsPi(pObj) )
266 Vec_PtrRemove(
p->vPis, pObj );
267 else if ( Ivy_ObjIsPo(pObj) )
268 Vec_PtrRemove(
p->vPos, pObj );
269 else if (
p->fFanout && Ivy_ObjIsBuf(pObj) )
270 Vec_PtrRemove(
p->vBufs, pObj );
275 Vec_PtrWriteEntry(
p->vObjs, pObj->
Id, NULL );
276 Ivy_ManRecycleMemory(
p, pObj );
280 int nRefsOld = pObj->
nRefs;
282 Ivy_ObjClean( pObj );
284 pObj->
nRefs = nRefsOld;
302 assert( !Ivy_IsComplement(pObj) );
303 assert( !Ivy_ObjIsNone(pObj) );
304 if ( Ivy_ObjIsConst1(pObj) || Ivy_ObjIsPi(pObj) )
306 pFanin0 = Ivy_ObjFanin0(pObj);
307 pFanin1 = Ivy_ObjFanin1(pObj);
309 if ( pFanin0 && !Ivy_ObjIsNone(pFanin0) && Ivy_ObjRefs(pFanin0) == 0 )
311 if ( pFanin1 && !Ivy_ObjIsNone(pFanin1) && Ivy_ObjRefs(pFanin1) == 0 )
332 assert( !Ivy_IsComplement(pObjOld) );
334 assert( Ivy_ObjIsNone(pObjOld) || !Ivy_ObjIsPi(pObjOld) );
336 assert( !Ivy_ObjIsBuf(Ivy_Regular(pObjNew)) );
338 assert( pObjOld != Ivy_Regular(pObjNew) );
352 if ( Ivy_IsComplement(pObjNew) || Ivy_ObjIsLatch(pObjNew) || Ivy_ObjRefs(pObjNew) > 0 || Ivy_ObjIsPi(pObjNew) || Ivy_ObjIsConst1(pObjNew) )
354 assert( !Ivy_IsComplement(pObjNew) );
359 if (
p->fFanout && !Ivy_ObjIsBuf(pObjNew) && pObjOld->
Level != pObjNew->
Level )
361 assert( Ivy_ObjIsNode(pObjOld) );
370 int ReqNew = Vec_IntEntry(
p->vRequired, pObjOld->
Id);
371 if ( ReqNew < Vec_IntEntry(
p->vRequired, pObjNew->
Id) )
373 Vec_IntWriteEntry(
p->vRequired, pObjNew->
Id, ReqNew );
383 assert( Ivy_ObjFanin0(pObjNew) == NULL || pObjOld != Ivy_ObjFanin0(pObjNew) );
384 assert( Ivy_ObjFanin1(pObjNew) == NULL || pObjOld != Ivy_ObjFanin1(pObjNew) );
393 assert( Ivy_ObjRefs(pObjNew) == 0 );
394 nRefsOld = pObjOld->
nRefs;
395 Ivy_ObjOverwrite( pObjOld, pObjNew );
396 pObjOld->
nRefs = nRefsOld;
401 if ( Ivy_ObjFanin1(pObjOld) )
407 Vec_PtrWriteEntry(
p->vObjs, pObjNew->
Id, NULL );
408 Ivy_ManRecycleMemory(
p, pObjNew );
410 if (
p->fFanout && Ivy_ObjIsBuf(pObjOld) )
411 Vec_PtrPush(
p->vBufs, pObjOld );
444 Ivy_Obj_t * pFanReal0, * pFanReal1, * pResult = NULL;
445 if ( Ivy_ObjIsPo(pNode) )
447 if ( !Ivy_ObjIsBuf(Ivy_ObjFanin0(pNode)) )
454 if ( !Ivy_ObjIsBuf(Ivy_ObjFanin0(pNode)) && !Ivy_ObjIsBuf(Ivy_ObjFanin1(pNode)) )
460 if ( Ivy_ObjIsNode(pNode) )
461 pResult =
Ivy_Oper(
p, pFanReal0, pFanReal1, Ivy_ObjType(pNode) );
462 else if ( Ivy_ObjIsLatch(pNode) )
463 pResult =
Ivy_Latch(
p, pFanReal0, Ivy_ObjInit(pNode) );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Ivy_ObjDelete(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fFreeTop)
void Ivy_ObjDisconnect(Ivy_Man_t *p, Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_ObjCreate(Ivy_Man_t *p, Ivy_Obj_t *pGhost)
Ivy_Obj_t * Ivy_ObjCreatePo(Ivy_Man_t *p, Ivy_Obj_t *pDriver)
void Ivy_ObjReplace(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew, int fDeleteOld, int fFreeTop, int fUpdateLevel)
void Ivy_ObjPatchFanin0(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFaninNew)
ABC_NAMESPACE_IMPL_START Ivy_Obj_t * Ivy_ObjCreatePi(Ivy_Man_t *p)
DECLARATIONS ///.
void Ivy_NodeFixBufferFanins(Ivy_Man_t *p, Ivy_Obj_t *pNode, int fUpdateLevel)
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)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
Ivy_Obj_t * Ivy_Latch(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Init_t Init)
void Ivy_TableInsert(Ivy_Man_t *p, Ivy_Obj_t *pObj)
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 ///.
void Ivy_TableDelete(Ivy_Man_t *p, Ivy_Obj_t *pObj)
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_Obj_t_ Ivy_Obj_t
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_ObjPatchFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFanoutOld, Ivy_Obj_t *pFanoutNew)
void Ivy_ObjAddFanout(Ivy_Man_t *p, Ivy_Obj_t *pObj, Ivy_Obj_t *pFanout)
void Ivy_ManHaigCreateObj(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ObjUpdateLevelR_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int ReqNew)