73static inline unsigned Tru_ManHash(
word * pTruth,
int nWords,
int nBins,
int * pPrimes )
77 for ( i = 0; i <
nWords; i++ )
78 uHash ^= pTruth[i] * pPrimes[i & 0x7];
95 static int s_Primes[10] = { 1291, 1699, 2357, 4177, 5147, 5647, 6343, 7103, 7873, 8147 };
98 assert( (pTruth[0] & 1) == 0 );
99 pSpot =
p->pTable + Tru_ManHash( pTruth,
p->nWords,
p->nTableSize, s_Primes );
100 for ( pEntry = Tru_ManReadOne(
p, *pSpot); pEntry; pSpot = &pEntry->
Next, pEntry = Tru_ManReadOne(
p, *pSpot) )
101 if ( Tru_ManEqual(pEntry->
pTruth, pTruth,
p->nWords) )
120 int * pTableOld, * pSpot;
121 int nTableSizeOld, iNext, Counter, i;
124 pTableOld =
p->pTable;
125 nTableSizeOld =
p->nTableSize;
126 p->nTableSize = 2 *
p->nTableSize + 1;
130 for ( i = 0; i < nTableSizeOld; i++ )
131 for ( pThis = Tru_ManReadOne(
p, pTableOld[i]),
132 iNext = (pThis? pThis->
Next : 0);
133 pThis; pThis = Tru_ManReadOne(
p, iNext),
134 iNext = (pThis? pThis->
Next : 0) )
143 assert( Counter == Vec_SetEntryNum(
p->pMem) );
161 if ( Tru_ManEqual0(pTruth,
p->nWords) )
163 if ( Tru_ManEqual1(pTruth,
p->nWords) )
166 if ( Vec_SetEntryNum(
p->pMem) > 2 *
p->nTableSize )
168 fCompl = pTruth[0] & 1;
170 Tru_ManNot( pTruth,
p->nWords );
175 *pSpot = Vec_SetAppend(
p->pMem, NULL,
p->nEntrySize );
176 assert( (*pSpot & 1) == 0 );
177 pEntry = Tru_ManReadOne(
p, *pSpot );
178 Tru_ManCopy( pEntry->
pTruth, pTruth,
p->nWords );
183 Tru_ManNot( pTruth,
p->nWords );
184 return *pSpot ^ fCompl;
211 assert( nVars > 0 && nVars <= 16 );
214 p->nWords = (nVars < 6) ? 1 : (1 << (nVars-6));
215 p->nEntrySize = (
sizeof(
Tru_One_t) +
p->nWords *
sizeof(
word))/
sizeof(
int);
216 p->nTableSize = 8147;
218 p->pMem = Vec_SetAlloc( 16 );
221 for ( i = 0; i < nVars; i++ )
223 for ( w = 0; w <
p->nWords; w++ )
225 p->pZero[w] = Masks[i];
226 else if ( w & (1 << (i-6)) )
227 p->pZero[w] = ~(
word)0;
231 assert( !i ||
p->hIthVars[i] >
p->hIthVars[i-1] );
233 Tru_ManClear(
p->pZero,
p->nWords );
250 printf(
"Lookups = %d. Entries = %d.\n",
p->nTableLookups, Vec_SetEntryNum(
p->pMem) );
251 Vec_SetFree(
p->pMem );
270 assert( v >= 0 && v < p->nVars );
271 return Tru_ManReadOne(
p,
p->hIthVars[v] )->pTruth;
290 return Tru_ManReadOne(
p, h )->pTruth;
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
unsigned __int64 word
DECLARATIONS ///.
Tru_Man_t * Tru_ManAlloc(int nVars)
FUNCTION DECLARATIONS ///.
word * Tru_ManVar(Tru_Man_t *p, int v)
int * Tru_ManLookup(Tru_Man_t *p, word *pTruth)
int Tru_ManInsert(Tru_Man_t *p, word *pTruth)
void Tru_ManResize(Tru_Man_t *p)
struct Tru_One_t_ Tru_One_t
word * Tru_ManFunc(Tru_Man_t *p, int h)
void Tru_ManFree(Tru_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Tru_Man_t_ Tru_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Set_t_ Vec_Set_t
INCLUDES ///.