46static int Dsd_CheckRootFunctionIdentity_rec( DdManager * dd, DdNode * bF1, DdNode * bF2, DdNode * bC1, DdNode * bC2 );
71 nRequested = Abc_PrimeCudd( nEntries );
72 if ( pCache->nTableSize != nRequested )
75 if ( pCache->nTableSize )
78 pCache->nTableSize = nRequested;
117 for ( i = 0; i < pCache->nTableSize; i++ )
118 pCache->pTable[0].bX[0] = NULL;
138 RetValue = Dsd_CheckRootFunctionIdentity_rec(dd, bF1, bF2, bC1, bC2);
154int Dsd_CheckRootFunctionIdentity_rec( DdManager * dd, DdNode * bF1, DdNode * bF2, DdNode * bC1, DdNode * bC2 )
164 if ( bC1 ==
b1 && bC2 ==
b1 )
return (
int)( bF1 == bF2 );
167 return Cudd_bddLeq( dd, bC2, Cudd_Not(bF2) );
170 return Cudd_bddLeq( dd, bC2, bF2 );
173 return Cudd_bddLeq( dd, bC1, Cudd_Not(bF1) );
176 return Cudd_bddLeq( dd, bC1, bF1 );
182 HKey =
hashKey4( bF1, bF2, bC1, bC2, pCache->nTableSize );
183 if ( pCache->pTable[HKey].bX[0] == bF1 &&
184 pCache->pTable[HKey].bX[1] == bF2 &&
185 pCache->pTable[HKey].bX[2] == bC1 &&
186 pCache->pTable[HKey].bX[3] == bC2 )
189 return (
int)(ABC_PTRUINT_T)pCache->pTable[HKey].bX[4];
196 DdNode * bA[4] = { bF1, bF2, bC1, bC2 };
197 DdNode * bAR[4] = { Cudd_Regular(bF1), Cudd_Regular(bF2), Cudd_Regular(bC1), Cudd_Regular(bC2) };
198 int CurLevel[4] = { cuddI(dd,bAR[0]->index), cuddI(dd,bAR[1]->index), cuddI(dd,bAR[2]->index), cuddI(dd,bAR[3]->index) };
199 int TopLevel = CUDD_CONST_INDEX;
201 DdNode * bE[4], * bT[4];
202 DdNode * bF1next, * bF2next, * bC1next, * bC2next;
207 for ( i = 0; i < 4; i++ )
208 if ( TopLevel > CurLevel[i] )
209 TopLevel = CurLevel[i];
212 for ( i = 0; i < 4; i++ )
213 if ( TopLevel == CurLevel[i] )
215 if ( bA[i] != bAR[i] )
217 bE[i] = Cudd_Not(cuddE(bAR[i]));
218 bT[i] = Cudd_Not(cuddT(bAR[i]));
222 bE[i] = cuddE(bAR[i]);
223 bT[i] = cuddT(bAR[i]);
227 bE[i] = bT[i] = bA[i];
235 if ( TopLevel == CurLevel[2] && TopLevel == CurLevel[3] )
257 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bF1next, bF2next, bC1next, bC2next );
261 else if ( TopLevel == CurLevel[2] && TopLevel != CurLevel[3] )
274 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bF1next, bE[1], bC1next, bE[3] );
276 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bF1next, bT[1], bC1next, bT[3] );
278 else if ( TopLevel != CurLevel[2] && TopLevel == CurLevel[3] )
291 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bE[0], bF2next, bE[2], bC2next );
293 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bT[0], bF2next, bT[2], bC2next );
300 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bE[0], bE[1], bE[2], bE[3] );
302 RetValue = Dsd_CheckRootFunctionIdentity_rec( dd, bT[0], bT[1], bT[2], bT[3] );
306 for ( i = 0; i < 4; i++ )
307 pCache->pTable[HKey].bX[i] = bA[i];
308 pCache->pTable[HKey].bX[4] = (DdNode*)(ABC_PTRUINT_T)RetValue;
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Dsd_CheckCacheDeallocate()
int Dsd_CheckRootFunctionIdentity(DdManager *dd, DdNode *bF1, DdNode *bF2, DdNode *bC1, DdNode *bC2)
void Dsd_CheckCacheAllocate(int nEntries)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Dsd_Cache_t_ Dds_Cache_t
DECLARATIONS ///.
void Dsd_CheckCacheClear()
struct Dsd_Entry_t_ Dsd_Entry_t