/**CFile**************************************************************** FileName [rwrExp.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [DAG-aware AIG rewriting package.] Synopsis [Computation of practically used NN-classes of 4-input cuts.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: rwrExp.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "rwr.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// typedef struct Rwr_Man4_t_ Rwr_Man4_t; struct Rwr_Man4_t_ { // internal lookups int nFuncs; // the number of four-var functions unsigned short * puCanons; // canonical forms int * pnCounts; // the counters of functions in each class int nConsidered; // the number of nodes considered int nClasses; // the number of NN classes }; typedef struct Rwr_Man5_t_ Rwr_Man5_t; struct Rwr_Man5_t_ { // internal lookups stmm_table * tTableNN; // the NN canonical forms stmm_table * tTableNPN; // the NPN canonical forms }; static Rwr_Man4_t * s_pManRwrExp4 = NULL; static Rwr_Man5_t * s_pManRwrExp5 = NULL; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man4ExploreStart() { Rwr_Man4_t * p; p = ABC_ALLOC( Rwr_Man4_t, 1 ); memset( p, 0, sizeof(Rwr_Man4_t) ); // canonical forms p->nFuncs = (1<<16); // canonical forms, phases, perms Extra_Truth4VarNPN( &p->puCanons, NULL, NULL, NULL ); // counters p->pnCounts = ABC_ALLOC( int, p->nFuncs ); memset( p->pnCounts, 0, sizeof(int) * p->nFuncs ); s_pManRwrExp4 = p; } /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man4ExploreCount( unsigned uTruth ) { assert( uTruth < (1<<16) ); s_pManRwrExp4->pnCounts[ s_pManRwrExp4->puCanons[uTruth] ]++; } /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man4ExplorePrint() { FILE * pFile; int i, CountMax, CountWrite, nCuts, nClasses; int * pDistrib; int * pReprs; // find the max number of occurences nCuts = nClasses = 0; CountMax = 0; for ( i = 0; i < s_pManRwrExp4->nFuncs; i++ ) { if ( CountMax < s_pManRwrExp4->pnCounts[i] ) CountMax = s_pManRwrExp4->pnCounts[i]; nCuts += s_pManRwrExp4->pnCounts[i]; if ( s_pManRwrExp4->pnCounts[i] > 0 ) nClasses++; } printf( "Number of cuts considered = %8d.\n", nCuts ); printf( "Classes occurring at least once = %8d.\n", nClasses ); // print the distribution of classes pDistrib = ABC_ALLOC( int, CountMax + 1 ); pReprs = ABC_ALLOC( int, CountMax + 1 ); memset( pDistrib, 0, sizeof(int)*(CountMax + 1) ); for ( i = 0; i < s_pManRwrExp4->nFuncs; i++ ) { pDistrib[ s_pManRwrExp4->pnCounts[i] ]++; pReprs[ s_pManRwrExp4->pnCounts[i] ] = i; } printf( "Occurence = %6d. Num classes = %4d. \n", 0, 2288-nClasses ); for ( i = 1; i <= CountMax; i++ ) if ( pDistrib[i] ) { printf( "Occurence = %6d. Num classes = %4d. Repr = ", i, pDistrib[i] ); Extra_PrintBinary( stdout, (unsigned*)&(pReprs[i]), 16 ); printf( "\n" ); } ABC_FREE( pDistrib ); ABC_FREE( pReprs ); // write into a file all classes above limit (5) CountWrite = 0; pFile = fopen( "npnclass_stats4.txt", "w" ); for ( i = 0; i < s_pManRwrExp4->nFuncs; i++ ) if ( s_pManRwrExp4->pnCounts[i] > 0 ) { Extra_PrintHex( pFile, (unsigned *)&i, 4 ); fprintf( pFile, " %10d\n", s_pManRwrExp4->pnCounts[i] ); // fprintf( pFile, "%d ", i ); CountWrite++; } fclose( pFile ); printf( "%d classes written into file \"%s\".\n", CountWrite, "npnclass_stats4.txt" ); } /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man5ExploreStart() { Rwr_Man5_t * p; p = ABC_ALLOC( Rwr_Man5_t, 1 ); memset( p, 0, sizeof(Rwr_Man5_t) ); p->tTableNN = stmm_init_table( st__numcmp, st__numhash ); p->tTableNPN = stmm_init_table( st__numcmp, st__numhash ); s_pManRwrExp5 = p; //Extra_PrintHex( stdout, Extra_TruthCanonNPN( 0x0000FFFF, 5 ), 5 ); //printf( "\n" ); } /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man5ExploreCount( unsigned uTruth ) { int * pCounter; if ( !stmm_find_or_add( s_pManRwrExp5->tTableNN, (char *)(ABC_PTRUINT_T)uTruth, (char***)&pCounter ) ) *pCounter = 0; (*pCounter)++; } /**Function************************************************************* Synopsis [Collects stats about 4-var functions appearing in netlists.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Rwt_Man5ExplorePrint() { FILE * pFile; stmm_generator * gen; int i, CountMax, nCuts, Counter; int * pDistrib; unsigned * pReprs; unsigned uTruth, uTruthC; abctime clk = Abc_Clock(); Vec_Int_t * vClassesNN, * vClassesNPN; // find the max number of occurences nCuts = 0; CountMax = 0; stmm_foreach_item( s_pManRwrExp5->tTableNN, gen, (char **)&uTruth, (char **)&Counter ) { nCuts += Counter; if ( CountMax < Counter ) CountMax = Counter; } printf( "Number of cuts considered = %8d.\n", nCuts ); printf( "Classes occurring at least once = %8d.\n", stmm_count(s_pManRwrExp5->tTableNN) ); printf( "The largest number of occurence = %8d.\n", CountMax ); // print the distribution of classes pDistrib = ABC_ALLOC( int, CountMax + 1 ); pReprs = ABC_ALLOC( unsigned, CountMax + 1 ); memset( pDistrib, 0, sizeof(int)*(CountMax + 1) ); stmm_foreach_item( s_pManRwrExp5->tTableNN, gen, (char **)&uTruth, (char **)&Counter ) { assert( Counter <= CountMax ); pDistrib[ Counter ]++; pReprs[ Counter ] = uTruth; } for ( i = 1; i <= CountMax; i++ ) if ( pDistrib[i] ) { printf( "Occurence = %6d. Num classes = %4d. Repr = ", i, pDistrib[i] ); Extra_PrintBinary( stdout, pReprs + i, 32 ); printf( "\n" ); } ABC_FREE( pDistrib ); ABC_FREE( pReprs ); // put them into an array vClassesNN = Vec_IntAlloc( stmm_count(s_pManRwrExp5->tTableNN) ); stmm_foreach_item( s_pManRwrExp5->tTableNN, gen, (char **)&uTruth, NULL ) Vec_IntPush( vClassesNN, (int)uTruth ); Vec_IntSortUnsigned( vClassesNN ); // write into a file all classes pFile = fopen( "nnclass_stats5.txt", "w" ); Vec_IntForEachEntry( vClassesNN, uTruth, i ) { if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)(ABC_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } Extra_PrintHex( pFile, &uTruth, 5 ); fprintf( pFile, " %10d\n", Counter ); } fclose( pFile ); printf( "%d classes written into file \"%s\".\n", vClassesNN->nSize, "nnclass_stats5.txt" ); clk = Abc_Clock(); // how many NPN classes exist? Vec_IntForEachEntry( vClassesNN, uTruth, i ) { int * pCounter; uTruthC = Extra_TruthCanonNPN( uTruth, 5 ); if ( !stmm_find_or_add( s_pManRwrExp5->tTableNPN, (char *)(ABC_PTRUINT_T)uTruthC, (char***)&pCounter ) ) *pCounter = 0; if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)(ABC_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } (*pCounter) += Counter; } printf( "The numbe of NPN classes = %d.\n", stmm_count(s_pManRwrExp5->tTableNPN) ); ABC_PRT( "Computing NPN classes", Abc_Clock() - clk ); // put them into an array vClassesNPN = Vec_IntAlloc( stmm_count(s_pManRwrExp5->tTableNPN) ); stmm_foreach_item( s_pManRwrExp5->tTableNPN, gen, (char **)&uTruth, NULL ) Vec_IntPush( vClassesNPN, (int)uTruth ); Vec_IntSortUnsigned( vClassesNPN ); // write into a file all classes pFile = fopen( "npnclass_stats5.txt", "w" ); Vec_IntForEachEntry( vClassesNPN, uTruth, i ) { if ( !stmm_lookup( s_pManRwrExp5->tTableNPN, (char *)(ABC_PTRUINT_T)uTruth, (char **)&Counter ) ) { assert( 0 ); } Extra_PrintHex( pFile, &uTruth, 5 ); fprintf( pFile, " %10d\n", Counter ); } fclose( pFile ); printf( "%d classes written into file \"%s\".\n", vClassesNPN->nSize, "npnclass_stats5.txt" ); // can they be uniquely characterized? } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END