diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 6e3bf2413..86266a25d 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -9059,7 +9059,7 @@ int Abc_CommandLutCasDec( Abc_Frame_t * pAbc, int argc, char ** argv ) extern Abc_Ntk_t * Abc_NtkLutCascade2( Abc_Ntk_t * pNtk, int nLutSize, int nLuts, int nRails, int nIters, int fVerbose, char * pGuide ); extern void Abc_NtkLutCascadeFile( char * pFileName, int nVarNum, int nLutSize, int nLuts, int nRails, int nIters, int fVerbose, int fVeryVerbose ); Abc_Ntk_t * pNtk = Abc_FrameReadNtk(pAbc), * pNtkRes; char * pGuide = NULL, * pFileName = NULL; - int c, nVarNum = -1, nLutSize = 6, nStages = 8, nRails = 1, nShared = 2, nIters = 1, fGen = 0, fVerbose = 0, fVeryVerbose = 0; + int c, nVarNum = -1, nLutSize = 6, nStages = 8, nRails = 1, nShared = 2, nIters = 10, fGen = 0, fVerbose = 0, fVeryVerbose = 0; Extra_UtilGetoptReset(); while ( ( c = Extra_UtilGetopt( argc, argv, "KMRSINFgvwh" ) ) != EOF ) { diff --git a/src/base/abci/abcCas.c b/src/base/abci/abcCas.c index 4aadaf8f0..4d34cce68 100644 --- a/src/base/abci/abcCas.c +++ b/src/base/abci/abcCas.c @@ -621,46 +621,51 @@ Abc_Ntk_t * Abc_NtkLutCascade2( Abc_Ntk_t * pNtk, int nLutSize, int nLuts, int n { extern Gia_Man_t * Abc_NtkStrashToGia( Abc_Ntk_t * pNtk ); extern word * Abc_LutCascade2( word * p, int nVars, int nLutSize, int nLuts, int nRails, int nIters, int fVerbose ); - Gia_Man_t * pGia = Abc_NtkStrashToGia( pNtk ); - word * pTruth1 = Gia_ObjComputeTruthTable( pGia, Gia_ManCo(pGia, 0) ); int nWords = Abc_TtWordNum(Abc_NtkCiNum(pNtk)); word * pCopy = ABC_ALLOC( word, nWords ); - Abc_TtCopy( pCopy, pTruth1, nWords, 0 ); + Gia_Man_t * pGia = Abc_NtkStrashToGia( pNtk ); + Abc_Ntk_t * pNew = NULL; + Abc_Random(1); + for ( int Iter = 0; Iter < nIters; Iter++ ) { + word * pTruth1 = Gia_ObjComputeTruthTable( pGia, Gia_ManCo(pGia, 0) ); + Abc_TtCopy( pCopy, pTruth1, nWords, 0 ); - int nVars = -1; - Vec_Int_t * vVarIDs = Vec_IntStartNatural( Abc_NtkCiNum(pNtk) ); - Abc_TtMinimumBase( pTruth1, Vec_IntArray(vVarIDs), Abc_NtkCiNum(pNtk), &nVars ); - Vec_IntShrink( vVarIDs, nVars ); - if ( fVerbose ) { - if ( Abc_NtkCiNum(pNtk) != nVars ) - printf( "The support of the function is reduced from %d to %d variables.\n", Abc_NtkCiNum(pNtk), nVars ); - printf( "Decomposing %d-var function into %d-rail cascade of %d-LUTs", nVars, nRails, nLutSize ); - if ( pGuide ) - printf( " using structural info: %s", pGuide ); - printf( ".\n" ); - } - - word * pLuts = Abc_LutCascadeDec( pGuide, pTruth1, Abc_NtkCiNum(pNtk), vVarIDs, nRails, nLutSize, fVerbose ); - Abc_Ntk_t * pNew = pLuts ? Abc_NtkLutCascadeFromLuts( pLuts, Abc_NtkCiNum(pNtk), pNtk, nLutSize, fVerbose ) : NULL; - Vec_IntFree( vVarIDs ); - - if ( pLuts ) { - if ( fVerbose ) - Abc_LutCascadePrint( pLuts ); - word * pTruth2 = Abc_LutCascadeTruth( pLuts, Abc_NtkCiNum(pNtk) ); - if ( !Abc_TtEqual(pCopy, pTruth2, nWords) ) { - printf( "Verification FAILED.\n" ); - printf("Function before: "); Abc_TtPrintHexRev( stdout, pCopy, Abc_NtkCiNum(pNtk) ); printf( "\n" ); - printf("Function after: "); Abc_TtPrintHexRev( stdout, pTruth2, Abc_NtkCiNum(pNtk) ); printf( "\n" ); + int nVars = -1; + Vec_Int_t * vVarIDs = Vec_IntStartNatural( Abc_NtkCiNum(pNtk) ); + Abc_TtMinimumBase( pTruth1, Vec_IntArray(vVarIDs), Abc_NtkCiNum(pNtk), &nVars ); + Vec_IntShrink( vVarIDs, nVars ); + if ( fVerbose ) { + if ( Abc_NtkCiNum(pNtk) != nVars ) + printf( "The support of the function is reduced from %d to %d variables.\n", Abc_NtkCiNum(pNtk), nVars ); + printf( "Decomposing %d-var function into %d-rail cascade of %d-LUTs", nVars, nRails, nLutSize ); + if ( pGuide ) + printf( " using structural info: %s", pGuide ); + printf( ".\n" ); } - else if ( fVerbose ) - printf( "Verification passed.\n" ); - ABC_FREE( pLuts ); - ABC_FREE( pTruth2 ); + + word * pLuts = Abc_LutCascadeDec( pGuide, pTruth1, Abc_NtkCiNum(pNtk), vVarIDs, nRails, nLutSize, fVerbose ); + pNew = pLuts ? Abc_NtkLutCascadeFromLuts( pLuts, Abc_NtkCiNum(pNtk), pNtk, nLutSize, fVerbose ) : NULL; + Vec_IntFree( vVarIDs ); + + if ( pLuts ) { + if ( fVerbose ) + Abc_LutCascadePrint( pLuts ); + word * pTruth2 = Abc_LutCascadeTruth( pLuts, Abc_NtkCiNum(pNtk) ); + if ( !Abc_TtEqual(pCopy, pTruth2, nWords) ) { + printf( "Verification FAILED.\n" ); + printf("Function before: "); Abc_TtPrintHexRev( stdout, pCopy, Abc_NtkCiNum(pNtk) ); printf( "\n" ); + printf("Function after: "); Abc_TtPrintHexRev( stdout, pTruth2, Abc_NtkCiNum(pNtk) ); printf( "\n" ); + } + else if ( fVerbose ) + printf( "Verification passed.\n" ); + ABC_FREE( pLuts ); + ABC_FREE( pTruth2 ); + break; + } + //ABC_FREE( pTruth1 ); } - Gia_ManStop( pGia ); ABC_FREE( pCopy ); - //ABC_FREE( pTruth1 ); + Gia_ManStop( pGia ); return pNew; } Abc_Ntk_t * Abc_NtkLutCascadeGen( int nLutSize, int nStages, int nRails, int nShared, int fVerbose ) @@ -1154,7 +1159,7 @@ Vec_Wrd_t * Abc_NtkLutCasReadTruths( char * pFileName, int nVarsOrig ) void Abc_NtkLutCascadeFile( char * pFileName, int nVarsOrig, int nLutSize, int nLuts, int nRails, int nIters, int fVerbose, int fVeryVerbose ) { abctime clkStart = Abc_Clock(); - int i, Sum = 0, nWords = Abc_TtWordNum(nVarsOrig); + int i, Sum = 0, nTotalLuts = 0, nWords = Abc_TtWordNum(nVarsOrig); Vec_Wrd_t * vTruths = NULL; if ( strstr(pFileName, ".txt") ) vTruths = Abc_NtkLutCasReadTruths( pFileName, nVarsOrig ); @@ -1172,7 +1177,8 @@ void Abc_NtkLutCascadeFile( char * pFileName, int nVarsOrig, int nLutSize, int n printf( "Considering %d functions having %d variables from file \"%s\".\n", nFuncs, nVarsOrig, pFileName ); word * pCopy = ABC_ALLOC( word, nWords ); - int LutStats[100] = {0}; + int Iter = 0, LutStats[100] = {0}; + Abc_Random(1); for ( i = 0; i < nFuncs; i++ ) { word * pTruth = Vec_WrdEntryP( vTruths, i*nWords ); @@ -1195,15 +1201,22 @@ void Abc_NtkLutCascadeFile( char * pFileName, int nVarsOrig, int nLutSize, int n printf( "The support of the function is reduced from %d to %d variables.\n", nVarsOrig, nVars ); printf( "Decomposing %d-var function into %d-rail cascade of %d-LUTs.\n", nVars, nRails, nLutSize ); } - + word * pLuts = Abc_LutCascadeDec( NULL, pTruth, nVarsOrig, vVarIDs, nRails, nLutSize, fVeryVerbose ); Vec_IntFree( vVarIDs ); if ( pLuts == NULL ) { + if ( ++Iter < nIters ) { + i--; + continue; + } + Iter = 0; if ( fVerbose || fVeryVerbose ) printf( "Not decomposable.\n" ); continue; } + Iter = 0; Sum++; + nTotalLuts += Abc_LutCascadeCount(pLuts); LutStats[Abc_LutCascadeCount(pLuts)]++; word * pTruth2 = Abc_LutCascadeTruth( pLuts, nVarsOrig ); if ( fVeryVerbose ) @@ -1227,7 +1240,8 @@ void Abc_NtkLutCascadeFile( char * pFileName, int nVarsOrig, int nLutSize, int n if ( LutStats[i] ) printf( " %d LUT6 : Function count = %8d (%6.2f %%)\n", i, LutStats[i], 100.0*LutStats[i]/nFuncs ); printf( "Non-decomp : Function count = %8d (%6.2f %%)\n", nFuncs-Sum, 100.0*(nFuncs-Sum)/Abc_MaxInt(1, nFuncs) ); - printf( "Finished %d functions (speed = %.2f functions / second). ", nFuncs, 1.0*nFuncs/(((double)(Abc_Clock() - clkStart))/((double)CLOCKS_PER_SEC)) ); + printf( "Finished %d functions (%.2f LUTs / function; %.2f functions / sec). ", + nFuncs, 1.0*nTotalLuts/Sum, 1.0*nFuncs/(((double)(Abc_Clock() - clkStart))/((double)CLOCKS_PER_SEC)) ); Abc_PrintTime( 0, "Total time", Abc_Clock() - clkStart ); } diff --git a/src/misc/util/utilBSet.c b/src/misc/util/utilBSet.c index a50a8079f..6f4111eb9 100644 --- a/src/misc/util/utilBSet.c +++ b/src/misc/util/utilBSet.c @@ -589,7 +589,7 @@ void Abc_BSEvalOneTest( word * pT, int nVars, int nBVars, int fVerbose ) int Abc_BSEvalBest( Abc_BSEval_t * p, word * pIn, word * pBest, int nVars, int nCVars, int nFVars, int fVerbose, int * pPermBest, int fShared ) { int i, k, Var0, Var1, Pla2Var[32], Var2Pla[32]; - int nPermVars = nVars-nCVars; + int nPermVars = nVars-nCVars, Count = 0; assert( p->nVars == nPermVars && p->nBVars == nVars-nFVars ); for ( i = 0; i < nVars; i++ ) Pla2Var[i] = Var2Pla[i] = i; @@ -605,6 +605,11 @@ int Abc_BSEvalBest( Abc_BSEval_t * p, word * pIn, word * pBest, int nVars, int n CostBest = CostThis; if ( pBest ) Abc_TtCopy( pBest, pIn, Abc_Truth6WordNum(nVars), 0 ); if ( pPermBest ) memcpy( pPermBest, Pla2Var, sizeof(int)*nVars ); + Count = 1; + } + else if ( CostBest == CostThis && (Abc_Random(0) % ++Count) == 0 ) { + if ( pBest ) Abc_TtCopy( pBest, pIn, Abc_Truth6WordNum(nVars), 0 ); + if ( pPermBest ) memcpy( pPermBest, Pla2Var, sizeof(int)*nVars ); } if ( fVerbose ) { @@ -922,7 +927,7 @@ word * Abc_LutCascade2( word * pFunc, int nVars, int nLutSize, int nLuts, int nR word * pTruth = ABC_ALLOC( word, Abc_TtWordNum(nVars) ); word * pBest = ABC_ALLOC( word, Abc_TtWordNum(nVars) ); Abc_TtCopy( pTruth, pFunc, Abc_TtWordNum(nVars), 0 ); - int i, nVarsCur = nVars, nOutVars = 0; + int i, r, nVarsCur = nVars, nOutVars = 0; while ( nVarsCur > nLutSize ) { int pPerm[32] = {0}; @@ -943,8 +948,12 @@ word * Abc_LutCascade2( word * pFunc, int nVars, int nLutSize, int nLuts, int nR } int MyuMin = Abc_BSEvalBest( p, pTruth, pBest, nVarsCur, nOutVars, nVarsCur-nLutSize, fVerbose, pPerm, 0 ); int Shared = 0, nRailsMin = Abc_Base2Log( MyuMin ); - if ( nRailsMin > nRails ) - nRailsMin = Abc_SharedEvalBest( p, pBest, nVarsCur, nOutVars, nVarsCur-nLutSize, MyuMin, nRails, fVerbose, &Shared, p->pPat ); + for ( r = 1; r <= nRails && nRailsMin > r; r++ ) { + int nRailsMinNew = Abc_SharedEvalBest( p, pBest, nVarsCur, nOutVars, nVarsCur-nLutSize, MyuMin, nRails, fVerbose, &Shared, p->pPat ); + if ( nRailsMinNew < 100 ) + nRailsMin = nRailsMinNew; + } + MyuMin = 1 << nRailsMin; if ( nRailsMin > nRails ) { Vec_WrdFreeP( &vRes ); break; @@ -1007,7 +1016,7 @@ word Abc_TtFindBVarsSVars( word * pTruth, int nVars, int nRVars, int nRails, int p->nBVars = nLutSize; } - int v, nWords = Abc_TtWordNum(nVars); + int v, r, nWords = Abc_TtWordNum(nVars); word * pCopy = ABC_ALLOC( word, nWords ); Abc_TtCopy( pCopy, pTruth, nWords, 0 ); //word pPat[MAX_PAT_WORD_SIZE]; @@ -1026,10 +1035,12 @@ word Abc_TtFindBVarsSVars( word * pTruth, int nVars, int nRVars, int nRails, int } int Shared = 0, nRailsMin = Abc_Base2Log( MyuMin ); - if ( nRailsMin > nRails ) { - nRailsMin = Abc_SharedEvalBest( p, pBest, nVars, nRVars, nVars-nLutSize, MyuMin, nRails, 0, &Shared, p->pPat ); - MyuMin = 1 << nRailsMin; + for ( r = 1; r <= nRails && nRailsMin > r; r++ ) { + int nRailsMinNew = Abc_SharedEvalBest( p, pBest, nVars, nRVars, nVars-nLutSize, MyuMin, r, 0, &Shared, p->pPat ); + if ( nRailsMinNew < 100 ) + nRailsMin = nRailsMinNew; } + MyuMin = 1 << nRailsMin; ABC_FREE( pCopy ); ABC_FREE( pBest );