31#define ABC_RS_DIV1_MAX 150
32#define ABC_RS_DIV2_MAX 500
97static Abc_ManRes_t* Abc_ManResubStart(
int nLeavesMax,
int nDivsMax );
108static void Abc_ManResubDivsS(
Abc_ManRes_t *
p,
int Required );
109static void Abc_ManResubDivsD(
Abc_ManRes_t *
p,
int Required );
137int Abc_NtkResubstitute(
Abc_Ntk_t * pNtk,
int nCutMax,
int nStepsMax,
int nMinSaved,
int nLevelsOdc,
int fUpdateLevel,
int fVerbose,
int fVeryVerbose )
147 abctime clk, clkStart = Abc_Clock();
150 assert( Abc_NtkIsStrash(pNtk) );
157 if ( nLevelsOdc > 0 )
164 if ( Abc_NtkLatchNum(pNtk) ) {
170 pManRes->
nNodesBeg = Abc_NtkNodeNum(pNtk);
171 nNodes = Abc_NtkObjNumMax(pNtk);
177 Extra_ProgressBarUpdate( pProgress, i, NULL );
182 if ( Abc_NodeIsPersistant(pNode) )
185 if ( Abc_ObjFanoutNum(pNode) > 1000 )
195pManRes->
timeCut += Abc_Clock() - clk;
213 pFForm = Abc_ManResubEval( pManRes, pNode, vLeaves, nStepsMax, fUpdateLevel, fVerbose );
216pManRes->
timeRes += Abc_Clock() - clk;
217 if ( pFForm == NULL )
221 Dec_GraphFree( pFForm );
237pManRes->
timeNtk += Abc_Clock() - clk;
238 Dec_GraphFree( pFForm );
241pManRes->
timeTotal = Abc_Clock() - clkStart;
242 pManRes->
nNodesEnd = Abc_NtkNodeNum(pNtk);
246 Abc_ManResubPrint( pManRes );
249 Abc_ManResubStop( pManRes );
257 if ( Abc_NtkLatchNum(pNtk) ) {
273 printf(
"Abc_NtkRefactor: The network check has failed.\n" );
294Abc_ManRes_t * Abc_ManResubStart(
int nLeavesMax,
int nDivsMax )
299 assert(
sizeof(
unsigned) == 4 );
302 p->nLeavesMax = nLeavesMax;
303 p->nDivsMax = nDivsMax;
304 p->vDivs = Vec_PtrAlloc(
p->nDivsMax );
306 p->nBits = (1 <<
p->nLeavesMax);
307 p->nWords = (
p->nBits <= 32)? 1 : (
p->nBits / 32);
308 p->pInfo =
ABC_ALLOC(
unsigned,
p->nWords * (
p->nDivsMax + 1) );
309 memset(
p->pInfo, 0,
sizeof(
unsigned) *
p->nWords *
p->nLeavesMax );
310 p->vSims = Vec_PtrAlloc(
p->nDivsMax );
311 for ( i = 0; i <
p->nDivsMax; i++ )
312 Vec_PtrPush(
p->vSims,
p->pInfo + i *
p->nWords );
314 p->pCareSet =
p->pInfo +
p->nDivsMax *
p->nWords;
315 Abc_InfoFill(
p->pCareSet,
p->nWords );
317 for ( k = 0; k <
p->nLeavesMax; k++ )
319 pData = (
unsigned *)
p->vSims->pArray[k];
320 for ( i = 0; i <
p->nBits; i++ )
322 pData[i>>5] |= (1 << (i&31));
325 p->vDivs1UP = Vec_PtrAlloc(
p->nDivsMax );
326 p->vDivs1UN = Vec_PtrAlloc(
p->nDivsMax );
327 p->vDivs1B = Vec_PtrAlloc(
p->nDivsMax );
328 p->vDivs2UP0 = Vec_PtrAlloc(
p->nDivsMax );
329 p->vDivs2UP1 = Vec_PtrAlloc(
p->nDivsMax );
330 p->vDivs2UN0 = Vec_PtrAlloc(
p->nDivsMax );
331 p->vDivs2UN1 = Vec_PtrAlloc(
p->nDivsMax );
332 p->vTemp = Vec_PtrAlloc(
p->nDivsMax );
349 Vec_PtrFree(
p->vDivs );
350 Vec_PtrFree(
p->vSims );
351 Vec_PtrFree(
p->vDivs1UP );
352 Vec_PtrFree(
p->vDivs1UN );
353 Vec_PtrFree(
p->vDivs1B );
354 Vec_PtrFree(
p->vDivs2UP0 );
355 Vec_PtrFree(
p->vDivs2UP1 );
356 Vec_PtrFree(
p->vDivs2UN0 );
357 Vec_PtrFree(
p->vDivs2UN1 );
358 Vec_PtrFree(
p->vTemp );
376 printf(
"Used constants = %6d. ",
p->nUsedNodeC );
ABC_PRT(
"Cuts ",
p->timeCut );
377 printf(
"Used replacements = %6d. ",
p->nUsedNode0 );
ABC_PRT(
"Resub ",
p->timeRes );
378 printf(
"Used single ORs = %6d. ",
p->nUsedNode1Or );
ABC_PRT(
" Div ",
p->timeDiv );
379 printf(
"Used single ANDs = %6d. ",
p->nUsedNode1And );
ABC_PRT(
" Mffc ",
p->timeMffc );
380 printf(
"Used double ORs = %6d. ",
p->nUsedNode2Or );
ABC_PRT(
" Sim ",
p->timeSim );
381 printf(
"Used double ANDs = %6d. ",
p->nUsedNode2And );
ABC_PRT(
" 1 ",
p->timeRes1 );
382 printf(
"Used OR-AND = %6d. ",
p->nUsedNode2OrAnd );
ABC_PRT(
" D ",
p->timeResD );
383 printf(
"Used AND-OR = %6d. ",
p->nUsedNode2AndOr );
ABC_PRT(
" 2 ",
p->timeRes2 );
384 printf(
"Used OR-2ANDs = %6d. ",
p->nUsedNode3OrAnd );
ABC_PRT(
"Truth ",
p->timeTruth );
385 printf(
"Used AND-2ORs = %6d. ",
p->nUsedNode3AndOr );
ABC_PRT(
"AIG ",
p->timeNtk );
386 printf(
"TOTAL = %6d. ",
p->nUsedNodeC +
396 );
ABC_PRT(
"TOTAL ",
p->timeTotal );
397 printf(
"Total leaves = %8d.\n",
p->nTotalLeaves );
398 printf(
"Total divisors = %8d.\n",
p->nTotalDivs );
400 printf(
"Gain = %8d. (%6.2f %%).\n",
p->nNodesBeg-
p->nNodesEnd, 100.0*(
p->nNodesBeg-
p->nNodesEnd)/
p->nNodesBeg );
418 if ( Abc_NodeIsTravIdCurrent(pNode) )
420 Abc_NodeSetTravIdCurrent(pNode);
426 Vec_PtrPush( vInternal, pNode );
443 int i, k, Limit, Counter;
445 Vec_PtrClear(
p->vDivs1UP );
446 Vec_PtrClear(
p->vDivs1UN );
447 Vec_PtrClear(
p->vDivs1B );
450 Vec_PtrClear(
p->vDivs );
451 Abc_NtkIncrementTravId( pRoot->
pNtk );
454 Vec_PtrPush(
p->vDivs, pNode );
455 Abc_NodeSetTravIdCurrent( pNode );
468 if ( Vec_PtrSize(
p->vDivs) - Vec_PtrSize(vLeaves) + Vec_PtrSize(
p->vTemp) >= Vec_PtrSize(
p->vSims) -
p->nLeavesMax )
472 Limit = Vec_PtrSize(
p->vSims) -
p->nLeavesMax - (Vec_PtrSize(
p->vDivs) - Vec_PtrSize(vLeaves) + Vec_PtrSize(
p->vTemp));
478 if ( Abc_ObjFanoutNum(pNode) > 100 )
486 if ( Abc_NodeIsTravIdCurrent(pFanout) || Abc_ObjIsCo(pFanout) || (
int)pFanout->
Level > Required )
488 if ( Abc_NodeIsTravIdCurrent(Abc_ObjFanin0(pFanout)) && Abc_NodeIsTravIdCurrent(Abc_ObjFanin1(pFanout)) )
490 if ( Abc_ObjFanin0(pFanout) == pRoot || Abc_ObjFanin1(pFanout) == pRoot )
492 Vec_PtrPush(
p->vDivs, pFanout );
493 Abc_NodeSetTravIdCurrent( pFanout );
495 if ( ++Counter == Limit )
503 p->nDivs = Vec_PtrSize(
p->vDivs);
507 Vec_PtrPush(
p->vDivs, pNode );
508 assert( pRoot == Vec_PtrEntryLast(
p->vDivs) );
510 assert( Vec_PtrSize(
p->vDivs) - Vec_PtrSize(vLeaves) <= Vec_PtrSize(
p->vSims) -
p->nLeavesMax );
532 if ( i < Vec_PtrSize(vLeaves) )
534 printf(
"%6d : %c\n", pNode->
Id,
'a'+i );
537 printf(
"%6d : %2d = ", pNode->
Id, i );
540 if ( Abc_ObjFanin0(pNode) == pFanin )
542 if ( k < Vec_PtrSize(vLeaves) )
543 printf(
"%c",
'a' + k );
546 printf(
"%s ", Abc_ObjFaninC0(pNode)?
"\'" :
"" );
549 if ( Abc_ObjFanin1(pNode) == pFanin )
551 if ( k < Vec_PtrSize(vLeaves) )
552 printf(
"%c",
'a' + k );
555 printf(
"%s ", Abc_ObjFaninC1(pNode)?
"\'" :
"" );
556 if ( pNode == pRoot )
577 char pFileName[1000];
579 FILE * pFile = fopen( pFileName,
"wb" );
580 if ( pFile == NULL ) {
581 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
584 fprintf( pFile,
"// Resub instance generated for node %d in network \"%s\" on %s\n", pRoot->
Id, pRoot->
pNtk->
pName,
Extra_TimeStamp() );
585 fprintf( pFile,
".i %d\n", nDivs );
586 fprintf( pFile,
".o %d\n", 1 );
587 fprintf( pFile,
".p %d\n", 1 << nLeaves );
589 for ( n = 0; n < (1 << nLeaves); n++ ) {
591 fprintf( pFile,
"%d", Abc_InfoHasBit((
unsigned *)pObj->
pData, n) );
592 if ( i == nLeaves-1 )
593 fprintf( pFile,
" " );
595 fprintf( pFile,
" %d\n", Abc_InfoHasBit((
unsigned *)pRoot->
pData, n) );
597 fprintf( pFile,
".e\n" );
599 printf(
"Finished dumping file \"%s\" with %d divisors and %d patterns.\n", pFileName, nDivs, (1 << nLeaves) );
616 unsigned * puData0, * puData1, * puData;
618 assert( Vec_PtrSize(vDivs) - nLeaves <= Vec_PtrSize(vSims) - nLeavesMax );
624 pObj->
pData = Vec_PtrEntry( vSims, i );
628 pObj->
pData = Vec_PtrEntry( vSims, i - nLeaves + nLeavesMax );
630 puData = (
unsigned *)pObj->
pData;
631 puData0 = (
unsigned *)Abc_ObjFanin0(pObj)->pData;
632 puData1 = (
unsigned *)Abc_ObjFanin1(pObj)->pData;
634 if ( Abc_ObjFaninC0(pObj) && Abc_ObjFaninC1(pObj) )
635 for ( k = 0; k <
nWords; k++ )
636 puData[k] = ~puData0[k] & ~puData1[k];
637 else if ( Abc_ObjFaninC0(pObj) )
638 for ( k = 0; k <
nWords; k++ )
639 puData[k] = ~puData0[k] & puData1[k];
640 else if ( Abc_ObjFaninC1(pObj) )
641 for ( k = 0; k <
nWords; k++ )
642 puData[k] = puData0[k] & ~puData1[k];
644 for ( k = 0; k <
nWords; k++ )
645 puData[k] = puData0[k] & puData1[k];
650 puData = (
unsigned *)pObj->
pData;
651 pObj->
fPhase = (puData[0] & 1);
653 for ( k = 0; k <
nWords; k++ )
654 puData[k] = ~puData[k];
674 pGraph = Dec_GraphCreate( 1 );
675 Dec_GraphNode( pGraph, 0 )->pFunc = pObj;
676 eRoot = Dec_EdgeCreate( 0, pObj->
fPhase );
677 Dec_GraphSetRoot( pGraph, eRoot );
679 Dec_GraphComplement( pGraph );
698 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj1) );
699 pGraph = Dec_GraphCreate( 2 );
700 Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0);
701 Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1);
702 eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ^ Abc_ObjIsComplement(pObj0) );
703 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) );
705 eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 );
707 eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 );
708 Dec_GraphSetRoot( pGraph, eRoot );
710 Dec_GraphComplement( pGraph );
729 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj1) );
730 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj2) );
731 assert( Abc_ObjRegular(pObj1) != Abc_ObjRegular(pObj2) );
732 pGraph = Dec_GraphCreate( 3 );
733 Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0);
734 Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1);
735 Dec_GraphNode( pGraph, 2 )->pFunc = Abc_ObjRegular(pObj2);
736 eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ^ Abc_ObjIsComplement(pObj0) );
737 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) );
738 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) );
741 eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 );
742 eRoot = Dec_GraphAddNodeOr( pGraph, eNode2, eRoot );
746 eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 );
747 eRoot = Dec_GraphAddNodeAnd( pGraph, eNode2, eRoot );
749 Dec_GraphSetRoot( pGraph, eRoot );
751 Dec_GraphComplement( pGraph );
769 Dec_Edge_t eRoot, ePrev, eNode0, eNode1, eNode2;
770 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj1) );
771 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj2) );
772 assert( Abc_ObjRegular(pObj1) != Abc_ObjRegular(pObj2) );
773 pGraph = Dec_GraphCreate( 3 );
774 Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0);
775 Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1);
776 Dec_GraphNode( pGraph, 2 )->pFunc = Abc_ObjRegular(pObj2);
777 eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ^ Abc_ObjIsComplement(pObj0) );
778 if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
780 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase );
781 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase );
782 ePrev = Dec_GraphAddNodeOr( pGraph, eNode1, eNode2 );
786 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) );
787 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) );
788 ePrev = Dec_GraphAddNodeAnd( pGraph, eNode1, eNode2 );
791 eRoot = Dec_GraphAddNodeOr( pGraph, eNode0, ePrev );
793 eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, ePrev );
794 Dec_GraphSetRoot( pGraph, eRoot );
796 Dec_GraphComplement( pGraph );
814 Dec_Edge_t eRoot, ePrev0, ePrev1, eNode0, eNode1, eNode2, eNode3;
815 assert( Abc_ObjRegular(pObj0) != Abc_ObjRegular(pObj1) );
816 assert( Abc_ObjRegular(pObj2) != Abc_ObjRegular(pObj3) );
817 pGraph = Dec_GraphCreate( 4 );
818 Dec_GraphNode( pGraph, 0 )->pFunc = Abc_ObjRegular(pObj0);
819 Dec_GraphNode( pGraph, 1 )->pFunc = Abc_ObjRegular(pObj1);
820 Dec_GraphNode( pGraph, 2 )->pFunc = Abc_ObjRegular(pObj2);
821 Dec_GraphNode( pGraph, 3 )->pFunc = Abc_ObjRegular(pObj3);
822 if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) )
824 eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase );
825 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase );
826 ePrev0 = Dec_GraphAddNodeOr( pGraph, eNode0, eNode1 );
827 if ( Abc_ObjIsComplement(pObj2) && Abc_ObjIsComplement(pObj3) )
829 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase );
830 eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase );
831 ePrev1 = Dec_GraphAddNodeOr( pGraph, eNode2, eNode3 );
835 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) );
836 eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ^ Abc_ObjIsComplement(pObj3) );
837 ePrev1 = Dec_GraphAddNodeAnd( pGraph, eNode2, eNode3 );
842 eNode0 = Dec_EdgeCreate( 0, Abc_ObjRegular(pObj0)->fPhase ^ Abc_ObjIsComplement(pObj0) );
843 eNode1 = Dec_EdgeCreate( 1, Abc_ObjRegular(pObj1)->fPhase ^ Abc_ObjIsComplement(pObj1) );
844 ePrev0 = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 );
845 if ( Abc_ObjIsComplement(pObj2) && Abc_ObjIsComplement(pObj3) )
847 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase );
848 eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase );
849 ePrev1 = Dec_GraphAddNodeOr( pGraph, eNode2, eNode3 );
853 eNode2 = Dec_EdgeCreate( 2, Abc_ObjRegular(pObj2)->fPhase ^ Abc_ObjIsComplement(pObj2) );
854 eNode3 = Dec_EdgeCreate( 3, Abc_ObjRegular(pObj3)->fPhase ^ Abc_ObjIsComplement(pObj3) );
855 ePrev1 = Dec_GraphAddNodeAnd( pGraph, eNode2, eNode3 );
859 eRoot = Dec_GraphAddNodeOr( pGraph, ePrev0, ePrev1 );
861 eRoot = Dec_GraphAddNodeAnd( pGraph, ePrev0, ePrev1 );
862 Dec_GraphSetRoot( pGraph, eRoot );
864 Dec_GraphComplement( pGraph );
886 unsigned * puData, * puDataR;
888 Vec_PtrClear(
p->vDivs1UP );
889 Vec_PtrClear(
p->vDivs1UN );
890 Vec_PtrClear(
p->vDivs1B );
891 puDataR = (
unsigned *)
p->pRoot->pData;
894 if ( (
int)pObj->
Level > Required - 1 )
897 puData = (
unsigned *)pObj->
pData;
899 for ( w = 0; w <
p->nWords; w++ )
901 if ( puData[w] & ~puDataR[w] &
p->pCareSet[w] )
903 if ( w ==
p->nWords )
905 Vec_PtrPush(
p->vDivs1UP, pObj );
910 for ( w = 0; w <
p->nWords; w++ )
912 if ( ~puData[w] & ~puDataR[w] &
p->pCareSet[w] )
914 if ( w ==
p->nWords )
916 Vec_PtrPush(
p->vDivs1UP, Abc_ObjNot(pObj) );
921 for ( w = 0; w <
p->nWords; w++ )
923 if ( ~puData[w] & puDataR[w] &
p->pCareSet[w] )
925 if ( w ==
p->nWords )
927 Vec_PtrPush(
p->vDivs1UN, pObj );
932 for ( w = 0; w <
p->nWords; w++ )
934 if ( puData[w] & puDataR[w] &
p->pCareSet[w] )
936 if ( w ==
p->nWords )
938 Vec_PtrPush(
p->vDivs1UN, Abc_ObjNot(pObj) );
943 Vec_PtrPush(
p->vDivs1B, pObj );
961 unsigned * puData0, * puData1, * puDataR;
963 Vec_PtrClear(
p->vDivs2UP0 );
964 Vec_PtrClear(
p->vDivs2UP1 );
965 Vec_PtrClear(
p->vDivs2UN0 );
966 Vec_PtrClear(
p->vDivs2UN1 );
967 puDataR = (
unsigned *)
p->pRoot->pData;
970 if ( (
int)pObj0->Level > Required - 2 )
973 puData0 = (
unsigned *)pObj0->pData;
976 if ( (
int)pObj1->Level > Required - 2 )
979 puData1 = (
unsigned *)pObj1->pData;
984 for ( w = 0; w <
p->nWords; w++ )
986 if ( (puData0[w] & puData1[w]) & ~puDataR[w] &
p->pCareSet[w] )
988 if ( w ==
p->nWords )
990 Vec_PtrPush(
p->vDivs2UP0, pObj0 );
991 Vec_PtrPush(
p->vDivs2UP1, pObj1 );
993 for ( w = 0; w <
p->nWords; w++ )
995 if ( (~puData0[w] & puData1[w]) & ~puDataR[w] &
p->pCareSet[w] )
997 if ( w ==
p->nWords )
999 Vec_PtrPush(
p->vDivs2UP0, Abc_ObjNot(pObj0) );
1000 Vec_PtrPush(
p->vDivs2UP1, pObj1 );
1002 for ( w = 0; w <
p->nWords; w++ )
1004 if ( (puData0[w] & ~puData1[w]) & ~puDataR[w] &
p->pCareSet[w] )
1006 if ( w ==
p->nWords )
1008 Vec_PtrPush(
p->vDivs2UP0, pObj0 );
1009 Vec_PtrPush(
p->vDivs2UP1, Abc_ObjNot(pObj1) );
1011 for ( w = 0; w <
p->nWords; w++ )
1013 if ( (puData0[w] | puData1[w]) & ~puDataR[w] &
p->pCareSet[w] )
1015 if ( w ==
p->nWords )
1017 Vec_PtrPush(
p->vDivs2UP0, Abc_ObjNot(pObj0) );
1018 Vec_PtrPush(
p->vDivs2UP1, Abc_ObjNot(pObj1) );
1025 for ( w = 0; w <
p->nWords; w++ )
1027 if ( ~(puData0[w] & puData1[w]) & puDataR[w] &
p->pCareSet[w] )
1029 if ( w ==
p->nWords )
1031 Vec_PtrPush(
p->vDivs2UN0, pObj0 );
1032 Vec_PtrPush(
p->vDivs2UN1, pObj1 );
1034 for ( w = 0; w <
p->nWords; w++ )
1036 if ( ~(~puData0[w] & puData1[w]) & puDataR[w] &
p->pCareSet[w] )
1038 if ( w ==
p->nWords )
1040 Vec_PtrPush(
p->vDivs2UN0, Abc_ObjNot(pObj0) );
1041 Vec_PtrPush(
p->vDivs2UN1, pObj1 );
1043 for ( w = 0; w <
p->nWords; w++ )
1045 if ( ~(puData0[w] & ~puData1[w]) & puDataR[w] &
p->pCareSet[w] )
1047 if ( w ==
p->nWords )
1049 Vec_PtrPush(
p->vDivs2UN0, pObj0 );
1050 Vec_PtrPush(
p->vDivs2UN1, Abc_ObjNot(pObj1) );
1052 for ( w = 0; w <
p->nWords; w++ )
1054 if ( ~(puData0[w] | puData1[w]) & puDataR[w] &
p->pCareSet[w] )
1056 if ( w ==
p->nWords )
1058 Vec_PtrPush(
p->vDivs2UN0, Abc_ObjNot(pObj0) );
1059 Vec_PtrPush(
p->vDivs2UN1, Abc_ObjNot(pObj1) );
1085 upData = (
unsigned *)
p->pRoot->pData;
1086 for ( w = 0; w <
p->nWords; w++ )
1088 if ( upData[w] &
p->pCareSet[w] )
1090 if ( w !=
p->nWords )
1093 if (
p->pRoot->fPhase )
1094 pGraph = Dec_GraphCreateConst1();
1096 pGraph = Dec_GraphCreateConst0();
1114 unsigned * puData, * puDataR;
1116 puDataR = (
unsigned *)
p->pRoot->pData;
1119 puData = (
unsigned *)pObj->
pData;
1120 for ( w = 0; w <
p->nWords; w++ )
1122 if ( (puData[w] ^ puDataR[w]) &
p->pCareSet[w] )
1124 if ( w ==
p->nWords )
1144 unsigned * puData0, * puData1, * puDataR;
1146 puDataR = (
unsigned *)
p->pRoot->pData;
1150 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1153 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1154 if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) )
1156 for ( w = 0; w <
p->nWords; w++ )
1158 if ( ((~puData0[w] | ~puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1161 else if ( Abc_ObjIsComplement(pObj0) )
1163 for ( w = 0; w <
p->nWords; w++ )
1165 if ( ((~puData0[w] | puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1168 else if ( Abc_ObjIsComplement(pObj1) )
1170 for ( w = 0; w <
p->nWords; w++ )
1172 if ( ((puData0[w] | ~puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1177 for ( w = 0; w <
p->nWords; w++ )
1179 if ( ((puData0[w] | puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1182 if ( w ==
p->nWords )
1192 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1195 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1196 if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) )
1198 for ( w = 0; w <
p->nWords; w++ )
1200 if ( ((~puData0[w] & ~puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1203 if ( Abc_ObjIsComplement(pObj0) )
1205 for ( w = 0; w <
p->nWords; w++ )
1207 if ( ((~puData0[w] & puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1210 if ( Abc_ObjIsComplement(pObj1) )
1212 for ( w = 0; w <
p->nWords; w++ )
1214 if ( ((puData0[w] & ~puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1219 for ( w = 0; w <
p->nWords; w++ )
1221 if ( ((puData0[w] & puData1[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1224 if ( w ==
p->nWords )
1247 Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObjMax, * pObjMin0 = NULL, * pObjMin1 = NULL;
1248 unsigned * puData0, * puData1, * puData2, * puDataR;
1249 int i, k, j, w, LevelMax;
1250 puDataR = (
unsigned *)
p->pRoot->pData;
1254 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1257 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1260 puData2 = (
unsigned *)Abc_ObjRegular(pObj2)->pData;
1261 if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1263 for ( w = 0; w <
p->nWords; w++ )
1265 if ( ((~puData0[w] | ~puData1[w] | ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1268 else if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1270 for ( w = 0; w <
p->nWords; w++ )
1272 if ( ((~puData0[w] | ~puData1[w] | puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1275 else if ( Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1277 for ( w = 0; w <
p->nWords; w++ )
1279 if ( ((~puData0[w] | puData1[w] | ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1282 else if ( Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1284 for ( w = 0; w <
p->nWords; w++ )
1286 if ( ((~puData0[w] | puData1[w] | puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1289 else if ( !Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1291 for ( w = 0; w <
p->nWords; w++ )
1293 if ( ((puData0[w] | ~puData1[w] | ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1296 else if ( !Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1298 for ( w = 0; w <
p->nWords; w++ )
1300 if ( ((puData0[w] | ~puData1[w] | puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1303 else if ( !Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1305 for ( w = 0; w <
p->nWords; w++ )
1307 if ( ((puData0[w] | puData1[w] | ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1310 else if ( !Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1312 for ( w = 0; w <
p->nWords; w++ )
1314 if ( ((puData0[w] | puData1[w] | puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1318 if ( w ==
p->nWords )
1320 LevelMax = Abc_MaxInt( Abc_ObjRegular(pObj0)->Level, Abc_MaxInt(Abc_ObjRegular(pObj1)->Level, Abc_ObjRegular(pObj2)->Level) );
1321 assert( LevelMax <= Required - 1 );
1324 if ( (
int)Abc_ObjRegular(pObj0)->Level == LevelMax )
1325 pObjMax = pObj0, pObjMin0 = pObj1, pObjMin1 = pObj2;
1326 if ( (
int)Abc_ObjRegular(pObj1)->Level == LevelMax )
1328 if ( pObjMax )
continue;
1329 pObjMax = pObj1, pObjMin0 = pObj0, pObjMin1 = pObj2;
1331 if ( (
int)Abc_ObjRegular(pObj2)->Level == LevelMax )
1333 if ( pObjMax )
continue;
1334 pObjMax = pObj2, pObjMin0 = pObj0, pObjMin1 = pObj1;
1348 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1351 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1354 puData2 = (
unsigned *)Abc_ObjRegular(pObj2)->pData;
1355 if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1357 for ( w = 0; w <
p->nWords; w++ )
1359 if ( ((~puData0[w] & ~puData1[w] & ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1362 else if ( Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1364 for ( w = 0; w <
p->nWords; w++ )
1366 if ( ((~puData0[w] & ~puData1[w] & puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1369 else if ( Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1371 for ( w = 0; w <
p->nWords; w++ )
1373 if ( ((~puData0[w] & puData1[w] & ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1376 else if ( Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1378 for ( w = 0; w <
p->nWords; w++ )
1380 if ( ((~puData0[w] & puData1[w] & puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1383 else if ( !Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1385 for ( w = 0; w <
p->nWords; w++ )
1387 if ( ((puData0[w] & ~puData1[w] & ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1390 else if ( !Abc_ObjIsComplement(pObj0) && Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1392 for ( w = 0; w <
p->nWords; w++ )
1394 if ( ((puData0[w] & ~puData1[w] & puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1397 else if ( !Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1399 for ( w = 0; w <
p->nWords; w++ )
1401 if ( ((puData0[w] & puData1[w] & ~puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1404 else if ( !Abc_ObjIsComplement(pObj0) && !Abc_ObjIsComplement(pObj1) && !Abc_ObjIsComplement(pObj2) )
1406 for ( w = 0; w <
p->nWords; w++ )
1408 if ( ((puData0[w] & puData1[w] & puData2[w]) ^ puDataR[w]) &
p->pCareSet[w] )
1412 if ( w ==
p->nWords )
1414 LevelMax = Abc_MaxInt( Abc_ObjRegular(pObj0)->Level, Abc_MaxInt(Abc_ObjRegular(pObj1)->Level, Abc_ObjRegular(pObj2)->Level) );
1415 assert( LevelMax <= Required - 1 );
1418 if ( (
int)Abc_ObjRegular(pObj0)->Level == LevelMax )
1419 pObjMax = pObj0, pObjMin0 = pObj1, pObjMin1 = pObj2;
1420 if ( (
int)Abc_ObjRegular(pObj1)->Level == LevelMax )
1422 if ( pObjMax )
continue;
1423 pObjMax = pObj1, pObjMin0 = pObj0, pObjMin1 = pObj2;
1425 if ( (
int)Abc_ObjRegular(pObj2)->Level == LevelMax )
1427 if ( pObjMax )
continue;
1428 pObjMax = pObj2, pObjMin0 = pObj0, pObjMin1 = pObj1;
1456 unsigned * puData0, * puData1, * puData2, * puDataR;
1458 puDataR = (
unsigned *)
p->pRoot->pData;
1462 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1465 pObj2 = (
Abc_Obj_t *)Vec_PtrEntry(
p->vDivs2UP1, k );
1467 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1468 puData2 = (
unsigned *)Abc_ObjRegular(pObj2)->pData;
1469 if ( Abc_ObjIsComplement(pObj0) )
1471 if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1473 for ( w = 0; w <
p->nWords; w++ )
1475 if ( ((~puData0[w] | (puData1[w] | puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1478 else if ( Abc_ObjIsComplement(pObj1) )
1480 for ( w = 0; w <
p->nWords; w++ )
1482 if ( ((~puData0[w] | (~puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1485 else if ( Abc_ObjIsComplement(pObj2) )
1487 for ( w = 0; w <
p->nWords; w++ )
1489 if ( ((~puData0[w] | (puData1[w] & ~puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1494 for ( w = 0; w <
p->nWords; w++ )
1496 if ( ((~puData0[w] | (puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1502 if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1504 for ( w = 0; w <
p->nWords; w++ )
1506 if ( ((puData0[w] | (puData1[w] | puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1509 else if ( Abc_ObjIsComplement(pObj1) )
1511 for ( w = 0; w <
p->nWords; w++ )
1513 if ( ((puData0[w] | (~puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1516 else if ( Abc_ObjIsComplement(pObj2) )
1518 for ( w = 0; w <
p->nWords; w++ )
1520 if ( ((puData0[w] | (puData1[w] & ~puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1525 for ( w = 0; w <
p->nWords; w++ )
1527 if ( ((puData0[w] | (puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1531 if ( w ==
p->nWords )
1533 p->nUsedNode2OrAnd++;
1541 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1544 pObj2 = (
Abc_Obj_t *)Vec_PtrEntry(
p->vDivs2UN1, k );
1546 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1547 puData2 = (
unsigned *)Abc_ObjRegular(pObj2)->pData;
1548 if ( Abc_ObjIsComplement(pObj0) )
1550 if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1552 for ( w = 0; w <
p->nWords; w++ )
1554 if ( ((~puData0[w] & (puData1[w] | puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1557 else if ( Abc_ObjIsComplement(pObj1) )
1559 for ( w = 0; w <
p->nWords; w++ )
1561 if ( ((~puData0[w] & (~puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1564 else if ( Abc_ObjIsComplement(pObj2) )
1566 for ( w = 0; w <
p->nWords; w++ )
1568 if ( ((~puData0[w] & (puData1[w] & ~puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1573 for ( w = 0; w <
p->nWords; w++ )
1575 if ( ((~puData0[w] & (puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1581 if ( Abc_ObjIsComplement(pObj1) && Abc_ObjIsComplement(pObj2) )
1583 for ( w = 0; w <
p->nWords; w++ )
1585 if ( ((puData0[w] & (puData1[w] | puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1588 else if ( Abc_ObjIsComplement(pObj1) )
1590 for ( w = 0; w <
p->nWords; w++ )
1592 if ( ((puData0[w] & (~puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1595 else if ( Abc_ObjIsComplement(pObj2) )
1597 for ( w = 0; w <
p->nWords; w++ )
1599 if ( ((puData0[w] & (puData1[w] & ~puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1604 for ( w = 0; w <
p->nWords; w++ )
1606 if ( ((puData0[w] & (puData1[w] & puData2[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1610 if ( w ==
p->nWords )
1612 p->nUsedNode2AndOr++;
1633 Abc_Obj_t * pObj0, * pObj1, * pObj2, * pObj3;
1634 unsigned * puData0, * puData1, * puData2, * puData3, * puDataR;
1635 int i, k, w = 0, Flag;
1636 puDataR = (
unsigned *)
p->pRoot->pData;
1640 pObj1 = (
Abc_Obj_t *)Vec_PtrEntry(
p->vDivs2UP1, i );
1641 puData0 = (
unsigned *)Abc_ObjRegular(pObj0)->pData;
1642 puData1 = (
unsigned *)Abc_ObjRegular(pObj1)->pData;
1643 Flag = (Abc_ObjIsComplement(pObj0) << 3) | (Abc_ObjIsComplement(pObj1) << 2);
1647 pObj3 = (
Abc_Obj_t *)Vec_PtrEntry(
p->vDivs2UP1, k );
1648 puData2 = (
unsigned *)Abc_ObjRegular(pObj2)->pData;
1649 puData3 = (
unsigned *)Abc_ObjRegular(pObj3)->pData;
1651 Flag = (Flag & 12) | ((
int)Abc_ObjIsComplement(pObj2) << 1) | (int)Abc_ObjIsComplement(pObj3);
1656 for ( w = 0; w <
p->nWords; w++ )
1658 if ( (((puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1662 for ( w = 0; w <
p->nWords; w++ )
1664 if ( (((puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1668 for ( w = 0; w <
p->nWords; w++ )
1670 if ( (((puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1674 for ( w = 0; w <
p->nWords; w++ )
1676 if ( (((puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1681 for ( w = 0; w <
p->nWords; w++ )
1683 if ( (((puData0[w] & ~puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1687 for ( w = 0; w <
p->nWords; w++ )
1689 if ( (((puData0[w] & ~puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1693 for ( w = 0; w <
p->nWords; w++ )
1695 if ( (((puData0[w] & ~puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1699 for ( w = 0; w <
p->nWords; w++ )
1701 if ( (((puData0[w] & ~puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1706 for ( w = 0; w <
p->nWords; w++ )
1708 if ( (((~puData0[w] & puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1712 for ( w = 0; w <
p->nWords; w++ )
1714 if ( (((~puData0[w] & puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1718 for ( w = 0; w <
p->nWords; w++ )
1720 if ( (((~puData0[w] & puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1724 for ( w = 0; w <
p->nWords; w++ )
1726 if ( (((~puData0[w] & puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1731 for ( w = 0; w <
p->nWords; w++ )
1733 if ( (((puData0[w] | puData1[w]) | (puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1737 for ( w = 0; w <
p->nWords; w++ )
1739 if ( (((puData0[w] | puData1[w]) | (puData2[w] & ~puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1743 for ( w = 0; w <
p->nWords; w++ )
1745 if ( (((puData0[w] | puData1[w]) | (~puData2[w] & puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1749 for ( w = 0; w <
p->nWords; w++ )
1751 if ( (((puData0[w] | puData1[w]) | (puData2[w] | puData3[w])) ^ puDataR[w]) &
p->pCareSet[w] )
1756 if ( w ==
p->nWords )
1758 p->nUsedNode3OrAnd++;
1896 Vec_PtrClear(
p->vDivs );
1923 p->nLeaves = Vec_PtrSize(vLeaves);
1929p->timeMffc += Abc_Clock() - clk;
1934 if ( !Abc_ManResubCollectDivs(
p, pRoot, vLeaves, Required ) )
1936 p->timeDiv += Abc_Clock() - clk;
1938 p->nTotalDivs +=
p->nDivs;
1939 p->nTotalLeaves +=
p->nLeaves;
1943 Abc_ManResubSimulate(
p->vDivs,
p->nLeaves,
p->vSims,
p->nLeavesMax,
p->nWords );
1944p->timeSim += Abc_Clock() - clk;
1948 if ( (pGraph = Abc_ManResubQuit(
p )) )
1951 p->nLastGain =
p->nMffc;
1956 if ( (pGraph = Abc_ManResubDivs0(
p )) )
1958p->timeRes1 += Abc_Clock() - clk;
1960 p->nLastGain =
p->nMffc;
1963 if ( nSteps == 0 ||
p->nMffc == 1 )
1965p->timeRes1 += Abc_Clock() - clk;
1970 Abc_ManResubDivsS(
p, Required );
1976 if ( (pGraph = Abc_ManResubDivs1(
p, Required )) )
1978p->timeRes1 += Abc_Clock() - clk;
1979 p->nLastGain =
p->nMffc - 1;
1982p->timeRes1 += Abc_Clock() - clk;
1983 if ( nSteps == 1 ||
p->nMffc == 2 )
1988 if ( (pGraph = Abc_ManResubDivs12(
p, Required )) )
1990p->timeRes2 += Abc_Clock() - clk;
1991 p->nLastGain =
p->nMffc - 2;
1994p->timeRes2 += Abc_Clock() - clk;
1998 Abc_ManResubDivsD(
p, Required );
1999p->timeResD += Abc_Clock() - clk;
2003 if ( (pGraph = Abc_ManResubDivs2(
p, Required )) )
2005p->timeRes2 += Abc_Clock() - clk;
2006 p->nLastGain =
p->nMffc - 2;
2009p->timeRes2 += Abc_Clock() - clk;
2010 if ( nSteps == 2 ||
p->nMffc == 3 )
2015 if ( (pGraph = Abc_ManResubDivs3(
p, Required )) )
2017p->timeRes3 += Abc_Clock() - clk;
2018 p->nLastGain =
p->nMffc - 3;
2021p->timeRes3 += Abc_Clock() - clk;
2022 if ( nSteps == 3 ||
p->nLeavesMax == 4 )
2044 if ( Abc_NodeIsTravIdCurrent(pObj) )
2046 Abc_NodeSetTravIdCurrent(pObj);
2048 if ( Abc_ObjIsCi(pObj) )
2049 printf(
"Abc_CutVolumeCheck() ERROR: The set of nodes is not a cut!\n" );
2071 Abc_NtkIncrementTravId( pNode->
pNtk );
2073 Abc_NodeSetTravIdCurrent( pObj );
2095 Vec_PtrPush( vLeaves, pObj );
2121 assert( !Abc_ObjIsCi(pNode) );
2122 vLeaves = Vec_PtrAlloc( 10 );
2148 Vec_Ptr_t * vLeaves, * vFactors, * vFact, * vNext;
2151 int i, k, Counter, RandLeaf;
2152 int BestCut, BestShare;
2153 assert( Abc_ObjIsNode(pNode) );
2156 if ( Vec_PtrSize(vLeaves) > nLeavesMax )
2158 Vec_PtrFree(vLeaves);
2161 if ( Vec_PtrSize(vLeaves) == nLeavesMax )
2164 vFactors = Vec_PtrAlloc( nLeavesMax );
2165 Abc_NtkIncrementTravId( pNode->
pNtk );
2168 Abc_NodeSetTravIdCurrent( pLeaf );
2169 if ( Abc_ObjIsCi(pLeaf) )
2170 Vec_PtrPush( vFactors, NULL );
2175 vFeasible = Vec_IntAlloc( nLeavesMax );
2178 BestCut = -1, BestShare = -1;
2180 Vec_IntClear( vFeasible );
2183 if ( vFact == NULL )
2188 Counter += !Abc_NodeIsTravIdCurrent(pTemp);
2190 if ( Counter <= nLeavesMax - Vec_PtrSize(vLeaves) + 1 )
2192 Vec_IntPush( vFeasible, i );
2193 if ( BestCut == -1 || BestShare < Vec_PtrSize(vFact) - Counter )
2194 BestCut = i, BestShare = Vec_PtrSize(vFact) - Counter;
2198 if ( Vec_IntSize(vFeasible) == 0 )
2205 pLeaf = (
Abc_Obj_t *)Vec_PtrEntry( vLeaves, RandLeaf );
2206 vNext = (
Vec_Ptr_t *)Vec_PtrEntry( vFactors, RandLeaf );
2208 Abc_NodeSetTravIdPrevious( pLeaf );
2210 for ( i = RandLeaf; i < Vec_PtrSize(vLeaves)-1; i++ )
2212 Vec_PtrWriteEntry( vLeaves, i, Vec_PtrEntry(vLeaves, i+1) );
2213 Vec_PtrWriteEntry( vFactors, i, Vec_PtrEntry(vFactors,i+1) );
2215 Vec_PtrShrink( vLeaves, Vec_PtrSize(vLeaves) -1 );
2216 Vec_PtrShrink( vFactors, Vec_PtrSize(vFactors)-1 );
2220 if ( Abc_NodeIsTravIdCurrent(pLeaf) )
2222 Abc_NodeSetTravIdCurrent( pLeaf );
2223 Vec_PtrPush( vLeaves, pLeaf );
2224 if ( Abc_ObjIsCi(pLeaf) )
2225 Vec_PtrPush( vFactors, NULL );
2229 Vec_PtrFree( vNext );
2230 assert( Vec_PtrSize(vLeaves) <= nLeavesMax );
2231 if ( Vec_PtrSize(vLeaves) == nLeavesMax )
2237 if ( vFact ) Vec_PtrFree( vFact );
2238 Vec_PtrFree( vFactors );
2239 Vec_IntFree( vFeasible );
int Dec_GraphUpdateNetwork(Abc_Obj_t *pRoot, Dec_Graph_t *pGraph, int fUpdateLevel, int nGain)
struct Abc_ManRes_t_ Abc_ManRes_t
int Abc_NodeMffcInside(Abc_Obj_t *pNode, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vInside)
Dec_Graph_t * Abc_ManResubQuit3(Abc_Obj_t *pRoot, Abc_Obj_t *pObj0, Abc_Obj_t *pObj1, Abc_Obj_t *pObj2, Abc_Obj_t *pObj3, int fOrGate)
Vec_Ptr_t * Abc_CutFactor(Abc_Obj_t *pNode)
int Abc_NtkResubstitute(Abc_Ntk_t *pNtk, int nCutMax, int nStepsMax, int nMinSaved, int nLevelsOdc, int fUpdateLevel, int fVerbose, int fVeryVerbose)
FUNCTION DEFINITIONS ///.
int Abc_CutVolumeCheck_rec(Abc_Obj_t *pObj)
Dec_Graph_t * Abc_ManResubQuit2(Abc_Obj_t *pRoot, Abc_Obj_t *pObj0, Abc_Obj_t *pObj1, Abc_Obj_t *pObj2, int fOrGate)
Dec_Graph_t * Abc_ManResubQuit1(Abc_Obj_t *pRoot, Abc_Obj_t *pObj0, Abc_Obj_t *pObj1, int fOrGate)
Dec_Graph_t * Abc_ManResubQuit21(Abc_Obj_t *pRoot, Abc_Obj_t *pObj0, Abc_Obj_t *pObj1, Abc_Obj_t *pObj2, int fOrGate)
void Abc_ManResubDumpInstance(Vec_Ptr_t *vDivs, int nLeaves, int nDivs, int nWords)
Dec_Graph_t * Abc_ManResubQuit0(Abc_Obj_t *pRoot, Abc_Obj_t *pObj)
void Abc_ManResubCollectDivs_rec(Abc_Obj_t *pNode, Vec_Ptr_t *vInternal)
void Abc_CutFactor_rec(Abc_Obj_t *pObj, Vec_Ptr_t *vLeaves)
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL Odc_Man_t * Abc_NtkDontCareAlloc(int nVarsMax, int nLevels, int fVerbose, int fVeryVerbose)
FUNCTION DEFINITIONS ///.
#define Abc_NtkForEachLatch(pNtk, pObj, i)
ABC_DLL int Abc_ObjRequiredLevel(Abc_Obj_t *pObj)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
ABC_DLL int Abc_NtkDontCareCompute(Odc_Man_t *p, Abc_Obj_t *pNode, Vec_Ptr_t *vLeaves, unsigned *puTruth)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
struct Abc_ManCut_t_ Abc_ManCut_t
struct Odc_Man_t_ Odc_Man_t
ABC_DLL void Abc_NtkDontCareClear(Odc_Man_t *p)
struct Abc_Aig_t_ Abc_Aig_t
ABC_DLL void Abc_NtkManCutStop(Abc_ManCut_t *p)
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void Abc_NtkStopReverseLevels(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NodeIsMuxControlType(Abc_Obj_t *pNode)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
ABC_DLL Vec_Ptr_t * Abc_NodeFindCut(Abc_ManCut_t *p, Abc_Obj_t *pRoot, int fContain)
ABC_DLL int Abc_AigCleanup(Abc_Aig_t *pMan)
ABC_DLL void Abc_NtkStartReverseLevels(Abc_Ntk_t *pNtk, int nMaxLevelIncrease)
ABC_DLL void Abc_NtkDontCareFree(Odc_Man_t *p)
ABC_DLL void Abc_NtkReassignIds(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_NtkCleanMarkAB(Abc_Ntk_t *pNtk)
ABC_DLL Abc_ManCut_t * Abc_NtkManCutStart(int nNodeSizeMax, int nConeSizeMax, int nNodeFanStop, int nConeFanStop)
#define Abc_NtkForEachNode(pNtk, pNode, i)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
typedefABC_NAMESPACE_HEADER_START struct Dec_Edge_t_ Dec_Edge_t
INCLUDES ///.
struct Dec_Graph_t_ Dec_Graph_t
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
#define Vec_PtrForEachEntryStop(Type, vVec, pEntry, i, Stop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.