47 if ( Ivy_ObjIsMarkA(pObj) )
49 Ivy_ObjSetMarkA(pObj);
50 if ( Ivy_ObjIsConst1(pObj) || Ivy_ObjIsCi(pObj) )
52 if (
p->pHaig == NULL && pObj->
pEquiv )
63 assert( Ivy_ObjIsBuf(pObj) || Ivy_ObjIsAnd(pObj) || Ivy_ObjIsExor(pObj) );
65 if ( !Ivy_ObjIsBuf(pObj) )
67 if (
p->pHaig == NULL && pObj->
pEquiv )
69 Vec_IntPush( vNodes, pObj->
Id );
92 assert( Ivy_ManLatchNum(
p) == 0 );
97 vNodes = Vec_IntAlloc( Ivy_ManNodeNum(
p) );
104 Ivy_ObjClearMarkA(pObj);
106 assert( Vec_IntSize(vNodes) == Ivy_ManNodeNum(
p) + Ivy_ManBufNum(
p) );
131 vLatches = Vec_IntAlloc( Ivy_ManLatchNum(
p) );
133 Vec_IntPush( vLatches, pObj->
Id );
135 vNodes = Vec_IntAlloc( Ivy_ManNodeNum(
p) );
144 Ivy_ObjClearMarkA(pObj);
150 if ( pvLatches == NULL )
151 Vec_IntFree( vLatches );
153 *pvLatches = vLatches;
172 if ( Ivy_ObjIsBuf(pObj) )
175 Vec_PtrPush( vCone, pObj );
178 assert( Ivy_ObjIsNode(pObj) );
181 Vec_PtrPushUnique( vCone, pObj );
199 assert( !Ivy_IsComplement(pObj) );
200 assert( Ivy_ObjIsNode(pObj) );
203 Ivy_Regular(pTemp)->fMarkA = 1;
206 Vec_PtrClear( vCone );
210 Ivy_Regular(pTemp)->fMarkA = 0;
229 vNodes = Vec_VecAlloc( 100 );
232 assert( !Ivy_ObjIsBuf(pObj) );
233 if ( Ivy_ObjIsNode(pObj) )
234 Vec_VecPush( vNodes, pObj->
Level, pObj );
255 int i, k, Level, LevelMax;
256 assert(
p->vRequired == NULL );
258 vLevelsR = Vec_IntStart( Ivy_ManObjIdMax(
p) + 1 );
263 Level = Vec_IntEntry( vLevelsR, pObj->
Id ) + 1 + Ivy_ObjIsExor(pObj);
264 if ( Vec_IntEntry( vLevelsR, Ivy_ObjFaninId0(pObj) ) < Level )
265 Vec_IntWriteEntry( vLevelsR, Ivy_ObjFaninId0(pObj), Level );
266 if ( Vec_IntEntry( vLevelsR, Ivy_ObjFaninId1(pObj) ) < Level )
267 Vec_IntWriteEntry( vLevelsR, Ivy_ObjFaninId1(pObj), Level );
269 Vec_VecFree( vNodes );
275 Level = Vec_IntEntry( vLevelsR, pObj->
Id );
276 Vec_IntWriteEntry( vLevelsR, pObj->
Id, LevelMax - Level );
279 p->vRequired = vLevelsR;
297 if ( Ivy_ObjIsTravIdPrevious(
p, pObj) )
300 if ( Ivy_ObjIsTravIdCurrent(
p, pObj) )
302 fprintf( stdout,
"Manager contains combinational loop!\n" );
303 fprintf( stdout,
"Node \"%d\" is encountered twice on the following path:\n", Ivy_ObjId(pObj) );
304 fprintf( stdout,
" %d", Ivy_ObjId(pObj) );
308 Ivy_ObjSetTravIdCurrent(
p, pObj );
310 if (
p->pHaig == NULL && pObj->
pEquiv && Ivy_ObjRefs(pObj) > 0 )
314 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
320 fprintf( stdout,
" -> (%d", Ivy_ObjId(pObj) );
321 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
322 fprintf( stdout,
" %d", Ivy_ObjId(pTemp) );
323 fprintf( stdout,
")" );
329 if ( Ivy_ObjIsCi(pObj) || Ivy_ObjIsConst1(pObj) )
332 Ivy_ObjSetTravIdPrevious(
p, pObj );
335 assert( Ivy_ObjIsNode(pObj) || Ivy_ObjIsBuf(pObj) );
340 fprintf( stdout,
" -> %d", Ivy_ObjId(pObj) );
347 fprintf( stdout,
" -> %d", Ivy_ObjId(pObj) );
351 Ivy_ObjSetTravIdPrevious(
p, pObj );
391 fprintf( stdout,
" (cone of %s \"%d\")\n", Ivy_ObjIsLatch(pObj)?
"latch" :
"PO", Ivy_ObjId(pObj) );
411 if ( Ivy_ObjIsMarkA(pObj) )
413 Ivy_ObjSetMarkA(pObj);
415 if ( Ivy_ObjIsConst1(pObj) || Ivy_ObjIsCi(pObj) )
417 assert( Ivy_ObjIsBuf(pObj) || Ivy_ObjIsAnd(pObj) || Ivy_ObjIsExor(pObj) );
420 if ( !Ivy_ObjIsBuf(pObj) )
423 if ( Ivy_ObjIsBuf(pObj) )
424 pObj->
Level = 1 + Ivy_ObjFanin0(pObj)->Level;
425 else if ( Ivy_ObjIsNode(pObj) )
426 pObj->
Level = Ivy_ObjLevelNew( pObj );
429 if ( fHaig && pObj->
pEquiv && Ivy_ObjRefs(pObj) > 0 )
432 unsigned LevelMax = pObj->
Level;
433 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
439 pObj->
Level = LevelMax;
440 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
441 pTemp->
Level = LevelMax;
466 printf(
"CI %d has a choice, which will not be visualized.\n", pObj->
Id );
476 LevelMax =
IVY_MAX( LevelMax, (
int)Ivy_ObjFanin0(pObj)->Level );
480 if ( (Ivy_ObjIsNode(pObj) || Ivy_ObjIsBuf(pObj)) && Ivy_ObjRefs(pObj) == 0 )
487 Ivy_ObjClearMarkA(pObj);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Vec_Int_t * Ivy_ManRequiredLevels(Ivy_Man_t *p)
int Ivy_ManIsAcyclic_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ManCollectCone_rec(Ivy_Obj_t *pObj, Vec_Ptr_t *vCone)
int Ivy_ManSetLevels_rec(Ivy_Obj_t *pObj, int fHaig)
int Ivy_ManIsAcyclic(Ivy_Man_t *p)
Vec_Int_t * Ivy_ManDfsSeq(Ivy_Man_t *p, Vec_Int_t **pvLatches)
ABC_NAMESPACE_IMPL_START void Ivy_ManDfs_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, Vec_Int_t *vNodes)
DECLARATIONS ///.
Vec_Int_t * Ivy_ManDfs(Ivy_Man_t *p)
Vec_Vec_t * Ivy_ManLevelize(Ivy_Man_t *p)
int Ivy_ManSetLevels(Ivy_Man_t *p, int fHaig)
void Ivy_ManCollectCone(Ivy_Obj_t *pObj, Vec_Ptr_t *vFront, Vec_Ptr_t *vCone)
#define Ivy_ManForEachCo(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
void Ivy_ManIncrementTravId(Ivy_Man_t *p)
DECLARATIONS ///.
#define Ivy_ManForEachLatch(p, pObj, i)
#define Ivy_ManForEachObj(p, pObj, i)
#define Ivy_ManForEachPo(p, pObj, i)
struct Ivy_Obj_t_ Ivy_Obj_t
#define Ivy_ManForEachCi(p, pObj, i)
#define Ivy_ManForEachNodeVec(p, vIds, pObj, i)
int Ivy_ManLevels(Ivy_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachEntryReverseReverse(Type, vGlob, pEntry, i, k)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.