ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
extraUtilPrime.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "misc/vec/vec.h"
#include "misc/vec/vecHsh.h"
#include "bool/kit/kit.h"
#include "misc/extra/extra.h"
Include dependency graph for extraUtilPrime.c:

Go to the source code of this file.

Classes

struct  Tab_Man_t_
 
struct  Tab_Ent_t_
 

Macros

#define ABC_PRIME_MASK   0xFF
 
#define TAB_UNUSED   0xFFFF
 
#define Tab_ManForEachCube(p, pCube, c)
 
#define Tab_ManForEachCubeReverse(p, pCube, c)
 

Typedefs

typedef struct Tab_Ent_t_ Tab_Ent_t
 

Functions

ABC_NAMESPACE_IMPL_START void Abc_GenCountDump (Vec_Int_t *vPrimes, int nVars, char *pFileName)
 DECLARATIONS ///.
 
void Abc_GenCountHits1 (Vec_Bit_t *vMap, Vec_Int_t *vPrimes, int nVars)
 
Vec_Int_tAbc_GenPrimes (int nVars)
 
void Abc_GenPrimesTest ()
 
Tab_Man_tTab_ManAlloc (int nVars, int nCubes)
 
void Tab_ManFree (Tab_Man_t *p)
 
void Tab_ManStart (Tab_Man_t *p, Vec_Int_t *vCubes)
 
int Tab_ManCubeFree (int *pCube1, int *pCube2, Vec_Int_t *vCubeFree)
 
int Tab_ManCheckEqual2 (int *pCube1, int *pCube2, int Var1, int Var2)
 
int Tab_ManCheckEqual (int *pCube1, int *pCube2, int Var1, int Var2)
 
int Tab_ManCountItems (Tab_Man_t *p, int Dist2, Vec_Int_t **pvStarts)
 
Vec_Int_tTab_ManCollectDist1 (Tab_Man_t *p, int Dist2)
 
void Tab_DecomposeTest ()
 

Macro Definition Documentation

◆ ABC_PRIME_MASK

#define ABC_PRIME_MASK   0xFF

Definition at line 128 of file extraUtilPrime.c.

◆ Tab_ManForEachCube

#define Tab_ManForEachCube ( p,
pCube,
c )
Value:
for ( c = 0; c < p->nCubes && (pCube = Tab_ManCube(p, c)); c++ ) \
if ( pCube[0] == -1 ) {} else
Cube * p
Definition exorList.c:222

Definition at line 280 of file extraUtilPrime.c.

280#define Tab_ManForEachCube( p, pCube, c ) \
281 for ( c = 0; c < p->nCubes && (pCube = Tab_ManCube(p, c)); c++ ) \
282 if ( pCube[0] == -1 ) {} else

◆ Tab_ManForEachCubeReverse

#define Tab_ManForEachCubeReverse ( p,
pCube,
c )
Value:
for ( c = p->nCubes - 1; c >= 0 && (pCube = Tab_ManCube(p, c)); c-- ) \
if ( pCube[0] == -1 ) {} else

Definition at line 284 of file extraUtilPrime.c.

284#define Tab_ManForEachCubeReverse( p, pCube, c ) \
285 for ( c = p->nCubes - 1; c >= 0 && (pCube = Tab_ManCube(p, c)); c-- ) \
286 if ( pCube[0] == -1 ) {} else

◆ TAB_UNUSED

#define TAB_UNUSED   0xFFFF

Definition at line 167 of file extraUtilPrime.c.

Typedef Documentation

◆ Tab_Ent_t

typedef struct Tab_Ent_t_ Tab_Ent_t

Definition at line 170 of file extraUtilPrime.c.

Function Documentation

◆ Abc_GenCountDump()

ABC_NAMESPACE_IMPL_START void Abc_GenCountDump ( Vec_Int_t * vPrimes,
int nVars,
char * pFileName )

DECLARATIONS ///.

CFile****************************************************************

