#include "mvc.h"
ABC_NAMESPACE_IMPL_START
int Mvc_CoverAnyLiteral( Mvc_Cover_t * pCover, Mvc_Cube_t * pMask )
{
Mvc_Cube_t * pCube;
int nWord, nBit, i;
int nLitsCur;
int fUseFirst = 0;
if ( fUseFirst )
{
for ( i = 0; i < pCover->nBits; i++ )
if ( !pMask || Mvc_CubeBitValue(pMask,i) )
{
nWord = Mvc_CubeWhichWord(i);
nBit = Mvc_CubeWhichBit(i);
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) )
{
nWord = Mvc_CubeWhichWord(i);
nBit = Mvc_CubeWhichBit(i);
nLitsCur = 0;
Mvc_CoverForEachCube( pCover, pCube )
if ( pCube->pData[nWord] & (1<<nBit) )
{
nLitsCur++;
if ( nLitsCur > 1 )
return i;
}
}
}
return -1;
}
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;
iMax = -1;
nLitsMax = -1;
for ( i = 0; i < pCover->nBits; i++ )
if ( !pMask || Mvc_CubeBitValue(pMask,i) )
{
nWord = Mvc_CubeWhichWord(i);
nBit = Mvc_CubeWhichBit(i);
nLitsCur = 0;
Mvc_CoverForEachCube( pCover, pCube )
if ( pCube->pData[nWord] & (1<<nBit) )
nLitsCur++;
if ( fUseFirst )
{
if ( nLitsMax < nLitsCur )
{
nLitsMax = nLitsCur;
iMax = i;
}
}
else
{
if ( nLitsMax <= nLitsCur )
{
nLitsMax = nLitsCur;
iMax = i;
}
}
}
if ( nLitsMax > 1 )
return iMax;
return -1;
}
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;
iMin = -1;
nLitsMin = 1000000;
for ( i = 0; i < pCover->nBits; i++ )
if ( !pMask || Mvc_CubeBitValue(pMask,i) )
{
nWord = Mvc_CubeWhichWord(i);
nBit = Mvc_CubeWhichBit(i);
nLitsCur = 0;
Mvc_CoverForEachCube( pCover, pCube )
if ( pCube->pData[nWord] & (1<<nBit) )
nLitsCur++;
if ( nLitsCur < 2 )
continue;
if ( fUseFirst )
{
if ( nLitsMin > nLitsCur )
{
nLitsMin = nLitsCur;
iMin = i;
}
}
else
{
if ( nLitsMin >= nLitsCur )
{
nLitsMin = nLitsCur;
iMin = i;
}
}
}
if ( nLitsMin < 1000000 )
return iMin;
return -1;
}
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;
pCoverNew = Mvc_CoverClone( pCover );
pCubeNew = Mvc_CubeAlloc( pCoverNew );
Mvc_CubeBitClean( pCubeNew );
assert( Mvc_CoverReadCubeNum(pSimple) == 1 );
pCubeS = Mvc_CoverReadCubeHead( pSimple );
iLitBest = Mvc_CoverBestLiteral( pCover, pCubeS );
Mvc_CubeBitInsert( pCubeNew, iLitBest );
Mvc_CoverAddCubeTail( pCoverNew, pCubeNew );
return pCoverNew;
}
int Mvc_CoverFirstCubeFirstLit( Mvc_Cover_t * pCover )
{
Mvc_Cube_t * pCube;
int iBit, Value;
pCube = Mvc_CoverReadCubeHead( pCover );
Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
if ( Value )
return iBit;
return -1;
}
int Mvc_CoverCountLiterals( Mvc_Cover_t * pCover )
{
Mvc_Cube_t * pCube;
int nWord, nBit;
int i, CounterTot, CounterCur;
CounterTot = 0;
for ( i = 0; i < pCover->nBits; i++ )
{
nWord = Mvc_CubeWhichWord(i);
nBit = Mvc_CubeWhichBit(i);
CounterCur = 0;
Mvc_CoverForEachCube( pCover, pCube )
if ( pCube->pData[nWord] & (1<<nBit) )
CounterCur++;
CounterTot += CounterCur;
}
return CounterTot;
}
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);
Counter = 0;
Mvc_CubeForEachBit( pCover, pCube, iBit, Value )
{
if ( Value )
{
if ( Counter++ )
return 0;
}
}
return 1;
}
ABC_NAMESPACE_IMPL_END