48 if ( Aig_ObjIsTravIdCurrent(
p, pObj ) )
50 Aig_ObjSetTravIdCurrent(
p, pObj );
51 if ( Aig_ObjIsCi(pObj) )
53 assert( Aig_ObjIsNode(pObj) );
81 pRepr = Aig_ObjRepr( pAig, pObj );
95 pEquiv = Aig_ObjEquiv( pAig, pObj );
120 if ( Aig_ObjIsTravIdCurrent(
p, pObj ) )
122 if ( Aig_ObjIsCi(pObj) )
124 RetValue = !Aig_ObjIsTravIdPrevious(
p, pObj );
125 Aig_ObjSetTravIdCurrent(
p, pObj );
128 assert( Aig_ObjIsNode(pObj) );
129 Aig_ObjSetTravIdCurrent(
p, pObj );
133 return (RetValue > 0);
168 int Class0 = 0, ClassCi = 0;
171 if ( Aig_ObjRepr(
p, pObj) == NULL )
173 if ( !Aig_ObjIsNode(pObj) )
174 printf(
"Obj %d is not an AND but it has a repr %d.\n", i, Aig_ObjId(Aig_ObjRepr(
p, pObj)) ), fProb = 1;
175 else if ( Aig_ObjRepr(
p, Aig_ObjRepr(
p, pObj)) )
176 printf(
"Obj %d has repr %d with a repr %d.\n", i, Aig_ObjId(Aig_ObjRepr(
p, pObj)), Aig_ObjId(Aig_ObjRepr(
p, Aig_ObjRepr(
p, pObj))) ), fProb = 1;
179 printf(
"Representive verification successful.\n" );
181 printf(
"Representive verification FAILED.\n" );
187 if ( Aig_ObjRepr(
p, pObj) == Aig_ManConst1(
p) )
189 if ( Aig_ObjRepr(
p, pObj) && Aig_ObjIsCi(Aig_ObjRepr(
p, pObj)) )
192 printf(
"Const0 nodes = %d. ConstCI nodes = %d.\n", Class0, ClassCi );
213 if (
p->pEquivs[i] != NULL )
216 printf(
"node %d participates in more than one choice class\n", i ), fProb = 1;
220 printf(
"node %d and repr %d have diff supports\n", pObj->
Id,
p->pEquivs[i]->Id );
222 pObj =
p->pEquivs[i];
223 if (
p->pEquivs[Aig_ObjId(pObj)] == NULL )
226 printf(
"repr %d has final node %d participates in more than one choice class\n", i, pObj->
Id ), fProb = 1;
230 if ( pObj->
nRefs > 0 )
231 printf(
"node %d belonging to choice has fanout %d\n", pObj->
Id, pObj->
nRefs );
233 if (
p->pReprs &&
p->pReprs[i] != NULL )
235 if ( pObj->
nRefs > 0 )
236 printf(
"node %d has representative %d and fanout count %d\n", pObj->
Id,
p->pReprs[i]->Id, pObj->
nRefs ), fProb = 1;
241 printf(
"Verification of choice AIG succeeded.\n" );
243 printf(
"Verification of choice AIG FAILED.\n" );
261 if ( Aig_ObjIsCi(pNode) || Aig_ObjIsConst1(pNode) )
263 assert( Aig_ObjIsNode(pNode) );
265 assert( !Aig_ObjIsTravIdPrevious(
p, pNode) );
267 if ( Aig_ObjIsTravIdCurrent(
p, pNode) )
270 Abc_Print( 1,
"Network \"%s\" contains combinational loop!\n",
p->pSpec?
p->pSpec : NULL );
272 Abc_Print( 1,
"Node \"%d\" is encountered twice on the following path to the COs:\n", Aig_ObjId(pNode) );
276 Aig_ObjSetTravIdCurrent(
p, pNode );
279 pFanin = Aig_ObjFanin0(pNode);
281 if ( !Aig_ObjIsTravIdPrevious(
p, pFanin) )
288 Abc_Print( 1,
" %d ->", Aig_ObjId(pFanin) );
294 pFanin = Aig_ObjFanin1(pNode);
296 if ( !Aig_ObjIsTravIdPrevious(
p, pFanin) )
303 Abc_Print( 1,
" %d ->", Aig_ObjId(pFanin) );
309 if ( Aig_ObjRepr(
p, pNode) == NULL && Aig_ObjEquiv(
p, pNode) != NULL )
311 for ( pFanin = Aig_ObjEquiv(
p, pNode); pFanin; pFanin = Aig_ObjEquiv(
p, pFanin) )
314 if ( Aig_ObjIsTravIdPrevious(
p, pFanin) )
321 Abc_Print( 1,
" %d", Aig_ObjId(pFanin) );
323 Abc_Print( 1,
" (choice of %d) -> ", Aig_ObjId(pNode) );
328 Aig_ObjSetTravIdPrevious(
p, pNode );
346 pNode = Aig_ObjFanin0(pNode);
347 if ( Aig_ObjIsTravIdPrevious(
p, pNode) )
354 Abc_Print( 1,
" CO %d\n", i );
377 if ( Aig_ObjIsCi(pObj) )
382 if ( Aig_ObjIsTravIdCurrent(
p, pObj ) )
384 Aig_ObjSetTravIdCurrent(
p, pObj );
397 assert( !Aig_IsComplement(pObj) );
398 assert( !Aig_IsComplement(pRepr) );
400 for ( pTemp = pRepr; pTemp; pTemp = Aig_ObjEquiv(
p, pTemp) )
406 for ( pTemp = pRepr; pTemp; pTemp = Aig_ObjEquiv(
p, pTemp) )
425 if ( (pRepr = Aig_ObjRepr(
p, Aig_Regular(pObj))) )
426 return Aig_NotCond( pRepr, Aig_Regular(pObj)->fPhase ^ pRepr->
fPhase ^ Aig_IsComplement(pObj) );
445 Aig_Obj_t * pRepr, * pObjNew, * pReprNew;
446 assert( !Aig_IsComplement(pObj) );
448 pRepr = Aig_ObjRepr( pAigOld, pObj );
449 if ( pRepr != NULL && (Aig_ObjIsConst1(pRepr) || Aig_ObjIsCi(pRepr)) )
457 Aig_ObjChild0CopyRepr(pAigNew, pObj),
458 Aig_ObjChild1CopyRepr(pAigNew, pObj) );
463 pObjNew = Aig_ObjGetRepr( pAigNew, pObjNew2 );
464 if ( pObjNew == pObjNew2 )
470 pObj->
pData = pObjNew;
475 assert( Aig_ObjIsNode(pRepr) );
480 if ( pReprNew->
Id >= pObjNew->
Id )
484 Aig_ObjSetRepr( pAigNew, pObjNew, pReprNew );
486 if ( pObjNew->
nRefs > 0 )
496 while ( pAigNew->pEquivs[pReprNew->
Id] != NULL )
497 pReprNew = pAigNew->pEquivs[pReprNew->
Id];
498 assert( pAigNew->pEquivs[pReprNew->
Id] == NULL );
499 pAigNew->pEquivs[pReprNew->
Id] = pObjNew;
512 Aig_ManConst1(pAig)->pData = Aig_ManConst1(pChoices);
516 assert( pAig->pReprs != NULL );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupDfs(Aig_Man_t *p)
void Aig_ManCleanMarkA(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManCleanData(Aig_Man_t *p)
Aig_Man_t * Dch_DeriveChoiceAig(Aig_Man_t *pAig, int fSkipRedSupps)
int Aig_ManCheckAcyclic_rec(Aig_Man_t *p, Aig_Obj_t *pNode, int fVerbose)
int Dch_ObjCheckTfi_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
int Aig_ManCheckAcyclic(Aig_Man_t *p, int fVerbose)
int Dch_ObjMarkTfi_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
int Dch_DeriveChoiceCountEquivs(Aig_Man_t *pAig)
int Dch_ObjCountSupp(Aig_Man_t *p, Aig_Obj_t *pObj)
int Dch_DeriveChoiceCountReprs(Aig_Man_t *pAig)
FUNCTION DECLARATIONS ///.
int Dch_ObjCheckSuppRed(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pRepr)
void Dch_DeriveChoiceAigNode(Aig_Man_t *pAigNew, Aig_Man_t *pAigOld, Aig_Obj_t *pObj, int fSkipRedSupps)
int Dch_ObjCheckTfi(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pRepr)
Aig_Man_t * Dch_DeriveChoiceAigInt(Aig_Man_t *pAig, int fSkipRedSupps)
void Dch_CheckChoices(Aig_Man_t *p, int fSkipRedSupps)
ABC_NAMESPACE_IMPL_START int Dch_ObjCountSupp_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
DECLARATIONS ///.
void Aig_ManCheckReprs(Aig_Man_t *p)