summaryrefslogtreecommitdiffstats
path: root/src/base/exor/exorUtil.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/exor/exorUtil.c')
-rw-r--r--src/base/exor/exorUtil.c204
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( &ltime );
+ TimeStr = asctime( localtime( &ltime ) );
+ // 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
+