summaryrefslogtreecommitdiffstats
path: root/src/misc/mvc/mvcLits.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
commit4812c90424dfc40d26725244723887a2d16ddfd9 (patch)
treeb32ace96e7e2d84d586e09ba605463b6f49c3271 /src/misc/mvc/mvcLits.c
parente54d9691616b9a0326e2fdb3156bb4eeb8abfcd7 (diff)
downloadabc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.gz
abc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.bz2
abc-4812c90424dfc40d26725244723887a2d16ddfd9.zip
Version abc71001
Diffstat (limited to 'src/misc/mvc/mvcLits.c')
-rw-r--r--src/misc/mvc/mvcLits.c345
1 files changed, 345 insertions, 0 deletions
diff --git a/src/misc/mvc/mvcLits.c b/src/misc/mvc/mvcLits.c
new file mode 100644
index 00000000..910158e9
--- /dev/null
+++ b/src/misc/mvc/mvcLits.c
@@ -0,0 +1,345 @@
+/**CFile****************************************************************
+
+ FileName [mvcLits.c]
+
+ PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
+
+ Synopsis [Literal counting/updating procedures.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - February 1, 2003.]
+
+ Revision [$Id: mvcLits.c,v 1.4 2003/04/03 06:31:50 alanmi Exp $]
+
+***********************************************************************/
+
+#include "mvc.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Find the any literal that occurs more than once.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverAnyLiteral( Mvc_Cover_t * pCover, Mvc_Cube_t * pMask )
+{
+ Mvc_Cube_t * pCube;
+ int nWord, nBit, i;
+ int nLitsCur;
+ int fUseFirst = 0;
+
+ // go through each literal
+ if ( fUseFirst )
+ {
+ for ( i = 0; i < pCover->nBits; i++ )
+ if ( !pMask || Mvc_CubeBitValue(pMask,i) )
+ {
+ // get the word and bit of this literal
+ nWord = Mvc_CubeWhichWord(i);
+ nBit = Mvc_CubeWhichBit(i);
+ // go through all the cubes
+ nLitsCur = 0;
+ Mvc_CoverForEachCube( pCover, pCube )
+ if ( pCube->pData[nWord] & (1<<nBit) )
+ {
+ nLitsCur++;
+ if ( nLitsCur > 1 )
+ return i;
+ }
+ }
+ }
+ else
+ {
+ for ( i = pCover->nBits - 1; i >=0; i-- )
+ if ( !pMask || Mvc_CubeBitValue(pMask,i) )
+ {
+ // get the word and bit of this literal
+ nWord = Mvc_CubeWhichWord(i);
+ nBit = Mvc_CubeWhichBit(i);
+ // go through all the cubes
+ nLitsCur = 0;
+ Mvc_CoverForEachCube( pCover, pCube )
+ if ( pCube->pData[nWord] & (1<<nBit) )
+ {
+ nLitsCur++;
+ if ( nLitsCur > 1 )
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Find the most often occurring literal.]
+
+ Description [Find the most often occurring literal among those
+ that occur more than once.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverBestLiteral( Mvc_Cover_t * pCover, Mvc_Cube_t * pMask )
+{
+ Mvc_Cube_t * pCube;
+ int nWord, nBit;
+ int i, iMax, nLitsMax, nLitsCur;
+ int fUseFirst = 1;
+
+ // go through each literal
+ iMax = -1;
+ nLitsMax = -1;
+ for ( i = 0; i < pCover->nBits; i++ )
+ if ( !pMask || Mvc_CubeBitValue(pMask,i) )
+ {
+ // get the word and bit of this literal
+ nWord = Mvc_CubeWhichWord(i);
+ nBit = Mvc_CubeWhichBit(i);
+ // go through all the cubes
+ nLitsCur = 0;
+ Mvc_CoverForEachCube( pCover, pCube )
+ if ( pCube->pData[nWord] & (1<<nBit) )
+ nLitsCur++;
+
+ // check if this is the best literal
+ if ( fUseFirst )
+ {
+ if ( nLitsMax < nLitsCur )
+ {
+ nLitsMax = nLitsCur;
+ iMax = i;
+ }
+ }
+ else
+ {
+ if ( nLitsMax <= nLitsCur )
+ {
+ nLitsMax = nLitsCur;
+ iMax = i;
+ }
+ }
+ }
+
+ if ( nLitsMax > 1 )
+ return iMax;
+ return -1;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Find the most often occurring literal.]
+
+ Description [Find the most often occurring literal among those
+ that occur more than once.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverWorstLiteral( Mvc_Cover_t * pCover, Mvc_Cube_t * pMask )
+{
+ Mvc_Cube_t * pCube;
+ int nWord, nBit;
+ int i, iMin, nLitsMin, nLitsCur;
+ int fUseFirst = 1;
+
+ // go through each literal
+ iMin = -1;
+ nLitsMin = 1000000;
+ for ( i = 0; i < pCover->nBits; i++ )
+ if ( !pMask || Mvc_CubeBitValue(pMask,i) )
+ {
+ // get the word and bit of this literal
+ nWord = Mvc_CubeWhichWord(i);
+ nBit = Mvc_CubeWhichBit(i);
+ // go through all the cubes
+ nLitsCur = 0;
+ Mvc_CoverForEachCube( pCover, pCube )
+ if ( pCube->pData[nWord] & (1<<nBit) )
+ nLitsCur++;
+
+ // skip the literal that does not occur or occurs once
+ if ( nLitsCur < 2 )
+ continue;
+
+ // check if this is the best literal
+ if ( fUseFirst )
+ {
+ if ( nLitsMin > nLitsCur )
+ {
+ nLitsMin = nLitsCur;
+ iMin = i;
+ }
+ }
+ else
+ {
+ if ( nLitsMin >= nLitsCur )
+ {
+ nLitsMin = nLitsCur;
+ iMin = i;
+ }
+ }
+ }
+
+ if ( nLitsMin < 1000000 )
+ return iMin;
+ return -1;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Mvc_Cover_t * Mvc_CoverBestLiteralCover( Mvc_Cover_t * pCover, Mvc_Cover_t * pSimple )
+{
+ Mvc_Cover_t * pCoverNew;
+ Mvc_Cube_t * pCubeNew;
+ Mvc_Cube_t * pCubeS;
+ int iLitBest;
+
+ // create the new cover
+ pCoverNew = Mvc_CoverClone( pCover );
+ // get the new cube
+ pCubeNew = Mvc_CubeAlloc( pCoverNew );
+ // clean the cube
+ Mvc_CubeBitClean( pCubeNew );
+
+ // get the first cube of pSimple
+ assert( Mvc_CoverReadCubeNum(pSimple) == 1 );
+ pCubeS = Mvc_CoverReadCubeHead( pSimple );
+ // find the best literal among those of pCubeS
+ iLitBest = Mvc_CoverBestLiteral( pCover, pCubeS );
+
+ // insert this literal into the cube
+ Mvc_CubeBitInsert( pCubeNew, iLitBest );
+ // add the cube to the cover
+ Mvc_CoverAddCubeTail( pCoverNew, pCubeNew );
+ return pCoverNew;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverFirstCubeFirstLit( Mvc_Cover_t * pCover )
+{
+ Mvc_Cube_t * pCube;
+ int iBit, Value;
+
+ // get the first cube
+ pCube = Mvc_CoverReadCubeHead( pCover );
+ // get the first literal
+ Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
+ if ( Value )
+ return iBit;
+ return -1;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the number of literals in the cover.]
+
+ Description [Allocates storage for literal counters and fills it up
+ using the current information.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverCountLiterals( Mvc_Cover_t * pCover )
+{
+ Mvc_Cube_t * pCube;
+ int nWord, nBit;
+ int i, CounterTot, CounterCur;
+
+ // allocate/clean the storage for literals
+// Mvc_CoverAllocateArrayLits( pCover );
+// memset( pCover->pLits, 0, pCover->nBits * sizeof(int) );
+ // go through each literal
+ CounterTot = 0;
+ for ( i = 0; i < pCover->nBits; i++ )
+ {
+ // get the word and bit of this literal
+ nWord = Mvc_CubeWhichWord(i);
+ nBit = Mvc_CubeWhichBit(i);
+ // go through all the cubes
+ CounterCur = 0;
+ Mvc_CoverForEachCube( pCover, pCube )
+ if ( pCube->pData[nWord] & (1<<nBit) )
+ CounterCur++;
+ CounterTot += CounterCur;
+ }
+ return CounterTot;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Returns the number of literals in the cover.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Mvc_CoverIsOneLiteral( Mvc_Cover_t * pCover )
+{
+ Mvc_Cube_t * pCube;
+ int iBit, Counter, Value;
+ if ( Mvc_CoverReadCubeNum(pCover) != 1 )
+ return 0;
+ pCube = Mvc_CoverReadCubeHead(pCover);
+ // count literals
+ Counter = 0;
+ Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
+ {
+ if ( Value )
+ {
+ if ( Counter++ )
+ return 0;
+ }
+ }
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+