mirror of https://github.com/YosysHQ/abc.git
337 lines
10 KiB
C
337 lines
10 KiB
C
/**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
|
|
|