/**CFile**************************************************************** FileName [bdcTable.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Truth-table-based bi-decomposition engine.] Synopsis [Hash table for intermediate nodes.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - January 30, 2007.] Revision [$Id: bdcTable.c,v 1.00 2007/01/30 00:00:00 alanmi Exp $] ***********************************************************************/ #include "bdcInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Checks containment of the function in the ISF.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Bdc_TableCheckContainment( Bdc_Man_t * p, Bdc_Isf_t * pIsf, unsigned * puTruth ) { return Kit_TruthIsImply( pIsf->puOn, puTruth, p->nVars ) && Kit_TruthIsDisjoint( puTruth, pIsf->puOff, p->nVars ); } /**Function************************************************************* Synopsis [Adds the new entry to the hash table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Bdc_Fun_t * Bdc_TableLookup( Bdc_Man_t * p, Bdc_Isf_t * pIsf ) { int fDisableCache = 0; Bdc_Fun_t * pFunc; if ( fDisableCache && Kit_WordCountOnes(pIsf->uSupp) > 1 ) return NULL; if ( pIsf->uSupp == 0 ) { assert( p->pTable[pIsf->uSupp] == p->pNodes ); if ( Kit_TruthIsConst1( pIsf->puOn, p->nVars ) ) return p->pNodes; assert( Kit_TruthIsConst1( pIsf->puOff, p->nVars ) ); return Bdc_Not(p->pNodes); } for ( pFunc = p->pTable[pIsf->uSupp]; pFunc; pFunc = pFunc->pNext ) if ( Bdc_TableCheckContainment( p, pIsf, pFunc->puFunc ) ) return pFunc; Bdc_IsfNot( pIsf ); for ( pFunc = p->pTable[pIsf->uSupp]; pFunc; pFunc = pFunc->pNext ) if ( Bdc_TableCheckContainment( p, pIsf, pFunc->puFunc ) ) { Bdc_IsfNot( pIsf ); return Bdc_Not(pFunc); } Bdc_IsfNot( pIsf ); return NULL; } /**Function************************************************************* Synopsis [Adds the new entry to the hash table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Bdc_TableAdd( Bdc_Man_t * p, Bdc_Fun_t * pFunc ) { if ( p->pTable[pFunc->uSupp] == NULL ) Vec_IntPush( p->vSpots, pFunc->uSupp ); pFunc->pNext = p->pTable[pFunc->uSupp]; p->pTable[pFunc->uSupp] = pFunc; } /**Function************************************************************* Synopsis [Adds the new entry to the hash table.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Bdc_TableClear( Bdc_Man_t * p ) { int Spot, i; Vec_IntForEachEntry( p->vSpots, Spot, i ) p->pTable[Spot] = NULL; Vec_IntClear( p->vSpots ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END