blob: 18c92657f52abf7ff321e112fad3742cf5512a71 [file] [log] [blame]
/**CFile****************************************************************
FileName [abcAuto.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Network and node package.]
Synopsis [Computation of autosymmetries.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: abcAuto.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "base/abc/abc.h"
#ifdef ABC_USE_CUDD
#include "bdd/extrab/extraBdd.h"
#endif
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
#ifdef ABC_USE_CUDD
static void Abc_NtkAutoPrintAll( DdManager * dd, int nInputs, DdNode * pbOutputs[], int nOutputs, char * pInputNames[], char * pOutputNames[], int fNaive );
static void Abc_NtkAutoPrintOne( DdManager * dd, int nInputs, DdNode * pbOutputs[], int Output, char * pInputNames[], char * pOutputNames[], int fNaive );
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_NtkAutoPrint( Abc_Ntk_t * pNtk, int Output, int fNaive, int fVerbose )
{
DdManager * dd; // the BDD manager used to hold shared BDDs
DdNode ** pbGlobal; // temporary storage for global BDDs
char ** pInputNames; // pointers to the CI names
char ** pOutputNames; // pointers to the CO names
int nOutputs, nInputs, i;
Vec_Ptr_t * vFuncsGlob;
Abc_Obj_t * pObj;
// compute the global BDDs
if ( Abc_NtkBuildGlobalBdds(pNtk, 10000000, 1, 1, fVerbose) == NULL )
return;
// get information about the network
nInputs = Abc_NtkCiNum(pNtk);
nOutputs = Abc_NtkCoNum(pNtk);
// dd = pNtk->pManGlob;
dd = (DdManager *)Abc_NtkGlobalBddMan( pNtk );
// complement the global functions
vFuncsGlob = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
Abc_NtkForEachCo( pNtk, pObj, i )
Vec_PtrPush( vFuncsGlob, Abc_ObjGlobalBdd(pObj) );
pbGlobal = (DdNode **)Vec_PtrArray( vFuncsGlob );
// get the network names
pInputNames = Abc_NtkCollectCioNames( pNtk, 0 );
pOutputNames = Abc_NtkCollectCioNames( pNtk, 1 );
// print the size of the BDDs
if ( fVerbose )
printf( "Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
// allocate additional variables
for ( i = 0; i < nInputs; i++ )
Cudd_bddNewVar( dd );
assert( Cudd_ReadSize(dd) == 2 * nInputs );
// create ZDD variables in the manager
Cudd_zddVarsFromBddVars( dd, 2 );
// perform the analysis of the primary output functions for auto-symmetry
if ( Output == -1 )
Abc_NtkAutoPrintAll( dd, nInputs, pbGlobal, nOutputs, pInputNames, pOutputNames, fNaive );
else
Abc_NtkAutoPrintOne( dd, nInputs, pbGlobal, Output, pInputNames, pOutputNames, fNaive );
// deref the PO functions
// Abc_NtkFreeGlobalBdds( pNtk );
// stop the global BDD manager
// Extra_StopManager( pNtk->pManGlob );
// pNtk->pManGlob = NULL;
Abc_NtkFreeGlobalBdds( pNtk, 1 );
ABC_FREE( pInputNames );
ABC_FREE( pOutputNames );
Vec_PtrFree( vFuncsGlob );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_NtkAutoPrintAll( DdManager * dd, int nInputs, DdNode * pbOutputs[], int nOutputs, char * pInputNames[], char * pOutputNames[], int fNaive )
{
DdNode * bSpace1, * bSpace2, * bCanVars, * bReduced, * zEquations;
double nMints;
int nSupp, SigCounter, o;
int nAutos;
int nAutoSyms;
int nAutoSymsMax;
int nAutoSymsMaxSupp;
int nAutoSymOuts;
int nSuppSizeMax;
abctime clk;
nAutoSymOuts = 0;
nAutoSyms = 0;
nAutoSymsMax = 0;
nAutoSymsMaxSupp = 0;
nSuppSizeMax = 0;
clk = Abc_Clock();
SigCounter = 0;
for ( o = 0; o < nOutputs; o++ )
{
// bSpace1 = Extra_bddSpaceFromFunctionFast( dd, pbOutputs[o] ); Cudd_Ref( bSpace1 );
bSpace1 = Extra_bddSpaceFromFunction( dd, pbOutputs[o], pbOutputs[o] ); Cudd_Ref( bSpace1 );
bCanVars = Extra_bddSpaceCanonVars( dd, bSpace1 ); Cudd_Ref( bCanVars );
bReduced = Extra_bddSpaceReduce( dd, pbOutputs[o], bCanVars ); Cudd_Ref( bReduced );
zEquations = Extra_bddSpaceEquations( dd, bSpace1 ); Cudd_Ref( zEquations );
nSupp = Cudd_SupportSize( dd, bSpace1 );
nMints = Cudd_CountMinterm( dd, bSpace1, nSupp );
nAutos = Extra_Base2LogDouble(nMints);
printf( "Output #%3d: Inputs = %2d. AutoK = %2d.\n", o, nSupp, nAutos );
if ( nAutos > 0 )
{
nAutoSymOuts++;
nAutoSyms += nAutos;
if ( nAutoSymsMax < nAutos )
{
nAutoSymsMax = nAutos;
nAutoSymsMaxSupp = nSupp;
}
}
if ( nSuppSizeMax < nSupp )
nSuppSizeMax = nSupp;
//ABC_PRB( dd, bCanVars );
//ABC_PRB( dd, bReduced );
//Cudd_PrintMinterm( dd, bReduced );
//printf( "The equations are:\n" );
//Cudd_zddPrintCover( dd, zEquations );
//printf( "\n" );
//fflush( stdout );
bSpace2 = Extra_bddSpaceFromMatrixPos( dd, zEquations ); Cudd_Ref( bSpace2 );
//ABC_PRB( dd, bSpace1 );
//ABC_PRB( dd, bSpace2 );
if ( bSpace1 != bSpace2 )
printf( "Spaces are NOT EQUAL!\n" );
// else
// printf( "Spaces are equal.\n" );
Cudd_RecursiveDeref( dd, bSpace1 );
Cudd_RecursiveDeref( dd, bSpace2 );
Cudd_RecursiveDeref( dd, bCanVars );
Cudd_RecursiveDeref( dd, bReduced );
Cudd_RecursiveDerefZdd( dd, zEquations );
}
printf( "The cumulative statistics for all outputs:\n" );
printf( "Ins=%3d ", nInputs );
printf( "InMax=%3d ", nSuppSizeMax );
printf( "Outs=%3d ", nOutputs );
printf( "Auto=%3d ", nAutoSymOuts );
printf( "SumK=%3d ", nAutoSyms );
printf( "KMax=%2d ", nAutoSymsMax );
printf( "Supp=%3d ", nAutoSymsMaxSupp );
printf( "Time=%4.2f ", (float)(Abc_Clock() - clk)/(float)(CLOCKS_PER_SEC) );
printf( "\n" );
}
/**Function*************************************************************
Synopsis []
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Abc_NtkAutoPrintOne( DdManager * dd, int nInputs, DdNode * pbOutputs[], int Output, char * pInputNames[], char * pOutputNames[], int fNaive )
{
DdNode * bSpace1, * bCanVars, * bReduced, * zEquations;
double nMints;
int nSupp, SigCounter;
int nAutos;
SigCounter = 0;
bSpace1 = Extra_bddSpaceFromFunctionFast( dd, pbOutputs[Output] ); Cudd_Ref( bSpace1 );
// bSpace1 = Extra_bddSpaceFromFunction( dd, pbOutputs[Output], pbOutputs[Output] ); Cudd_Ref( bSpace1 );
bCanVars = Extra_bddSpaceCanonVars( dd, bSpace1 ); Cudd_Ref( bCanVars );
bReduced = Extra_bddSpaceReduce( dd, pbOutputs[Output], bCanVars ); Cudd_Ref( bReduced );
zEquations = Extra_bddSpaceEquations( dd, bSpace1 ); Cudd_Ref( zEquations );
nSupp = Cudd_SupportSize( dd, bSpace1 );
nMints = Cudd_CountMinterm( dd, bSpace1, nSupp );
nAutos = Extra_Base2LogDouble(nMints);
printf( "Output #%3d: Inputs = %2d. AutoK = %2d.\n", Output, nSupp, nAutos );
Cudd_RecursiveDeref( dd, bSpace1 );
Cudd_RecursiveDeref( dd, bCanVars );
Cudd_RecursiveDeref( dd, bReduced );
Cudd_RecursiveDerefZdd( dd, zEquations );
}
#else
void Abc_NtkAutoPrint( Abc_Ntk_t * pNtk, int Output, int fNaive, int fVerbose ) {}
#endif
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END