84 word * pLimit, * pEntry1, * pEntry2;
86 int i, k, v, Value, Counter = 0;
87 pNew = Vec_WrdAlloc( Vec_WrdSize(
p) );
91 for ( v = 0; v < nVarsMin; v++ )
94 for ( k = 0; k < nVars; k++ )
95 if ( ((pMatrix[v] >> k) & 1) && ((Entry >> k) & 1) )
98 EntryNew |= (((
word)1) << v);
100 Vec_WrdPush( pNew, EntryNew );
103 pLimit = Vec_WrdLimit(pNew);
104 pEntry1 = Vec_WrdArray(pNew);
105 for ( ; pEntry1 < pLimit; pEntry1++ )
106 for ( pEntry2 = pEntry1 + 1; pEntry2 < pLimit; pEntry2++ )
107 if ( *pEntry1 == *pEntry2 )
110 printf(
"The total of %d pairs fail verification.\n", Counter );
112 printf(
"Verification successful.\n" );
130 unsigned * pMap =
ABC_CALLOC(
unsigned, 1 << Abc_MaxInt(0,nBits-5) );
131 word * pLimit = Vec_WrdLimit(
p);
132 word * pEntry1 = Vec_WrdArray(
p);
133 word * pEntry2, Value;
134 for ( ; pEntry1 < pLimit; pEntry1++ )
135 for ( pEntry2 = pEntry1 + 1; pEntry2 < pLimit; pEntry2++ )
137 Value = *pEntry1 ^ *pEntry2;
138 if ( Abc_InfoHasBit(pMap, (
int)Value) )
140 Abc_InfoXorBit( pMap, (
int)Value );
141 Vec_WrdPush( vRes, Value );
267void Abc_SuppTest(
int nOnes,
int nVars,
int fUseSimple,
int fCheck,
int fVerbose )
276 printf(
"M = %2d N = %2d : ", nOnes, nVars );
277 printf(
"K = %6d ", Vec_WrdSize(vRes) );
278 printf(
"Total = %12.0f ", 0.5 * Vec_WrdSize(vRes) * (Vec_WrdSize(vRes) - 1) );
279 printf(
"Distinct = %8d ", Vec_WrdSize(vPairs) );
280 Abc_PrintTime( 1,
"Reduction time", Abc_Clock() - clk );
284 printf(
"Solution with %d variables found. ", nVarsMin );
285 Abc_PrintTime( 1,
"Covering time", Abc_Clock() - clk );
288 Vec_WrdFree( vPairs );
307 int nCubes = 0, nVars = -1, iVar;
308 char * pCur, * pToken, * pStart =
"INPUT F-COVER";
311 { printf(
"Cannot open input file (%s).\n", pFileName );
return NULL; }
312 pCur =
strstr( pStr, pStart );
314 { printf(
"Cannot find beginning of cube cover (%s).\n", pStart );
return NULL; }
316 nCubes = atoi( pToken );
317 if ( nCubes < 1 || nCubes > 1000000 )
318 { printf(
"The number of cubes in not in the range [1; 1000000].\n" );
return NULL; }
319 vRes = Vec_WrdAlloc( 1000 );
321 while ( (pToken =
strtok(NULL,
" \t\r\n,")) != NULL )
328 { printf(
"The number of inputs (%d) is too high.\n", iVar ); Vec_WrdFree(vRes);
return NULL; }
331 else if ( nVars != iVar )
332 { printf(
"The number of inputs (%d) does not match declaration (%d).\n", nVars, iVar ); Vec_WrdFree(vRes);
return NULL; }
333 Vec_WrdPush( vRes, uCube );
337 if ( pToken[1] ==
'0' && pToken[0] ==
'1' )
338 uCube |= (((
word)1) << iVar);
339 else if ( pToken[1] !=
'1' || pToken[0] !=
'0' )
340 { printf(
"Strange literal representation (%s) of cube %d.\n", pToken, nCubes ); Vec_WrdFree(vRes);
return NULL; }
344 if ( Vec_WrdSize(vRes) != nCubes )
345 { printf(
"The number of cubes (%d) does not match declaration (%d).\n", Vec_WrdSize(vRes), nCubes ); Vec_WrdFree(vRes);
return NULL; }
347 printf(
"Successfully parsed function with %d inputs and %d cubes.\n", nVars, nCubes );
366 word * pEnt2, * pEnt = Vec_WrdArray( vCubes );
367 word * pLimit = Vec_WrdLimit( vCubes );
368 Vec_Wrd_t * vRes, * vPairs = Vec_WrdAlloc( Vec_WrdSize(vCubes) * (Vec_WrdSize(vCubes) - 1) / 2 );
369 word * pStore = Vec_WrdArray( vPairs );
370 for ( ; pEnt < pLimit; pEnt++ )
371 for ( pEnt2 = pEnt+1; pEnt2 < pLimit; pEnt2++ )
372 *pStore++ = *pEnt ^ *pEnt2;
373 vPairs->nSize = Vec_WrdCap(vPairs);
374 assert( pStore == Vec_WrdLimit(vPairs) );
377 vRes = Vec_WrdDup( vPairs );
378 printf(
"Successfully generated diff matrix with %10d rows (%6.2f %%). ",
379 Vec_WrdSize(vRes), 100.0 * Vec_WrdSize(vRes) / Vec_WrdSize(vPairs) );
380 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
381 Vec_WrdFree( vPairs );
405 int v, vBest = -1, dBest = -1;
406 for ( v = 0; v < nVars; v++ )
408 if ( Vec_WecLevelSize(pS, v) )
410 if ( vBest == -1 || dBest > Vec_WecLevelSize(pD, v) )
411 vBest = v, dBest = Vec_WecLevelSize(pD, v);
417 word Entry;
int i, v;
418 assert( Vec_WecLevelSize(pS, iVar) == 0 );
419 Vec_IntClear( Vec_WecEntry(pD, iVar) );
422 if ( ((Entry >> iVar) & 1) == 0 )
425 if ( pCounts[i] == 1 )
427 for ( v = 0; v < nVars; v++ )
428 if ( (Entry >> v) & 1 )
430 Vec_IntRemove( Vec_WecEntry(pD, v), i );
431 Vec_WecPush( pS, v, i );
434 else if ( pCounts[i] == 2 )
436 for ( v = 0; v < nVars; v++ )
437 if ( (Entry >> v) & 1 )
438 Vec_WecPush( pD, v, i );
452 Vec_Wec_t * vSingles = Vec_WecStart( 64 );
453 Vec_Wec_t * vDoubles = Vec_WecStart( 64 );
454 word Entry;
int i, v, iVar, nVarsNew = nVars;
455 int * pCounts =
ABC_ALLOC(
int, Vec_WrdSize(
p) );
458 pCounts[i] = Abc_SuppCountOnes64( Entry );
459 if ( pCounts[i] == 1 )
461 for ( v = 0; v < nVars; v++ )
462 if ( (Entry >> v) & 1 )
463 Vec_WecPush( vSingles, v, i );
465 else if ( pCounts[i] == 2 )
467 for ( v = 0; v < nVars; v++ )
468 if ( (Entry >> v) & 1 )
469 Vec_WecPush( vDoubles, v, i );
472 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
486 Vec_WecFree( vSingles );
487 Vec_WecFree( vDoubles );