33 if ( !Aig_IsComplement(p0) || !Aig_IsComplement(p1) )
37 if ( !Aig_ObjIsAnd(p0) || !Aig_ObjIsAnd(p1) )
39 if ( Aig_ObjFanin0(p0) != Aig_ObjFanin0(p1) || Aig_ObjFanin1(p0) != Aig_ObjFanin1(p1) )
41 if ( Aig_ObjFaninC0(p0) == Aig_ObjFaninC0(p1) || Aig_ObjFaninC1(p0) == Aig_ObjFaninC1(p1) )
43 *ppFan0 = Aig_ObjChild0(p0);
44 *ppFan1 = Aig_ObjChild1(p0);
66 for ( v = Aig_ManCiNum(
p); v <= i; v++ )
68 assert( i < Vec_PtrSize(
p->vCis) );
69 return Aig_ManCi(
p, i );
111 if ( p0 == Aig_Not(p1) )
112 return Aig_Not(
p->pConst1);
113 if ( Aig_Regular(p0) ==
p->pConst1 )
114 return p0 ==
p->pConst1 ? p1 : Aig_Not(
p->pConst1);
115 if ( Aig_Regular(p1) ==
p->pConst1 )
116 return p1 ==
p->pConst1 ? p0 : Aig_Not(
p->pConst1);
118 if (
p->fAddStrash && (Aig_ObjIsNode(Aig_Regular(p0)) || Aig_ObjIsNode(Aig_Regular(p1))) )
120 Aig_Obj_t * pFanA, * pFanB, * pFanC, * pFanD;
121 pFanA = Aig_ObjChild0(Aig_Regular(p0));
122 pFanB = Aig_ObjChild1(Aig_Regular(p0));
123 pFanC = Aig_ObjChild0(Aig_Regular(p1));
124 pFanD = Aig_ObjChild1(Aig_Regular(p1));
125 if ( Aig_IsComplement(p0) )
127 if ( pFanA == Aig_Not(p1) || pFanB == Aig_Not(p1) )
130 return Aig_And(
p, Aig_Not(pFanA), pFanB );
132 return Aig_And(
p, Aig_Not(pFanB), pFanA );
136 if ( pFanA == Aig_Not(p1) || pFanB == Aig_Not(p1) )
137 return Aig_Not(
p->pConst1);
138 if ( pFanA == p1 || pFanB == p1 )
141 if ( Aig_IsComplement(p1) )
143 if ( pFanC == Aig_Not(p0) || pFanD == Aig_Not(p0) )
146 return Aig_And(
p, Aig_Not(pFanC), pFanD );
148 return Aig_And(
p, Aig_Not(pFanD), pFanC );
152 if ( pFanC == Aig_Not(p0) || pFanD == Aig_Not(p0) )
153 return Aig_Not(
p->pConst1);
154 if ( pFanC == p0 || pFanD == p0 )
157 if ( !Aig_IsComplement(p0) && !Aig_IsComplement(p1) )
159 if ( pFanA == Aig_Not(pFanC) || pFanA == Aig_Not(pFanD) || pFanB == Aig_Not(pFanC) || pFanB == Aig_Not(pFanD) )
160 return Aig_Not(
p->pConst1);
161 if ( pFanA == pFanC || pFanB == pFanC )
163 if ( pFanB == pFanC || pFanB == pFanD )
165 if ( pFanA == pFanD || pFanB == pFanD )
167 if ( pFanA == pFanC || pFanA == pFanD )
170 else if ( Aig_IsComplement(p0) && !Aig_IsComplement(p1) )
172 if ( pFanA == Aig_Not(pFanC) || pFanA == Aig_Not(pFanD) || pFanB == Aig_Not(pFanC) || pFanB == Aig_Not(pFanD) )
174 if ( pFanB == pFanC || pFanB == pFanD )
175 return Aig_And(
p, Aig_Not(pFanA), p1 );
176 if ( pFanA == pFanC || pFanA == pFanD )
177 return Aig_And(
p, Aig_Not(pFanB), p1 );
179 else if ( !Aig_IsComplement(p0) && Aig_IsComplement(p1) )
181 if ( pFanC == Aig_Not(pFanA) || pFanC == Aig_Not(pFanB) || pFanD == Aig_Not(pFanA) || pFanD == Aig_Not(pFanB) )
183 if ( pFanD == pFanA || pFanD == pFanB )
184 return Aig_And(
p, Aig_Not(pFanC), p0 );
185 if ( pFanC == pFanA || pFanC == pFanB )
186 return Aig_And(
p, Aig_Not(pFanD), p0 );
190 if ( pFanA == pFanD && pFanB == Aig_Not(pFanC) )
191 return Aig_Not(pFanA);
192 if ( pFanB == pFanC && pFanA == Aig_Not(pFanD) )
193 return Aig_Not(pFanB);
194 if ( pFanA == pFanC && pFanB == Aig_Not(pFanD) )
195 return Aig_Not(pFanA);
196 if ( pFanB == pFanD && pFanA == Aig_Not(pFanC) )
197 return Aig_Not(pFanB);
201 if (
p->fCatchExor && Aig_ObjIsExorType( p0, p1, &pFan0, &pFan1 ) )
226 return Aig_Not(
p->pConst1);
227 if ( p0 == Aig_Not(p1) )
229 if ( Aig_Regular(p0) ==
p->pConst1 )
230 return Aig_NotCond( p1, p0 ==
p->pConst1 );
231 if ( Aig_Regular(p1) ==
p->pConst1 )
232 return Aig_NotCond( p0, p1 ==
p->pConst1 );
234 if ( !
p->fCatchExor )
237 fCompl = Aig_IsComplement(p0) ^ Aig_IsComplement(p1);
238 p0 = Aig_Regular(p0);
239 p1 = Aig_Regular(p1);
243 return Aig_NotCond( pResult, fCompl );
245 return Aig_NotCond( pResult, fCompl );
261 return Aig_Not(
Aig_And(
p, Aig_Not(p0), Aig_Not(p1) ) );
279 if ( p0 == Aig_ManConst0(
p) || p1 == Aig_ManConst0(
p) || p0 == Aig_Not(p1) )
280 return Aig_ManConst0(
p);
281 if ( p0 == Aig_ManConst1(
p) )
283 if ( p1 == Aig_ManConst1(
p) )
285 if ( Aig_Regular(p0)->Id < Aig_Regular(p1)->Id )
319 int fUseMuxCanon = 0;
320 Aig_Obj_t * pTempA1, * pTempA2, * pTempB1, * pTempB2, * pTemp;
326 if ( p1 == Aig_Not(p0) )
328 if ( pC == Aig_ManConst0(
p) )
330 if ( pC == Aig_ManConst1(
p) )
332 if ( p0 == Aig_ManConst0(
p) )
334 if ( p0 == Aig_ManConst1(
p) )
335 return Aig_Or(
p, Aig_Not(pC), p1 );
336 if ( p1 == Aig_ManConst0(
p) )
337 return Aig_And(
p, Aig_Not(pC), p0 );
338 if ( p1 == Aig_ManConst1(
p) )
343 if ( pTempA1 && pTempA2 )
346 if ( pTemp )
return Aig_Not(pTemp);
348 Count0 = (pTempA1 != NULL) + (pTempA2 != NULL);
352 if ( pTempB1 && pTempB2 )
355 if ( pTemp )
return pTemp;
357 Count1 = (pTempB1 != NULL) + (pTempB2 != NULL);
359 if ( Count0 >= Count1 )
378 return Aig_Or(
p,
Aig_Or(
p,
Aig_And(
p, pA, pB),
Aig_And(
p, pA, pC)),
Aig_And(
p, pB, pC) );
398 pObj2 =
Aig_Multi_rec(
p, ppObjs + nObjs/2, nObjs - nObjs/2, Type );
399 return Aig_Oper(
p, pObj1, pObj2, Type );
434 assert( vPairs->nSize > 0 );
435 assert( vPairs->nSize % 2 == 0 );
436 for ( i = 0; i < vPairs->nSize; i += 2 )
438 vPairs->nSize = vPairs->nSize/2;
456 assert( vNodes1->nSize > 0 && vNodes2->nSize > 0 );
457 assert( vNodes1->nSize == vNodes2->nSize );
458 for ( i = 0; i < vNodes1->nSize; i++ )
478 pFunc = Aig_ManConst1(
p );
479 for ( i = 0; i < nVars; i++ )
499 pFunc = Aig_ManConst0(
p );
500 for ( i = 0; i < nVars; i++ )
520 pFunc = Aig_ManConst0(
p );
521 for ( i = 0; i < nVars; i++ )
541 Aig_Obj_t * pObj, * pFanin0, * pFanin1, * pCtrl;
546 vNodes = Vec_PtrAlloc( 100 );
549 for ( i = 0; i < nPIs; i++ )
551 for ( i = 0; i < nNodes; i++ )
553 if ( rand() % 10 == 0 )
554 pCtrl = Aig_ManConst0(
p);
555 else if ( rand() % 10 == 0 )
556 pCtrl = Aig_ManConst1(
p);
557 else if ( rand() % 3 == 0 || i < nPIs )
560 pCtrl = (
Aig_Obj_t *)Vec_PtrEntry(vNodes, rand() % i);
561 if ( rand() % 2 == 0 )
562 pCtrl = Aig_Not( pCtrl );
564 if ( rand() % 10 == 0 )
565 pFanin1 = Aig_ManConst0(
p);
566 else if ( rand() % 10 == 0 )
567 pFanin1 = Aig_ManConst1(
p);
568 else if ( rand() % 3 == 0 || i < nPIs )
571 pFanin1 = (
Aig_Obj_t *)Vec_PtrEntry(vNodes, rand() % i);
572 if ( rand() % 2 == 0 )
573 pFanin1 = Aig_Not( pFanin1 );
575 if ( rand() % 10 == 0 )
576 pFanin0 = Aig_ManConst0(
p);
577 else if ( rand() % 10 == 0 )
578 pFanin0 = Aig_ManConst1(
p);
579 else if ( rand() % 3 == 0 || i < nPIs )
582 pFanin0 = (
Aig_Obj_t *)Vec_PtrEntry(vNodes, rand() % i);
583 if ( rand() % 2 == 0 )
584 pFanin0 = Aig_Not( pFanin0 );
586 pObj =
Aig_Mux(
p, pCtrl, pFanin1, pFanin0 );
587 Vec_PtrPush( vNodes, pObj );
591 Vec_PtrFree( vNodes );
593 printf(
"Number of nodes = %6d.\n", Aig_ManObjNum(
p) );
595 printf(
"Number of nodes = %6d.\n", Aig_ManObjNum(
p) );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Aig_Obj_t * Aig_CreateAnd(Aig_Man_t *p, int nVars)
Aig_Obj_t * Aig_Maj(Aig_Man_t *p, Aig_Obj_t *pA, Aig_Obj_t *pB, Aig_Obj_t *pC)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_Mux(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
Aig_Obj_t * Aig_Oper(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1, Aig_Type_t Type)
Aig_Obj_t * Aig_Miter(Aig_Man_t *p, Vec_Ptr_t *vPairs)
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_Multi_rec(Aig_Man_t *p, Aig_Obj_t **ppObjs, int nObjs, Aig_Type_t Type)
Aig_Obj_t * Aig_CreateExor(Aig_Man_t *p, int nVars)
Aig_Obj_t * Aig_Mux2(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
Aig_Obj_t * Aig_Multi(Aig_Man_t *p, Aig_Obj_t **pArgs, int nArgs, Aig_Type_t Type)
Aig_Obj_t * Aig_CreateOr(Aig_Man_t *p, int nVars)
Aig_Obj_t * Aig_IthVar(Aig_Man_t *p, int i)
FUNCTION DEFINITIONS ///.
Aig_Obj_t * Aig_TableLookupInt(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_MiterTwo(Aig_Man_t *p, Vec_Ptr_t *vNodes1, Vec_Ptr_t *vNodes2)
Aig_Obj_t * Aig_ObjCreate(Aig_Man_t *p, Aig_Obj_t *pGhost)
void Aig_ManStop(Aig_Man_t *p)
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 ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
Aig_Obj_t * Aig_TableLookup(Aig_Man_t *p, Aig_Obj_t *pGhost)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManDumpBlif(Aig_Man_t *p, char *pFileName, Vec_Ptr_t *vPiNames, Vec_Ptr_t *vPoNames)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.