28static int bit_count[256] = {
29 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
30 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
31 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
32 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
33 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
34 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
35 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
36 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
40static void Mvc_CoverCopyColumn(
Mvc_Cover_t * pCoverOld,
Mvc_Cover_t * pCoverNew,
int iColOld,
int iColNew );
103 int Counter, i, v0, v1;
107 Counter = pCover->
nBits/2;
108 for ( i = 0; i < pCover->
nBits/2; i++ )
133 int RetValue, v0, v1;
139 RetValue = (int)( !v0 || !v1 );
275 unsigned char * pByte, * pByteStart, * pByteStop;
287 pByteStart = (
unsigned char *)pCube->
pData;
288 pByteStop = pByteStart + nBytes;
290 for ( pByte = pByteStart; pByte < pByteStop; pByte++ )
291 nOnes += bit_count[*pByte];
350 unsigned char * pByte, * pByteStart, * pByteStop;
368 pByteStart = (
unsigned char *)pMask->
pData;
369 pByteStop = pByteStart + nBytes;
373 for ( pByte = pByteStart; pByte < pByteStop; pByte++ )
374 nOnes += bit_count[*pByte];
376 pDiffs[nCubePairs++] = nOnes;
420 for ( i = 0; i < nVarsRem; i++ )
424 assert( pVarsRem[i] >= 0 && pVarsRem[i] <
p->nBits );
425 Mvc_CoverCopyColumn(
p, pCover, pVarsRem[i], i );
445 int iColOld,
int iColNew )
448 int iWordOld, iWordNew, iBitOld, iBitNew;
462 if ( pCubeOld->
pData[iWordOld] & (1<<iBitOld) )
463 pCubeNew->
pData[iWordNew] |= (1<<iBitNew);
465 pCubeNew->
pData[iWordNew] &= ~(1<<iBitNew);
554 int Value0, Value1, Temp;
556 assert( iValue0 + 1 == iValue1 );
571 if ( Value0 && Value1 )
574 assert( Value0 || Value1 );
611 int iValueA0,
int iValueA1,
int iValueB0,
int iValueB1 )
615 int ValueA0, ValueA1, ValueB0, ValueB1;
629 assert( ValueA0 || ValueA1 );
630 assert( ValueB0 || ValueB1 );
633 if ( ValueA0 != ValueB0 && ValueA1 != ValueB1 )
641 if ( ValueA0 && ValueB0 )
646 if ( ValueA1 && ValueB1 )
676 int i, nValues, iValueFirst, Res;
679 iValueFirst = Vm_VarMapReadValuesFirst(pData->pVm, iVar);
680 nValues = Vm_VarMapReadValues(pData->pVm, iVar);
682 for ( i = 0; i <= nValues; i++ )
698 for ( i = 0; i < nValues; i++ )
726 int iValueFirst, Res, Counter;
729 iValueFirst = Vm_VarMapReadValuesFirst( pData->pVm, iVar );
761 int i, iLast, iLastNew;
769 for ( i = pCover->
nBits; i < pCoverNew->nBits; i++ )
812 int nWord, nBit, i, iCube;
815 for ( i = 0; i < pCover->
nBits; i++ )
826 if ( pCube->
pData[nWord] & (1<<nBit) )
862 printf(
"Cube %2d out of %2d contains dirty bits.\n", nCubes,
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Mvc_Cover_t * Mvc_CoverCofactor(Mvc_Cover_t *p, int iValue, int iValueOther)
Mvc_Cover_t * Mvc_CoverTranspose(Mvc_Cover_t *pCover)
Mvc_Cover_t * Mvc_CoverCommonCubeCover(Mvc_Cover_t *pCover)
int Mvc_CoverSupportSizeBinary(Mvc_Cover_t *pCover)
Mvc_Cover_t * Mvc_CoverFlipVar(Mvc_Cover_t *p, int iValue0, int iValue1)
int Mvc_CoverCountCubePairDiffs(Mvc_Cover_t *pCover, unsigned char pDiffs[])
void Mvc_CoverMakeCubeFree(Mvc_Cover_t *pCover)
int Mvc_CoverCheckSuppContainment(Mvc_Cover_t *pCover1, Mvc_Cover_t *pCover2)
int Mvc_UtilsCheckUnusedZeros(Mvc_Cover_t *pCover)
Mvc_Cover_t * Mvc_CoverRemoveDontCareLits(Mvc_Cover_t *pCover)
Mvc_Cover_t * Mvc_CoverUnivQuantify(Mvc_Cover_t *p, int iValueA0, int iValueA1, int iValueB0, int iValueB1)
void Mvc_CoverSupportAnd(Mvc_Cover_t *pCover, Mvc_Cube_t *pSupp)
void Mvc_CoverInverse(Mvc_Cover_t *pCover)
void Mvc_CoverCommonCube(Mvc_Cover_t *pCover, Mvc_Cube_t *pComCube)
Mvc_Cover_t * Mvc_CoverRemap(Mvc_Cover_t *p, int *pVarsRem, int nVarsRem)
int Mvc_CoverSupportVarBelongs(Mvc_Cover_t *pCover, int iVar)
int Mvc_CoverIsCubeFree(Mvc_Cover_t *pCover)
int Mvc_CoverSetCubeSizes(Mvc_Cover_t *pCover)
void Mvc_CoverSupport(Mvc_Cover_t *pCover, Mvc_Cube_t *pSupp)
FUNCTION DEFINITIONS ///.
#define Mvc_CubeBitOr(CubeR, Cube1, Cube2)
int Mvr_CoverCountLitsWithValue(Mvc_Data_t *pData, Mvc_Cover_t *pCover, int iVar, int iValue)
#define Mvc_CoverAddCubeTail(pCover, pCube)
#define Mvc_CubeBitNotImpl(Res, Cube1, Cube2)
Mvc_Cover_t * Mvc_CoverDup(Mvc_Cover_t *pCover)
#define Mvc_CubeWhichWord(Bit)
Mvc_Cover_t * Mvc_CoverClone(Mvc_Cover_t *pCover)
#define Mvc_CubeSetSize(Cube, Size)
struct MvcCubeStruct Mvc_Cube_t
#define Mvc_CubeSetLast(Cube, Last)
#define Mvc_CubeBitAnd(CubeR, Cube1, Cube2)
void Mvc_CoverAllocateMask(Mvc_Cover_t *pCover)
struct MvcDataStruct Mvc_Data_t
#define Mvc_CubeBitExor(CubeR, Cube1, Cube2)
#define Mvc_CubeBitEmpty(Res, Cube)
#define Mvc_CubeReadNext(Cube)
MACRO DEFINITIONS ///.
#define Mvc_CubeBitClean(Cube)
#define Mvc_CubeBitSharp(CubeR, Cube1, Cube2)
#define Mvc_CubeBitRemove(Cube, Bit)
unsigned int Mvc_CubeWord_t
STRUCTURE DEFINITIONS ///.
Mvc_Cover_t * Mvc_CoverAlloc(Mvc_Manager_t *pMem, int nBits)
DECLARATIONS ///.
#define Mvc_CubeBitFill(Cube)
#define Mvc_CubeBitValue(Cube, Bit)
#define Mvc_CoverForEachCube(Cover, Cube)
Mvc_Cover_t ** Mvc_CoverCofactors(Mvc_Data_t *pData, Mvc_Cover_t *pCover, int iVar)
Mvc_Cube_t * Mvc_CubeAlloc(Mvc_Cover_t *pCover)
DECLARATIONS ///.
struct MvcCoverStruct Mvc_Cover_t
#define Mvc_CubeBitEqualUnderMask(Res, Cube1, Cube2, Mask)
void Mvc_CubeBitRemoveDcs(Mvc_Cube_t *pCube)
Mvc_Cube_t * Mvc_CoverReadCubeHead(Mvc_Cover_t *pCover)
#define Mvc_CubeWhichBit(Bit)
#define Mvc_CubeBitNot(Cube)
int Mvc_CoverReadCubeNum(Mvc_Cover_t *pCover)
#define Mvc_CubeBitInsert(Cube, Bit)
void Mvc_CubeFree(Mvc_Cover_t *pCover, Mvc_Cube_t *pCube)
Mvc_Cube_t * Mvc_CubeDup(Mvc_Cover_t *pCover, Mvc_Cube_t *pCube)
#define Mvc_CoverForEachCubeStart(Start, Cube)
#define Mvc_CubeBitCopy(Cube1, Cube2)