blob: e1016cd56ca788176f11174461c2d87110b90170 [file] [log] [blame]
/**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"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// 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 ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END