31#define KIT_ISOP_MEM_LIMIT (1<<20)
34static unsigned * Kit_TruthIsop_rec(
unsigned * puOn,
unsigned * puOnDc,
int nVars,
Kit_Sop_t * pcRes,
Vec_Int_t * vStore );
35static unsigned Kit_TruthIsop5_rec(
unsigned uOn,
unsigned uOnDc,
int nVars,
Kit_Sop_t * pcRes,
Vec_Int_t * vStore );
55int Kit_TruthIsop2(
unsigned * puTruth0,
unsigned * puTruth1,
int nVars,
Vec_Int_t * vMemory,
int fTryBoth,
int fReturnTt )
61 assert( nVars >= 0 && nVars <= 16 );
63 Vec_IntClear( vMemory );
66 Kit_TruthNot( puTruth0, puTruth0, nVars );
67 pResult = Kit_TruthIsop_rec( puTruth1, puTruth0, nVars, pcRes, vMemory );
68 Kit_TruthNot( puTruth0, puTruth0, nVars );
69 if ( pcRes->nCubes == -1 )
74 assert( Kit_TruthIsImply( puTruth1, pResult, nVars ) );
75 Kit_TruthNot( puTruth0, puTruth0, nVars );
76 assert( Kit_TruthIsImply( pResult, puTruth0, nVars ) );
77 Kit_TruthNot( puTruth0, puTruth0, nVars );
78 if ( pcRes->nCubes == 0 || (pcRes->nCubes == 1 && pcRes->pCubes[0] == 0) )
80 vMemory->pArray[0] = 0;
81 Vec_IntShrink( vMemory, pcRes->nCubes );
87 Kit_TruthNot( puTruth1, puTruth1, nVars );
88 pResult = Kit_TruthIsop_rec( puTruth0, puTruth1, nVars, pcRes2, vMemory );
89 Kit_TruthNot( puTruth1, puTruth1, nVars );
90 if ( pcRes2->nCubes >= 0 )
92 assert( Kit_TruthIsImply( puTruth0, pResult, nVars ) );
93 Kit_TruthNot( puTruth1, puTruth1, nVars );
94 assert( Kit_TruthIsImply( pResult, puTruth1, nVars ) );
95 Kit_TruthNot( puTruth1, puTruth1, nVars );
96 if ( pcRes->nCubes > pcRes2->nCubes || (pcRes->nCubes == pcRes2->nCubes && pcRes->nLits > pcRes2->nLits) )
107 int nWords = Kit_TruthWordNum( nVars );
108 memmove( vMemory->pArray, pResult,
nWords *
sizeof(
unsigned) );
109 Vec_IntShrink( vMemory,
nWords );
113 memmove( vMemory->pArray, pcRes->pCubes, pcRes->nCubes *
sizeof(
unsigned) );
114 Vec_IntShrink( vMemory, pcRes->nCubes );
140 assert( nVars >= 0 && nVars <= 16 );
145 Vec_IntClear( vMemory );
148 pResult = Kit_TruthIsop_rec( puTruth, puTruth, nVars, pcRes, vMemory );
149 if ( pcRes->nCubes == -1 )
154 assert( Kit_TruthIsEqual( puTruth, pResult, nVars ) );
155 if ( pcRes->nCubes == 0 || (pcRes->nCubes == 1 && pcRes->pCubes[0] == 0) )
157 vMemory->pArray[0] = 0;
158 Vec_IntShrink( vMemory, pcRes->nCubes );
164 Kit_TruthNot( puTruth, puTruth, nVars );
165 pResult = Kit_TruthIsop_rec( puTruth, puTruth, nVars, pcRes2, vMemory );
166 if ( pcRes2->nCubes >= 0 )
168 assert( Kit_TruthIsEqual( puTruth, pResult, nVars ) );
169 if ( pcRes->nCubes > pcRes2->nCubes || (pcRes->nCubes == pcRes2->nCubes && pcRes->nLits > pcRes2->nLits) )
175 Kit_TruthNot( puTruth, puTruth, nVars );
179 memmove( vMemory->pArray, pcRes->pCubes, pcRes->nCubes *
sizeof(
unsigned) );
180 Vec_IntShrink( vMemory, pcRes->nCubes );
185 int i, k, Entry, Literal;
186 if ( Vec_IntSize(vCover) == 0 || (Vec_IntSize(vCover) == 1 && Vec_IntEntry(vCover, 0) == 0) )
188 printf(
"Constant %d\n", Vec_IntSize(vCover) );
193 for ( k = 0; k < nVars; k++ )
195 Literal = 3 & (Entry >> (k << 1));
198 else if ( Literal == 2 )
200 else if ( Literal == 0 )
204 printf(
" %d\n", !fCompl );
209 int fCompl =
Kit_TruthIsop( puTruth, nVars, vCover, fTryBoth );
224unsigned * Kit_TruthIsop_rec(
unsigned * puOn,
unsigned * puOnDc,
int nVars,
Kit_Sop_t * pcRes,
Vec_Int_t * vStore )
227 Kit_Sop_t * pcRes0 = &cRes0, * pcRes1 = &cRes1, * pcRes2 = &cRes2;
228 unsigned * puRes0, * puRes1, * puRes2;
229 unsigned * puOn0, * puOn1, * puOnDc0, * puOnDc1, * pTemp, * pTemp0, * pTemp1;
233 nWordsAll = Kit_TruthWordNum( nVars );
234 pTemp = Vec_IntFetch( vStore, nWordsAll );
241 if ( Kit_TruthIsConst0( puOn, nVars ) )
245 pcRes->pCubes = NULL;
246 Kit_TruthClear( pTemp, nVars );
249 if ( Kit_TruthIsConst1( puOnDc, nVars ) )
253 pcRes->pCubes = Vec_IntFetch( vStore, 1 );
254 if ( pcRes->pCubes == NULL )
259 pcRes->pCubes[0] = 0;
260 Kit_TruthFill( pTemp, nVars );
273 unsigned uRes = Kit_TruthIsop5_rec( puOn[0], puOnDc[0],
Var+1, pcRes, vStore );
274 for ( i = 0; i < nWordsAll; i++ )
281 puOn0 = puOn; puOn1 = puOn +
nWords;
282 puOnDc0 = puOnDc; puOnDc1 = puOnDc +
nWords;
283 pTemp0 = pTemp; pTemp1 = pTemp +
nWords;
285 Kit_TruthSharp( pTemp0, puOn0, puOnDc1,
Var );
286 puRes0 = Kit_TruthIsop_rec( pTemp0, puOnDc0,
Var, pcRes0, vStore );
287 if ( pcRes0->nCubes == -1 )
292 Kit_TruthSharp( pTemp1, puOn1, puOnDc0,
Var );
293 puRes1 = Kit_TruthIsop_rec( pTemp1, puOnDc1,
Var, pcRes1, vStore );
294 if ( pcRes1->nCubes == -1 )
299 Kit_TruthSharp( pTemp0, puOn0, puRes0,
Var );
300 Kit_TruthSharp( pTemp1, puOn1, puRes1,
Var );
301 Kit_TruthOr( pTemp0, pTemp0, pTemp1,
Var );
302 Kit_TruthAnd( pTemp1, puOnDc0, puOnDc1,
Var );
303 puRes2 = Kit_TruthIsop_rec( pTemp0, pTemp1,
Var, pcRes2, vStore );
304 if ( pcRes2->nCubes == -1 )
310 pcRes->nLits = pcRes0->nLits + pcRes1->nLits + pcRes2->nLits + pcRes0->nCubes + pcRes1->nCubes;
311 pcRes->nCubes = pcRes0->nCubes + pcRes1->nCubes + pcRes2->nCubes;
312 pcRes->pCubes = Vec_IntFetch( vStore, pcRes->nCubes );
313 if ( pcRes->pCubes == NULL )
319 for ( i = 0; i < pcRes0->nCubes; i++ )
320 pcRes->pCubes[k++] = pcRes0->pCubes[i] | (1 << ((
Var<<1)+0));
321 for ( i = 0; i < pcRes1->nCubes; i++ )
322 pcRes->pCubes[k++] = pcRes1->pCubes[i] | (1 << ((
Var<<1)+1));
323 for ( i = 0; i < pcRes2->nCubes; i++ )
324 pcRes->pCubes[k++] = pcRes2->pCubes[i];
325 assert( k == pcRes->nCubes );
327 Kit_TruthOr( pTemp0, puRes0, puRes2,
Var );
328 Kit_TruthOr( pTemp1, puRes1, puRes2,
Var );
331 for ( i = 1; i < nWordsAll/
nWords; i++ )
332 for ( k = 0; k <
nWords; k++ )
333 pTemp[i*
nWords + k] = pTemp[k];
351unsigned Kit_TruthIsop5_rec(
unsigned uOn,
unsigned uOnDc,
int nVars,
Kit_Sop_t * pcRes,
Vec_Int_t * vStore )
353 unsigned uMasks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
355 Kit_Sop_t * pcRes0 = &cRes0, * pcRes1 = &cRes1, * pcRes2 = &cRes2;
356 unsigned uOn0, uOn1, uOnDc0, uOnDc1, uRes0, uRes1, uRes2;
359 assert( (uOn & ~uOnDc) == 0 );
364 pcRes->pCubes = NULL;
367 if ( uOnDc == 0xFFFFFFFF )
371 pcRes->pCubes = Vec_IntFetch( vStore, 1 );
372 if ( pcRes->pCubes == NULL )
377 pcRes->pCubes[0] = 0;
389 uOnDc0 = uOnDc1 = uOnDc;
395 uRes0 = Kit_TruthIsop5_rec( uOn0 & ~uOnDc1, uOnDc0,
Var, pcRes0, vStore );
396 if ( pcRes0->nCubes == -1 )
401 uRes1 = Kit_TruthIsop5_rec( uOn1 & ~uOnDc0, uOnDc1,
Var, pcRes1, vStore );
402 if ( pcRes1->nCubes == -1 )
407 uRes2 = Kit_TruthIsop5_rec( (uOn0 & ~uRes0) | (uOn1 & ~uRes1), uOnDc0 & uOnDc1,
Var, pcRes2, vStore );
408 if ( pcRes2->nCubes == -1 )
414 pcRes->nLits = pcRes0->nLits + pcRes1->nLits + pcRes2->nLits + pcRes0->nCubes + pcRes1->nCubes;
415 pcRes->nCubes = pcRes0->nCubes + pcRes1->nCubes + pcRes2->nCubes;
416 pcRes->pCubes = Vec_IntFetch( vStore, pcRes->nCubes );
417 if ( pcRes->pCubes == NULL )
423 for ( i = 0; i < pcRes0->nCubes; i++ )
424 pcRes->pCubes[k++] = pcRes0->pCubes[i] | (1 << ((
Var<<1)+0));
425 for ( i = 0; i < pcRes1->nCubes; i++ )
426 pcRes->pCubes[k++] = pcRes1->pCubes[i] | (1 << ((
Var<<1)+1));
427 for ( i = 0; i < pcRes2->nCubes; i++ )
428 pcRes->pCubes[k++] = pcRes2->pCubes[i];
429 assert( k == pcRes->nCubes );
431 uRes2 |= (uRes0 & ~uMasks[
Var]) | (uRes1 & uMasks[
Var]);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
void Kit_TruthIsopPrint(unsigned *puTruth, int nVars, Vec_Int_t *vCover, int fTryBoth)
#define KIT_ISOP_MEM_LIMIT
DECLARATIONS ///.
int Kit_TruthIsop2(unsigned *puTruth0, unsigned *puTruth1, int nVars, Vec_Int_t *vMemory, int fTryBoth, int fReturnTt)
FUNCTION DEFINITIONS ///.
void Kit_TruthIsopPrintCover(Vec_Int_t *vCover, int nVars, int fCompl)
void Kit_TruthCofactor0(unsigned *pTruth, int nVars, int iVar)
typedefABC_NAMESPACE_HEADER_START struct Kit_Sop_t_ Kit_Sop_t
INCLUDES ///.
void Kit_TruthCofactor1(unsigned *pTruth, int nVars, int iVar)
int Kit_TruthVarInSupport(unsigned *pTruth, int nVars, int iVar)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.