21#ifndef ABC__map__cov__covInt_h
22#define ABC__map__cov__covInt_h
65#define Min_CoverForEachCube( pCover, pCube ) \
66 for ( pCube = pCover; \
68 pCube = pCube->pNext )
69#define Min_CoverForEachCubeSafe( pCover, pCube, pCube2 ) \
70 for ( pCube = pCover, \
71 pCube2 = pCube? pCube->pNext: NULL; \
74 pCube2 = pCube? pCube->pNext: NULL )
75#define Min_CoverForEachCubePrev( pCover, pCube, ppPrev ) \
76 for ( pCube = pCover, \
79 ppPrev = &pCube->pNext, \
80 pCube = pCube->pNext )
83static inline int Min_CubeHasBit(
Min_Cube_t *
p,
int i ) {
return (
p->uData[(i)>>5] & (1<<((i) & 31))) > 0; }
84static inline void Min_CubeSetBit(
Min_Cube_t *
p,
int i ) {
p->uData[(i)>>5] |= (1<<((i) & 31)); }
85static inline void Min_CubeXorBit(
Min_Cube_t *
p,
int i ) {
p->uData[(i)>>5] ^= (1<<((i) & 31)); }
86static inline int Min_CubeGetVar(
Min_Cube_t *
p,
int Var ) {
return 3 & (
p->uData[(2*
Var)>>5] >> ((2*
Var) & 31)); }
87static inline void Min_CubeXorVar(
Min_Cube_t *
p,
int Var,
int Value ) {
p->uData[(2*
Var)>>5] ^= (Value<<((2*
Var) & 31)); }
134 memset( pCube->
uData, 0xff,
sizeof(
unsigned) *
p->nWords );
152 pCube = Min_CubeAlloc(
p );
153 Min_CubeXorBit( pCube, iVar*2+fCompl );
172 pCube = Min_CubeAlloc(
p );
224static inline int Min_CubeCountLits(
Min_Cube_t * pCube )
228 for ( w = 0; w < (int)pCube->
nWords; w++ )
230 uData = pCube->
uData[w] ^ (pCube->
uData[w] >> 1);
231 for ( i = 0; i < 32; i += 2 )
232 if ( uData & (1 << i) )
253 Vec_IntClear( vLits );
254 for ( w = 0; w < (int)pCube->
nWords; w++ )
256 uData = pCube->
uData[w] ^ (pCube->
uData[w] >> 1);
257 for ( i = 0; i < 32; i += 2 )
258 if ( uData & (1 << i) )
259 Vec_IntPush( vLits, w*16 + i/2 );
274static inline int Min_CoverCountCubes(
Min_Cube_t * pCover )
300 for ( i = 0; i < (int)pCube0->
nWords; i++ )
303 uData = (uData | (uData >> 1)) & 0x55555555;
304 if ( uData != 0x55555555 )
325 Vec_IntClear( vVars );
326 for ( w = 0; w < (int)pCube->
nWords; w++ )
328 uData = pThis->
uData[w] & (pThis->
uData[w] >> 1) & 0x55555555;
329 uData &= (pCube->
uData[w] ^ (pCube->
uData[w] >> 1));
332 for ( i = 0; i < 32; i += 2 )
333 if ( uData & (1 << i) )
334 Vec_IntPush( vVars, w*16 + i/2 );
353 for ( i = 0; i < (int)pCube0->
nWords; i++ )
358 if ( pTemp ) pTemp->
uData[i] = 0;
363 uData = (uData | (uData >> 1)) & 0x55555555;
364 if ( (uData & (uData-1)) > 0 )
366 if ( pTemp ) pTemp->
uData[i] = uData | (uData << 1);
374 printf(
"Error: Min_CubesDistOne() looks at two equal cubes!\n" );
390static inline int Min_CubesDistTwo(
Min_Cube_t * pCube0,
Min_Cube_t * pCube1,
int * pVar0,
int * pVar1 )
394 for ( i = 0; i < (int)pCube0->
nWords; i++ )
401 uData = (uData | (uData >> 1)) & 0x55555555;
402 if ( (
Var0 >= 0 ||
Var1 >= 0) && (uData & (uData-1)) > 0 )
404 for ( k = 0; k < 32; k += 2 )
405 if ( uData & (1 << k) )
409 else if (
Var1 == -1 )
440 printf(
"Error: Min_CubesDistTwo() looks at two equal cubes or dist1 cubes!\n" );
461 pCube = Min_CubeAlloc(
p );
462 for ( i = 0; i <
p->nWords; i++ )
464 pCube->
nLits = Min_CubeCountLits( pCube );
484 pCube = Min_CubeAlloc(
p );
485 for ( i = 0; i <
p->nWords; i++ )
487 pCube->
nLits = Min_CubeCountLits( pCube );
505 for ( i = 0; i < (int)pCube0->
nWords; i++ )
525 for ( i = 0; i < (int)pCube0->
nWords; i++ )
545 for ( w = 0; w < (int)pCube->
nWords; w++ )
548 pCube->
uData[w] |= (pDist->
uData[w] & ~pMask->uData[w]);
566 for ( w = 0; w < (int)pCube->
nWords; w++ )
586 if ( pCover == NULL )
596 if ( Min_CubesAreEqual( pCube, pThis ) )
598 Min_CubeRecycle(
p, pCube );
604 p->ppStore[pCube->
nLits] = pCube;
636 for ( i = 0; i <= (int)pCube->
nLits; i++ )
640 if ( pThis !=
p->pBubble && Min_CubeIsContained( pThis, pCube ) )
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
void Min_CoverWriteStore(FILE *pFile, Min_Man_t *p)
Min_Cube_t * Min_CoverCollect(Min_Man_t *p, int nSuppSize)
void Min_ManFree(Min_Man_t *p)
void Min_CoverWriteFile(Min_Cube_t *pCover, char *pName, int fEsop)
struct Min_Cube_t_ Min_Cube_t
int Min_CubeCheck(Min_Cube_t *pCube)
#define Min_CoverForEachCube(pCover, pCube)
Min_Man_t * Min_ManAlloc(int nVars)
DECLARATIONS ///.
void Min_CoverExpand(Min_Man_t *p, Min_Cube_t *pCover)
void Min_CoverCheck(Min_Man_t *p)
void Min_ManClean(Min_Man_t *p, int nSupp)
void Min_CoverCreate(Vec_Str_t *vCover, Min_Cube_t *pCover, char Type)
void Min_EsopAddCube(Min_Man_t *p, Min_Cube_t *pCube)
int Min_CoverSuppVarNum(Min_Man_t *p, Min_Cube_t *pCover)
void Min_CoverWrite(FILE *pFile, Min_Cube_t *pCover)
void Min_SopMinimize(Min_Man_t *p)
FUNCTION DEFINITIONS ///.
#define Min_CoverForEachCubeSafe(pCover, pCube, pCube2)
void Min_SopAddCube(Min_Man_t *p, Min_Cube_t *pCube)
void Min_CubeWrite(FILE *pFile, Min_Cube_t *pCube)
void Min_EsopMinimize(Min_Man_t *p)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Min_Man_t_ Min_Man_t
DECLARATIONS ///.
Extra_MmFixed_t * pMemMan