diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2018-09-16 16:31:42 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2018-09-16 16:31:42 -0700 |
commit | 677c984e166693ccd4c7bb56a3aa7e7de282ef8a (patch) | |
tree | 9f1a96099f29209536a58a3bd038d241077f7392 | |
parent | 57d65f7391f14a93014d1e6c988357e545aac491 (diff) | |
download | abc-677c984e166693ccd4c7bb56a3aa7e7de282ef8a.tar.gz abc-677c984e166693ccd4c7bb56a3aa7e7de282ef8a.tar.bz2 abc-677c984e166693ccd4c7bb56a3aa7e7de282ef8a.zip |
Expriments with functions.
-rw-r--r-- | src/base/abci/abc.c | 32 | ||||
-rw-r--r-- | src/opt/dau/dauNpn2.c | 47 |
2 files changed, 50 insertions, 29 deletions
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 1edc4b6c..d2d8bf4a 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -23012,11 +23012,11 @@ usage: ***********************************************************************/ int Abc_CommandFunEnum( Abc_Frame_t * pAbc, int argc, char ** argv ) { - extern void Dtt_EnumerateLf( int nVars, int nNodeMax, int fVerbose ); + extern void Dtt_EnumerateLf( int nVars, int nNodeMax, int fDelay, int fVerbose ); extern void Dau_FunctionEnum( int nInputs, int nVars, int nNodeMax, int fUseTwo, int fReduce, int fVerbose ); - int c, nInputs = 4, nVars = 4, nNodeMax = 32, fUseTwo = 0, fReduce = 0, fSimple = 0, fVerbose = 0; + int c, nInputs = 4, nVars = 4, nNodeMax = 32, fUseTwo = 0, fReduce = 0, fSimple = 0, fDelay = 0, fVerbose = 0; Extra_UtilGetoptReset(); - while ( ( c = Extra_UtilGetopt( argc, argv, "SIMtrlvh" ) ) != EOF ) + while ( ( c = Extra_UtilGetopt( argc, argv, "SIMtrldvh" ) ) != EOF ) { switch ( c ) { @@ -23062,6 +23062,9 @@ int Abc_CommandFunEnum( Abc_Frame_t * pAbc, int argc, char ** argv ) case 'l': fSimple ^= 1; break; + case 'd': + fDelay ^= 1; + break; case 'v': fVerbose ^= 1; break; @@ -23072,14 +23075,14 @@ int Abc_CommandFunEnum( Abc_Frame_t * pAbc, int argc, char ** argv ) goto usage; } } - if ( fSimple ) + if ( fSimple || fDelay ) { - if ( nVars < 4 || nVars > 5 ) + if ( nVars < 3 || nVars > 5 ) { - Abc_Print( -1, "The number of inputs should be 4 <= I <= 5.\n" ); + Abc_Print( -1, "The number of inputs should be 3 <= I <= 5.\n" ); goto usage; } - Dtt_EnumerateLf( nVars, nNodeMax, fVerbose ); + Dtt_EnumerateLf( nVars, nNodeMax, fDelay, fVerbose ); } else { @@ -23098,15 +23101,16 @@ int Abc_CommandFunEnum( Abc_Frame_t * pAbc, int argc, char ** argv ) return 0; usage: - Abc_Print( -2, "usage: funenum [-SIM num] [-trlvh]\n" ); + Abc_Print( -2, "usage: funenum [-SIM num] [-trldvh]\n" ); Abc_Print( -2, "\t enumerates minimum 2-input-gate implementations\n" ); - Abc_Print( -2, "\t-S num : the maximum intermediate support size [default = %d]\n", nInputs ); + Abc_Print( -2, "\t-S num : the maximum intermediate support size [default = %d]\n", nInputs ); Abc_Print( -2, "\t-I num : the number of inputs of Boolean functions [default = %d]\n", nVars ); - Abc_Print( -2, "\t-M num : the maximum number of 2-input gates [default = %d]\n", nNodeMax ); - Abc_Print( -2, "\t-t : toggle adding combination of two gates [default = %s]\n", fUseTwo? "yes": "no" ); - Abc_Print( -2, "\t-r : toggle reducing the last level [default = %s]\n", fReduce? "yes": "no" ); - Abc_Print( -2, "\t-l : toggle generating L(f) rather than C(f) [default = %s]\n", fSimple? "yes": "no" ); - Abc_Print( -2, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); + Abc_Print( -2, "\t-M num : the maximum number of 2-input gates [default = %d]\n", nNodeMax ); + Abc_Print( -2, "\t-t : toggle adding combination of two gates [default = %s]\n", fUseTwo? "yes": "no" ); + Abc_Print( -2, "\t-r : toggle reducing the last level [default = %s]\n", fReduce? "yes": "no" ); + Abc_Print( -2, "\t-l : toggle generating L(f) rather than C(f) [default = %s]\n", fSimple? "yes": "no" ); + Abc_Print( -2, "\t-d : toggle generating D(f) rather than C(f) [default = %s]\n", fDelay? "yes": "no" ); + Abc_Print( -2, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" ); Abc_Print( -2, "\t-h : print the command usage\n"); return 1; } diff --git a/src/opt/dau/dauNpn2.c b/src/opt/dau/dauNpn2.c index 58f3cfb5..b02aa794 100644 --- a/src/opt/dau/dauNpn2.c +++ b/src/opt/dau/dauNpn2.c @@ -45,9 +45,11 @@ struct Dtt_Man_t_ Vec_Wec_t * vFunNodes; // nodes by NPN class Vec_Int_t * vTemp; // temporary Vec_Int_t * vTemp2; // temporary + unsigned FunMask; // function mask unsigned BinMask; // hash mask unsigned * pBins; // hash bins Vec_Int_t * vUsedBins; // used bins + int Counts[32]; // node counts }; //////////////////////////////////////////////////////////////////////// @@ -82,6 +84,7 @@ Dtt_Man_t * Dtt_ManAlloc( int nVars ) p->vFunNodes = Vec_WecStart( 16 ); p->vTemp = Vec_IntAlloc( 4000 ); p->vTemp2 = Vec_IntAlloc( 4000 ); + p->FunMask = nVars == 5 ? ~0 : (nVars == 4 ? 0xFFFF : 0xFF); p->BinMask = 0x3FFF; p->pBins = ABC_FALLOC( unsigned, p->BinMask + 1 ); p->vUsedBins = Vec_IntAlloc( 4000 ); @@ -171,45 +174,56 @@ Vec_Int_t * Dtt_ManCollect( Dtt_Man_t * p, unsigned Truth, Vec_Int_t * vFuns ) ***********************************************************************/ static inline int Dtt_ManGetFun( Dtt_Man_t * p, unsigned tFun ) { - unsigned ttFun = p->nVars == 4 ? 0xFFFF & tFun : tFun; - return Abc_TtGetBit( p->pPres, ttFun >> 1 ); + return Abc_TtGetBit( p->pPres, (tFun & p->FunMask) >> 1 ); } static inline void Dtt_ManSetFun( Dtt_Man_t * p, unsigned tFun ) { - unsigned ttFun = p->nVars == 4 ? 0xFFFF & tFun : tFun; - //assert( !Dtt_ManGetFun(p, ttFun) ); - Abc_TtSetBit( p->pPres, ttFun >> 1 ); + //assert( !Dtt_ManGetFun(p, (fFun & p->FunMask)) ); + Abc_TtSetBit( p->pPres, (tFun & p->FunMask) >> 1 ); } void Dtt_ManAddFunction( Dtt_Man_t * p, int n, int FanI, int FanJ, int Type, unsigned Truth ) { Vec_Int_t * vFuncs = Dtt_ManCollect( p, Truth, p->vTemp2 ); unsigned Min = Vec_IntFindMin( vFuncs ); int i, nObjs = Vec_IntSize(p->vFanins)/2; + int nNodesI = 0xF & (Vec_IntEntry(p->vConfigs, FanI) >> 3); + int nNodesJ = 0xF & (Vec_IntEntry(p->vConfigs, FanJ) >> 3); + int nNodes = nNodesI + nNodesJ + 1; assert( nObjs == Vec_IntSize(p->vTruths) ); assert( nObjs == Vec_IntSize(p->vConfigs) ); assert( nObjs == Vec_IntSize(p->vClasses) ); Vec_WecPush( p->vFunNodes, n, nObjs ); Vec_IntPushTwo( p->vFanins, FanI, FanJ ); Vec_IntPush( p->vTruths, Truth ); - Vec_IntPush( p->vConfigs, Type ); + Vec_IntPush( p->vConfigs, (nNodes << 3) | Type ); Vec_IntPush( p->vClasses, Vec_IntSize(p->vTruthNpns) ); Vec_IntPush( p->vTruthNpns, Min ); Vec_IntForEachEntry( vFuncs, Min, i ) Dtt_ManSetFun( p, Min ); + assert( nNodes < 32 ); + p->Counts[nNodes]++; } -int Dtt_PrintStats( int nNodes, int nVars, Vec_Wec_t * vFunNodes, word nSteps, abctime clk ) +int Dtt_PrintStats( int nNodes, int nVars, Vec_Wec_t * vFunNodes, word nSteps, abctime clk, int fDelay ) { int nNew = Vec_IntSize(Vec_WecEntry(vFunNodes, nNodes)); - printf("N =%2d | ", nNodes ); + printf("%c =%2d | ", fDelay ? 'D':'N', nNodes ); printf("C =%12.0f | ", (double)(iword)nSteps ); - printf("New%d =%10d ", nVars, nNew + (int)(nNodes==0) ); + printf("New%d =%10d ", nVars, nNew + (int)(nNodes==0) ); printf("All%d =%10d | ", nVars, Vec_WecSizeSize(vFunNodes)+1 ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); //Abc_Print(1, "%9.2f sec\n", 1.0*(Abc_Clock() - clk)/(CLOCKS_PER_SEC)); fflush(stdout); return nNew; } -void Dtt_EnumerateLf( int nVars, int nNodeMax, int fVerbose ) +void Dtt_PrintDistrib( Dtt_Man_t * p ) +{ + int i; + printf( "NPN classes for each node count (N):\n" ); + for ( i = 0; i < 32; i++ ) + if ( p->Counts[i] ) + printf( "N = %2d : NPN = %6d\n", i, p->Counts[i] ); +} +void Dtt_EnumerateLf( int nVars, int nNodeMax, int fDelay, int fVerbose ) { abctime clk = Abc_Clock(); word nSteps = 0; Dtt_Man_t * p = Dtt_ManAlloc( nVars ); int n, i, j; @@ -224,16 +238,17 @@ void Dtt_EnumerateLf( int nVars, int nNodeMax, int fVerbose ) Vec_WecPush( p->vFunNodes, 0, Vec_IntSize(p->vFanins)/2 ); Vec_IntPushTwo( p->vFanins, 0, 0 ); Vec_IntPush( p->vTruths, (unsigned)s_Truths6[0] ); - Vec_IntPush( p->vConfigs, -1 ); + Vec_IntPush( p->vConfigs, 0 ); Vec_IntPush( p->vClasses, Vec_IntSize(p->vTruthNpns) ); Vec_IntPush( p->vTruthNpns, (unsigned)s_Truths6[0] ); for ( i = 0; i < nVars; i++ ) Dtt_ManSetFun( p, (unsigned)s_Truths6[i] ); + p->Counts[0] = 2; // enumerate - Dtt_PrintStats(0, nVars, p->vFunNodes, nSteps, clk); - for ( n = 1; n < nNodeMax; n++ ) + Dtt_PrintStats(0, nVars, p->vFunNodes, nSteps, clk, fDelay); + for ( n = 1; n <= nNodeMax; n++ ) { - for ( i = 0, j = n - 1; i < n; i++, j-- ) if ( i <= j ) + for ( i = 0, j = n - 1; i < n; i++, j = j - 1 + fDelay ) if ( i <= j ) { Vec_Int_t * vFaninI = Vec_WecEntry( p->vFunNodes, i ); Vec_Int_t * vFaninJ = Vec_WecEntry( p->vFunNodes, j ); @@ -263,9 +278,11 @@ void Dtt_EnumerateLf( int nVars, int nNodeMax, int fVerbose ) } } } - if ( Dtt_PrintStats(n, nVars, p->vFunNodes, nSteps, clk) == 0 ) + if ( Dtt_PrintStats(n, nVars, p->vFunNodes, nSteps, clk, fDelay) == 0 ) break; } + if ( fDelay ) + Dtt_PrintDistrib( p ); Dtt_ManFree( p ); } |