summaryrefslogtreecommitdiffstats
path: root/src/map/mapper/mapperCanon.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2005-07-29 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2005-07-29 08:01:00 -0700
commit888e5bed5d7f56a5d86d91a6e8e88f3e5a3454dc (patch)
tree11d48c9e9069f54dc300c3571ae63c744c802c50 /src/map/mapper/mapperCanon.c
parent7f94414388cce67bd3cc1a6d6269f0ed31ed0d06 (diff)
downloadabc-888e5bed5d7f56a5d86d91a6e8e88f3e5a3454dc.tar.gz
abc-888e5bed5d7f56a5d86d91a6e8e88f3e5a3454dc.tar.bz2
abc-888e5bed5d7f56a5d86d91a6e8e88f3e5a3454dc.zip
Version abc50729
Diffstat (limited to 'src/map/mapper/mapperCanon.c')
-rw-r--r--src/map/mapper/mapperCanon.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/map/mapper/mapperCanon.c b/src/map/mapper/mapperCanon.c
new file mode 100644
index 00000000..c5186c7e
--- /dev/null
+++ b/src/map/mapper/mapperCanon.c
@@ -0,0 +1,161 @@
+/**CFile****************************************************************
+
+ FileName [mapperCanon.c]
+
+ PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
+
+ Synopsis [Generic technology mapping engine.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 2.0. Started - June 1, 2004.]
+
+ Revision [$Id: mapperCanon.c,v 1.2 2005/01/23 06:59:42 alanmi Exp $]
+
+***********************************************************************/
+
+#include "mapperInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+static unsigned Map_CanonComputePhase( unsigned uTruths[][2], int nVars, unsigned uTruth, unsigned uPhase );
+static void Map_CanonComputePhase6( unsigned uTruths[][2], int nVars, unsigned uTruth[], unsigned uPhase, unsigned uTruthRes[] );
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Computes the N-canonical form of the Boolean function.]
+
+ Description [The N-canonical form is defined as the truth table with
+ the minimum integer value. This function exhaustively enumerates
+ through the complete set of 2^N phase assignments.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Map_CanonComputeSlow( unsigned uTruths[][2], int nVarsMax, int nVarsReal, unsigned uTruth[], unsigned char * puPhases, unsigned uTruthRes[] )
+{
+ unsigned uTruthPerm[2];
+ int nMints, nPhases, m;
+
+ nPhases = 0;
+ nMints = (1 << nVarsReal);
+ if ( nVarsMax < 6 )
+ {
+ uTruthRes[0] = MAP_MASK(32);
+ for ( m = 0; m < nMints; m++ )
+ {
+ uTruthPerm[0] = Map_CanonComputePhase( uTruths, nVarsMax, uTruth[0], m );
+ if ( uTruthRes[0] > uTruthPerm[0] )
+ {
+ uTruthRes[0] = uTruthPerm[0];
+ nPhases = 0;
+ puPhases[nPhases++] = (unsigned char)m;
+ }
+ else if ( uTruthRes[0] == uTruthPerm[0] )
+ {
+ if ( nPhases < 4 ) // the max number of phases in Map_Super_t
+ puPhases[nPhases++] = (unsigned char)m;
+ }
+ }
+ uTruthRes[1] = uTruthRes[0];
+ }
+ else
+ {
+ uTruthRes[0] = MAP_MASK(32);
+ uTruthRes[1] = MAP_MASK(32);
+ for ( m = 0; m < nMints; m++ )
+ {
+ Map_CanonComputePhase6( uTruths, nVarsMax, uTruth, m, uTruthPerm );
+ if ( uTruthRes[1] > uTruthPerm[1] || uTruthRes[1] == uTruthPerm[1] && uTruthRes[0] > uTruthPerm[0] )
+ {
+ uTruthRes[0] = uTruthPerm[0];
+ uTruthRes[1] = uTruthPerm[1];
+ nPhases = 0;
+ puPhases[nPhases++] = (unsigned char)m;
+ }
+ else if ( uTruthRes[1] == uTruthPerm[1] && uTruthRes[0] == uTruthPerm[0] )
+ {
+ if ( nPhases < 4 ) // the max number of phases in Map_Super_t
+ puPhases[nPhases++] = (unsigned char)m;
+ }
+ }
+ }
+ assert( nPhases > 0 );
+// printf( "%d ", nPhases );
+ return nPhases;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Performs phase transformation for one function of less than 6 variables.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+unsigned Map_CanonComputePhase( unsigned uTruths[][2], int nVars, unsigned uTruth, unsigned uPhase )
+{
+ int v, Shift;
+ for ( v = 0, Shift = 1; v < nVars; v++, Shift <<= 1 )
+ if ( uPhase & Shift )
+ uTruth = (((uTruth & ~uTruths[v][0]) << Shift) | ((uTruth & uTruths[v][0]) >> Shift));
+ return uTruth;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Performs phase transformation for one function of 6 variables.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Map_CanonComputePhase6( unsigned uTruths[][2], int nVars, unsigned uTruth[], unsigned uPhase, unsigned uTruthRes[] )
+{
+ unsigned uTemp;
+ int v, Shift;
+
+ // initialize the result
+ uTruthRes[0] = uTruth[0];
+ uTruthRes[1] = uTruth[1];
+ if ( uPhase == 0 )
+ return;
+ // compute the phase
+ for ( v = 0, Shift = 1; v < nVars; v++, Shift <<= 1 )
+ if ( uPhase & Shift )
+ {
+ if ( Shift < 32 )
+ {
+ uTruthRes[0] = (((uTruthRes[0] & ~uTruths[v][0]) << Shift) | ((uTruthRes[0] & uTruths[v][0]) >> Shift));
+ uTruthRes[1] = (((uTruthRes[1] & ~uTruths[v][1]) << Shift) | ((uTruthRes[1] & uTruths[v][1]) >> Shift));
+ }
+ else
+ {
+ uTemp = uTruthRes[0];
+ uTruthRes[0] = uTruthRes[1];
+ uTruthRes[1] = uTemp;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+