148static inline int Ivy_ObjSatNum(
Ivy_Obj_t * pObj ) {
return (
int)(ABC_PTRUINT_T)pObj->
pNextFan0; }
162static inline unsigned Ivy_ObjRandomSim() {
return (rand() << 24) ^ (rand() << 12) ^ rand(); }
165#define Ivy_FraigForEachEquivClass( pList, pEnt ) \
166 for ( pEnt = pList; \
168 pEnt = Ivy_ObjEquivListNext(pEnt) )
169#define Ivy_FraigForEachEquivClassSafe( pList, pEnt, pEnt2 ) \
170 for ( pEnt = pList, \
171 pEnt2 = pEnt? Ivy_ObjEquivListNext(pEnt): NULL; \
174 pEnt2 = pEnt? Ivy_ObjEquivListNext(pEnt): NULL )
176#define Ivy_FraigForEachClassNode( pClass, pEnt ) \
177 for ( pEnt = pClass; \
179 pEnt = Ivy_ObjClassNodeNext(pEnt) )
181#define Ivy_FraigForEachBinNode( pBin, pEnt ) \
184 pEnt = Ivy_ObjNodeHashNext(pEnt) )
188static Ivy_Man_t * Ivy_FraigPerform_int(
Ivy_Man_t * pManAig,
Ivy_FraigParams_t * pParams, ABC_INT64_T nBTLimitGlobal, ABC_INT64_T nInsLimitGlobal, ABC_INT64_T * pnSatConfs, ABC_INT64_T * pnSatInspects );
199static int Ivy_FraigMiterStatus(
Ivy_Man_t * pMan );
201static void Ivy_FraigMiterPrint(
Ivy_Man_t * pNtk,
char * pString,
abctime clk,
int fVerbose );
207static ABC_INT64_T s_nBTLimitGlobal = 0;
208static ABC_INT64_T s_nInsLimitGlobal = 0;
262 ABC_INT64_T nSatConfs = 0, nSatInspects = 0;
272 printf(
"RESOURCE LIMITS: Iterations = %d. Rewriting = %s. Fraiging = %s.\n",
274 printf(
"Miter = %d (%3.1f). Rwr = %d (%3.1f). Fraig = %d (%3.1f). Last = %d.\n",
286 RetValue = Ivy_FraigMiterStatus( pManAig );
287 Ivy_FraigMiterPrint( pManAig,
"SAT solving", clk, pParams->
fVerbose );
292 if ( Ivy_ManNodeNum(pManAig) < 500 )
298 RetValue = Ivy_FraigMiterStatus( pManAig );
299 Ivy_FraigMiterPrint( pManAig,
"SAT solving", clk, pParams->
fVerbose );
309 for ( nIter = 0; nIter < pParams->
nItersMax; nIter++ )
313 printf(
"ITERATION %2d : Confs = %6d. FraigBTL = %3d. \n", nIter+1,
334 RetValue = Ivy_FraigMiterStatus( pManAig );
345 RetValue = Ivy_FraigMiterStatus( pManAig );
346 Ivy_FraigMiterPrint( pManAig,
"Fraiging ", clk, pParams->
fVerbose );
358 printf(
"Reached global limit on conflicts/inspects. Quitting.\n" );
394 if ( RetValue == 0 && pManAig->pData == NULL )
396 pManAig->pData =
ABC_ALLOC(
int, Ivy_ManPiNum(pManAig) );
397 memset( pManAig->pData, 0,
sizeof(
int) * Ivy_ManPiNum(pManAig) );
414Ivy_Man_t * Ivy_FraigPerform_int(
Ivy_Man_t * pManAig,
Ivy_FraigParams_t * pParams, ABC_INT64_T nBTLimitGlobal, ABC_INT64_T nInsLimitGlobal, ABC_INT64_T * pnSatConfs, ABC_INT64_T * pnSatInspects )
419 if ( Ivy_ManNodeNum(pManAig) == 0 )
422 assert( Ivy_ManLatchNum(pManAig) == 0 );
423 p = Ivy_FraigStart( pManAig, pParams );
425 p->nBTLimitGlobal = nBTLimitGlobal;
426 p->nInsLimitGlobal = nInsLimitGlobal;
428 Ivy_FraigSimulate(
p );
430 pManAigNew =
p->pManFraig;
431p->timeTotal = Abc_Clock() - clk;
433 *pnSatConfs =
p->pSat?
p->pSat->stats.conflicts : 0;
435 *pnSatInspects =
p->pSat?
p->pSat->stats.inspects : 0;
456 if ( Ivy_ManNodeNum(pManAig) == 0 )
459 assert( Ivy_ManLatchNum(pManAig) == 0 );
460 p = Ivy_FraigStart( pManAig, pParams );
461 Ivy_FraigSimulate(
p );
463 pManAigNew =
p->pManFraig;
464p->timeTotal = Abc_Clock() - clk;
488 assert( Ivy_ManLatchNum(pManAig) == 0 );
489 p = Ivy_FraigStartSimple( pManAig, pParams );
491 p->nBTLimitGlobal = s_nBTLimitGlobal;
492 p->nInsLimitGlobal = s_nInsLimitGlobal;
495 pObj->
pEquiv =
Ivy_And(
p->pManFraig, Ivy_ObjChild0Equiv(pObj), Ivy_ObjChild1Equiv(pObj) );
497 Ivy_FraigMiterProve(
p );
504 if ( Ivy_ObjFaninVec(pObj) )
505 Vec_PtrFree( Ivy_ObjFaninVec(pObj) );
510 pManAigNew =
p->pManFraig;
511p->timeTotal = Abc_Clock() - clk;
536 p->pParams = pParams;
537 p->pManAig = pManAig;
539 p->vPiVars = Vec_PtrAlloc( 100 );
567 p->pParams = pParams;
568 p->pManAig = pManAig;
574 p->pSimWords = (
char *)
ABC_ALLOC(
char, Ivy_ManObjNum(pManAig) * EntrySize );
575 memset(
p->pSimWords, 0, (
size_t)EntrySize );
581 if ( Ivy_ObjIsNode(pObj) )
583 if (
p->pSimStart == NULL )
584 p->pSimStart = pSims;
587 pSims->
pFanin0 = Ivy_ObjSim( Ivy_ObjFanin0(pObj) );
588 pSims->
pFanin1 = Ivy_ObjSim( Ivy_ObjFanin1(pObj) );
589 pSims->
Type = (Ivy_ObjFaninPhase(Ivy_ObjChild0(pObj)) << 2) | (Ivy_ObjFaninPhase(Ivy_ObjChild1(pObj)) << 1) | pObj->
fPhase;
597 Ivy_ObjSetSim( pObj, pSims );
599 assert( k == Ivy_ManObjNum(pManAig) );
601 p->nPatWords = Ivy_BitWordNum( Ivy_ManPiNum(pManAig) );
602 p->pPatWords =
ABC_ALLOC(
unsigned,
p->nPatWords );
603 p->pPatScores =
ABC_ALLOC(
int, 32 *
p->nSimWords );
604 p->vPiVars = Vec_PtrAlloc( 100 );
623 if (
p->pParams->fVerbose )
625 if (
p->vPiVars ) Vec_PtrFree(
p->vPiVars );
647 nMemory = (double)Ivy_ManObjNum(
p->pManAig)*
p->nSimWords*
sizeof(unsigned)/(1<<20);
648 printf(
"SimWords = %d. Rounds = %d. Mem = %0.2f MB. ",
p->nSimWords,
p->nSimRounds, nMemory );
649 printf(
"Classes: Beg = %d. End = %d.\n",
p->nClassesBeg,
p->nClassesEnd );
651 printf(
"Proof = %d. Counter-example = %d. Fail = %d. FailReal = %d. Zero = %d.\n",
652 p->nSatProof,
p->nSatCallsSat,
p->nSatFails,
p->nSatFailsReal,
p->nClassesZero );
653 printf(
"Final = %d. Miter = %d. Total = %d. Mux = %d. (Exor = %d.) SatVars = %d.\n",
654 Ivy_ManNodeNum(
p->pManFraig),
p->nNodesMiter, Ivy_ManNodeNum(
p->pManAig), 0, 0,
p->nSatVars );
656 ABC_PRT(
"AIG simulation ",
p->timeSim );
657 ABC_PRT(
"AIG traversal ",
p->timeTrav );
658 ABC_PRT(
"SAT solving ",
p->timeSat );
659 ABC_PRT(
" Unsat ",
p->timeSatUnsat );
661 ABC_PRT(
" Fail ",
p->timeSatFail );
662 ABC_PRT(
"Class refining ",
p->timeRef );
663 ABC_PRT(
"TOTAL RUNTIME ",
p->timeTotal );
664 if (
p->time1 ) {
ABC_PRT(
"time1 ",
p->time1 ); }
684 assert( Ivy_ObjIsPi(pObj) );
685 pSims = Ivy_ObjSim(pObj);
686 for ( i = 0; i <
p->nSimWords; i++ )
687 pSims->
pData[i] = Ivy_ObjRandomSim();
705 assert( Ivy_ObjIsPi(pObj) );
706 pSims = Ivy_ObjSim(pObj);
707 for ( i = 0; i <
p->nSimWords; i++ )
708 pSims->
pData[i] = fConst1? ~(
unsigned)0 : 0;
752 Limit =
IVY_MIN( Ivy_ManPiNum(
p->pManAig),
p->nSimWords * 32 - 1 );
753 for ( i = 0; i < Limit; i++ )
754 Ivy_InfoXorBit( Ivy_ObjSim( Ivy_ManPi(
p->pManAig,i) )->pData, i+1 );
772 pSims = Ivy_ObjSim(pObj);
773 for ( i = 0; i <
p->nSimWords; i++ )
774 if ( pSims->
pData[i] )
794 pSims = Ivy_ObjSim(pObj);
795 for ( i = 0; i <
p->nSimWords; i++ )
814 pSims0 = Ivy_ObjSim(pObj0);
815 pSims1 = Ivy_ObjSim(pObj1);
816 for ( i = 0; i <
p->nSimWords; i++ )
835 unsigned * pData, * pData0, * pData1;
837 pData = pSims->
pData;
840 switch( pSims->
Type )
843 for ( i = 0; i <
p->nSimWords; i++ )
844 pData[i] = (pData0[i] & pData1[i]);
847 for ( i = 0; i <
p->nSimWords; i++ )
848 pData[i] = ~(pData0[i] & pData1[i]);
851 for ( i = 0; i <
p->nSimWords; i++ )
852 pData[i] = (pData0[i] & ~pData1[i]);
855 for ( i = 0; i <
p->nSimWords; i++ )
856 pData[i] = (~pData0[i] | pData1[i]);
859 for ( i = 0; i <
p->nSimWords; i++ )
860 pData[i] = (~pData0[i] & pData1[i]);
863 for ( i = 0; i <
p->nSimWords; i++ )
864 pData[i] = (pData0[i] | ~pData1[i]);
867 for ( i = 0; i <
p->nSimWords; i++ )
868 pData[i] = ~(pData0[i] | pData1[i]);
871 for ( i = 0; i <
p->nSimWords; i++ )
872 pData[i] = (pData0[i] | pData1[i]);
891 int fCompl, fCompl0, fCompl1, i;
892 assert( !Ivy_IsComplement(pObj) );
894 pSims = Ivy_ObjSim(pObj);
895 pSims0 = Ivy_ObjSim(Ivy_ObjFanin0(pObj));
896 pSims1 = Ivy_ObjSim(Ivy_ObjFanin1(pObj));
899 fCompl0 = Ivy_ObjFaninPhase(Ivy_ObjChild0(pObj));
900 fCompl1 = Ivy_ObjFaninPhase(Ivy_ObjChild1(pObj));
902 if ( fCompl0 && fCompl1 )
905 for ( i = 0; i <
p->nSimWords; i++ )
908 for ( i = 0; i <
p->nSimWords; i++ )
911 else if ( fCompl0 && !fCompl1 )
914 for ( i = 0; i <
p->nSimWords; i++ )
917 for ( i = 0; i <
p->nSimWords; i++ )
920 else if ( !fCompl0 && fCompl1 )
923 for ( i = 0; i <
p->nSimWords; i++ )
926 for ( i = 0; i <
p->nSimWords; i++ )
932 for ( i = 0; i <
p->nSimWords; i++ )
935 for ( i = 0; i <
p->nSimWords; i++ )
953 static int s_FPrimes[128] = {
954 1009, 1049, 1093, 1151, 1201, 1249, 1297, 1361, 1427, 1459,
955 1499, 1559, 1607, 1657, 1709, 1759, 1823, 1877, 1933, 1997,
956 2039, 2089, 2141, 2213, 2269, 2311, 2371, 2411, 2467, 2543,
957 2609, 2663, 2699, 2741, 2797, 2851, 2909, 2969, 3037, 3089,
958 3169, 3221, 3299, 3331, 3389, 3461, 3517, 3557, 3613, 3671,
959 3719, 3779, 3847, 3907, 3943, 4013, 4073, 4129, 4201, 4243,
960 4289, 4363, 4441, 4493, 4549, 4621, 4663, 4729, 4793, 4871,
961 4933, 4973, 5021, 5087, 5153, 5227, 5281, 5351, 5417, 5471,
962 5519, 5573, 5651, 5693, 5749, 5821, 5861, 5923, 6011, 6073,
963 6131, 6199, 6257, 6301, 6353, 6397, 6481, 6563, 6619, 6689,
964 6737, 6803, 6863, 6917, 6977, 7027, 7109, 7187, 7237, 7309,
965 7393, 7477, 7523, 7561, 7607, 7681, 7727, 7817, 7877, 7933,
966 8011, 8039, 8059, 8081, 8093, 8111, 8123, 8147
973 pSims = Ivy_ObjSim(pObj);
974 for ( i = 0; i <
p->nSimWords; i++ )
975 uHash ^= pSims->
pData[i] * s_FPrimes[i];
1008p->timeSim += Abc_Clock() - clk;
1028 for ( pSims =
p->pSimStart; pSims; pSims = pSims->
pNext )
1030p->timeSim += Abc_Clock() - clk;
1047 if ( Ivy_ObjClassNodeNext(pClass) == NULL )
1048 Ivy_ObjSetClassNodeNext( pClass, pObj );
1050 Ivy_ObjSetClassNodeNext( Ivy_ObjClassNodeLast(pClass), pObj );
1051 Ivy_ObjSetClassNodeLast( pClass, pObj );
1052 Ivy_ObjSetClassNodeRepr( pObj, pClass );
1053 Ivy_ObjSetClassNodeNext( pObj, NULL );
1069 if ( pList->
pHead == NULL )
1071 pList->
pHead = pClass;
1072 pList->
pTail = pClass;
1073 Ivy_ObjSetEquivListPrev( pClass, NULL );
1074 Ivy_ObjSetEquivListNext( pClass, NULL );
1078 Ivy_ObjSetEquivListNext( pList->
pTail, pClass );
1079 Ivy_ObjSetEquivListPrev( pClass, pList->
pTail );
1080 Ivy_ObjSetEquivListNext( pClass, NULL );
1081 pList->
pTail = pClass;
1099 Ivy_ObjSetEquivListPrev( pClass, pBase );
1100 Ivy_ObjSetEquivListNext( pClass, Ivy_ObjEquivListNext(pBase) );
1101 if ( Ivy_ObjEquivListNext(pBase) )
1102 Ivy_ObjSetEquivListPrev( Ivy_ObjEquivListNext(pBase), pClass );
1103 Ivy_ObjSetEquivListNext( pBase, pClass );
1104 if ( pList->
pTail == pBase )
1105 pList->
pTail = pClass;
1122 if ( pList->
pHead == pClass )
1123 pList->
pHead = Ivy_ObjEquivListNext(pClass);
1124 if ( pList->
pTail == pClass )
1125 pList->
pTail = Ivy_ObjEquivListPrev(pClass);
1126 if ( Ivy_ObjEquivListPrev(pClass) )
1127 Ivy_ObjSetEquivListNext( Ivy_ObjEquivListPrev(pClass), Ivy_ObjEquivListNext(pClass) );
1128 if ( Ivy_ObjEquivListNext(pClass) )
1129 Ivy_ObjSetEquivListPrev( Ivy_ObjEquivListNext(pClass), Ivy_ObjEquivListPrev(pClass) );
1130 Ivy_ObjSetEquivListNext( pClass, NULL );
1131 Ivy_ObjSetEquivListPrev( pClass, NULL );
1150 int nPairs = 0, nNodes;
1158 nPairs += nNodes * (nNodes - 1) / 2;
1177 Ivy_Obj_t * pObj, * pConst1, * pBin, * pEntry;
1180 pConst1 = Ivy_ManConst1(
p->pManAig);
1182 nTableSize = Ivy_ManObjNum(
p->pManAig) / 2 + 13;
1188 if ( !Ivy_ObjIsPi(pObj) && !Ivy_ObjIsNode(pObj) )
1197 pBin = pTable[Hash % nTableSize];
1207 Ivy_ObjSetNodeHashNext( pObj, pBin );
1208 pTable[Hash % nTableSize] = pObj;
1211 assert(
p->lClasses.pHead == NULL );
1214 if ( !Ivy_ObjIsConst1(pObj) && !Ivy_ObjIsPi(pObj) && !Ivy_ObjIsNode(pObj) )
1216 Ivy_ObjSetNodeHashNext( pObj, NULL );
1217 if ( Ivy_ObjClassNodeRepr(pObj) == NULL )
1219 assert( Ivy_ObjClassNodeNext(pObj) == NULL );
1223 if ( Ivy_ObjClassNodeNext( Ivy_ObjClassNodeRepr(pObj) ) != NULL )
1226 Ivy_ObjSetClassNodeRepr( pObj, NULL );
1246 Ivy_Obj_t * pClassNew, * pListOld, * pListNew, * pNode;
1254 if (
p->pParams->fPatScores )
1255 Ivy_FraigAddToPatScores(
p, pClass, pClassNew );
1258 pListOld = pClassNew;
1260 if ( pClassNew == NULL )
1263 Ivy_ObjSetClassNodeRepr( pClassNew, NULL );
1265 pListNew = pClassNew;
1271 Ivy_ObjSetClassNodeNext( pListOld, pNode );
1276 Ivy_ObjSetClassNodeNext( pListNew, pNode );
1277 Ivy_ObjSetClassNodeRepr( pNode, pClassNew );
1281 Ivy_ObjSetClassNodeNext( pListNew, NULL );
1282 Ivy_ObjSetClassNodeNext( pListOld, NULL );
1286 if ( Ivy_ObjClassNodeNext(pClass) == NULL )
1289 if ( Ivy_ObjClassNodeNext(pClassNew) == NULL )
1293 return RetValue + 1;
1310 int i, k, BestPat, * pModel;
1312 pSims = Ivy_ObjSim(pObj);
1313 for ( i = 0; i <
p->nSimWords; i++ )
1314 if ( pSims->
pData[i] )
1316 assert( i < p->nSimWords );
1318 for ( k = 0; k < 32; k++ )
1319 if ( pSims->
pData[i] & (1 << k) )
1323 BestPat = i * 32 + k;
1325 pModel =
ABC_ALLOC(
int, Ivy_ManPiNum(
p->pManFraig) );
1328 pModel[i] = Ivy_InfoHasBit(Ivy_ObjSim(pObj)->pData, BestPat);
1333 assert(
p->pManFraig->pData == NULL );
1334 p->pManFraig->pData = pModel;
1390 int RetValue, Counter = 0;
1394 if (
p->pParams->fProve )
1396 if (
p->pManFraig->pData )
1405 Counter += ( RetValue > 0 );
1411p->timeRef += Abc_Clock() - clk;
1429 printf(
"Class {" );
1431 printf(
" %d(%d)%c", pObj->
Id, pObj->
Level, pObj->
fPhase?
'+' :
'-' );
1490 memset(
p->pPatWords, 0,
sizeof(
unsigned) *
p->nPatWords );
1506 memset(
p->pPatWords, 0xff,
sizeof(
unsigned) *
p->nPatWords );
1525 pModel =
ABC_ALLOC(
int, Ivy_ManPiNum(
p->pManFraig) );
1528 pModel[i] = (
p->pSat->model[Ivy_ObjSatNum(pObj)] ==
l_True );
1547 memset(
p->pPatWords, 0,
sizeof(
unsigned) *
p->nPatWords );
1551 if (
p->pSat->model[Ivy_ObjSatNum(pObj)] ==
l_True )
1552 Ivy_InfoSetBit(
p->pPatWords, i );
1571 memset(
p->pPatWords, 0,
sizeof(
unsigned) *
p->nPatWords );
1575 if (
p->pSat->model[Ivy_ObjSatNum(pObj)] ==
l_True )
1577 Ivy_InfoSetBit(
p->pPatWords, pObj->
Id - 1 );
1595 for ( i = 0; i <
p->nPatWords; i++ )
1596 p->pPatWords[i] = Ivy_ObjRandomSim();
1599 if ( Ivy_InfoHasBit(
p->pPatWords, pObj->
Id - 1 ) ^ sat_solver_var_value(
p->pSat, Ivy_ObjSatNum(pObj)) )
1600 Ivy_InfoXorBit(
p->pPatWords, pObj->
Id - 1 );
1617 int nChanges, nClasses;
1628 if (
p->pManFraig->pData )
1635 if (
p->pManFraig->pData )
1642 nClasses =
p->lClasses.nItems;
1644 if (
p->pManFraig->pData )
1647 }
while ( (
double)nChanges / nClasses >
p->pParams->dSimSatur );
1666 int i, nLimit =
p->nSimWords * 32;
1667 for ( i = 0; i < nLimit; i++ )
1668 p->pPatScores[i] = 0;
1688 pSims0 = Ivy_ObjSim(pClass);
1689 pSims1 = Ivy_ObjSim(pClassNew);
1691 for ( w = 0; w <
p->nSimWords; w++ )
1696 for ( i = 0; i < 32; i++ )
1697 if ( uDiff & ( 1 << i ) )
1698 p->pPatScores[w*32+i]++;
1717 int i, nLimit =
p->nSimWords * 32, MaxScore = 0, BestPat = -1;
1718 for ( i = 1; i < nLimit; i++ )
1720 if ( MaxScore < p->pPatScores[i] )
1722 MaxScore =
p->pPatScores[i];
1726 if ( MaxScore == 0 )
1731 memset(
p->pPatWords, 0,
sizeof(
unsigned) *
p->nPatWords );
1734 pSims = Ivy_ObjSim(pObj);
1735 if ( Ivy_InfoHasBit(pSims->
pData, BestPat) )
1736 Ivy_InfoSetBit(
p->pPatWords, i);
1757 if (
p->pParams->fPatScores )
1760 if (
p->pManFraig->pData )
1763 printf(
"Error: A counter-example did not refine classes!\n" );
1766 if ( !
p->pParams->fPatScores )
1776 if (
p->pManFraig->pData )
1779 if ( nChanges == 0 )
1796void Ivy_FraigMiterPrint(
Ivy_Man_t * pNtk,
char * pString,
abctime clk,
int fVerbose )
1800 printf(
"Nodes = %7d. Levels = %4d. ", Ivy_ManNodeNum(pNtk),
Ivy_ManLevels(pNtk) );
1801 ABC_PRT( pString, Abc_Clock() - clk );
1815int Ivy_FraigMiterStatus(
Ivy_Man_t * pMan )
1818 int i, CountConst0 = 0, CountNonConst0 = 0, CountUndecided = 0;
1823 pObjNew = Ivy_ObjChild0(pObj);
1825 if ( pObjNew == pMan->pConst1 )
1831 if ( pObjNew == Ivy_Not(pMan->pConst1) )
1845 if ( Ivy_Regular(pObjNew)->fPhase != (
unsigned)Ivy_IsComplement(pObjNew) )
1862 if ( CountNonConst0 )
1864 if ( CountUndecided )
1888 if ( i && fVerbose )
1890 ABC_PRT(
"Time", Abc_Clock() -clk );
1892 pObjNew = Ivy_ObjChild0Equiv(pObj);
1894 if ( pObjNew ==
p->pManFraig->pConst1 )
1897 printf(
"Output %2d (out of %2d) is constant 1. ", i, Ivy_ManPoNum(
p->pManAig) );
1899 p->pManFraig->pData =
ABC_ALLOC(
int, Ivy_ManPiNum(
p->pManFraig) );
1900 memset(
p->pManFraig->pData, 0,
sizeof(
int) * Ivy_ManPiNum(
p->pManFraig) );
1904 if ( pObjNew == Ivy_Not(
p->pManFraig->pConst1) )
1907 printf(
"Output %2d (out of %2d) is already constant 0. ", i, Ivy_ManPoNum(
p->pManAig) );
1911 if ( Ivy_Regular(pObjNew)->fPhase != (
unsigned)Ivy_IsComplement(pObjNew) )
1914 printf(
"Output %2d (out of %2d) cannot be constant 0. ", i, Ivy_ManPoNum(
p->pManAig) );
1916 p->pManFraig->pData =
ABC_ALLOC(
int, Ivy_ManPiNum(
p->pManFraig) );
1917 memset(
p->pManFraig->pData, 0,
sizeof(
int) * Ivy_ManPiNum(
p->pManFraig) );
1929 RetValue = Ivy_FraigNodeIsConst(
p, Ivy_Regular(pObjNew) );
1930 if ( RetValue == 1 )
1933 printf(
"Output %2d (out of %2d) was proved constant 0. ", i, Ivy_ManPoNum(
p->pManAig) );
1935 Ivy_ObjFanin0(pObj)->pEquiv = Ivy_NotCond(
p->pManFraig->pConst1, !Ivy_ObjFaninC0(pObj) );
1938 if ( RetValue == -1 )
1941 printf(
"Output %2d (out of %2d) has timed out at %d backtracks. ", i, Ivy_ManPoNum(
p->pManAig),
p->pParams->nBTLimitMiter );
1946 printf(
"Output %2d (out of %2d) was proved NOT a constant 0. ", i, Ivy_ManPoNum(
p->pManAig) );
1948 p->pManFraig->pData = Ivy_FraigCreateModel(
p);
1953 ABC_PRT(
"Time", Abc_Clock() -clk );
1973p->nClassesBeg =
p->lClasses.nItems;
1978 Extra_ProgressBarUpdate(
p->pProgress, k++, NULL );
1980 if (
p->pManFraig->pData )
1981 pObj->
pEquiv =
Ivy_And(
p->pManFraig, Ivy_ObjChild0Equiv(pObj), Ivy_ObjChild1Equiv(pObj) );
1983 pObj->
pEquiv = Ivy_FraigAnd(
p, pObj );
1989p->nClassesEnd =
p->lClasses.nItems;
1991 p->nNodesMiter = Ivy_ManNodeNum(
p->pManFraig);
1993 if (
p->pParams->fProve &&
p->pManFraig->pData == NULL )
1994 Ivy_FraigMiterProve(
p );
2004 if ( Ivy_ObjFaninVec(pObj) )
2005 Vec_PtrFree( Ivy_ObjFaninVec(pObj) );
2029 Ivy_Obj_t * pObjNew, * pFanin0New, * pFanin1New, * pObjReprNew;
2032 pFanin0New = Ivy_ObjChild0Equiv(pObjOld);
2033 pFanin1New = Ivy_ObjChild1Equiv(pObjOld);
2035 pObjNew =
Ivy_And(
p->pManFraig, pFanin0New, pFanin1New );
2037 if ( Ivy_ObjClassNodeRepr(pObjOld) == NULL ||
2038 (!
p->pParams->fDoSparse && Ivy_ObjClassNodeRepr(pObjOld) ==
p->pManAig->pConst1) )
2046 pObjReprNew = Ivy_ObjFraig(Ivy_ObjClassNodeRepr(pObjOld));
2048 if ( Ivy_Regular(pObjNew) == Ivy_Regular(pObjReprNew) )
2050 assert( Ivy_Regular(pObjNew) != Ivy_ManConst1(
p->pManFraig) );
2054 RetValue = Ivy_FraigNodesAreEquiv(
p, Ivy_Regular(pObjReprNew), Ivy_Regular(pObjNew) );
2055 if ( RetValue == 1 )
2058 if ( Ivy_ObjClassNodeNext(pObjOld) == NULL )
2059 Ivy_ObjClassNodeRepr(pObjOld)->fMarkA = 1;
2060 return Ivy_NotCond( pObjReprNew, pObjOld->
fPhase ^ Ivy_ObjClassNodeRepr(pObjOld)->fPhase );
2062 if ( RetValue == -1 )
2083 for ( i = 0; i <
p->nSatVars; i++ )
2084 printf(
"%d %d ", i, (
int)
p->pSat->activity[i] );
2101 int pLits[4], RetValue, RetValue1, nBTLimit;
2105 assert( !Ivy_IsComplement(pNew) );
2106 assert( !Ivy_IsComplement(pOld) );
2112 nBTLimit =
p->pParams->nBTLimitNode;
2118 if ( nBTLimit <= 10 )
2120 nBTLimit = (int)pow(nBTLimit, 0.7);
2125 if (
p->pSat == NULL )
2137 Ivy_FraigNodeAddToSolver(
p, pOld, pNew );
2140 Ivy_FraigSetActivityFactors(
p, pOld, pNew );
2145 pLits[0] = toLitCond( Ivy_ObjSatNum(pOld), 0 );
2146 pLits[1] = toLitCond( Ivy_ObjSatNum(pNew), pOld->
fPhase == pNew->
fPhase );
2149 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0,
2150 p->nBTLimitGlobal,
p->nInsLimitGlobal );
2151p->timeSat += Abc_Clock() - clk;
2154p->timeSatUnsat += Abc_Clock() - clk;
2155 pLits[0] = lit_neg( pLits[0] );
2156 pLits[1] = lit_neg( pLits[1] );
2160 p->nSatCallsUnsat++;
2162 else if ( RetValue1 ==
l_True )
2164p->timeSatSat += Abc_Clock() - clk;
2171p->timeSatFail += Abc_Clock() - clk;
2181 if ( pOld !=
p->pManFraig->pConst1 )
2189 if ( pOld ==
p->pManFraig->pConst1 )
2198 pLits[0] = toLitCond( Ivy_ObjSatNum(pOld), 1 );
2199 pLits[1] = toLitCond( Ivy_ObjSatNum(pNew), pOld->
fPhase ^ pNew->
fPhase );
2201 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0,
2202 p->nBTLimitGlobal,
p->nInsLimitGlobal );
2203p->timeSat += Abc_Clock() - clk;
2206p->timeSatUnsat += Abc_Clock() - clk;
2207 pLits[0] = lit_neg( pLits[0] );
2208 pLits[1] = lit_neg( pLits[1] );
2211 p->nSatCallsUnsat++;
2213 else if ( RetValue1 ==
l_True )
2215p->timeSatSat += Abc_Clock() - clk;
2222p->timeSatFail += Abc_Clock() - clk;
2268 int pLits[2], RetValue1;
2273 assert( !Ivy_IsComplement(pNew) );
2274 assert( pNew !=
p->pManFraig->pConst1 );
2278 if (
p->pSat == NULL )
2290 Ivy_FraigNodeAddToSolver(
p, NULL, pNew );
2293 Ivy_FraigSetActivityFactors(
p, NULL, pNew );
2297 pLits[0] = toLitCond( Ivy_ObjSatNum(pNew), pNew->
fPhase );
2299 (ABC_INT64_T)
p->pParams->nBTLimitMiter, (ABC_INT64_T)0,
2300 p->nBTLimitGlobal,
p->nInsLimitGlobal );
2301p->timeSat += Abc_Clock() - clk;
2304p->timeSatUnsat += Abc_Clock() - clk;
2305 pLits[0] = lit_neg( pLits[0] );
2309 p->nSatCallsUnsat++;
2311 else if ( RetValue1 ==
l_True )
2313p->timeSatSat += Abc_Clock() - clk;
2321p->timeSatFail += Abc_Clock() - clk;
2355 int pLits[4], RetValue, VarF, VarI, VarT, VarE, fCompT, fCompE;
2357 assert( !Ivy_IsComplement( pNode ) );
2362 VarF = Ivy_ObjSatNum(pNode);
2363 VarI = Ivy_ObjSatNum(pNodeI);
2364 VarT = Ivy_ObjSatNum(Ivy_Regular(pNodeT));
2365 VarE = Ivy_ObjSatNum(Ivy_Regular(pNodeE));
2367 fCompT = Ivy_IsComplement(pNodeT);
2368 fCompE = Ivy_IsComplement(pNodeE);
2378 pLits[0] = toLitCond(VarI, 1);
2379 pLits[1] = toLitCond(VarT, 1^fCompT);
2380 pLits[2] = toLitCond(VarF, 0);
2383 pLits[0] = toLitCond(VarI, 1);
2384 pLits[1] = toLitCond(VarT, 0^fCompT);
2385 pLits[2] = toLitCond(VarF, 1);
2388 pLits[0] = toLitCond(VarI, 0);
2389 pLits[1] = toLitCond(VarE, 1^fCompE);
2390 pLits[2] = toLitCond(VarF, 0);
2393 pLits[0] = toLitCond(VarI, 0);
2394 pLits[1] = toLitCond(VarE, 0^fCompE);
2395 pLits[2] = toLitCond(VarF, 1);
2412 pLits[0] = toLitCond(VarT, 0^fCompT);
2413 pLits[1] = toLitCond(VarE, 0^fCompE);
2414 pLits[2] = toLitCond(VarF, 1);
2417 pLits[0] = toLitCond(VarT, 1^fCompT);
2418 pLits[1] = toLitCond(VarE, 1^fCompE);
2419 pLits[2] = toLitCond(VarF, 0);
2438 int * pLits, nLits, RetValue, i;
2439 assert( !Ivy_IsComplement(pNode) );
2440 assert( Ivy_ObjIsNode( pNode ) );
2442 nLits = Vec_PtrSize(vSuper) + 1;
2448 pLits[0] = toLitCond(Ivy_ObjSatNum(Ivy_Regular(pFanin)), Ivy_IsComplement(pFanin));
2449 pLits[1] = toLitCond(Ivy_ObjSatNum(pNode), 1);
2455 pLits[i] = toLitCond(Ivy_ObjSatNum(Ivy_Regular(pFanin)), !Ivy_IsComplement(pFanin));
2456 pLits[nLits-1] = toLitCond(Ivy_ObjSatNum(pNode), 0);
2476 if ( Ivy_IsComplement(pObj) || Ivy_ObjIsPi(pObj) || (!fFirst && Ivy_ObjRefs(pObj) > 1) ||
2479 Vec_PtrPushUnique( vSuper, pObj );
2501 assert( !Ivy_IsComplement(pObj) );
2502 assert( !Ivy_ObjIsPi(pObj) );
2503 vSuper = Vec_PtrAlloc( 4 );
2521 assert( !Ivy_IsComplement(pObj) );
2522 if ( Ivy_ObjSatNum(pObj) )
2524 assert( Ivy_ObjSatNum(pObj) == 0 );
2525 assert( Ivy_ObjFaninVec(pObj) == NULL );
2526 if ( Ivy_ObjIsConst1(pObj) )
2529 Ivy_ObjSetSatNum( pObj,
p->nSatVars++ );
2530 if ( Ivy_ObjIsNode(pObj) )
2531 Vec_PtrPush( vFrontier, pObj );
2549 int i, k, fUseMuxes = 1;
2552 if ( (!pOld || Ivy_ObjFaninVec(pOld)) && (!pNew || Ivy_ObjFaninVec(pNew)) )
2555 vFrontier = Vec_PtrAlloc( 100 );
2562 assert( Ivy_ObjSatNum(pNode) );
2563 assert( Ivy_ObjFaninVec(pNode) == NULL );
2566 vFanins = Vec_PtrAlloc( 4 );
2567 Vec_PtrPushUnique( vFanins, Ivy_ObjFanin0( Ivy_ObjFanin0(pNode) ) );
2568 Vec_PtrPushUnique( vFanins, Ivy_ObjFanin0( Ivy_ObjFanin1(pNode) ) );
2569 Vec_PtrPushUnique( vFanins, Ivy_ObjFanin1( Ivy_ObjFanin0(pNode) ) );
2570 Vec_PtrPushUnique( vFanins, Ivy_ObjFanin1( Ivy_ObjFanin1(pNode) ) );
2582 assert( Vec_PtrSize(vFanins) > 1 );
2583 Ivy_ObjSetFaninVec( pNode, vFanins );
2585 Vec_PtrFree( vFrontier );
2605 assert( !Ivy_IsComplement(pObj) );
2606 assert( Ivy_ObjSatNum(pObj) );
2608 if ( Ivy_ObjIsTravIdCurrent(
p->pManFraig, pObj) )
2610 Ivy_ObjSetTravIdCurrent(
p->pManFraig, pObj);
2612 if ( pObj->
Level <= (
unsigned)LevelMin || Ivy_ObjIsPi(pObj) )
2616 p->pSat->factors[Ivy_ObjSatNum(pObj)] =
p->pParams->dActConeBumpMax * (pObj->
Level - LevelMin)/(LevelMax - LevelMin);
2617 veci_push(&
p->pSat->act_vars, Ivy_ObjSatNum(pObj));
2619 vFanins = Ivy_ObjFaninVec( pObj );
2638 int LevelMin, LevelMax;
2643 veci_resize(&
p->pSat->act_vars, 0);
2647 assert(
p->pParams->dActConeRatio > 0 &&
p->pParams->dActConeRatio < 1 );
2649 LevelMin = (int)(LevelMax * (1.0 -
p->pParams->dActConeRatio));
2651 if ( pOld && !Ivy_ObjIsConst1(pOld) )
2653 if ( pNew && !Ivy_ObjIsConst1(pNew) )
2656p->timeTrav += Abc_Clock() - clk;
2663#include "bdd/cudd/cuddInt.h"
2681DdNode * Ivy_FraigNodesAreEquivBdd_int( DdManager * dd, DdNode * bFunc,
Vec_Ptr_t * vFront,
int Level )
2689 vTemp = Vec_PtrAlloc( 100 );
2692 if ( (
int)pObj->
Level != Level )
2695 pObj->
TravId = Vec_PtrSize(vTemp);
2696 Vec_PtrPush( vTemp, pObj );
2700 pFanin = Ivy_ObjFanin0(pObj);
2701 if ( pFanin->
fMarkB == 0 )
2704 pFanin->
TravId = Vec_PtrSize(vTemp);
2705 Vec_PtrPush( vTemp, pFanin );
2708 pFanin = Ivy_ObjFanin1(pObj);
2709 if ( pFanin->
fMarkB == 0 )
2712 pFanin->
TravId = Vec_PtrSize(vTemp);
2713 Vec_PtrPush( vTemp, pFanin );
2717 NewSize =
IVY_MAX(dd->size, Vec_PtrSize(vTemp));
2718 pFuncs =
ABC_ALLOC( DdNode *, NewSize );
2721 if ( (
int)pObj->
Level != Level )
2722 pFuncs[i] = Cudd_bddIthVar( dd, pObj->
TravId );
2724 pFuncs[i] = Cudd_bddAnd( dd,
2725 Cudd_NotCond( Cudd_bddIthVar(dd, Ivy_ObjFanin0(pObj)->TravId), Ivy_ObjFaninC0(pObj) ),
2726 Cudd_NotCond( Cudd_bddIthVar(dd, Ivy_ObjFanin1(pObj)->TravId), Ivy_ObjFaninC1(pObj) ) );
2727 Cudd_Ref( pFuncs[i] );
2730 assert( NewSize == dd->size );
2731 for ( i = Vec_PtrSize(vFront); i < dd->size; i++ )
2733 pFuncs[i] = Cudd_bddIthVar( dd, i );
2734 Cudd_Ref( pFuncs[i] );
2738 bFuncNew = Cudd_bddVectorCompose( dd, bFunc, pFuncs ); Cudd_Ref( bFuncNew );
2746 for ( i = 0; i < dd->size; i++ )
2747 Cudd_RecursiveDeref( dd, pFuncs[i] );
2753 vTemp->nCap = vTemp->nSize = 0;
2754 vTemp->pArray = NULL;
2755 Vec_PtrFree( vTemp );
2757 Cudd_Deref( bFuncNew );
2774 static DdManager * dd = NULL;
2775 DdNode * bFunc, * bTemp;
2778 int i, RetValue, Iter, Level;
2781 dd = Cudd_Init( 50, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
2783 vFront = Vec_PtrAlloc( 100 );
2784 Vec_PtrPush( vFront, pObj1 );
2785 Vec_PtrPush( vFront, pObj2 );
2787 bFunc = Cudd_bddXor( dd, Cudd_bddIthVar(dd,0), Cudd_bddIthVar(dd,1) ); Cudd_Ref( bFunc );
2788 bFunc = Cudd_NotCond( bFunc, pObj1->
fPhase != pObj2->
fPhase );
2790 for ( Iter = 0; ; Iter++ )
2795 if ( Level < (
int)pObj->
Level )
2796 Level = (int)pObj->
Level;
2799 bFunc = Ivy_FraigNodesAreEquivBdd_int( dd, bTemp = bFunc, vFront, Level ); Cudd_Ref( bFunc );
2800 Cudd_RecursiveDeref( dd, bTemp );
2801 if ( bFunc == Cudd_ReadLogicZero(dd) )
2802 {printf(
"%d", Iter );
break;}
2803 if ( Cudd_DagSize(bFunc) > 1000 )
2804 {printf(
"b" );
break;}
2805 if ( dd->size > 120 )
2806 {printf(
"s" );
break;}
2808 {printf(
"i" );
break;}
2810 if ( bFunc == Cudd_ReadLogicZero(dd) )
2812 else if ( Level == 0 )
2816 Cudd_RecursiveDeref( dd, bFunc );
2817 Vec_PtrFree( vFront );
2845 if ( Ivy_ObjIsPi(pNode) )
2847 Vec_IntPush( vLeaves, pNode->
Id );
2850 assert( Ivy_ObjIsAnd(pNode) );
2853 Vec_IntPush( vNodes, pNode->
Id );
2875 vNodes = Vec_IntAlloc( 100 );
2876 Ivy_ManConst1(
p)->fMarkB = 1;
2879 Ivy_ManConst1(
p)->fMarkB = 0;
2882 Ivy_ManConst1(
p)->pEquiv = (
Ivy_Obj_t *)Aig_ManConst1(pMan);
2900 pMiter = Aig_NotCond( pMiter, Aig_Regular(pMiter)->fPhase ^ Aig_IsComplement(pMiter) );
2913 Vec_IntFree( vNodes );
2930 extern int Fra_FraigSat(
Aig_Man_t * pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit,
int nLearnedStart,
int nLearnedDelta,
int nLearnedPerce,
int fFlipBits,
int fAndOuts,
int fNewSolver,
int fVerbose );
2935 vLeaves = Vec_IntAlloc( 100 );
2937 RetValue =
Fra_FraigSat( pMan, nConfLimit, 0, 0, 0, 0, 0, 0, 0, 1 );
2938 if ( RetValue == 0 )
2941 memset( pGlo->pPatWords, 0,
sizeof(
unsigned) * pGlo->nPatWords );
2943 if ( ((
int *)pMan->pData)[i] )
2945 int iObjIvy = Vec_IntEntry( vLeaves, i );
2946 assert( iObjIvy > 0 && iObjIvy <= Ivy_ManPiNum(
p) );
2947 Ivy_InfoSetBit( pGlo->pPatWords, iObjIvy-1 );
2953 Vec_IntFree( vLeaves );
2954 if ( RetValue == 1 )
2955 printf(
"UNSAT\n" );
2956 else if ( RetValue == 0 )
2958 else if ( RetValue == -1 )
2959 printf(
"UNDEC\n" );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
#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_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
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_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
#define sat_solver_addclause
int Fra_FraigSat(Aig_Man_t *pMan, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, int nLearnedStart, int nLearnedDelta, int nLearnedPerce, int fFlipBits, int fAndOuts, int fNewSolver, int fVerbose)
ITERATORS ///.
Ivy_Man_t * Ivy_FraigPerform(Ivy_Man_t *pManAig, Ivy_FraigParams_t *pParams)
int Ivy_FraigCountPairsClasses(Ivy_FraigMan_t *p)
void Ivy_FraigCleanPatScores(Ivy_FraigMan_t *p)
void Ivy_NodeAssignConst(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj, int fConst1)
Aig_Man_t * Ivy_FraigExtractCone(Ivy_Man_t *p, Ivy_Obj_t *pObj1, Ivy_Obj_t *pObj2, Vec_Int_t *vLeaves)
void Ivy_FraigSavePattern0(Ivy_FraigMan_t *p)
void Ivy_FraigResimulate(Ivy_FraigMan_t *p)
void Ivy_FraigSimulateOne(Ivy_FraigMan_t *p)
int Ivy_FraigRefineClasses(Ivy_FraigMan_t *p)
void Ivy_FraigPrintClass(Ivy_Obj_t *pClass)
void Ivy_FraigSavePattern2(Ivy_FraigMan_t *p)
struct Prove_ParamsStruct_t_ Prove_Params_t
void Ivy_FraigCheckOutputSimsSavePattern(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
int Ivy_FraigSetActivityFactors_rec(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj, int LevelMin, int LevelMax)
void Ivy_FraigRemoveClass(Ivy_FraigList_t *pList, Ivy_Obj_t *pClass)
void Ivy_FraigPrintSimClasses(Ivy_FraigMan_t *p)
void Ivy_FraigSimulateOneSim(Ivy_FraigMan_t *p)
int Ivy_FraigRefineClass_rec(Ivy_FraigMan_t *p, Ivy_Obj_t *pClass)
void Ivy_FraigAssignDist1(Ivy_FraigMan_t *p, unsigned *pPat)
int Ivy_FraigSelectBestPat(Ivy_FraigMan_t *p)
int Ivy_FraigCheckOutputSims(Ivy_FraigMan_t *p)
int Ivy_NodeHasZeroSim(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
void Ivy_FraigInsertClass(Ivy_FraigList_t *pList, Ivy_Obj_t *pBase, Ivy_Obj_t *pClass)
void Ivy_FraigSavePattern1(Ivy_FraigMan_t *p)
#define Ivy_FraigForEachEquivClassSafe(pList, pEnt, pEnt2)
#define Ivy_FraigForEachBinNode(pBin, pEnt)
#define Ivy_FraigForEachEquivClass(pList, pEnt)
void Ivy_NodeAssignRandom(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
void Ivy_FraigParamsDefault(Ivy_FraigParams_t *pParams)
FUNCTION DEFINITIONS ///.
void Ivy_FraigCreateClasses(Ivy_FraigMan_t *p)
ABC_NAMESPACE_IMPL_END ABC_NAMESPACE_IMPL_START ABC_NAMESPACE_IMPL_END ABC_NAMESPACE_IMPL_START void Ivy_FraigExtractCone_rec(Ivy_Man_t *p, Ivy_Obj_t *pNode, Vec_Int_t *vLeaves, Vec_Int_t *vNodes)
void Ivy_NodeSimulate(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
Vec_Ptr_t * Ivy_FraigCollectSuper(Ivy_Obj_t *pObj, int fUseMuxes)
int Ivy_FraigCountClassNodes(Ivy_Obj_t *pClass)
void Ivy_FraigPrintActivity(Ivy_FraigMan_t *p)
void Ivy_NodeSimulateSim(Ivy_FraigMan_t *p, Ivy_FraigSim_t *pSims)
void Ivy_FraigAddClass(Ivy_FraigList_t *pList, Ivy_Obj_t *pClass)
struct Ivy_FraigList_t_ Ivy_FraigList_t
void Ivy_FraigCollectSuper_rec(Ivy_Obj_t *pObj, Vec_Ptr_t *vSuper, int fFirst, int fUseMuxes)
void Ivy_FraigObjAddToFrontier(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj, Vec_Ptr_t *vFrontier)
#define Ivy_FraigForEachClassNode(pClass, pEnt)
typedefABC_NAMESPACE_IMPL_START struct Ivy_FraigMan_t_ Ivy_FraigMan_t
DECLARATIONS ///.
unsigned Ivy_NodeHash(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
void Ivy_NodeComplementSim(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj)
struct Ivy_FraigSim_t_ Ivy_FraigSim_t
int Ivy_NodeCompareSims(Ivy_FraigMan_t *p, Ivy_Obj_t *pObj0, Ivy_Obj_t *pObj1)
void Ivy_FraigAddClausesSuper(Ivy_FraigMan_t *p, Ivy_Obj_t *pNode, Vec_Ptr_t *vSuper)
void Ivy_FraigAssignRandom(Ivy_FraigMan_t *p)
void Ivy_FraigAddClausesMux(Ivy_FraigMan_t *p, Ivy_Obj_t *pNode)
Ivy_Man_t * Ivy_FraigMiter(Ivy_Man_t *pManAig, Ivy_FraigParams_t *pParams)
void Ivy_FraigSavePattern3(Ivy_FraigMan_t *p)
void Ivy_FraigSavePattern(Ivy_FraigMan_t *p)
void Ivy_NodeAddToClass(Ivy_Obj_t *pClass, Ivy_Obj_t *pObj)
int Ivy_FraigProve(Ivy_Man_t **ppManAig, void *pPars)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
void Ivy_ManIncrementTravId(Ivy_Man_t *p)
DECLARATIONS ///.
int Ivy_ManCleanup(Ivy_Man_t *p)
#define Ivy_ManForEachObj(p, pObj, i)
#define Ivy_ManForEachNode(p, pObj, i)
#define IVY_MIN(a, b)
MACRO DEFINITIONS ///.
Ivy_Obj_t * Ivy_ObjCreatePo(Ivy_Man_t *p, Ivy_Obj_t *pDriver)
struct Ivy_FraigParams_t_ Ivy_FraigParams_t
#define Ivy_ManForEachPo(p, pObj, i)
void Ivy_ManStop(Ivy_Man_t *p)
struct Ivy_Obj_t_ Ivy_Obj_t
int Ivy_ObjIsMuxType(Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_ObjRecognizeMux(Ivy_Obj_t *pObj, Ivy_Obj_t **ppObjT, Ivy_Obj_t **ppObjE)
#define Ivy_ManForEachNodeVec(p, vIds, pObj, i)
Ivy_Man_t * Ivy_ManStartFrom(Ivy_Man_t *p)
#define Ivy_ManForEachPi(p, pObj, i)
ITERATORS ///.
Ivy_Man_t * Ivy_ManDup(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_And(Ivy_Man_t *p, Ivy_Obj_t *p0, Ivy_Obj_t *p1)
int Ivy_ManLevels(Ivy_Man_t *p)
sat_solver * sat_solver_new(void)
int sat_solver_simplify(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
void Sat_SolverPrintStats(FILE *pFile, sat_solver *p)
ABC_INT64_T nInsLimitGlobal
Ivy_FraigParams_t * pParams
Ivy_FraigSim_t * pSimStart
ABC_INT64_T nBTLimitGlobal
ABC_INT64_T nTotalBacktracksMade
ABC_INT64_T nTotalInspectsMade
ABC_INT64_T nTotalBacktrackLimit
float nMiteringLimitMulti
ABC_INT64_T nTotalInspectLimit
float nRewritingLimitMulti
float nFraigingLimitMulti
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.