FileName [extraUtilPrime.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [extra]

Synopsis [Function enumeration.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
extraUtilPrime.c,v 1.0 2003/02/01 00:00:00 alanmi Exp

] FUNCTION DEFINITIONS /// Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 51 of file extraUtilPrime.c.

52{
53 FILE * pFile;
54 int i, k, Prime;
55 pFile = fopen( pFileName, "wb" );
56 fprintf( pFile, "# %d prime numbers up to 2^%d generated by ABC on %s\n", Vec_IntSize(vPrimes), nVars, Extra_TimeStamp() );
57 fprintf( pFile, ".i %d\n", nVars );
58 fprintf( pFile, ".o %d\n", 1 );
59 fprintf( pFile, ".p %d\n", Vec_IntSize(vPrimes) );
60 Vec_IntForEachEntry( vPrimes, Prime, i )
61 for ( k = nVars-1; k >= 0; k-- )
62 fprintf( pFile, "%d%s", (Prime >> k)&1, k ? "" : " 1\n" );
63 fprintf( pFile, ".e\n\n" );
64 fclose( pFile );
65}
char * Extra_TimeStamp()
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Abc_GenCountHits1()

void Abc_GenCountHits1 ( Vec_Bit_t * vMap,
Vec_Int_t * vPrimes,
int nVars )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 78 of file extraUtilPrime.c.

79{
80 abctime clk = Abc_Clock();
81 int i, k, Prime, Count = 0;
82 Vec_IntForEachEntry( vPrimes, Prime, i )
83 {
84 for ( k = 0; k < nVars; k++ )
85 if ( !Vec_BitEntry(vMap, Prime ^ (1<<k)) )
86 {
87 //printf( "%3d : %2d %2d flipped bit %d\n", Count, Prime, Prime ^ (1<<k), k );
88 Count++;
89 }
90 }
91 printf( "Dist1 pairs = %d. ", Count/2 );
92 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
93}
ABC_INT64_T abctime
Definition abc_global.h:332
Here is the caller graph for this function:

◆ Abc_GenPrimes()

Vec_Int_t * Abc_GenPrimes ( int nVars)

Definition at line 94 of file extraUtilPrime.c.

95{
96 int i, n, nBits = ( 1 << nVars );
97 Vec_Bit_t * vMap = Vec_BitStart( nBits );
98 Vec_Int_t * vPrimes = Vec_IntAlloc( 1000 );
99 Vec_BitWriteEntry(vMap, 0, 1);
100 Vec_BitWriteEntry(vMap, 1, 1);
101 for ( n = 2; n < nBits; n++ )
102 if ( !Vec_BitEntry(vMap, n) )
103 for ( i = 2*n; i < nBits; i += n )
104 Vec_BitWriteEntry(vMap, i, 1);
105 for ( n = 2; n < nBits; n++ )
106 if ( !Vec_BitEntry(vMap, n) )
107 Vec_IntPush( vPrimes, n );
108 printf( "Primes up to 2^%d = %d\n", nVars, Vec_IntSize(vPrimes) );
109 Abc_GenCountHits1( vMap, vPrimes, nVars );
110 Vec_BitFree( vMap );
111 return vPrimes;
112}
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
void Abc_GenCountHits1(Vec_Bit_t *vMap, Vec_Int_t *vPrimes, int nVars)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Abc_GenPrimesTest()

void Abc_GenPrimesTest ( )

Definition at line 113 of file extraUtilPrime.c.

114{
115 // 54,400,028 primes up to 2^30 can be computed in 22 sec
116 int nVars = 18;
117 Vec_Int_t * vPrimes = Abc_GenPrimes( nVars );
118 Abc_GenCountDump( vPrimes, nVars, "primes18.pla" );
119 //Vec_IntPrint( vPrimes );
120 printf( "Primes up to 2^%d = %d\n", nVars, Vec_IntSize(vPrimes) );
121
122 Vec_IntFree( vPrimes );
123}
Vec_Int_t * Abc_GenPrimes(int nVars)
ABC_NAMESPACE_IMPL_START void Abc_GenCountDump(Vec_Int_t *vPrimes, int nVars, char *pFileName)
DECLARATIONS ///.
Here is the call graph for this function:

◆ Tab_DecomposeTest()

void Tab_DecomposeTest ( )

Function*************************************************************

Synopsis [Table decomposition.]

Description []

SideEffects []

SeeAlso []

Definition at line 578 of file extraUtilPrime.c.

579{
580 int nVars = 20;// no more than 13
581 abctime clk = Abc_Clock();
582 Vec_Int_t * vPairs;
583 Vec_Int_t * vPrimes = Abc_GenPrimes( nVars );
584 Tab_Man_t * p = Tab_ManAlloc( nVars, Vec_IntSize(vPrimes) );
585 Tab_ManStart( p, vPrimes );
586 printf( "Created %d cubes dependent on %d variables.\n", p->nCubes, p->nVars );
587 vPairs = Tab_ManCollectDist1( p, 0 );
588 printf( "Collected %d pairs.\n", Vec_IntSize(vPairs)/2 );
589 Vec_IntFree( vPairs );
590 Tab_ManFree( p );
591 Vec_IntFree( vPrimes );
592 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
593}
void Tab_ManStart(Tab_Man_t *p, Vec_Int_t *vCubes)
void Tab_ManFree(Tab_Man_t *p)
Tab_Man_t * Tab_ManAlloc(int nVars, int nCubes)
Vec_Int_t * Tab_ManCollectDist1(Tab_Man_t *p, int Dist2)
struct Tab_Man_t_ Tab_Man_t
Definition plaHash.c:80
Here is the call graph for this function:

◆ Tab_ManAlloc()

Tab_Man_t * Tab_ManAlloc ( int nVars,
int nCubes )

Function*************************************************************

Synopsis [Manager manipulation.]

Description []

SideEffects []

SeeAlso []

Definition at line 300 of file extraUtilPrime.c.

301{
303 p->nVars = nVars;
304 p->nCubes = nCubes;
305 p->Degree = Abc_Base2Log((p->nVars + 1) * p->nCubes + 1) + 3;
306 p->Mask = (1 << p->Degree) - 1;
307 //p->nEnts = 1;
308 p->pCubes = ABC_CALLOC( int, p->nCubes * (p->nVars + 1) );
309 p->pValues = ABC_CALLOC( word, p->nCubes );
310// p->pTable = ABC_CALLOC( Tab_Ent_t, (p->Mask + 1) );
311 printf( "Allocated %.2f MB for cube structure.\n", 4.0 * p->nCubes * (p->nVars + 2) / (1 << 20) );
312 return p;
313}
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
Here is the caller graph for this function:

◆ Tab_ManCheckEqual()

int Tab_ManCheckEqual ( int * pCube1,
int * pCube2,
int Var1,
int Var2 )

Definition at line 397 of file extraUtilPrime.c.

398{
399 int Cube1[32], Cube2[32];
400 int i, k, nVars1, nVars2;
401 assert( pCube1[0] <= 32 );
402 assert( pCube2[0] <= 32 );
403 for ( i = 1, k = 0; i <= pCube1[0]; i++ )
404 if ( i != Var1 )
405 Cube1[k++] = pCube1[i];
406 nVars1 = k;
407 for ( i = 1, k = 0; i <= pCube2[0]; i++ )
408 if ( i != Var2 )
409 Cube2[k++] = pCube2[i];
410 nVars2 = k;
411 if ( nVars1 != nVars2 )
412 return 0;
413 for ( i = 0; i < nVars1; i++ )
414 if ( Cube1[i] != Cube2[i] )
415 return 0;
416 return 1;
417}
#define assert(ex)
Definition util_old.h:213
@ Var1
Definition xsatSolver.h:56
Here is the caller graph for this function:

◆ Tab_ManCheckEqual2()

int Tab_ManCheckEqual2 ( int * pCube1,
int * pCube2,
int Var1,
int Var2 )

Definition at line 382 of file extraUtilPrime.c.

383{
384 int i1, i2;
385 for ( i1 = i2 = 1; ; i1++, i2++ )
386 {
387 if ( i1 == Var1 ) i1++;
388 if ( i2 == Var2 ) i2++;
389 if ( i1 > pCube1[0] || i2 > pCube2[0] )
390 return 0;
391 if ( pCube1[i1] != pCube2[i2] )
392 return 0;
393 if ( i1 == pCube1[0] && i2 == pCube2[0] )
394 return 1;
395 }
396}

◆ Tab_ManCollectDist1()

Vec_Int_t * Tab_ManCollectDist1 ( Tab_Man_t * p,
int Dist2 )

Definition at line 446 of file extraUtilPrime.c.

447{
448 Vec_Int_t * vStarts = NULL; // starting mark for each cube
449 int nItems = Tab_ManCountItems( p, Dist2, &vStarts ); // item count
450 int nBits = Abc_Base2Log( nItems ) + 6; // hash table size
451 Vec_Bit_t * vPres = Vec_BitStart( 1 << nBits ); // hash table
452 Vec_Bit_t * vMarks = Vec_BitStart( nItems ); // collisions
453 Vec_Int_t * vUseful = Vec_IntAlloc( 1000 ); // useful pairs
454 Vec_Int_t * vBin = Vec_IntAlloc( 100 );
455 Vec_Int_t * vCubeFree = Vec_IntAlloc( 100 );
456 word Value; unsigned Mask = (1 << nBits) - 1;
457 int * pCube, c, a, b, nMarks = 0, nUseful, Entry1, Entry2;
458 // iterate forward
459 Tab_ManForEachCube( p, pCube, c )
460 {
461 // cube
462 if ( Vec_BitAddEntry(vPres, (int)p->pValues[c] & Mask) )
463 Vec_BitWriteEntry( vMarks, nMarks, 1 );
464 nMarks++;
465 // dist1
466 for ( a = 1; a <= pCube[0]; a++, nMarks++ )
467 if ( Vec_BitAddEntry(vPres, (int)(p->pValues[c] - Tab_ManValue(p, pCube[a])) & Mask) )
468 Vec_BitWriteEntry( vMarks, nMarks, 1 );
469 // dist2
470 if ( Dist2 )
471 for ( a = 1; a <= pCube[0]; a++ )
472 {
473 Value = p->pValues[c] - Tab_ManValue(p, pCube[a]);
474 for ( b = a + 1; b <= pCube[0]; b++, nMarks++ )
475 if ( Vec_BitAddEntry(vPres, (int)(Value - Tab_ManValue(p, pCube[b])) & Mask) )
476 Vec_BitWriteEntry( vMarks, nMarks, 1 );
477 }
478 }
479 assert( nMarks == nItems );
480 Vec_BitReset( vPres );
481 // iterate backward
482 nMarks--;
483 Tab_ManForEachCubeReverse( p, pCube, c )
484 {
485 Value = p->pValues[c];
486 // dist2
487 if ( Dist2 )
488 for ( a = pCube[0]; a >= 1; a-- )
489 {
490 Value = p->pValues[c] - Tab_ManValue(p, pCube[a]);
491 for ( b = pCube[0]; b >= a + 1; b--, nMarks-- )
492 if ( Vec_BitAddEntry(vPres, (int)(Value - Tab_ManValue(p, pCube[b])) & Mask) )
493 Vec_BitWriteEntry( vMarks, nMarks, 1 );
494 }
495 // dist1
496 for ( a = pCube[0]; a >= 1; a--, nMarks-- )
497 if ( Vec_BitAddEntry(vPres, (int)(p->pValues[c] - Tab_ManValue(p, pCube[a])) & Mask) )
498 Vec_BitWriteEntry( vMarks, nMarks, 1 );
499 // cube
500 if ( Vec_BitAddEntry(vPres, (int)p->pValues[c] & Mask) )
501 Vec_BitWriteEntry( vMarks, nMarks, 1 );
502 nMarks--;
503 }
504 nMarks++;
505 assert( nMarks == 0 );
506 Vec_BitFree( vPres );
507 // count useful
508 nUseful = Vec_BitCount( vMarks );
509printf( "Items = %d. Bits = %d. Useful = %d. \n", nItems, nBits, nUseful );
510
511 // add to the hash table
512 p->nTable = Abc_PrimeCudd(nUseful);
513 p->pTable = ABC_FALLOC( Tab_Ent_t, p->nTable );
514printf( "Table %d\n", p->nTable );
515 Tab_ManForEachCube( p, pCube, c )
516 {
517 // cube
518 if ( Vec_BitEntry(vMarks, nMarks++) )
519 Tab_ManHashAdd( p, (int)(p->pValues[c] % p->nTable), c, TAB_UNUSED, TAB_UNUSED );
520 // dist1
521 for ( a = 1; a <= pCube[0]; a++, nMarks++ )
522 if ( Vec_BitEntry(vMarks, nMarks) )
523 Tab_ManHashAdd( p, (int)((p->pValues[c] - Tab_ManValue(p, pCube[a])) % p->nTable), c, a-1, TAB_UNUSED );
524 // dist2
525 if ( Dist2 )
526 for ( a = 1; a <= pCube[0]; a++ )
527 {
528 Value = p->pValues[c] - Tab_ManValue(p, pCube[a]);
529 for ( b = a + 1; b <= pCube[0]; b++, nMarks++ )
530 if ( Vec_BitEntry(vMarks, nMarks) )
531 Tab_ManHashAdd( p, (int)((Value - Tab_ManValue(p, pCube[b])) % p->nTable), c, a-1, b-1 );
532 }
533 }
534 assert( nMarks == nItems );
535 // collect entries
536 for ( c = 0; c < p->nTable; c++ )
537 {
538 Tab_ManHashCollectBin( p, c, vBin );
539 //printf( "%d ", Vec_IntSize(vBin) );
540 //if ( c > 100 )
541 // break;
542 Vec_IntForEachEntry( vBin, Entry1, a )
543 Vec_IntForEachEntryStart( vBin, Entry2, b, a + 1 )
544 {
545 Tab_Ent_t * pEntA = Tab_ManEnt( p, Entry1 );
546 Tab_Ent_t * pEntB = Tab_ManEnt( p, Entry2 );
547 int * pCubeA = Tab_ManCube( p, pEntA->Cube );
548 int * pCubeB = Tab_ManCube( p, pEntB->Cube );
549// int Base = Tab_ManCubeFree( pCubeA, pCubeB, vCubeFree );
550// if ( Vec_IntSize(vCubeFree) == 2 )
551 if ( Tab_ManCheckEqual(pCubeA, pCubeB, pEntA->VarA+1, pEntB->VarA+1) )
552 {
553 Vec_IntPushTwo( vUseful, pEntA->Cube, pEntB->Cube );
554 }
555 }
556
557 }
558 //printf( "\n" );
559
560 ABC_FREE( p->pTable );
561 Vec_IntFree( vCubeFree );
562 Vec_IntFree( vBin );
563 Vec_BitFree( vMarks );
564 return vUseful;
565}
#define ABC_FALLOC(type, num)
Definition abc_global.h:266
#define ABC_FREE(obj)
Definition abc_global.h:267
struct Tab_Ent_t_ Tab_Ent_t
int Tab_ManCountItems(Tab_Man_t *p, int Dist2, Vec_Int_t **pvStarts)
#define TAB_UNUSED
#define Tab_ManForEachCubeReverse(p, pCube, c)
#define Tab_ManForEachCube(p, pCube, c)
int Tab_ManCheckEqual(int *pCube1, int *pCube2, int Var1, int Var2)
unsigned VarA
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
Definition vecInt.h:56
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Tab_ManCountItems()

int Tab_ManCountItems ( Tab_Man_t * p,
int Dist2,
Vec_Int_t ** pvStarts )

Function*************************************************************

Synopsis [Collecting distance-1 pairs.]

Description []

SideEffects []

SeeAlso []

Definition at line 430 of file extraUtilPrime.c.

431{
432 Vec_Int_t * vStarts = Vec_IntAlloc( p->nCubes );
433 int * pCube, c, Count = 0;
434 Tab_ManForEachCube( p, pCube, c )
435 {
436 Vec_IntPush( vStarts, Count );
437 Count += 1 + pCube[0];
438 if ( Dist2 )
439 Count += pCube[0] * pCube[0] / 2;
440 }
441 assert( Vec_IntSize(vStarts) == p->nCubes );
442 if ( pvStarts )
443 *pvStarts = vStarts;
444 return Count;
445}
Here is the caller graph for this function:

◆ Tab_ManCubeFree()

int Tab_ManCubeFree ( int * pCube1,
int * pCube2,
Vec_Int_t * vCubeFree )

Function*************************************************************

Synopsis [Find a cube-free divisor of the two cubes.]

Description []

SideEffects []

SeeAlso []

Definition at line 348 of file extraUtilPrime.c.

349{
350 int * pBeg1 = pCube1 + 1; // skip variable ID
351 int * pBeg2 = pCube2 + 1; // skip variable ID
352 int * pEnd1 = pBeg1 + pCube1[0];
353 int * pEnd2 = pBeg2 + pCube2[0];
354 int Counter = 0, fAttr0 = 0, fAttr1 = 1;
355 Vec_IntClear( vCubeFree );
356 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
357 {
358 if ( *pBeg1 == *pBeg2 )
359 pBeg1++, pBeg2++, Counter++;
360 else if ( *pBeg1 < *pBeg2 )
361 Vec_IntPush( vCubeFree, Abc_Var2Lit(*pBeg1++, fAttr0) );
362 else
363 {
364 if ( Vec_IntSize(vCubeFree) == 0 )
365 fAttr0 = 1, fAttr1 = 0;
366 Vec_IntPush( vCubeFree, Abc_Var2Lit(*pBeg2++, fAttr1) );
367 }
368 }
369 while ( pBeg1 < pEnd1 )
370 Vec_IntPush( vCubeFree, Abc_Var2Lit(*pBeg1++, fAttr0) );
371 while ( pBeg2 < pEnd2 )
372 Vec_IntPush( vCubeFree, Abc_Var2Lit(*pBeg2++, fAttr1) );
373 if ( Vec_IntSize(vCubeFree) == 0 )
374 printf( "The SOP has duplicated cubes.\n" );
375 else if ( Vec_IntSize(vCubeFree) == 1 )
376 printf( "The SOP has contained cubes.\n" );
377// else if ( Vec_IntSize(vCubeFree) == 2 && Abc_Lit2Var(Abc_Lit2Var(Vec_IntEntry(vCubeFree, 0))) == Abc_Lit2Var(Abc_Lit2Var(Vec_IntEntry(vCubeFree, 1))) )
378// printf( "The SOP has distance-1 cubes or it is not a prime cover. Please make sure the result verifies.\n" );
379 assert( !Abc_LitIsCompl(Vec_IntEntry(vCubeFree, 0)) );
380 return Counter;
381}

◆ Tab_ManFree()

void Tab_ManFree ( Tab_Man_t * p)

Definition at line 314 of file extraUtilPrime.c.

315{
316 ABC_FREE( p->pCubes );
317 ABC_FREE( p->pValues );
318 ABC_FREE( p->pTable );
319 ABC_FREE( p );
320}
Here is the caller graph for this function:

◆ Tab_ManStart()

void Tab_ManStart ( Tab_Man_t * p,
Vec_Int_t * vCubes )

Definition at line 321 of file extraUtilPrime.c.

322{
323 int * pCube, Cube, c, v;
324 p->nLits = 0;
325 Tab_ManForEachCube( p, pCube, c )
326 {
327 Cube = Vec_IntEntry( vCubes, c );
328 pCube[0] = p->nVars;
329 for ( v = 0; v < p->nVars; v++ )
330 pCube[v+1] = Abc_Var2Lit( v, !((Cube >> v) & 1) );
331 p->pValues[c] = Tab_ManHashValue( p, pCube );
332 p->nLits += pCube[0];
333 }
334}
struct cube Cube
Here is the caller graph for this function: