36#define ABC_MAX_CUBES 1000000
37#define ABC_MAX_CUBES2 10000
43int Abc_ConvertZddToSop( DdManager * dd, DdNode * zCover,
char * pSop,
int nFanins,
Vec_Str_t * vCube,
int fPhase );
44static DdNode * Abc_ConvertAigToBdd( DdManager * dd,
Hop_Obj_t * pRoot);
45extern int Abc_CountZddCubes( DdManager * dd, DdNode * zCover );
63void Abc_ConvertSopToBdd2Count(
char * pSop,
int nCubes,
int nStep,
int iVar,
int pRes[3] )
66 for ( i = 0; i < nCubes; i++ )
67 if ( pSop[i*nStep+iVar] ==
'-' )
68 pRes[0]++,
assert( pRes[1] == 0 && pRes[2] == 0 );
69 else if ( pSop[i*nStep+iVar] ==
'0' )
70 pRes[1]++,
assert( pRes[2] == 0 );
71 else if ( pSop[i*nStep+iVar] ==
'1' )
75DdNode * Abc_ConvertSopToBdd2_rec( DdManager * dd,
char * pSop, DdNode ** pbVars,
int nCubes,
int nStep,
int iVar )
77 DdNode * bRes[5] = {NULL};
78 int pRes[3] = {0}, i, Start = 0;
80 return Cudd_ReadLogicZero(dd);
81 if ( iVar == nStep - 3 )
82 return Cudd_ReadOne(dd);
83 Abc_ConvertSopToBdd2Count( pSop, nCubes, nStep, iVar, pRes );
84 for ( i = 0; i < 3; Start += pRes[i++] )
85 bRes[i] = Abc_ConvertSopToBdd2_rec( dd, pSop + Start*nStep, pbVars, pRes[i], nStep, iVar+1 ), Cudd_Ref( bRes[i] );
86 bRes[3] = Cudd_bddIte( dd, pbVars[iVar], bRes[2], bRes[1] ); Cudd_Ref( bRes[3] );
87 Cudd_RecursiveDeref( dd, bRes[1] );
88 Cudd_RecursiveDeref( dd, bRes[2] );
89 bRes[4] = Cudd_bddOr( dd, bRes[0], bRes[3] ); Cudd_Ref( bRes[4] );
90 Cudd_RecursiveDeref( dd, bRes[3] );
91 Cudd_RecursiveDeref( dd, bRes[0] );
92 Cudd_Deref( bRes[4] );
95DdNode * Abc_ConvertSopToBdd2( DdManager * dd,
char * pSop, DdNode ** pbVars )
99 assert( pSop[nCubes*nStep] ==
'\0' );
100 return Abc_ConvertSopToBdd2_rec( dd, pSop, pbVars, nCubes, nStep, 0 );
114DdNode * Abc_ConvertSopToBdd( DdManager * dd,
char * pSop, DdNode ** pbVars )
116 DdNode * bSum, * bCube, * bTemp, * bVar;
122 bSum = Cudd_ReadLogicZero(dd); Cudd_Ref( bSum );
125 for ( v = 0; v < nVars; v++ )
127 bSum = Cudd_bddXor( dd, bTemp = bSum, pbVars? pbVars[v] : Cudd_bddIthVar(dd, v) ); Cudd_Ref( bSum );
128 Cudd_RecursiveDeref( dd, bTemp );
135 bSum = Abc_ConvertSopToBdd2( dd, pSop, pbVars );
138 DdNode ** pbVars =
ABC_ALLOC( DdNode *, nVars );
139 for ( v = 0; v < nVars; v++ )
140 pbVars[v] = Cudd_bddIthVar( dd, v );
141 bSum = Abc_ConvertSopToBdd2( dd, pSop, pbVars );
151 bCube = Cudd_ReadOne(dd); Cudd_Ref( bCube );
155 bVar = Cudd_Not( pbVars? pbVars[v] : Cudd_bddIthVar( dd, v ) );
156 else if ( Value ==
'1' )
157 bVar = pbVars? pbVars[v] : Cudd_bddIthVar( dd, v );
160 bCube = Cudd_bddAnd( dd, bTemp = bCube, bVar ); Cudd_Ref( bCube );
161 Cudd_RecursiveDeref( dd, bTemp );
163 bSum = Cudd_bddOr( dd, bTemp = bSum, bCube );
165 Cudd_RecursiveDeref( dd, bTemp );
166 Cudd_RecursiveDeref( dd, bCube );
189 DdManager * dd, * ddTemp = NULL;
191 int nFaninsMax, i, k, iVar, nCubesMax = 0;
193 assert( Abc_NtkHasSop(pNtk) );
203 if ( nFaninsMax == 0 )
204 printf(
"Warning: The network has only constant nodes.\n" );
205 dd = Cudd_Init( nFaninsMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
208 if ( nFaninsMax > 10 )
210 ddTemp = Cudd_Init( nFaninsMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
211 Cudd_AutodynEnable( ddTemp, CUDD_REORDER_SYMM_SIFT );
212 vFanins = Vec_IntAlloc( nFaninsMax );
218 if ( Abc_ObjIsBarBuf(pNode) )
221 if ( Abc_ObjFaninNum(pNode) > 10 )
223 DdNode * pFunc = Abc_ConvertSopToBdd( ddTemp, (
char *)pNode->
pData, NULL );
226 printf(
"Abc_NtkSopToBdd: Error while converting SOP into BDD.\n" );
231 Vec_IntFill( vFanins, Abc_ObjFaninNum(pNode), -1 );
232 for ( k = iVar = 0; k < nFaninsMax; k++ )
233 if ( ddTemp->invperm[k] < Abc_ObjFaninNum(pNode) )
234 Vec_IntWriteEntry( vFanins, ddTemp->invperm[k], iVar++ );
235 assert( iVar == Abc_ObjFaninNum(pNode) );
238 Cudd_Ref( (DdNode *)pNode->
pData );
239 Cudd_RecursiveDeref( ddTemp, pFunc );
241 Vec_IntClear( vFanins );
242 for ( k = 0; k < nFaninsMax; k++ )
243 if ( ddTemp->invperm[k] < Abc_ObjFaninNum(pNode) )
244 Vec_IntPush( vFanins, Vec_IntEntry(&pNode->
vFanins, ddTemp->invperm[k]) );
245 for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
246 Vec_IntWriteEntry( &pNode->
vFanins, k, Vec_IntEntry(vFanins, k) );
250 pNode->
pData = Abc_ConvertSopToBdd( dd, (
char *)pNode->
pData, NULL );
251 if ( pNode->
pData == NULL )
253 printf(
"Abc_NtkSopToBdd: Error while converting SOP into BDD.\n" );
256 Cudd_Ref( (DdNode *)pNode->
pData );
265 Vec_IntFreeP( &vFanins );
288char * Abc_ConvertBddToSop(
Mem_Flex_t * pMan, DdManager * dd, DdNode * bFuncOn, DdNode * bFuncOnDc,
int nFanins,
int fAllPrimes,
Vec_Str_t * vCube,
int fMode )
292 DdNode * bFuncNew, * bCover, * zCover, * zCover0, * zCover1;
293 int nCubes = 0, nCubes0, nCubes1, fPhase = 0;
295 assert( bFuncOn == bFuncOnDc || Cudd_bddLeq( dd, bFuncOn, bFuncOnDc ) );
296 if ( Cudd_IsConstant(bFuncOn) || Cudd_IsConstant(bFuncOnDc) )
303 pSop[1] =
'0' + (int)(bFuncOn == Cudd_ReadOne(dd));
311 assert( fAllPrimes == 0 );
314 bCover = Cudd_zddIsop( dd, Cudd_Not(bFuncOnDc), Cudd_Not(bFuncOn), &zCover0 );
317 Cudd_RecursiveDeref( dd, bCover );
318 nCubes0 = Abc_CountZddCubes( dd, zCover0 );
321 bCover = Cudd_zddIsop( dd, bFuncOn, bFuncOnDc, &zCover1 );
324 Cudd_RecursiveDeref( dd, bCover );
325 nCubes1 = Abc_CountZddCubes( dd, zCover1 );
328 if ( nCubes1 <= nCubes0 )
332 Cudd_RecursiveDerefZdd( dd, zCover0 );
339 Cudd_RecursiveDerefZdd( dd, zCover1 );
343 else if ( fMode == 0 )
353 bCover = Cudd_zddIsop( dd, Cudd_Not(bFuncOnDc), Cudd_Not(bFuncOn), &zCover );
356 Cudd_RecursiveDeref( dd, bCover );
358 nCubes = Abc_CountZddCubes( dd, zCover );
361 else if ( fMode == 1 )
371 bCover = Cudd_zddIsop( dd, bFuncOn, bFuncOnDc, &zCover );
374 Cudd_RecursiveDeref( dd, bCover );
376 nCubes = Abc_CountZddCubes( dd, zCover );
386 Cudd_RecursiveDerefZdd( dd, zCover );
387 printf(
"The number of cubes exceeded the predefined limit (%d).\n",
ABC_MAX_CUBES );
395 pSop =
ABC_ALLOC(
char, (nFanins + 3) * nCubes + 1 );
396 pSop[(nFanins + 3) * nCubes] = 0;
398 Vec_StrFill( vCube, nFanins,
'-' );
399 Vec_StrPush( vCube,
'\0' );
400 Abc_ConvertZddToSop( dd, zCover, pSop, nFanins, vCube, fPhase );
401 Cudd_RecursiveDerefZdd( dd, zCover );
406 bFuncNew = Abc_ConvertSopToBdd( dd, pSop, NULL ); Cudd_Ref( bFuncNew );
407 if ( bFuncOn == bFuncOnDc )
409 if ( bFuncNew != bFuncOn )
410 printf(
"Verification failed.\n" );
414 if ( !Cudd_bddLeq(dd, bFuncOn, bFuncNew) || !Cudd_bddLeq(dd, bFuncNew, bFuncOnDc) )
415 printf(
"Verification failed.\n" );
417 Cudd_RecursiveDeref( dd, bFuncNew );
439 DdManager * dd = (DdManager *)pNtk->
pManFunc;
444 vGuide = Vec_IntAlloc( Abc_NtkObjNumMax(pNtk) );
445 Vec_IntFill( vGuide, Abc_NtkObjNumMax(pNtk), fMode );
449 Vec_Ptr_t * vFuncs = Vec_PtrStart( Abc_NtkObjNumMax(pNtk) );
450 assert( !Cudd_ReorderingStatus(dd, (Cudd_ReorderingType *)&nCubes) );
452 if ( !Abc_ObjIsBarBuf(pNode) )
453 Vec_PtrWriteEntry( vFuncs, i, pNode->
pData );
455 nCubes =
Extra_bddCountCubes( dd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs), fMode, nCubeLimit, Vec_IntArray(vGuide) );
456 Vec_PtrFree( vFuncs );
459 Vec_IntFree( vGuide );
465 assert( Abc_NtkHasBdd(pNtk) );
467 Cudd_zddVarsFromBddVars( dd, 2 );
472 vCube = Vec_StrAlloc( 100 );
475 if ( Abc_ObjIsBarBuf(pNode) )
478 bFunc = (DdNode *)pNode->
pData;
479 pNode->
pNext = (
Abc_Obj_t *)Abc_ConvertBddToSop( pManNew, dd, bFunc, bFunc, Abc_ObjFaninNum(pNode), 0, vCube, Vec_IntEntry(vGuide, i) );
480 if ( pNode->
pNext == NULL )
485 Vec_IntFree( vGuide );
486 Vec_StrFree( vCube );
495 printf(
"Node %d with level %d has %d fanins but its SOP has support size %d.\n",
501 Vec_IntFree( vGuide );
502 Vec_StrFree( vCube );
511 if ( Abc_ObjIsBarBuf(pNode) )
513 Cudd_RecursiveDeref( dd, (DdNode *)pNode->
pData );
539void Abc_ConvertZddToSop_rec( DdManager * dd, DdNode * zCover,
char * pSop,
int nFanins,
Vec_Str_t * vCube,
int fPhase,
int * pnCubes )
541 DdNode * zC0, * zC1, * zC2;
544 if ( zCover == dd->zero )
546 if ( zCover == dd->one )
549 pCube = pSop + (*pnCubes) * (nFanins + 3);
554 Index = zCover->index/2;
555 assert( Index < nFanins );
557 vCube->
pArray[Index] =
'0';
558 Abc_ConvertZddToSop_rec( dd, zC0, pSop, nFanins, vCube, fPhase, pnCubes );
559 vCube->
pArray[Index] =
'1';
560 Abc_ConvertZddToSop_rec( dd, zC1, pSop, nFanins, vCube, fPhase, pnCubes );
561 vCube->
pArray[Index] =
'-';
562 Abc_ConvertZddToSop_rec( dd, zC2, pSop, nFanins, vCube, fPhase, pnCubes );
576int Abc_ConvertZddToSop( DdManager * dd, DdNode * zCover,
char * pSop,
int nFanins,
Vec_Str_t * vCube,
int fPhase )
579 Abc_ConvertZddToSop_rec( dd, zCover, pSop, nFanins, vCube, fPhase, &nCubes );
598 *ppSop0 = Abc_ConvertBddToSop( pMmMan, (DdManager *)pNode->
pNtk->
pManFunc, (DdNode *)pNode->
pData, (DdNode *)pNode->
pData, Abc_ObjFaninNum(pNode), fAllPrimes, vCube, 0 );
599 *ppSop1 = Abc_ConvertBddToSop( pMmMan, (DdManager *)pNode->
pNtk->
pManFunc, (DdNode *)pNode->
pData, (DdNode *)pNode->
pData, Abc_ObjFaninNum(pNode), fAllPrimes, vCube, 1 );
620 int nFaninsMax, fFound, i;
622 assert( Abc_NtkHasSop(pNtk) );
637 if ( nFaninsMax == 0 )
638 printf(
"Warning: The network has only constant nodes.\n" );
639 dd = Cudd_Init( nFaninsMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
642 vCube = Vec_StrAlloc( 100 );
646 bFunc = Abc_ConvertSopToBdd( dd, (
char *)pNode->
pData, NULL ); Cudd_Ref( bFunc );
647 pNode->
pData = Abc_ConvertBddToSop( (
Mem_Flex_t *)pNtk->
pManFunc, dd, bFunc, bFunc, Abc_ObjFaninNum(pNode), 0, vCube, 1 );
648 Cudd_RecursiveDeref( dd, bFunc );
651 Vec_StrFree( vCube );
669void Abc_CountZddCubes_rec( DdManager * dd, DdNode * zCover,
int * pnCubes )
671 DdNode * zC0, * zC1, * zC2;
672 if ( zCover == dd->zero )
674 if ( zCover == dd->one )
682 Abc_CountZddCubes_rec( dd, zC0, pnCubes );
683 Abc_CountZddCubes_rec( dd, zC1, pnCubes );
684 Abc_CountZddCubes_rec( dd, zC2, pnCubes );
698int Abc_CountZddCubes( DdManager * dd, DdNode * zCover )
701 Abc_CountZddCubes_rec( dd, zCover, &nCubes );
721 DdManager * dd, * ddTemp = NULL;
723 int nFaninsMax, i, k, iVar;
725 assert( Abc_NtkHasAig(pNtk) );
729 if ( nFaninsMax == 0 )
730 printf(
"Warning: The network has only constant nodes.\n" );
732 dd = Cudd_Init( nFaninsMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
735 ddTemp = Cudd_Init( nFaninsMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
736 Cudd_AutodynEnable( ddTemp, CUDD_REORDER_SYMM_SIFT );
737 vFanins = Vec_IntAlloc( nFaninsMax );
741 assert( Hop_ManPiNum(pMan) >= nFaninsMax );
742 for ( i = 0; i < nFaninsMax; i++ )
743 Hop_ManPi(pMan, i)->pData = Cudd_bddIthVar(ddTemp, i);
748 if ( Abc_ObjIsBarBuf(pNode) )
753 printf(
"Abc_NtkAigToBdd: Error while converting AIG into BDD.\n" );
758 Vec_IntFill( vFanins, Abc_ObjFaninNum(pNode), -1 );
759 for ( k = iVar = 0; k < nFaninsMax; k++ )
760 if ( ddTemp->invperm[k] < Abc_ObjFaninNum(pNode) )
761 Vec_IntWriteEntry( vFanins, ddTemp->invperm[k], iVar++ );
762 assert( iVar == Abc_ObjFaninNum(pNode) );
765 Cudd_Ref( (DdNode *)pNode->
pData );
766 Cudd_RecursiveDeref( ddTemp, pFunc );
768 Vec_IntClear( vFanins );
769 for ( k = 0; k < nFaninsMax; k++ )
770 if ( ddTemp->invperm[k] < Abc_ObjFaninNum(pNode) )
771 Vec_IntPush( vFanins, Vec_IntEntry(&pNode->
vFanins, ddTemp->invperm[k]) );
772 for ( k = 0; k < Abc_ObjFaninNum(pNode); k++ )
773 Vec_IntWriteEntry( &pNode->
vFanins, k, Vec_IntEntry(vFanins, k) );
778 Vec_IntFreeP( &vFanins );
798void Abc_ConvertAigToBdd_rec1( DdManager * dd,
Hop_Obj_t * pObj )
800 assert( !Hop_IsComplement(pObj) );
801 if ( !Hop_ObjIsNode(pObj) || Hop_ObjIsMarkA(pObj) )
803 Abc_ConvertAigToBdd_rec1( dd, Hop_ObjFanin0(pObj) );
804 Abc_ConvertAigToBdd_rec1( dd, Hop_ObjFanin1(pObj) );
805 pObj->
pData = Cudd_bddAnd( dd, (DdNode *)Hop_ObjChild0Copy(pObj), (DdNode *)Hop_ObjChild1Copy(pObj) );
806 Cudd_Ref( (DdNode *)pObj->
pData );
807 assert( !Hop_ObjIsMarkA(pObj) );
808 Hop_ObjSetMarkA( pObj );
822void Abc_ConvertAigToBdd_rec2( DdManager * dd,
Hop_Obj_t * pObj )
824 assert( !Hop_IsComplement(pObj) );
825 if ( !Hop_ObjIsNode(pObj) || !Hop_ObjIsMarkA(pObj) )
827 Abc_ConvertAigToBdd_rec2( dd, Hop_ObjFanin0(pObj) );
828 Abc_ConvertAigToBdd_rec2( dd, Hop_ObjFanin1(pObj) );
829 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
831 assert( Hop_ObjIsMarkA(pObj) );
832 Hop_ObjClearMarkA( pObj );
846DdNode * Abc_ConvertAigToBdd( DdManager * dd,
Hop_Obj_t * pRoot )
850 if ( Hop_ObjIsConst1( Hop_Regular(pRoot) ) )
851 return Cudd_NotCond( Cudd_ReadOne(dd), Hop_IsComplement(pRoot) );
853 Abc_ConvertAigToBdd_rec1( dd, Hop_Regular(pRoot) );
855 bFunc = Cudd_NotCond( Hop_Regular(pRoot)->pData, Hop_IsComplement(pRoot) ); Cudd_Ref( bFunc );
857 Abc_ConvertAigToBdd_rec2( dd, Hop_Regular(pRoot) );
890 assert( Abc_NtkHasSop(pNtk) );
903 if ( Abc_ObjIsBarBuf(pNode) )
906 pNode->
pData = Abc_ConvertSopToAig( pMan, (
char *)pNode->
pData );
907 if ( pNode->
pData == NULL )
910 printf(
"Abc_NtkSopToAig: Error while converting SOP into AIG.\n" );
937 int i, Value, nFanins;
943 pSum = Hop_ManConst0(pMan);
944 for ( i = 0; i < nFanins; i++ )
950 pSum = Hop_ManConst0(pMan);
954 pAnd = Hop_ManConst1(pMan);
959 else if ( Value ==
'0' )
963 pSum =
Hop_Or( pMan, pSum, pAnd );
968 pSum = Hop_Not(pSum);
1010 assert( !Hop_IsComplement(pObj) );
1011 if ( !Hop_ObjIsNode(pObj) || Hop_ObjIsMarkA(pObj) )
1015 pObj->
iData = Gia_ManAppendAnd2(
p, Hop_ObjChild0CopyI(pObj), Hop_ObjChild1CopyI(pObj) );
1016 assert( !Hop_ObjIsMarkA(pObj) );
1017 Hop_ObjSetMarkA( pObj );
1021 assert( !Hop_IsComplement(pObj) );
1022 if ( !Hop_ObjIsNode(pObj) || !Hop_ObjIsMarkA(pObj) )
1026 assert( Hop_ObjIsMarkA(pObj) );
1027 Hop_ObjClearMarkA( pObj );
1031 assert( !Hop_IsComplement(pRoot) );
1032 if ( Hop_ObjIsConst1( pRoot ) )
1036 return pRoot->
iData;
1058 int i, k, nObjs, iGiaObj;
1059 assert( Abc_NtkIsAigLogic(
p) );
1063 pNew->
pName = Abc_UtilStrsav( Abc_NtkName(
p) );
1064 pNew->
pSpec = Abc_UtilStrsav( Abc_NtkSpec(
p) );
1067 Hop_ManConst1(pHopMan)->iData = 1;
1070 pNode->
iTemp = Gia_ManAppendCi(pNew);
1072 nObjs = 1 + Abc_NtkCiNum(
p) + Abc_NtkCoNum(
p);
1076 vMapping = Vec_IntStart( nObjs );
1081 if ( Abc_ObjIsBarBuf(pNode) )
1083 assert( !Abc_ObjFaninC0(pNode) );
1084 pNode->
iTemp = Gia_ManAppendBuf( pNew, Abc_ObjFanin0(pNode)->iTemp );
1088 Hop_ManPi(pHopMan, k)->iData = pFanin->
iTemp;
1092 assert( Abc_ObjFaninNum(pNode) <= Hop_ManPiNum(pHopMan) );
1094 iGiaObj = Abc_Lit2Var( pHopObj->
iData );
1095 if ( vMapping && Gia_ObjIsAnd(Gia_ManObj(pNew, iGiaObj)) && !Vec_IntEntry(vMapping, iGiaObj) )
1097 Vec_IntWriteEntry( vMapping, iGiaObj, Vec_IntSize(vMapping) );
1098 Vec_IntPush( vMapping, Abc_ObjFaninNum(pNode) );
1100 Vec_IntPush( vMapping, Abc_Lit2Var(pFanin->
iTemp) );
1101 Vec_IntPush( vMapping, iGiaObj );
1108 Gia_ManAppendCo( pNew, Abc_ObjFanin0(pNode)->iTemp );
1111 pNew->
vIdsOrig = Vec_IntStart( Gia_ManObjNum(pNew) );
1113 Vec_IntWriteEntry( pNew->
vIdsOrig, Abc_Lit2Var(pNode->
iTemp), Abc_ObjId(pNode) );
1114 Vec_PtrFree( vNodes );
1116 assert( Gia_ManObjNum(pNew) <= nObjs );
1136 assert( !Hop_IsComplement(pObj) );
1137 if ( !Hop_ObjIsNode(pObj) || Hop_ObjIsMarkA(pObj) )
1142 assert( !Hop_ObjIsMarkA(pObj) );
1143 Hop_ObjSetMarkA( pObj );
1167 if ( Hop_ObjIsConst1( Hop_Regular(pRoot) ) )
1168 return Abc_ObjNotCond(
Abc_AigConst1(pNtkAig), Hop_IsComplement(pRoot) );
1173 Hop_ManPi(pHopMan, i)->pData = pFanin->
pCopy;
1179 return Abc_ObjNotCond( (
Abc_Obj_t *)Hop_Regular(pRoot)->pData, Hop_IsComplement(pRoot) );
1200 assert( Abc_NtkHasMapping(pNtk) );
1207 if ( Abc_ObjIsBarBuf(pNode) )
1263 assert( !Abc_NtkIsStrash(pNtk) );
1264 if ( Abc_NtkHasBlackbox(pNtk) )
1266 if ( Abc_NtkHasSop(pNtk) )
1274 if ( Abc_NtkHasMapping(pNtk) )
1276 if ( Abc_NtkHasBdd(pNtk) )
1278 if ( Abc_NtkHasAig(pNtk) )
1301 assert( !Abc_NtkIsStrash(pNtk) );
1302 if ( Abc_NtkHasBlackbox(pNtk) )
1304 if ( Abc_NtkHasBdd(pNtk) )
1306 if ( Abc_NtkHasMapping(pNtk) )
1311 if ( Abc_NtkHasSop(pNtk) )
1316 if ( Abc_NtkHasAig(pNtk) )
1335 assert( !Abc_NtkIsStrash(pNtk) );
1336 if ( Abc_NtkHasBlackbox(pNtk) )
1338 if ( Abc_NtkHasAig(pNtk) )
1340 if ( Abc_NtkHasMapping(pNtk) )
1345 if ( Abc_NtkHasBdd(pNtk) )
1351 if ( Abc_NtkHasSop(pNtk) )
1371 Vec_Int_t * vFanins = Abc_ObjFaninVec( pObj );
1372 char * pCube, * pSop = (
char*)pObj->
pData;
1374 assert( nVars == Vec_IntSize(vFanins) );
1375 for ( i = 0; i < Vec_IntSize(vFanins); i++ )
1376 for ( j = i+1; j < Vec_IntSize(vFanins); j++ )
1378 if ( Vec_IntEntry(vFanins, i) < Vec_IntEntry(vFanins, j) )
1380 ABC_SWAP(
int, Vec_IntArray(vFanins)[i], Vec_IntArray(vFanins)[j] );
1381 for ( pCube = pSop; *pCube; pCube += nVars + 3 ) {
1382 ABC_SWAP(
char, pCube[i], pCube[j] );
1389 assert( Abc_NtkIsSopLogic(pNtk) );
void Abc_NtkSortCubes(Abc_Ntk_t *pNtk, int fWeight)
void Abc_ConvertAigToGia_rec2(Hop_Obj_t *pObj)
int Abc_NtkSopToBlifMv(Abc_Ntk_t *pNtk)
#define ABC_MAX_CUBES
DECLARATIONS ///.
void Abc_NtkFaninSort(Abc_Ntk_t *pNtk)
void Abc_ConvertAigToGia_rec1(Gia_Man_t *p, Hop_Obj_t *pObj)
Gia_Man_t * Abc_NtkAigToGia(Abc_Ntk_t *p, int fGiaSimple)
int Abc_NtkMapToSop(Abc_Ntk_t *pNtk)
Abc_Obj_t * Abc_ConvertAigToAig(Abc_Ntk_t *pNtkAig, Abc_Obj_t *pObjOld)
DECLARATIONS ///.
int Abc_NtkBddToSop(Abc_Ntk_t *pNtk, int fMode, int nCubeLimit, int fCubeSort)
int Abc_NtkToAig(Abc_Ntk_t *pNtk)
int Abc_NtkMapToSopUsingLibrary(Abc_Ntk_t *pNtk, void *library)
int Abc_NtkSopToBdd(Abc_Ntk_t *pNtk)
Hop_Obj_t * Abc_ConvertSopToAigInternal(Hop_Man_t *pMan, char *pSop)
int Abc_NtkSopToAig(Abc_Ntk_t *pNtk)
int Abc_ConvertAigToGia(Gia_Man_t *p, Hop_Obj_t *pRoot)
void Abc_NodeBddToCnf(Abc_Obj_t *pNode, Mem_Flex_t *pMmMan, Vec_Str_t *vCube, int fAllPrimes, char **ppSop0, char **ppSop1)
int Abc_NtkToBdd(Abc_Ntk_t *pNtk)
void Abc_ConvertAigToAig_rec(Abc_Ntk_t *pNtkAig, Hop_Obj_t *pObj)
int Abc_NtkToSop(Abc_Ntk_t *pNtk, int fMode, int nCubeLimit)
void Abc_NtkLogicMakeDirectSops(Abc_Ntk_t *pNtk)
void Abc_ObjFaninSort(Abc_Obj_t *pObj)
int Abc_NtkAigToBdd(Abc_Ntk_t *pNtk)
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL int Abc_NtkGetFaninMax(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_SopIsConst0(char *pSop)
ABC_DLL Vec_Ptr_t * Abc_NtkDfs(Abc_Ntk_t *pNtk, int fCollectAll)
#define Abc_ObjForEachFanin(pObj, pFanin, i)
ABC_DLL int Abc_SopGetPhase(char *pSop)
#define Abc_CubeForEachVar(pCube, Value, i)
struct Abc_Aig_t_ Abc_Aig_t
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_NtkSortSops(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_NtkCleanNext(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Obj_t * Abc_AigAnd(Abc_Aig_t *pMan, Abc_Obj_t *p0, Abc_Obj_t *p1)
#define Abc_SopForEachCube(pSop, nFanins, pCube)
ABC_DLL int Abc_SopGetVarNum(char *pSop)
ABC_DLL int Abc_SopIsExorType(char *pSop)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL int Abc_SopIsComplement(char *pSop)
ABC_DLL void Abc_NtkCleanCopy(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_SopGetCubeNum(char *pSop)
ABC_DLL char * Abc_SopRegister(Mem_Flex_t *pMan, const char *pName)
DECLARATIONS ///.
ABC_DLL Abc_Obj_t * Abc_AigConst1(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachNode(pNtk, pNode, i)
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL void * Abc_FrameReadLibGen()
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
Hop_Obj_t * Dec_GraphFactorSop(Hop_Man_t *pMan, char *pSop)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Man_t_ Gia_Man_t
void Hop_ConeUnmark_rec(Hop_Obj_t *pObj)
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
Hop_Obj_t * Hop_IthVar(Hop_Man_t *p, int i)
FUNCTION DEFINITIONS ///.
Hop_Obj_t * Hop_Exor(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
int Hop_DagSize(Hop_Obj_t *pObj)
Hop_Obj_t * Hop_And(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
void Hop_ManStop(Hop_Man_t *p)
Hop_Obj_t * Hop_Or(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
Hop_Man_t * Hop_ManStart()
DECLARATIONS ///.
struct Hop_Obj_t_ Hop_Obj_t
Mem_Flex_t * Mem_FlexStart()
char * Mem_FlexEntryFetch(Mem_Flex_t *p, int nBytes)
void Mem_FlexStop(Mem_Flex_t *p, int fVerbose)
char * Mio_GateReadSop(Mio_Gate_t *pGate)
struct Mio_GateStruct_t_ Mio_Gate_t
struct Mem_Flex_t_ Mem_Flex_t
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.