49 int nCubesInit, nCubesOld, nIter;
53 nCubesInit =
p->nCubes;
55 nCubesOld =
p->nCubes;
60 while ( 100.0*(nCubesOld -
p->nCubes)/nCubesOld > 3.0 );
81 int v00, v01, v10, v11,
Var0,
Var1, Index, fCont0, fCont1, nCubesOld;
94 p->pBubble->pNext =
p->ppStore[0];
95 p->ppStore[0] =
p->pBubble;
96 p->pBubble->nLits = 0;
102 Index =
p->pBubble->nLits;
106 if ( pCube ==
p->pBubble )
111 *ppPrev =
p->pBubble->pNext;
112 pCube =
p->pBubble->pNext;
114 for ( Index++; Index <=
p->nVars; Index++ )
115 if (
p->ppStore[Index] )
117 ppPrev = &(
p->ppStore[Index]);
118 pCube =
p->ppStore[Index];
127 if ( Min_CubesDistTwo( pCube, pThis, &
Var0, &
Var1 ) )
129 if ( pThis == NULL && Index < p->nVars )
131 if ( Min_CubesDistTwo( pCube, pThis, &
Var0, &
Var1 ) )
137 p->pBubble->pNext = pCube->
pNext;
138 pCube->
pNext =
p->pBubble;
139 p->pBubble->nLits = pCube->
nLits;
149 *ppPrevT = pThis->
pNext;
150 *ppPrev =
p->pBubble;
151 p->pBubble->pNext = pCube->
pNext;
152 p->pBubble->nLits = pCube->
nLits;
155 assert( pCube !=
p->pBubble && pThis !=
p->pBubble );
159 v00 = Min_CubeGetVar( pCube,
Var0 );
160 v01 = Min_CubeGetVar( pCube,
Var1 );
161 v10 = Min_CubeGetVar( pThis,
Var0 );
162 v11 = Min_CubeGetVar( pThis,
Var1 );
163 assert( v00 != v10 && v01 != v11 );
164 assert( v00 != 3 || v01 != 3 );
165 assert( v10 != 3 || v11 != 3 );
176 if ( v00 != 3 && v01 != 3 && v10 != 3 && v11 != 3 )
178 assert( v00 == (v10 ^ 3) );
179 assert( v01 == (v11 ^ 3) );
181 Min_CubeXorVar( pCube,
Var0, 3 );
183 fCont0 = Min_CoverContainsCube(
p, pCube );
185 Min_CubeXorVar( pCube,
Var0, 3 );
186 Min_CubeXorVar( pCube,
Var1, 3 );
191 fCont1 = Min_CoverContainsCube(
p, pCube );
193 Min_CubeXorVar( pCube,
Var1, 3 );
196 if ( fCont0 && fCont1 )
199 Min_CubeRecycle(
p, pThis );
201 Min_CubeXorVar( pCube,
Var0, v00 ^ 3 );
202 Min_CubeXorVar( pCube,
Var1, v01 ^ 3 );
209 Min_CubeXorVar( pCube,
Var0, v00 ^ 3 );
212 Min_CubeXorVar( pThis,
Var1, v11 ^ 3 );
219 Min_CubeXorVar( pCube,
Var1, v01 ^ 3 );
222 Min_CubeXorVar( pThis,
Var0, v10 ^ 3 );
236 if ( v00 != 3 && v01 != 3 )
238 assert( v10 == 3 || v11 == 3 );
239 pTemp = pCube; pCube = pThis; pThis = pTemp;
240 Index = v00; v00 = v10; v10 = Index;
241 Index = v01; v01 = v11; v11 = Index;
249 Index = v00; v00 = v01; v01 = Index;
250 Index = v10; v10 = v11; v11 = Index;
254 if ( v00 == 3 && v11 == 3 )
256 assert( v01 != 3 && v10 != 3 );
259 Min_CubeXorVar( pCube,
Var0, v10 );
260 Min_CubeXorVar( pCube,
Var1, 3 );
263 fCont0 = Min_CoverContainsCube(
p, pCube );
265 Min_CubeXorVar( pCube,
Var0, v10 );
266 Min_CubeXorVar( pCube,
Var1, 3 );
272 Min_CubeRecycle(
p, pThis );
274 Min_CubeXorVar( pCube,
Var1, v01 ^ 3 );
281 Min_CubeXorVar( pCube,
Var0, v10 );
284 nCubesOld =
p->nCubes;
287 if (
p->nCubes < nCubesOld + 1 )
298 Min_CubeXorVar( pCube,
Var0, v10 );
302 Min_CubeXorVar( pThis,
Var1, v01 );
313 assert( v01 != 3 && v10 != 3 && v11 != 3 );
316 Min_CubeXorVar( pThis,
Var0, 3 );
318 fCont0 = Min_CoverContainsCube(
p, pThis );
320 Min_CubeXorVar( pThis,
Var0, 3 );
325 Min_CubeRecycle(
p, pThis );
327 Min_CubeXorVar( pCube,
Var1, v01 ^ 3 );
335 Min_CubeXorVar( pCube,
Var0, v10 );
338 Min_CubeXorVar( pThis,
Var1, v11 ^ 3 );
368 if ( Min_CubesAreEqual( pCube, pThis ) )
370 Min_CubeRecycle(
p, pCube );
375 for ( i = 0; i < (int)pCube->
nLits; i++ )
378 if ( pThis !=
p->pBubble && Min_CubeIsContained( pThis, pCube ) )
380 Min_CubeRecycle(
p, pCube );
387 if ( Min_CubesDistOne( pCube, pThis, NULL ) )
389 *ppPrev = pThis->
pNext;
390 Min_CubesTransformOr( pCube, pThis );
392 Min_CubeRecycle(
p, pThis );
399 for ( i = pCube->
nLits + 1; i <= (
int)pCube->
nVars; i++ )
401 ppPrev = &
p->ppStore[i];
404 if ( pThis !=
p->pBubble && Min_CubeIsContained( pCube, pThis ) )
406 *ppPrev = pThis->
pNext;
407 Min_CubeRecycle(
p, pThis );
411 ppPrev = &pThis->
pNext;
417 p->ppStore[pCube->
nLits] = pCube;
437 assert( (
int)pCube->
nLits == Min_CubeCountLits(pCube) );
460 for ( i = 0; i <=
p->nVars; i++ )
465 if ( !Min_CubesAreEqual( pCube, pCube2 ) )
467 *ppPrev = pCube2->
pNext;
468 Min_CubeRecycle(
p, pCube2 );
471 for ( k = i + 1; k <=
p->nVars; k++ )
474 if ( !Min_CubeIsContained( pCube, pCube2 ) )
476 *ppPrev = pCube2->
pNext;
477 Min_CubeRecycle(
p, pCube2 );
498 for ( i =
p->nVars; i >= 0; i-- )
504 if ( !Min_CubesDistOne( pCube, pCube2, NULL ) )
506 pCubeNew = Min_CubesXor(
p, pCube, pCube2 );
509 p->ppStore[pCubeNew->
nLits] = pCubeNew;
529 Min_Cube_t * pCover, * pCube, * pNext, * pReady, * pThis, ** ppPrev;
533 vVars = Vec_IntAlloc( 100 );
535 pCover = Min_CubeAlloc(
p );
540 if ( Min_CubesDisjoint( pThis, pCube ) )
543 pNext = pThis->
pNext;
545 Min_CoverGetDisjVars( pThis, pCube, vVars );
551 Min_CubeXorVar( pReady, vVars->pArray[i], 3 );
555 Value = Min_CubeGetVar( pReady, vVars->pArray[i] );
556 pReady = Min_CubeDup(
p, pReady );
557 Min_CubeXorVar( pReady, vVars->pArray[i], 3 ^ Value );
560 ppPrev = &pReady->
pNext;
563 pThis->
pNext = pNext;
565 Vec_IntFree( vVars );
568 Min_CoverExpandRemoveEqual(
p, pCover );
590 pCube = Min_CubeAlloc(
p );
591 Min_CubeXorBit( pCube, 2*0+1 );
592 Min_CubeXorBit( pCube, 2*1+1 );
593 Min_CubeXorBit( pCube, 2*2+0 );
594 Min_CubeXorBit( pCube, 2*3+0 );
595 Min_CubeXorBit( pCube, 2*4+0 );
596 Min_CubeXorBit( pCube, 2*5+1 );
597 Min_CubeXorBit( pCube, 2*6+1 );
603 for ( i = 0; i <=
p->nVars; i++ )
605 if ( pThis !=
p->pBubble && Min_CubeIsContained( pThis, pCube ) )
607 Min_CubeRecycle(
p, pCube );
610 Min_CubeRecycle(
p, pCube );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Min_Cube_t * Min_CoverCollect(Min_Man_t *p, int nSuppSize)
struct Min_Cube_t_ Min_Cube_t
int Min_CubeCheck(Min_Cube_t *pCube)
#define Min_CoverForEachCube(pCover, pCube)
#define Min_CoverForEachCubePrev(pCover, pCube, ppPrev)
#define Min_CoverForEachCubeSafe(pCover, pCube, pCube2)
Min_Cube_t * Min_SopComplement(Min_Man_t *p, Min_Cube_t *pSharp)
int Min_SopAddCubeInt(Min_Man_t *p, Min_Cube_t *pCube)
void Min_SopContain(Min_Man_t *p)
int Min_SopCheck(Min_Man_t *p)
void Min_SopMinimize(Min_Man_t *p)
FUNCTION DEFINITIONS ///.
void Min_SopAddCube(Min_Man_t *p, Min_Cube_t *pCube)
void Min_SopDist1Merge(Min_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Min_Man_t_ Min_Man_t
DECLARATIONS ///.
#define Vec_IntForEachEntryReverse(vVec, pEntry, i)