33#define RMAN_MAXVARS 12
34#define RMAX_MAXWORD (RMAN_MAXVARS <= 5 ? 1 : (1 << (RMAN_MAXVARS - 5)))
101 static Bdc_Par_t Pars = {0}, * pPars = &Pars;
109 p->nBins = Abc_PrimeCudd(5000);
113 pPars->nVarsMax =
p->nVars;
130static inline int Aig_RManTableHash(
unsigned * pTruth,
int nVars,
int nBins,
int * pPrimes )
132 int i,
nWords = Kit_TruthWordNum( nVars );
134 for ( i = 0; i <
nWords; i++ )
135 uHash ^= pTruth[i] * pPrimes[i & 0xf];
136 return (
int)(uHash % nBins);
152 static int s_Primes[16] = {
153 1291, 1699, 1999, 2357, 2953, 3313, 3907, 4177,
154 4831, 5147, 5647, 6343, 6899, 7103, 7873, 8147 };
156 ppSpot =
p->pBins + Aig_RManTableHash( pTruth, nVars,
p->nBins, s_Primes );
157 for ( pEntry = *ppSpot; pEntry; ppSpot = &pEntry->
pNext, pEntry = pEntry->
pNext )
158 if ( Kit_TruthIsEqual( pEntry->
pTruth, pTruth, nVars ) )
178 int nBinsOld, Counter, i;
186 p->nBins = Abc_PrimeCudd( 3 * nBinsOld );
190 for ( i = 0; i < nBinsOld; i++ )
191 for ( pEntry = pBinsOld[i], pNext = pEntry? pEntry->
pNext : NULL;
192 pEntry; pEntry = pNext, pNext = pEntry? pEntry->
pNext : NULL )
196 assert( *ppPlace == NULL );
199 pEntry->
pNext = NULL;
202 assert( Counter ==
p->nEntries );
225 (*ppSpot)->nVisits++;
228 nBytes =
sizeof(
Aig_Tru_t) +
sizeof(
unsigned) * Kit_TruthWordNum(nVars);
229 if (
p->nEntries == 3*
p->nBins )
232 pEntry->
Id =
p->nEntries++;
233 pEntry->
nVars = nVars;
235 pEntry->
pNext = NULL;
236 memcpy( pEntry->
pTruth, pTruth,
sizeof(
unsigned) * Kit_TruthWordNum(nVars) );
255 printf(
"Total funcs = %10d\n",
p->nTotal );
256 printf(
"Full DSD funcs = %10d\n",
p->nTtDsd );
257 printf(
"Part DSD funcs = %10d\n",
p->nTtDsdPart );
258 printf(
"Non- DSD funcs = %10d\n",
p->nTtDsdNot );
259 printf(
"Uniq-var funcs = %10d\n",
p->nUniqueVars );
260 printf(
"Unique funcs = %10d\n",
p->nEntries );
261 printf(
"Distribution of functions:\n" );
262 for ( i = 5; i <=
p->nVars; i++ )
263 printf(
"%2d = %8d\n", i,
p->nVarFuncs[i] );
287 if ( s_pRMan == NULL )
290 sprintf( Buffer,
"aiglib%02d.aig", s_pRMan->nVars );
313 for ( i = 0; i < nVars; i++ )
314 printf(
"%2d/%2d ", pStore2[2*i], pStore2[2*i+1] );
331 int i, j, best_i, tmp;
332 for ( i = 0; i < nVars-1; i++ )
335 for ( j = i+1; j < nVars; j++ )
336 if ( pArray[j] > pArray[best_i] )
338 tmp = pArray[i]; pArray[i] = pArray[best_i]; pArray[best_i] = tmp;
356 for ( v = 0; v < nVars; v++ )
358 printf(
"%2d : ", v );
359 for ( k = 0; k < 2; k++ )
361 printf(
"%5d ", pSigs[2*v+k].nOnes );
363 for ( i = 0; i < nVars; i++ )
364 printf(
"%4d ", pSigs[2*v+k].nCofOnes[i] );
385 for ( v = 0; v < nVars; v++ )
388 pSigs[2*v+0].
nOnes = Kit_TruthCountOnes( pAux, nVars );
393 pSigs[2*v+1].
nOnes = Kit_TruthCountOnes( pAux, nVars );
413 return memcmp( p0, p1,
sizeof(
int) );
430 for ( i = 0; i < nVars - 1; i++ )
431 if ( Aig_RManCompareSigs( &pMints[2*i], &pMints[2*(i+1)], nVars ) == 0 )
450 for ( i = 0; i < nVars; i++ )
451 if ( Aig_RManCompareSigs( &pMints[2*i], &pMints[2*i+1], nVars ) == 0 )
458 for ( i = 1; i < nVars; i++ )
459 if ( Aig_RManCompareSigs( &pMints[2*(i-1)], &pMints[2*i], nVars ) == 0 )
462 printf(
"%c",
'0' + i );
464 printf(
"%c",
'A' + i-10 );
482 int i, Temp, fChange, Counter;
483 unsigned * pTemp, uCanonPhase = 0;
487 for ( i = 0; i < nVars; i++ )
490 if ( Aig_RManCompareSigs( &pSigs[2*i+0], &pSigs[2*i+1], nVars ) <= 0 )
492 uCanonPhase |= (1 << i);
493 TempSig = pSigs[2*i+0];
494 pSigs[2*i+0] = pSigs[2*i+1];
495 pSigs[2*i+1] = TempSig;
502 for ( i = 0; i < nVars-1; i++ )
505 if ( Aig_RManCompareSigs( &pSigs[2*i], &pSigs[2*(i+1)], nVars ) <= 0 )
510 Temp = pCanonPerm[i];
511 pCanonPerm[i] = pCanonPerm[i+1];
512 pCanonPerm[i+1] = Temp;
514 TempSig = pSigs[2*i];
515 pSigs[2*i] = pSigs[2*(i+1)];
516 pSigs[2*(i+1)] = TempSig;
518 TempSig = pSigs[2*i+1];
519 pSigs[2*i+1] = pSigs[2*(i+1)+1];
520 pSigs[2*(i+1)+1] = TempSig;
523 pTemp = pIn; pIn = pOut; pOut = pTemp;
528 if ( fReturnIn ^ !(Counter & 1) )
529 Kit_TruthCopy( pOut, pIn, nVars );
560 int i, nNodes, RetValue;
567 printf(
"Decomposition failed.\n" );
572 for ( i = 0; i < nVars; i++ )
575 for ( i = nVars + 1; i < nNodes; i++ )
609 printf(
"The number of variables in too large.\n" );
613 if ( s_pRMan == NULL )
619 if ( pObj == NULL || pObj->
nFans == 3 )
626 s_pRMan->nVarFuncs[nVars]++;
627 if ( nVars < nVarsInit )
628 s_pRMan->nTtDsdPart++;
630 s_pRMan->nTtDsdNot++;
632 nWords = Abc_TruthWordNum( nVars );
634 memcpy( s_pRMan->pTruthInit, Kit_DsdObjTruth(pObj), (
size_t)(4*
nWords) );
637 if ( s_pRMan->pTruthInit[0] & 1 )
638 Kit_TruthNot( s_pRMan->pTruthInit, s_pRMan->pTruthInit, nVars );
639 memcpy( s_pRMan->pTruth, s_pRMan->pTruthInit, 4*
nWords );
642 for ( i = 0; i < nVars; i++ )
643 s_pRMan->pPerm[i] = i;
644 uPhaseC =
Aig_RManSemiCanonicize( s_pRMan->pTruthTemp, s_pRMan->pTruth, nVars, s_pRMan->pPerm, s_pRMan->pMints, 1 );
647 s_pRMan->nUniqueVars += fUniqueVars;
678 for ( i = 0; i < nVars; i++ )
679 s_pRMan->pPermR[i] = s_pRMan->pPerm[i];
681 Kit_TruthPermute( s_pRMan->pTruthTemp, s_pRMan->pTruth, nVars, s_pRMan->pPermR, 1 );
683 for ( i = 0; i < nVars; i++ )
684 if ( uPhaseC & (1 << i) )
688 if ( fUniqueVars && !Kit_TruthIsEqual( s_pRMan->pTruth, s_pRMan->pTruthInit, nVars ) )
689 printf(
"Verification failed.\n" );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_RManTableResize(Aig_RMan_t *p)
int Aig_RManTableFindOrAdd(Aig_RMan_t *p, unsigned *pTruth, int nVars)
Aig_Tru_t ** Aig_RManTableLookup(Aig_RMan_t *p, unsigned *pTruth, int nVars)
unsigned Aig_RManSemiCanonicize(unsigned *pOut, unsigned *pIn, int nVars, char *pCanonPerm, Aig_VSig_t *pSigs, int fReturnIn)
#define RMAN_MAXVARS
DECLARATIONS ///.
Aig_RMan_t * Aig_RManStart()
FUNCTION DEFINITIONS ///.
void Aig_RManPrintSigs(Aig_VSig_t *pSigs, int nVars)
struct Aig_RMan_t_ Aig_RMan_t
void Aig_RManSaveOne(Aig_RMan_t *p, unsigned *pTruth, int nVars)
void Aig_RManSortNums(int *pArray, int nVars)
struct Aig_VSig_t_ Aig_VSig_t
void Aig_RManRecord(unsigned *pTruth, int nVarsInit)
void Aig_RManPrintUniqueVars(Aig_VSig_t *pMints, int nVars)
int Aig_RManVarsAreUnique(Aig_VSig_t *pMints, int nVars)
void Aig_RManPrintVarProfile(unsigned *pTruth, int nVars, unsigned *pTruthAux)
struct Aig_Tru_t_ Aig_Tru_t
void Aig_RManComputeVSigs(unsigned *pTruth, int nVars, Aig_VSig_t *pSigs, unsigned *pAux)
void Aig_RManStop(Aig_RMan_t *p)
void Aig_MmFlexStop(Aig_MmFlex_t *p, int fVerbose)
char * Aig_MmFlexEntryFetch(Aig_MmFlex_t *p, int nBytes)
void Aig_ManStop(Aig_Man_t *p)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
struct Aig_MmFlex_t_ Aig_MmFlex_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Aig_MmFlex_t * Aig_MmFlexStart()
Aig_Obj_t * Aig_IthVar(Aig_Man_t *p, int i)
FUNCTION DEFINITIONS ///.
int Bdc_ManNodeNum(Bdc_Man_t *p)
Bdc_Fun_t * Bdc_FuncFanin0(Bdc_Fun_t *p)
Bdc_Fun_t * Bdc_ManRoot(Bdc_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Bdc_Fun_t_ Bdc_Fun_t
INCLUDES ///.
struct Bdc_Par_t_ Bdc_Par_t
void Bdc_FuncSetCopy(Bdc_Fun_t *p, void *pCopy)
struct Bdc_Man_t_ Bdc_Man_t
Bdc_Fun_t * Bdc_FuncFanin1(Bdc_Fun_t *p)
void * Bdc_FuncCopy(Bdc_Fun_t *p)
void Bdc_ManFree(Bdc_Man_t *p)
int Bdc_ManDecompose(Bdc_Man_t *p, unsigned *puFunc, unsigned *puCare, int nVars, Vec_Ptr_t *vDivs, int nNodesMax)
Bdc_Fun_t * Bdc_ManFunc(Bdc_Man_t *p, int i)
DECLARATIONS ///.
Bdc_Man_t * Bdc_ManAlloc(Bdc_Par_t *pPars)
MACRO DEFINITIONS ///.
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
Kit_DsdNtk_t * Kit_DsdDecompose(unsigned *pTruth, int nVars)
void Kit_TruthSwapAdjacentVars(unsigned *pOut, unsigned *pIn, int nVars, int Start)
DECLARATIONS ///.
void Kit_TruthCofactor1New(unsigned *pOut, unsigned *pIn, int nVars, int iVar)
void Kit_TruthChangePhase(unsigned *pTruth, int nVars, int iVar)
void Kit_TruthCofactor0New(unsigned *pOut, unsigned *pIn, int nVars, int iVar)
void Kit_DsdNtkFree(Kit_DsdNtk_t *pNtk)
struct Kit_DsdObj_t_ Kit_DsdObj_t
void Kit_TruthCountOnesInCofsSlow(unsigned *pTruth, int nVars, int *pStore, unsigned *pAux)
struct Kit_DsdNtk_t_ Kit_DsdNtk_t
void Kit_TruthCountOnesInCofs0(unsigned *pTruth, int nVars, int *pStore)
void Kit_TruthPermute(unsigned *pOut, unsigned *pIn, int nVars, char *pPerm, int fReturnIn)
Kit_DsdObj_t * Kit_DsdNonDsdPrimeMax(Kit_DsdNtk_t *pNtk)
char pPermR[RMAN_MAXVARS]
Aig_VSig_t pMints[2 *RMAN_MAXVARS]
int nVarFuncs[RMAN_MAXVARS+1]
unsigned pTruthTemp[RMAX_MAXWORD]
unsigned pTruthInit[RMAX_MAXWORD]
unsigned pTruthC[RMAX_MAXWORD]
unsigned pTruth[RMAX_MAXWORD]
int nCofOnes[RMAN_MAXVARS]