49 assert( !Ivy_IsComplement(pObj) );
51 if ( pObj->
pEquiv == NULL || Ivy_ObjRefs(pObj) > 0 )
55 for ( pTemp = Ivy_Regular(pObj->
pEquiv); pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
56 if ( Ivy_ObjRefs(pTemp) > 0 )
59 assert( Ivy_ObjRefs(pTemp) > 0 );
60 return Ivy_NotCond( pTemp, Ivy_IsComplement(pObj->
pEquiv) );
64static inline int Ivy_HaigObjCountClass(
Ivy_Obj_t * pObj )
68 assert( !Ivy_IsComplement(pObj) );
69 assert( Ivy_ObjRefs(pObj) > 0 );
70 if ( pObj->
pEquiv == NULL )
74 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
104 printf(
"Starting : " );
109 vLatches = Vec_IntAlloc( 100 );
113 Vec_IntPush( vLatches, pObj->
Id );
115 p->pHaig->pData = vLatches;
142 Ivy_ManConst1(pNew)->pEquiv = Ivy_ManConst1(
p)->pEquiv;
145 pNew->pHaig =
p->pHaig;
187 assert( !Ivy_IsComplement(pObj) );
188 if ( Ivy_ObjType(pObj) ==
IVY_BUF )
189 pObj->
pEquiv = Ivy_ObjChild0Equiv(pObj);
190 else if ( Ivy_ObjType(pObj) ==
IVY_LATCH )
193 pEquiv0 = Ivy_ObjChild0Equiv(pObj);
194 pEquiv0 = Ivy_NotCond( Ivy_HaigObjRepr(Ivy_Regular(pEquiv0)), Ivy_IsComplement(pEquiv0) );
197 else if ( Ivy_ObjType(pObj) ==
IVY_AND )
200 pEquiv0 = Ivy_ObjChild0Equiv(pObj);
201 pEquiv0 = Ivy_NotCond( Ivy_HaigObjRepr(Ivy_Regular(pEquiv0)), Ivy_IsComplement(pEquiv0) );
202 pEquiv1 = Ivy_ObjChild1Equiv(pObj);
203 pEquiv1 = Ivy_NotCond( Ivy_HaigObjRepr(Ivy_Regular(pEquiv1)), Ivy_IsComplement(pEquiv1) );
224 if ( pObjNew == pObjOld )
226 if ( Levels == 0 || Ivy_ObjIsCi(pObjNew) || Ivy_ObjIsConst1(pObjNew) )
230 if ( Ivy_ObjIsNode(pObjNew) &&
Ivy_ObjIsInTfi_rec( Ivy_ObjFanin1(pObjNew), pObjOld, Levels - 1 ) )
249 Ivy_Obj_t * pObjOldHaigR, * pObjNewHaigR;
254 assert( !Ivy_IsComplement(pObjOld) );
256 pObjOldHaig = pObjOld->
pEquiv;
257 pObjNewHaig = Ivy_NotCond( Ivy_Regular(pObjNew)->pEquiv, Ivy_IsComplement(pObjNew) );
259 pObjOldHaig = Ivy_NotCond( Ivy_HaigObjRepr(Ivy_Regular(pObjOldHaig)), Ivy_IsComplement(pObjOldHaig) );
260 pObjNewHaig = Ivy_NotCond( Ivy_HaigObjRepr(Ivy_Regular(pObjNewHaig)), Ivy_IsComplement(pObjNewHaig) );
262 pObjOldHaigR = Ivy_Regular(pObjOldHaig);
263 pObjNewHaigR = Ivy_Regular(pObjNewHaig);
265 fCompl = (Ivy_IsComplement(pObjOldHaig) != Ivy_IsComplement(pObjNewHaig));
267 if ( pObjOldHaigR == pObjNewHaigR )
270 if ( Ivy_ObjRefs(pObjOldHaigR) == 0 || pObjNewHaigR->
pEquiv != NULL ||
271 Ivy_ObjRefs(pObjNewHaigR) > 0 )
280 p->pHaig->nClassesSkip++;
285 assert( Ivy_ObjRefs(pObjOldHaigR) > 0 );
287 if ( pObjOldHaigR->
pEquiv == NULL )
288 pObjNewHaigR->
pEquiv = Ivy_NotCond( pObjOldHaigR, fCompl );
290 pObjNewHaigR->
pEquiv = Ivy_NotCond( pObjOldHaigR->
pEquiv, fCompl );
291 pObjOldHaigR->
pEquiv = pObjNewHaigR;
320 int nChoices, nChoiceNodes, Counter, i;
322 nChoices = nChoiceNodes = 0;
325 if ( Ivy_ObjIsTerm(pObj) || i == 0 )
327 if ( Ivy_ObjRefs(pObj) == 0 )
329 Counter = Ivy_HaigObjCountClass( pObj );
330 nChoiceNodes += (int)(Counter > 1);
331 nChoices += Counter - 1;
335 *pnChoices = nChoices;
352 int nChoices, nChoiceNodes;
358 printf(
"Final : " );
365 printf(
"Total choice nodes = %d. Total choices = %d. Skipped classes = %d.\n",
366 nChoiceNodes, nChoices,
p->pHaig->nClassesSkip );
372 printf(
"HAIG is acyclic\n" );
375 printf(
"HAIG contains a cycle\n" );
419 printf(
"Compatibility fails.\n" );
442 Vec_Int_t * vNodes, * vLatches, * vLatchesD;
457printf(
"Setting PI %d\n", pObj->
Id );
464printf(
"Collected node %d with fanins %d and %d\n", pObj->
Id, Ivy_ObjFanin0(pObj)->Id, Ivy_ObjFanin1(pObj)->Id );
480 for ( k = 0; k < 10; k++ )
486 printf(
"Iter %d : Non-determinate = %d\n", k, Counter );
492printf(
"Processing node %d with fanins %d and %d\n", pObj->
Id, Ivy_ObjFanin0(pObj)->Id, Ivy_ObjFanin1(pObj)->Id );
493 In0 = Ivy_InitNotCond( (
Ivy_Init_t)Ivy_ObjFanin0(pObj)->Init, Ivy_ObjFaninC0(pObj) );
494 In1 = Ivy_InitNotCond( (
Ivy_Init_t)Ivy_ObjFanin1(pObj)->Init, Ivy_ObjFaninC1(pObj) );
495 pObj->
Init = Ivy_ManHaigSimulateAnd( In0, In1 );
497 if ( pObj->
pEquiv && Ivy_ObjRefs(pObj) > 0 )
500printf(
"Processing choice node %d\n", pObj->
Id );
503 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
506printf(
"Processing secondary node %d\n", pTemp->
Id );
508 In0 = Ivy_ManHaigSimulateChoice( In0, In1 );
517 pObj->
Level = Ivy_ObjFanin0(pObj)->Init;
519printf(
"Using latch %d with fanin %d\n", pObj->
Id, Ivy_ObjFanin0(pObj)->Id );
525 Vec_IntFree( vNodes );
526 Vec_IntFree( vLatches );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Ivy_ObjIsInTfi_rec(Ivy_Obj_t *pObjNew, Ivy_Obj_t *pObjOld, int Levels)
void Ivy_ManHaigSimulate(Ivy_Man_t *p)
void Ivy_ManHaigTrasfer(Ivy_Man_t *p, Ivy_Man_t *pNew)
int Ivy_ManHaigCountChoices(Ivy_Man_t *p, int *pnChoices)
void Ivy_ManHaigStop(Ivy_Man_t *p)
void Ivy_ManHaigStart(Ivy_Man_t *p, int fVerbose)
FUNCTION DEFINITIONS ///.
void Ivy_ManHaigCreateChoice(Ivy_Man_t *p, Ivy_Obj_t *pObjOld, Ivy_Obj_t *pObjNew)
void Ivy_ManHaigCreateObj(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ManHaigPostprocess(Ivy_Man_t *p, int fVerbose)
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)
#define Ivy_ManForEachLatch(p, pObj, i)
int Ivy_ManIsAcyclic(Ivy_Man_t *p)
Vec_Int_t * Ivy_ManDfsSeq(Ivy_Man_t *p, Vec_Int_t **pvLatches)
#define Ivy_ManForEachObj(p, pObj, i)
void Ivy_ManStop(Ivy_Man_t *p)
struct Ivy_Obj_t_ Ivy_Obj_t
void Ivy_ManPrintStats(Ivy_Man_t *p)
#define Ivy_ManForEachNodeVec(p, vIds, pObj, i)
#define Ivy_ManForEachPi(p, pObj, i)
ITERATORS ///.
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)