49static inline Npn_Obj_t * Npn_ManObj(
Npn_Man_t *
p,
int i ) {
assert( i < p->nBufferSize );
return i ?
p->pBuffer + i : NULL; }
52static word Truth[8] = {
83 char * pTemp = Abc_UtilStrsav(pStr);
88 printf(
"%03d: %s\n", count++, pTemp );
91 for ( i = mid; i <= end; i++ )
94 pTemp[mid] = pTemp[i];
100 pTemp[mid] = pTemp[i];
117static inline int Npn_TruthHasVar(
word t,
int v )
119 return ((t & Truth[v]) >> (1<<v)) != (t & ~Truth[v]);
133static inline int Npn_TruthSupport(
word t )
136 for ( v = 0; v < 6; v++ )
137 if ( Npn_TruthHasVar( t, v ) )
153static inline int Npn_TruthSuppSize(
word t,
int nVars )
157 for ( v = 0; v < nVars; v++ )
158 if ( Npn_TruthHasVar( t, v ) )
174static inline int Npn_TruthIsMinBase(
word t )
176 int Supp = Npn_TruthSupport(t);
177 return (Supp & (Supp+1)) == 0;
196 uTruth = ((uTruth &
ABC_CONST(0x00000000FFFFFFFF)) << 32) | (uTruth &
ABC_CONST(0x00000000FFFFFFFF));
198 uTruth = ((uTruth &
ABC_CONST(0x0000FFFF0000FFFF)) << 16) | (uTruth &
ABC_CONST(0x0000FFFF0000FFFF));
200 uTruth = ((uTruth &
ABC_CONST(0x00FF00FF00FF00FF)) << 8) | (uTruth &
ABC_CONST(0x00FF00FF00FF00FF));
202 uTruth = ((uTruth &
ABC_CONST(0x0F0F0F0F0F0F0F0F)) << 4) | (uTruth &
ABC_CONST(0x0F0F0F0F0F0F0F0F));
204 uTruth = ((uTruth &
ABC_CONST(0x3333333333333333)) << 2) | (uTruth &
ABC_CONST(0x3333333333333333));
206 uTruth = ((uTruth &
ABC_CONST(0x5555555555555555)) << 1) | (uTruth &
ABC_CONST(0x5555555555555555));
221static inline int Npn_TruthCountOnes(
word t )
228 return (t &
ABC_CONST(0x00000000FFFFFFFF)) + (t>>32);
242static inline word Npn_TruthChangePhase(
word t,
int v )
244 return ((t & Truth[v]) >> (1<<v)) | ((t & ~Truth[v]) << (1<<v));
258static inline word Npn_TruthSwapAdjacentVars(
word t,
int v )
260 static word PMasks[5][3] = {
268 return (t & PMasks[v][0]) | ((t & PMasks[v][1]) << (1 << v)) | ((t & PMasks[v][2]) >> (1 << v));
282static inline word Npn_TruthCanon(
word t,
int nVars,
int * pPhase )
284 int fUsePolarity = 0;
285 int fUsePermutation = 0;
286 char Temp, pSigs[13], pCanonPerm[6];
287 int v, fChange, CanonPhase = 0;
289 pSigs[12] = Npn_TruthCountOnes( t );
290 if ( pSigs[12] > 32 )
293 pSigs[12] = 64 - pSigs[12];
294 CanonPhase |= (1 << 6);
296 if ( fUsePolarity || fUsePermutation )
298 for ( v = 0; v < nVars; v++ )
301 pSigs[2*v+1] = Npn_TruthCountOnes( t & Truth[v] );
302 pSigs[2*v] = pSigs[12] - pSigs[2*v+1];
307 for ( v = 0; v < nVars; v++ )
309 if ( pSigs[2*v] >= pSigs[2*v+1] )
311 CanonPhase |= (1 << v);
313 pSigs[2*v] = pSigs[2*v+1];
315 t = Npn_TruthChangePhase( t, v );
318 if ( fUsePermutation )
322 for ( v = 0; v < nVars-1; v++ )
326 if ( pSigs[2*v] >= pSigs[2*(v+1)] )
331 if ( Abc_MinInt(pSigs[2*v],pSigs[2*v+1]) >= Abc_MinInt(pSigs[2*(v+1)],pSigs[2*(v+1)+1]) )
336 Temp = pCanonPerm[v];
337 pCanonPerm[v] = pCanonPerm[v+1];
338 pCanonPerm[v+1] = Temp;
341 pSigs[2*v] = pSigs[2*(v+1)];
342 pSigs[2*(v+1)] = Temp;
345 pSigs[2*v+1] = pSigs[2*(v+1)+1];
346 pSigs[2*(v+1)+1] = Temp;
348 t = Npn_TruthSwapAdjacentVars( t, v );
355 for ( v = 0; v < nVars; v++ )
356 *pPhase |= (pCanonPerm[v] << (4 * v));
357 *pPhase |= (CanonPhase << 24);
376 word Key = (uTruth * (
word)101) ^ (uTruth * (
word)733) ^ (uTruth * (
word)1777);
377 return (
int)(Key % (
word)
p->nBins);
394 int * pBinsOld, * ppPlace;
395 int nBinsOld, Counter, i;
403 p->nBins = Abc_PrimeCudd( 3 * nBinsOld );
407 for ( i = 0; i < nBinsOld; i++ )
408 for ( pEntry = Npn_ManObj(
p, pBinsOld[i]),
409 pNext = pEntry ? Npn_ManObj(
p, pEntry->iNext) : NULL;
412 pNext = pEntry ? Npn_ManObj(
p, pEntry->iNext) : NULL )
415 ppPlace =
p->pBins + Npn_ManHash(
p, pEntry->uTruth );
417 pEntry->iNext = *ppPlace;
418 *ppPlace = Npn_ManObjNum(
p, pEntry );
421 assert( Counter ==
p->nEntries );
440 int * pPlace, Key = Npn_ManHash(
p, uTruth );
442 if (
p->nEntries ==
p->nBufferSize )
448 for ( pEntry = Npn_ManObj(
p,
p->pBins[Key]),
449 pPlace =
p->pBins + Key;
451 pPlace = &pEntry->iNext,
452 pEntry = Npn_ManObj(
p, pEntry->iNext) )
453 if ( pEntry->uTruth == uTruth )
459 *pPlace =
p->nEntries;
460 assert(
p->nEntries <
p->nBufferSize );
461 pEntry = Npn_ManObj(
p,
p->nEntries++ );
462 pEntry->uTruth = uTruth;
466 if (
p->nEntries > 3 *
p->nBins )
489 FILE * pFile = fopen( pFileName,
"r" );
492 Abc_Print( -1,
"Cannot open NPN function file \"%s\".\n", pFileName );
496 while ( fgets( pBuffer, 1000, pFile ) != NULL )
498 pToken =
strtok( pBuffer,
" \t\n" );
499 if ( pToken == NULL )
501 if ( pToken[0] ==
'#' )
503 if (
strlen(pToken) != 16 )
505 Abc_Print( 0,
"Skipping token %s that does not look like a 16-digit hex number.\n" );
510 uTruth = (((
word)Truth[1]) << 32) | (
word)Truth[0];
513 assert( pEntry->Count == 1 );
515 pToken =
strtok( NULL,
" \t\n" );
516 pEntry->Count = atoi(pToken);
534 if ( (*pp1)->Count > (*pp2)->Count )
536 if ( (*pp1)->Count < (*pp2)->Count )
556 FILE * pFile = fopen( pFileName,
"w" );
560 Abc_Print( -1,
"Cannot open NPN function file \"%s\".\n", pFileName );
563 vEntries = Vec_PtrAlloc(
p->nEntries );
564 for ( i = 0; i <
p->nBins; i++ )
565 for ( pEntry = Npn_ManObj(
p,
p->pBins[i]); pEntry; pEntry = Npn_ManObj(
p, pEntry->iNext) )
566 Vec_PtrPush( vEntries, pEntry );
567 Vec_PtrSort( vEntries, (
int (*)(
const void *,
const void *))Npn_ManCompareEntries );
571 fprintf( pFile,
" %d %d\n", pEntry->Count, Npn_TruthSuppSize(pEntry->uTruth, 6) );
574 Vec_PtrFree( vEntries );
592 if ( pFileName == NULL )
594 p->nBufferSize = 1000000;
595 p->nBufferSize = 100;
597 p->nBins = Abc_PrimeCudd(
p->nBufferSize / 2 );
603 FILE * pFile = fopen( pFileName,
"r" );
606 Abc_Print( -1,
"Cannot open NPN function file \"%s\".\n", pFileName );
612 p->nBins = Abc_PrimeCudd(
p->nBufferSize / 2 );
651 if ( pNpnMan != NULL )
672 if ( pNpnMan != NULL )
674 Abc_Print( 1,
"Removing old table with %d entries.\n", pNpnMan->nEntries );
678 Abc_Print( 1,
"Created new table with %d entries from file \"%s\".\n", pNpnMan->nEntries, pFileName );
694 if ( pNpnMan == NULL )
696 Abc_Print( 1,
"There is no table with entries.\n" );
700 Abc_Print( 1,
"Dumped table with %d entries from file \"%s\".\n", pNpnMan->nEntries, pFileName );
716 word uTruth = (((
word)puTruth[1]) << 32) | (
word)puTruth[0];
717 assert( nVars >= 0 && nVars <= 6 );
718 if ( pNpnMan == NULL )
720 Abc_Print( 1,
"Creating new table with 0 entries.\n" );
724 if ( !Npn_TruthIsMinBase( uTruth ) )
729 uTruth = Npn_TruthCanon( uTruth, 6, NULL );
void Npn_ManRead(Npn_Man_t *p, char *pFileName)
void Npn_TruthPermute_rec(char *pStr, int mid, int end)
FUNCTION DEFINITIONS ///.
void Npn_ManSave(char *pFileName)
void Npn_ManSaveOne(unsigned *puTruth, int nVars)
Npn_Obj_t * Npn_ManAdd(Npn_Man_t *p, word uTruth)
struct Npn_Man_t_ Npn_Man_t
word Npn_TruthPadWord(word uTruth, int nVars)
void Npn_ManLoad(char *pFileName)
void Npn_ManWrite(Npn_Man_t *p, char *pFileName)
void Npn_ManResize(Npn_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Npn_Obj_t_ Npn_Obj_t
DECLARATIONS ///.
void Npn_ManStop(Npn_Man_t *p)
Npn_Man_t * Npn_ManStart(char *pFileName)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, 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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.