summaryrefslogtreecommitdiffstats
path: root/src/opt/rwr/rwrExp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opt/rwr/rwrExp.c')
-rw-r--r--src/opt/rwr/rwrExp.c333
1 files changed, 333 insertions, 0 deletions
diff --git a/src/opt/rwr/rwrExp.c b/src/opt/rwr/rwrExp.c
new file mode 100644
index 00000000..2d00bb1c
--- /dev/null
+++ b/src/opt/rwr/rwrExp.c
@@ -0,0 +1,333 @@
+/**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"
+
+////////////////////////////////////////////////////////////////////////
+/// 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 = 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 = 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 = ALLOC( int, CountMax + 1 );
+ pReprs = 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" );
+ }
+ free( pDistrib );
+ 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, 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 = 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 *)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;
+ int clk = 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 = ALLOC( int, CountMax + 1 );
+ pReprs = 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" );
+ }
+ free( pDistrib );
+ 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 *)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 = 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 *)uTruthC, (char***)&pCounter ) )
+ *pCounter = 0;
+ if ( !stmm_lookup( s_pManRwrExp5->tTableNN, (char *)uTruth, (char **)&Counter ) )
+ {
+ assert( 0 );
+ }
+ (*pCounter) += Counter;
+ }
+ printf( "The numbe of NPN classes = %d.\n", stmm_count(s_pManRwrExp5->tTableNPN) );
+PRT( "Computing NPN classes", 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 *)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 ///
+////////////////////////////////////////////////////////////////////////
+
+