blob: 9d8455b49d26395613ee844d5aee196d6183190d [file] [log] [blame]
/**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