/**Function************************************************************* Synopsis [Resizes the table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_TableResize( Map_Man_t * pMan ) { Map_Node_t ** pBinsNew; Map_Node_t * pEnt, * pEnt2; int nBinsNew, Counter, i, clk; unsigned Key; clk = clock(); // get the new table size nBinsNew = Cudd_Prime(2 * pMan->nBins); // allocate a new array pBinsNew = ALLOC( Map_Node_t *, nBinsNew ); memset( pBinsNew, 0, sizeof(Map_Node_t *) * nBinsNew ); // rehash the entries from the old table Counter = 0; for ( i = 0; i < pMan->nBins; i++ ) for ( pEnt = pMan->pBins[i], pEnt2 = pEnt? pEnt->pNext: NULL; pEnt; pEnt = pEnt2, pEnt2 = pEnt? pEnt->pNext: NULL ) { Key = Map_HashKey2( pEnt->p1, pEnt->p2, nBinsNew ); pEnt->pNext = pBinsNew[Key]; pBinsNew[Key] = pEnt; Counter++; } assert( Counter == pMan->nNodes - pMan->nInputs ); if ( pMan->fVerbose ) { // printf( "Increasing the unique table size from %6d to %6d. ", pMan->nBins, nBinsNew ); // PRT( "Time", clock() - clk ); } // replace the table and the parameters free( pMan->pBins ); pMan->pBins = pBinsNew; pMan->nBins = nBinsNew; }
/**Function************************************************************* Synopsis [Looks up the AND2 node in the unique table.] Description [This procedure implements one-level hashing. All the nodes are hashed by their children. If the node with the same children was already created, it is returned by the call to this procedure. If it does not exist, this procedure creates a new node with these children. ] SideEffects [] SeeAlso [] ***********************************************************************/ Map_Node_t * Map_TableLookup( Map_Man_t * pMan, Map_Node_t * p1, Map_Node_t * p2 ) { Map_Node_t * pEnt; unsigned Key; if ( p1 == p2 ) return p1; if ( p1 == Map_Not(p2) ) return Map_Not(pMan->pConst1); if ( Map_NodeIsConst(p1) ) { if ( p1 == pMan->pConst1 ) return p2; return Map_Not(pMan->pConst1); } if ( Map_NodeIsConst(p2) ) { if ( p2 == pMan->pConst1 ) return p1; return Map_Not(pMan->pConst1); } if ( Map_Regular(p1)->Num > Map_Regular(p2)->Num ) pEnt = p1, p1 = p2, p2 = pEnt; Key = Map_HashKey2( p1, p2, pMan->nBins ); for ( pEnt = pMan->pBins[Key]; pEnt; pEnt = pEnt->pNext ) if ( pEnt->p1 == p1 && pEnt->p2 == p2 ) return pEnt; // resize the table if ( pMan->nNodes >= 2 * pMan->nBins ) { Map_TableResize( pMan ); Key = Map_HashKey2( p1, p2, pMan->nBins ); } // create the new node pEnt = Map_NodeCreate( pMan, p1, p2 ); // add the node to the corresponding linked list in the table pEnt->pNext = pMan->pBins[Key]; pMan->pBins[Key] = pEnt; return pEnt; }