diff options
Diffstat (limited to 'src/base/exor/exorUtil.c')
-rw-r--r-- | src/base/exor/exorUtil.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/src/base/exor/exorUtil.c b/src/base/exor/exorUtil.c new file mode 100644 index 00000000..fb0f40f3 --- /dev/null +++ b/src/base/exor/exorUtil.c @@ -0,0 +1,204 @@ +/**CFile**************************************************************** + + FileName [exorUtil.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Exclusive sum-of-product minimization.] + + Synopsis [Utilities.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: exorUtil.c,v 1.0 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +//////////////////////////////////////////////////////////////////////// +/// /// +/// Implementation of EXORCISM - 4 /// +/// An Exclusive Sum-of-Product Minimizer /// +/// Alan Mishchenko <alanmi@ee.pdx.edu> /// +/// /// +//////////////////////////////////////////////////////////////////////// +/// /// +/// Utility Functions /// +/// /// +/// 1) allocating memory for and creating the ESOP cover /// +/// 2) writing the resultant cover into an ESOP PLA file /// +/// /// +/// Ver. 1.0. Started - July 15, 2000. Last update - July 20, 2000 /// +/// Ver. 1.4. Started - Aug 10, 2000. Last update - Aug 10, 2000 /// +/// Ver. 1.5. Started - Aug 19, 2000. Last update - Aug 19, 2000 /// +/// Ver. 1.7. Started - Sep 20, 2000. Last update - Sep 23, 2000 /// +/// /// +//////////////////////////////////////////////////////////////////////// +/// This software was tested with the BDD package "CUDD", v.2.3.0 /// +/// by Fabio Somenzi /// +/// http://vlsi.colorado.edu/~fabio/ /// +//////////////////////////////////////////////////////////////////////// + +#include "exor.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// EXTERNAL VARIABLES //// +//////////////////////////////////////////////////////////////////////// + +// information about the options, the function, and the cover +extern cinfo g_CoverInfo; + +//////////////////////////////////////////////////////////////////////// +/// EXTERNAL FUNCTIONS /// +//////////////////////////////////////////////////////////////////////// + +// Cube Cover Iterator +// starts an iterator that traverses all the cubes in the ring +extern Cube* IterCubeSetStart(); +// returns the next cube in the ring +extern Cube* IterCubeSetNext(); + +// retrieves the variable from the cube +extern varvalue GetVar( Cube* pC, int Var ); + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////// +//////////// Cover Service Procedures ///////////////// +/////////////////////////////////////////////////////////////////// + +int CountLiterals() +// nCubesAlloc is the number of allocated cubes +{ + Cube* p; + int Value, v; + int LitCounter = 0; + int LitCounterControl = 0; + + for ( p = IterCubeSetStart( ); p; p = IterCubeSetNext() ) + { + LitCounterControl += p->a; + + assert( p->fMark == 0 ); + + // write the input variables + for ( v = 0; v < g_CoverInfo.nVarsIn; v++ ) + { + Value = GetVar( p, v ); + if ( Value == VAR_NEG ) + LitCounter++; + else if ( Value == VAR_POS ) + LitCounter++; + else if ( Value != VAR_ABS ) + { + assert(0); + } + } + } + + if ( LitCounterControl != LitCounter ) + printf( "Warning! The recorded number of literals (%d) differs from the actual number (%d)\n", LitCounterControl, LitCounter ); + return LitCounter; +} + + +void WriteTableIntoFile( FILE * pFile ) +// nCubesAlloc is the number of allocated cubes +{ + int v, w; + Cube * p; + int cOutputs; + int nOutput; + int WordSize; + + for ( p = IterCubeSetStart( ); p; p = IterCubeSetNext() ) + { + assert( p->fMark == 0 ); + + // write the input variables + for ( v = 0; v < g_CoverInfo.nVarsIn; v++ ) + { + int Value = GetVar( p, v ); + if ( Value == VAR_NEG ) + fprintf( pFile, "0" ); + else if ( Value == VAR_POS ) + fprintf( pFile, "1" ); + else if ( Value == VAR_ABS ) + fprintf( pFile, "-" ); + else + assert(0); + } + fprintf( pFile, " " ); + + // write the output variables + cOutputs = 0; + nOutput = g_CoverInfo.nVarsOut; + WordSize = 8*sizeof( unsigned ); + for ( w = 0; w < g_CoverInfo.nWordsOut; w++ ) + for ( v = 0; v < WordSize; v++ ) + { + if ( p->pCubeDataOut[w] & (1<<v) ) + fprintf( pFile, "1" ); + else + fprintf( pFile, "0" ); + if ( ++cOutputs == nOutput ) + break; + } + fprintf( pFile, "\n" ); + } +} + + +int WriteResultIntoFile( char * pFileName ) +// write the ESOP cover into the PLA file <NewFileName> +{ + FILE * pFile; + time_t ltime; + char * TimeStr; + + pFile = fopen( pFileName, "w" ); + if ( pFile == NULL ) + { + fprintf( pFile, "\n\nCannot open the output file\n" ); + return 1; + } + + // get current time + time( <ime ); + TimeStr = asctime( localtime( <ime ) ); + // get the number of literals + g_CoverInfo.nLiteralsAfter = CountLiterals(); + fprintf( pFile, "# EXORCISM-4 output for command line arguments: " ); + fprintf( pFile, "\"-Q %d -V %d\"\n", g_CoverInfo.Quality, g_CoverInfo.Verbosity ); + fprintf( pFile, "# Minimization performed %s", TimeStr ); + fprintf( pFile, "# Initial statistics: " ); + fprintf( pFile, "Cubes = %d Literals = %d\n", g_CoverInfo.nCubesBefore, g_CoverInfo.nLiteralsBefore ); + fprintf( pFile, "# Final statistics: " ); + fprintf( pFile, "Cubes = %d Literals = %d\n", g_CoverInfo.nCubesInUse, g_CoverInfo.nLiteralsAfter ); + fprintf( pFile, "# File reading and reordering time = %.2f sec\n", TICKS_TO_SECONDS(g_CoverInfo.TimeRead) ); + fprintf( pFile, "# Starting cover generation time = %.2f sec\n", TICKS_TO_SECONDS(g_CoverInfo.TimeStart) ); + fprintf( pFile, "# Pure ESOP minimization time = %.2f sec\n", TICKS_TO_SECONDS(g_CoverInfo.TimeMin) ); + fprintf( pFile, ".i %d\n", g_CoverInfo.nVarsIn ); + fprintf( pFile, ".o %d\n", g_CoverInfo.nVarsOut ); + fprintf( pFile, ".p %d\n", g_CoverInfo.nCubesInUse ); + fprintf( pFile, ".type esop\n" ); + WriteTableIntoFile( pFile ); + fprintf( pFile, ".e\n" ); + fclose( pFile ); + return 0; +} + +/////////////////////////////////////////////////////////////////// +//////////// End of File ///////////////// +/////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |