39#define RST_RANDOM_UNSIGNED ((((unsigned)rand()) << 24) ^ (((unsigned)rand()) << 12) ^ ((unsigned)rand()))
41typedef struct Abc_ManRst_t_ Abc_ManRst_t;
68 int nNodesRestructured;
84static Dec_Graph_t * Abc_NodeEvaluateDsd( Abc_ManRst_t * pManRst,
Dsd_Node_t * pNodeDsd,
Abc_Obj_t * pRoot,
int Required,
int nNodesSaved,
int * pnNodesAdded );
86static Cut_Man_t * Abc_NtkStartCutManForRestruct(
Abc_Ntk_t * pNtk,
int nCutMax,
int fDag );
87static Abc_ManRst_t * Abc_NtkManRstStart(
int nCutMax,
int fUpdateLevel,
int fUseZeros,
int fVerbose );
88static void Abc_NtkManRstStop( Abc_ManRst_t *
p );
89static void Abc_NtkManRstPrintStats( Abc_ManRst_t *
p );
110 Abc_ManRst_t * pManRst;
115 abctime clk, clkStart = Abc_Clock();
120 assert( Abc_NtkIsStrash(pNtk) );
130 pManRst = Abc_NtkManRstStart( nCutMax, fUpdateLevel, fUseZeros, fVerbose );
131 pManRst->pNtk = pNtk;
134 pManCut = Abc_NtkStartCutManForRestruct( pNtk, nCutMax, fMulti );
135pManRst->timeCut += Abc_Clock() - clk;
139 nNodes = Abc_NtkObjNumMax(pNtk);
143 Extra_ProgressBarUpdate( pProgress, i, NULL );
148 if ( Abc_NodeIsPersistant(pNode) )
154 if ( Abc_ObjFanoutNum(pNode) > 1000 )
162pManRst->timeCut += Abc_Clock() - clk;
167 pGraph = Abc_NodeResubstitute( pManRst, pNode, pCutList );
169 pGraph = Abc_NodeRestructure( pManRst, pNode, pCutList );
170pManRst->timeRes += Abc_Clock() - clk;
171 if ( pGraph == NULL )
177pManRst->timeNtk += Abc_Clock() - clk;
178 Dec_GraphFree( pGraph );
181pManRst->timeTotal = Abc_Clock() - clkStart;
185 Abc_NtkManRstPrintStats( pManRst );
188 Abc_NtkManRstStop( pManRst );
200 printf(
"Abc_NtkRefactor: The network check has failed.\n" );
217void Abc_RestructNodeDivisors( Abc_ManRst_t *
p,
Abc_Obj_t * pRoot,
int nNodesSaved )
222 Vec_PtrClear(
p->vDecs );
225 Vec_PtrPush(
p->vDecs, pNode );
235 if ( pFanout->
fMarkC || Abc_ObjIsPo(pFanout) )
237 if ( Abc_ObjFanin0(pFanout)->fMarkC && Abc_ObjFanin1(pFanout)->fMarkC )
239 Vec_PtrPush(
p->vDecs, pFanout );
273 printf(
"%d\n", Vec_PtrSize(
p->vDecs)-nNodesSaved-Vec_PtrSize(
p->vLeaves) );
293 p->nNodesConsidered++;
303 for ( pCut = pCutList; pCut; pCut = pCut->
pNext )
307 if ( (pGraph = Abc_NodeRestructureCut(
p, pNode, pCut )) )
331 int nNodesSaved, nNodesAdded;
332 int Required, nMaxSize, clk, i;
333 int fVeryVerbose = 0;
335 p->nCutsConsidered++;
341 Vec_PtrClear(
p->vLeaves );
342 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
347 Vec_PtrPush(
p->vLeaves, pLeaf );
354 bFunc = Abc_NodeConeBdd(
p->dd,
p->dd->vars, pRoot,
p->vLeaves,
p->vVisited ); Cudd_Ref( bFunc );
355p->timeBdd += Abc_Clock() - clk;
358 if ( Cudd_IsConstant(bFunc) )
361 p->nNodesGained +=
p->nLastGain;
362 p->nNodesRestructured++;
363 Cudd_RecursiveDeref(
p->dd, bFunc );
364 if ( Cudd_IsComplement(bFunc) )
365 return Dec_GraphCreateConst0();
366 return Dec_GraphCreateConst1();
372p->timeDsd += Abc_Clock() - clk;
378 Cudd_RecursiveDeref(
p->dd, bFunc );
399 Abc_NtkIncrementTravId( pRoot->
pNtk );
433 pGraph = Abc_NodeEvaluateDsd(
p, pNodeDsd, pRoot, Required, nNodesSaved, &nNodesAdded );
435p->timeEval += Abc_Clock() - clk;
438 if ( pGraph == NULL || nNodesAdded == -1 || (nNodesAdded == nNodesSaved && !
p->fUseZeros) )
440 Cudd_RecursiveDeref(
p->dd, bFunc );
441 if ( pGraph ) Dec_GraphFree( pGraph );
455 p->nLastGain = nNodesSaved - nNodesAdded;
456 p->nNodesGained +=
p->nLastGain;
457 p->nNodesRestructured++;
463 printf(
"Cone = %2d. ",
p->vLeaves->nSize );
464 printf(
"BDD = %2d. ", Cudd_DagSize(bFunc) );
465 printf(
"FF = %2d. ", 1 + Dec_GraphNodeNum(pGraph) );
466 printf(
"MFFC = %2d. ", nNodesSaved );
467 printf(
"Add = %2d. ", nNodesAdded );
468 printf(
"GAIN = %2d. ",
p->nLastGain );
471 Cudd_RecursiveDeref(
p->dd, bFunc );
488void Abc_NodeEdgeDsdPermute(
Dec_Graph_t * pGraph, Abc_ManRst_t * pManRst,
Vec_Int_t * vEdges,
int fExor )
491 Abc_Obj_t * pNode1, * pNode2, * pNode3, * pTemp;
492 int LeftBound = 0, RightBound, i;
494 RightBound = Vec_IntSize(vEdges) - 2;
495 assert( LeftBound <= RightBound );
496 if ( LeftBound == RightBound )
499 eNode1 = Dec_IntToEdge( Vec_IntEntry(vEdges, RightBound + 1) );
500 eNode2 = Dec_IntToEdge( Vec_IntEntry(vEdges, RightBound ) );
501 pNode1 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode1.Node )->pFunc;
502 pNode2 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode2.Node )->pFunc;
503 pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl );
504 pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl );
506 if ( pNode1 == NULL )
509 for ( i = RightBound; i >= LeftBound; i-- )
512 eNode3 = Dec_IntToEdge( Vec_IntEntry(vEdges, i) );
513 pNode3 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode3.Node )->pFunc;
514 pNode3 = !pNode3? NULL : Abc_ObjNotCond( pNode3, eNode3.fCompl );
515 if ( pNode3 == NULL )
520 if ( pNode1 && pNode3 )
523 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
526 if ( pNode3 == pNode2 )
528 Vec_IntWriteEntry( vEdges, i, Dec_EdgeToInt(eNode2) );
529 Vec_IntWriteEntry( vEdges, RightBound, Dec_EdgeToInt(eNode3) );
535 if ( pNode1 && pNode3 )
538 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
541 if ( eNode3.Node == eNode2.Node )
543 Vec_IntWriteEntry( vEdges, i, Dec_EdgeToInt(eNode2) );
544 Vec_IntWriteEntry( vEdges, RightBound, Dec_EdgeToInt(eNode3) );
564 int i, NodeOld, NodeNew;
566 for ( i = vEdges->nSize-2; i >= 0; i-- )
568 NodeOld = Dec_IntToEdge(vEdges->pArray[i]).Node;
569 NodeNew = Dec_IntToEdge(Edge).Node;
571 if ( Dec_GraphNode(pGraph, NodeOld)->Level <= Dec_GraphNode(pGraph, NodeNew)->Level )
572 vEdges->pArray[i+1] = vEdges->pArray[i];
576 vEdges->pArray[i+1] = Edge;
590Dec_Edge_t Abc_NodeEvaluateDsd_rec(
Dec_Graph_t * pGraph, Abc_ManRst_t * pManRst,
Dsd_Node_t * pNodeDsd,
int Required,
int nNodesSaved,
int * pnNodesAdded )
592 Dec_Edge_t eNode1, eNode2, eNode3, eResult, eQuit = { 0, 2006 };
593 Abc_Obj_t * pNode1, * pNode2, * pNode3, * pNode4, * pTemp;
597 int Level1, Level2, Level3, Level4;
598 int i, Index, fCompl, Type;
609 assert( Index < Dec_GraphLeaveNum(pGraph) );
610 eResult = Dec_EdgeCreate( Index, fCompl );
619 eResult = Abc_NodeEvaluateDsd_rec( pGraph, pManRst, pChildDsd, Required, nNodesSaved, pnNodesAdded );
620 if ( eResult.Node == eQuit.Node )
622 Vec_IntFree( vEdges );
627 Vec_IntPush( vEdges, Dec_EdgeToInt(eResult) );
629 Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eResult) );
638 assert( Vec_IntSize(vEdges) > 1 );
639 while ( Vec_IntSize(vEdges) > 1 )
642 if ( Vec_IntSize(vEdges) > 2 )
643 Abc_NodeEdgeDsdPermute( pGraph, pManRst, vEdges, 0 );
645 eNode1 = Dec_IntToEdge( Vec_IntPop(vEdges) );
646 eNode2 = Dec_IntToEdge( Vec_IntPop(vEdges) );
647 pNode1 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode1.Node )->pFunc;
648 pNode2 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode2.Node )->pFunc;
649 pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl );
650 pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl );
653 if ( pNode1 && pNode2 )
656 pNode3 = !pNode3? NULL : Abc_ObjNot(pNode3);
659 eNode3 = Dec_GraphAddNodeOr( pGraph, eNode1, eNode2 );
661 Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level;
662 Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level;
663 Dec_GraphNode( pGraph, eNode3.Node )->Level = 1 + Abc_MaxInt(Level1, Level2);
667 Dec_GraphNode( pGraph, eNode3.Node )->pFunc = Abc_ObjNotCond(pNode3, eNode3.fCompl);
668 Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level;
671 if ( !pNode3 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode3)) )
674 if ( *pnNodesAdded > nNodesSaved )
676 Vec_IntFree( vEdges );
681 Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eNode3) );
684 eResult = Dec_IntToEdge( Vec_IntPop(vEdges) );
685 Vec_IntFree( vEdges );
687 eResult.fCompl ^= fCompl;
693 assert( Vec_IntSize(vEdges) > 1 );
694 while ( Vec_IntSize(vEdges) > 1 )
697 if ( Vec_IntSize(vEdges) > 2 )
698 Abc_NodeEdgeDsdPermute( pGraph, pManRst, vEdges, 1 );
700 eNode1 = Dec_IntToEdge( Vec_IntPop(vEdges) );
701 eNode2 = Dec_IntToEdge( Vec_IntPop(vEdges) );
702 pNode1 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode1.Node )->pFunc;
703 pNode2 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode2.Node )->pFunc;
704 pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl );
705 pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl );
709 if ( pNode1 && pNode2 )
712 eNode3 = Dec_GraphAddNodeXor( pGraph, eNode1, eNode2, Type );
714 Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level;
715 Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level;
716 Dec_GraphNode( pGraph, eNode3.Node )->Level = 2 + Abc_MaxInt(Level1, Level2);
720 Dec_GraphNode( pGraph, eNode3.Node )->pFunc = Abc_ObjNotCond(pNode3, eNode3.fCompl);
721 Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level;
724 if ( !pNode3 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode3)) )
727 if ( !pNode1 || !pNode2 )
728 (*pnNodesAdded) += 2;
729 else if ( Type == 0 )
732 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
735 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
741 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
744 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
747 if ( *pnNodesAdded > nNodesSaved )
749 Vec_IntFree( vEdges );
754 Abc_NodeEdgeDsdPushOrdered( pGraph, vEdges, Dec_EdgeToInt(eNode3) );
757 eResult = Dec_IntToEdge( Vec_IntPop(vEdges) );
758 Vec_IntFree( vEdges );
760 eResult.fCompl ^= fCompl;
765 DdNode * bLocal, * bVar, * bCofT, * bCofE;
769 bVar = pManRst->dd->vars[0];
770 bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE );
771 bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT );
774 Cudd_RecursiveDeref( pManRst->dd, bCofE );
775 Cudd_RecursiveDeref( pManRst->dd, bCofT );
776 bVar = pManRst->dd->vars[1];
777 bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE );
778 bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT );
781 Cudd_RecursiveDeref( pManRst->dd, bCofE );
782 Cudd_RecursiveDeref( pManRst->dd, bCofT );
783 bVar = pManRst->dd->vars[2];
784 bCofE = Cudd_Cofactor( pManRst->dd, bLocal, Cudd_Not(bVar) ); Cudd_Ref( bCofE );
785 bCofT = Cudd_Cofactor( pManRst->dd, bLocal, bVar ); Cudd_Ref( bCofT );
788 Cudd_RecursiveDeref( pManRst->dd, bCofE );
789 Cudd_RecursiveDeref( pManRst->dd, bCofT );
790 Cudd_RecursiveDeref( pManRst->dd, bLocal );
791 Vec_IntFree( vEdges );
796 Cudd_RecursiveDeref( pManRst->dd, bLocal );
800 eNode1 = Dec_IntToEdge( Vec_IntEntry(vEdges, bVar->index) );
801 eNode2 = Dec_IntToEdge( Vec_IntEntry(vEdges, Cudd_Regular(bCofT)->index) );
802 eNode3 = Dec_IntToEdge( Vec_IntEntry(vEdges, Cudd_Regular(bCofE)->index) );
804 eNode2.fCompl ^= Cudd_IsComplement(bCofT);
805 eNode3.fCompl ^= Cudd_IsComplement(bCofE);
808 Cudd_RecursiveDeref( pManRst->dd, bCofE );
809 Cudd_RecursiveDeref( pManRst->dd, bCofT );
812 pNode1 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode1.Node )->pFunc;
813 pNode2 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode2.Node )->pFunc;
814 pNode3 = (
Abc_Obj_t *)Dec_GraphNode( pGraph, eNode3.Node )->pFunc;
815 pNode1 = !pNode1? NULL : Abc_ObjNotCond( pNode1, eNode1.fCompl );
816 pNode2 = !pNode2? NULL : Abc_ObjNotCond( pNode2, eNode2.fCompl );
817 pNode3 = !pNode3? NULL : Abc_ObjNotCond( pNode3, eNode3.fCompl );
822 if ( pNode1 && pNode2 && pNode3 )
826 eResult = Dec_GraphAddNodeMux( pGraph, eNode1, eNode2, eNode3, Type );
829 Level1 = Dec_GraphNode( pGraph, eNode1.Node )->Level;
830 Level2 = Dec_GraphNode( pGraph, eNode2.Node )->Level;
831 Level3 = Dec_GraphNode( pGraph, eNode3.Node )->Level;
832 Dec_GraphNode( pGraph, eResult.Node )->Level = 2 + Abc_MaxInt( Abc_MaxInt(Level1, Level2), Level3 );
836 Dec_GraphNode( pGraph, eResult.Node )->pFunc = Abc_ObjNotCond(pNode4, eResult.fCompl);
837 Level4 = Dec_GraphNode( pGraph, eResult.Node )->Level;
840 if ( !pNode4 || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pNode4)) )
845 if ( !pNode1 || !pNode2 )
850 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
853 if ( !pNode1 || !pNode3 )
858 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
864 if ( !pNode1 || !pNode2 )
869 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
872 if ( !pNode1 || !pNode3 )
877 if ( !pTemp || Abc_NodeIsTravIdCurrent(Abc_ObjRegular(pTemp)) )
881 if ( *pnNodesAdded > nNodesSaved )
883 Vec_IntFree( vEdges );
888 Vec_IntFree( vEdges );
890 eResult.fCompl ^= fCompl;
893 Vec_IntFree( vEdges );
908Dec_Graph_t * Abc_NodeEvaluateDsd( Abc_ManRst_t * pManRst,
Dsd_Node_t * pNodeDsd,
Abc_Obj_t * pRoot,
int Required,
int nNodesSaved,
int * pnNodesAdded )
917 pGraph = Dec_GraphCreate( Vec_PtrSize(pManRst->vLeaves) );
920 pLeaf = (
Abc_Obj_t *)Vec_PtrEntry( pManRst->vLeaves, i );
921 pNode->
pFunc = pLeaf;
927 gEdge = Abc_NodeEvaluateDsd_rec( pGraph, pManRst, pNodeDsd, Required, nNodesSaved, pnNodesAdded );
928 if ( gEdge.Node > 1000 )
931 Dec_GraphFree( pGraph );
936 pLeaf = (
Abc_Obj_t *)Dec_GraphNode( pGraph, gEdge.Node )->pFunc;
937 if ( Abc_ObjRegular(pLeaf) == pRoot )
940 Dec_GraphFree( pGraph );
944 Dec_GraphSetRoot( pGraph, gEdge );
975 pParams->
fDag = fDag;
978 pParams->
nIdsMax = Abc_NtkObjNumMax( pNtk );
980 if ( pParams->
fDrop )
984 if ( Abc_ObjFanoutNum(pObj) > 0 )
1000Abc_ManRst_t * Abc_NtkManRstStart(
int nCutMax,
int fUpdateLevel,
int fUseZeros,
int fVerbose )
1004 memset(
p, 0,
sizeof(Abc_ManRst_t) );
1006 p->nCutMax = nCutMax;
1007 p->fUpdateLevel = fUpdateLevel;
1008 p->fUseZeros = fUseZeros;
1009 p->fVerbose = fVerbose;
1011 p->dd = Cudd_Init(
p->nCutMax, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
1012 Cudd_zddVarsFromBddVars(
p->dd, 2 );
1016 p->vVisited = Vec_PtrAlloc( 100 );
1017 p->vLeaves = Vec_PtrAlloc( 100 );
1018 p->vDecs = Vec_PtrAlloc( 100 );
1019 p->vTemp = Vec_PtrAlloc( 100 );
1020 p->vSims = Vec_IntAlloc( 100 );
1021 p->vOnes = Vec_IntAlloc( 100 );
1022 p->vBinate = Vec_IntAlloc( 100 );
1023 p->vTwos = Vec_IntAlloc( 100 );
1024 p->vRands = Vec_IntAlloc( 20 );
1028 for ( i = 0; i < 20; i++ )
1029 Vec_IntPush(
p->vRands, (
int)RST_RANDOM_UNSIGNED );
1045void Abc_NtkManRstStop( Abc_ManRst_t *
p )
1049 Vec_PtrFree(
p->vDecs );
1050 Vec_PtrFree(
p->vLeaves );
1051 Vec_PtrFree(
p->vVisited );
1052 Vec_PtrFree(
p->vTemp );
1053 Vec_IntFree(
p->vSims );
1054 Vec_IntFree(
p->vOnes );
1055 Vec_IntFree(
p->vBinate );
1056 Vec_IntFree(
p->vTwos );
1057 Vec_IntFree(
p->vRands );
1072void Abc_NtkManRstPrintStats( Abc_ManRst_t *
p )
1074 printf(
"Refactoring statistics:\n" );
1075 printf(
"Nodes considered = %8d.\n",
p->nNodesConsidered );
1076 printf(
"Cuts considered = %8d.\n",
p->nCutsConsidered );
1077 printf(
"Cuts explored = %8d.\n",
p->nCutsExplored );
1078 printf(
"Nodes restructured = %8d.\n",
p->nNodesRestructured );
1079 printf(
"Calculated gain = %8d.\n",
p->nNodesGained );
1081 ABC_PRT(
"Resynthesis",
p->timeRes );
1085 ABC_PRT(
"AIG update ",
p->timeNtk );
1106 Vec_PtrClear(
p->vDecs );
1107 Abc_NtkIncrementTravId( pRoot->
pNtk );
1108 for ( i = 0; i < (int)pCut->
nLeaves; i++ )
1110 pNode = Abc_NtkObj(pRoot->
pNtk, pCut->
pLeaves[i]);
1111 if ( pNode == NULL )
1113 Vec_PtrPush(
p->vDecs, pNode );
1114 Abc_NodeSetTravIdCurrent( pNode );
1122 if ( Abc_NodeIsTravIdCurrent(pFanout) || Abc_ObjIsPo(pFanout) )
1124 if ( Abc_NodeIsTravIdCurrent(Abc_ObjFanin0(pFanout)) && Abc_NodeIsTravIdCurrent(Abc_ObjFanin1(pFanout)) )
1126 Vec_PtrPush(
p->vDecs, pFanout );
1127 Abc_NodeSetTravIdCurrent( pFanout );
1145int Abc_NodeResubMffc_rec(
Abc_Obj_t * pNode )
1147 if ( Abc_NodeIsTravIdCurrent(pNode) )
1149 Abc_NodeSetTravIdCurrent( pNode );
1150 return 1 + Abc_NodeResubMffc_rec( Abc_ObjFanin0(pNode) ) +
1151 Abc_NodeResubMffc_rec( Abc_ObjFanin1(pNode) );
1165int Abc_NodeResubMffc( Abc_ManRst_t *
p,
Vec_Ptr_t * vDecs,
int nLeaves,
Abc_Obj_t * pRoot )
1170 Abc_NtkIncrementTravId( pRoot->
pNtk );
1173 Abc_NodeSetTravIdCurrent( pObj );
1175 assert( Abc_NodeIsTravIdPrevious(pRoot) );
1176 Counter = Abc_NodeResubMffc_rec( pRoot );
1178 Vec_PtrClear(
p->vTemp );
1181 if ( Abc_NodeIsTravIdCurrent(pObj) )
1182 Vec_PtrPush(
p->vTemp, pObj );
1184 Vec_PtrWriteEntry( vDecs, k++, pObj );
1187 Vec_PtrWriteEntry( vDecs, k++, pObj );
1188 assert( k == Vec_PtrSize(
p->vDecs) );
1189 assert( pRoot == Vec_PtrEntryLast(
p->vDecs) );
1207 unsigned uData0, uData1, uData;
1210 Vec_IntClear( vSims );
1213 uData = (unsigned)Vec_IntEntry( vRands, i );
1214 pObj->
pData = (
void *)(ABC_PTRUINT_T)uData;
1215 Vec_IntPush( vSims, uData );
1220 uData0 = (unsigned)(ABC_PTRUINT_T)Abc_ObjFanin0(pObj)->pData;
1221 uData1 = (unsigned)(ABC_PTRUINT_T)Abc_ObjFanin1(pObj)->pData;
1222 uData = (Abc_ObjFaninC0(pObj)? ~uData0 : uData0) & (Abc_ObjFaninC1(pObj)? ~uData1 : uData1);
1223 pObj->
pData = (
void *)(ABC_PTRUINT_T)uData;
1224 Vec_IntPush( vSims, uData );
1239int Abc_NodeCheckFull( Abc_ManRst_t *
p,
Dec_Graph_t * pGraph )
1259 uRoot = (unsigned)Vec_IntEntryLast( vSims );
1262 pGraph = Dec_GraphCreateConst0();
1263 else if ( uRoot == ~(
unsigned)0 )
1264 pGraph = Dec_GraphCreateConst1();
1267 if ( Abc_NodeCheckFull(
p, pGraph ) )
1269 Dec_GraphFree( pGraph );
1287 unsigned uRoot, uNode;
1290 Vec_IntClear( vOnes );
1291 Vec_IntClear(
p->vBinate );
1292 uRoot = (unsigned)Vec_IntEntryLast( vSims );
1293 for ( i = 0; i < nNodes; i++ )
1295 uNode = (unsigned)Vec_IntEntry( vSims, i );
1296 if ( uRoot == uNode || uRoot == ~uNode )
1298 pGraph = Dec_GraphCreate( 1 );
1299 Dec_GraphNode( pGraph, 0 )->pFunc = Vec_PtrEntry(
p->vDecs, i );
1300 Dec_GraphSetRoot( pGraph, Dec_IntToEdge( (
int)(uRoot == ~uNode) ) );
1302 if ( Abc_NodeCheckFull(
p, pGraph ) )
1304 Dec_GraphFree( pGraph );
1306 if ( (uRoot & uNode) == 0 )
1307 Vec_IntPush( vOnes, i << 1 );
1308 else if ( (uRoot & ~uNode) == 0 )
1309 Vec_IntPush( vOnes, (i << 1) + 1 );
1311 Vec_IntPush(
p->vBinate, i );
1333 uRoot = (unsigned)Vec_IntEntryLast( vSims );
1334 for ( i = 0; i < vOnes->nSize; i++ )
1335 for ( k = i+1; k < vOnes->nSize; k++ )
1336 if ( ~uRoot == ((
unsigned)vOnes->pArray[i] | (
unsigned)vOnes->pArray[k]) )
1338 eNode0 = Dec_IntToEdge( vOnes->pArray[i] ^ 1 );
1339 eNode1 = Dec_IntToEdge( vOnes->pArray[k] ^ 1 );
1340 pGraph = Dec_GraphCreate( 2 );
1341 Dec_GraphNode( pGraph, 0 )->pFunc = Vec_PtrEntry(
p->vDecs, eNode0.Node );
1342 Dec_GraphNode( pGraph, 1 )->pFunc = Vec_PtrEntry(
p->vDecs, eNode1.Node );
1343 eRoot = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 );
1344 Dec_GraphSetRoot( pGraph, eRoot );
1345 if ( Abc_NodeCheckFull(
p, pGraph ) )
1347 Dec_GraphFree( pGraph );
1390 if ( !Abc_Abc_NodeResubCollectDivs(
p, pRoot, pCut ) )
1394 nNodesSaved = Abc_NodeResubMffc(
p,
p->vDecs, pCut->
nLeaves, pRoot );
1395 assert( nNodesSaved > 0 );
1398 Abc_NodeMffcSimulate(
p->vDecs, pCut->
nLeaves,
p->vRands,
p->vSims );
1401 pGraph = Abc_NodeMffcConstants(
p,
p->vSims );
1404 p->nNodesGained += nNodesSaved;
1405 p->nNodesRestructured++;
1410 pGraph = Abc_NodeMffcSingleVar(
p,
p->vSims, Vec_IntSize(
p->vSims) - nNodesSaved,
p->vOnes );
1413 p->nNodesGained += nNodesSaved;
1414 p->nNodesRestructured++;
1417 if ( nNodesSaved == 1 )
1421 pGraph = Abc_NodeMffcSingleNode(
p,
p->vSims, Vec_IntSize(
p->vSims) - nNodesSaved,
p->vOnes );
1424 p->nNodesGained += nNodesSaved - 1;
1425 p->nNodesRestructured++;
1428 if ( nNodesSaved == 2 )
1432 pGraph = Abc_NodeMffcDoubleNode(
p,
p->vSims, Vec_IntSize(
p->vSims) - nNodesSaved,
p->vOnes );
1435 p->nNodesGained += nNodesSaved - 2;
1436 p->nNodesRestructured++;
1439 if ( nNodesSaved == 3 )
1470 p->nNodesConsidered++;
1474 for ( pCut = pCutList; pCut; pCut = pCut->
pNext )
1475 nCuts += (
int)(pCut->
nLeaves > 3);
1476 printf(
"-----------------------------------\n" );
1477 printf(
"Node %6d : Factor-cuts = %5d.\n", pNode->
Id, nCuts );
1480 for ( pCut = pCutList; pCut; pCut = pCut->
pNext )
1484 pGraph = Abc_NodeResubEval(
p, pNode, pCut );
1485 if ( pGraph == NULL )
1487 if ( !pGraphBest || Dec_GraphNodeNum(pGraph) < Dec_GraphNodeNum(pGraphBest) )
1490 Dec_GraphFree(pGraphBest);
1491 pGraphBest = pGraph;
1494 Dec_GraphFree(pGraph);
int Dec_GraphUpdateNetwork(Abc_Obj_t *pRoot, Dec_Graph_t *pGraph, int fUpdateLevel, int nGain)
ABC_NAMESPACE_IMPL_START int Abc_NtkRestructure(Abc_Ntk_t *pNtk, int nCutMax, int fUpdateLevel, int fUseZeros, int fVerbose)
DECLARATIONS ///.
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL int Abc_NodeMffcSize(Abc_Obj_t *pNode)
FUNCTION DEFINITIONS ///.
ABC_DLL int Abc_ObjRequiredLevel(Abc_Obj_t *pObj)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
ABC_DLL int Abc_NodeMffcLabelAig(Abc_Obj_t *pNode)
#define Abc_ObjForEachFanout(pObj, pFanout, i)
struct Abc_Aig_t_ Abc_Aig_t
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL void * Abc_NodeGetCutsRecursive(void *p, Abc_Obj_t *pObj, int fDag, int fTree)
ABC_DLL Abc_Obj_t * Abc_AigAndLookup(Abc_Aig_t *pMan, Abc_Obj_t *p0, Abc_Obj_t *p1)
ABC_DLL void Abc_NtkStopReverseLevels(Abc_Ntk_t *pNtk)
ABC_DLL Vec_Int_t * Abc_NtkFanoutCounts(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NtkLevel(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_AigCleanup(Abc_Aig_t *pMan)
ABC_DLL void Abc_NtkStartReverseLevels(Abc_Ntk_t *pNtk, int nMaxLevelIncrease)
ABC_DLL Abc_Obj_t * Abc_AigXorLookup(Abc_Aig_t *pMan, Abc_Obj_t *p0, Abc_Obj_t *p1, int *pType)
ABC_DLL Abc_Obj_t * Abc_AigMuxLookup(Abc_Aig_t *pMan, Abc_Obj_t *pC, Abc_Obj_t *pT, Abc_Obj_t *pE, int *pType)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL void Abc_NtkCleanCopy(Abc_Ntk_t *pNtk)
ABC_DLL void Abc_NtkReassignIds(Abc_Ntk_t *pNtk)
#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
struct Cut_ParamsStruct_t_ Cut_Params_t
void Cut_NodeSetTriv(Cut_Man_t *p, int Node)
Cut_Man_t * Cut_ManStart(Cut_Params_t *pParams)
FUNCTION DEFINITIONS ///.
struct Cut_ManStruct_t_ Cut_Man_t
BASIC TYPES ///.
void Cut_ManSetFanoutCounts(Cut_Man_t *p, Vec_Int_t *vFanCounts)
struct Cut_CutStruct_t_ Cut_Cut_t
void Cut_ManStop(Cut_Man_t *p)
struct Dec_Node_t_ Dec_Node_t
#define Dec_GraphForEachLeaf(pGraph, pLeaf, i)
ITERATORS ///.
typedefABC_NAMESPACE_HEADER_START struct Dec_Edge_t_ Dec_Edge_t
INCLUDES ///.
struct Dec_Graph_t_ Dec_Graph_t
Dsd_Manager_t * Dsd_ManagerStart(DdManager *dd, int nSuppMax, int fVerbose)
FUNCTION DECLARATIONS ///.
void Dsd_TreeNodeGetInfoOne(Dsd_Node_t *pNode, int *DepthMax, int *GateSizeMax)
DdNode * Dsd_NodeReadFunc(Dsd_Node_t *p)
enum Dsd_Type_t_ Dsd_Type_t
struct Dsd_Manager_t_ Dsd_Manager_t
TYPEDEF DEFINITIONS ///.
Dsd_Node_t * Dsd_DecomposeOne(Dsd_Manager_t *pDsdMan, DdNode *bFunc)
void Dsd_ManagerStop(Dsd_Manager_t *dMan)
struct Dsd_Node_t_ Dsd_Node_t
DdNode * Dsd_TreeGetPrimeFunction(DdManager *dd, Dsd_Node_t *pNode)
FUNCTION DEFINITIONS ///.
#define Dsd_NodeForEachChild(Node, Index, Child)
ITERATORS ///.
int Dsd_NodeReadDecsNum(Dsd_Node_t *p)
Dsd_Type_t Dsd_NodeReadType(Dsd_Node_t *p)
FUNCTION DEFINITIONS ///.
#define Dsd_IsComplement(p)
MACRO DEFINITIONS ///.
#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 ///.