diff options
Diffstat (limited to 'src/sat/bsat/satTruth.c')
-rw-r--r-- | src/sat/bsat/satTruth.c | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/src/sat/bsat/satTruth.c b/src/sat/bsat/satTruth.c new file mode 100644 index 00000000..7d69f558 --- /dev/null +++ b/src/sat/bsat/satTruth.c @@ -0,0 +1,315 @@ +/**CFile**************************************************************** + + FileName [satTruth.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [SAT solver.] + + Synopsis [Truth table computation package.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: satTruth.c,v 1.4 2005/09/16 22:55:03 casem Exp $] + +***********************************************************************/ + +#include "satTruth.h" +#include "vecRec.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +struct Tru_Man_t_ +{ + int nVars; // the number of variables + int nWords; // the number of words in the truth table + int nEntrySize; // the size of one entry in 'int' + int nTableSize; // hash table size + int * pTable; // hash table + Vec_Rec_t * pMem; // memory for truth tables + word * pZero; // temporary truth table + int hIthVars[16]; // variable handles + int nTableLookups; +}; + +typedef struct Tru_One_t_ Tru_One_t; // 16 bytes minimum +struct Tru_One_t_ +{ + int Handle; // support + int Next; // next one in the table + word pTruth[0]; // truth table +}; + +static inline Tru_One_t * Tru_ManReadOne( Tru_Man_t * p, int h ) { return h ? (Tru_One_t *)Vec_RecEntryP(p->pMem, h) : NULL; } + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Returns the hash key.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline unsigned Tru_ManHash( word * pTruth, int nWords, int nBins, int * pPrimes ) +{ + int i; + unsigned uHash = 0; + for ( i = 0; i < nWords; i++ ) + uHash ^= pTruth[i] * pPrimes[i & 0x7]; + return uHash % nBins; +} + +/**Function************************************************************* + + Synopsis [Returns the given record.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int * Tru_ManLookup( Tru_Man_t * p, word * pTruth ) +{ + static int s_Primes[10] = { 1291, 1699, 2357, 4177, 5147, 5647, 6343, 7103, 7873, 8147 }; + Tru_One_t * pEntry; + int * pSpot; + assert( (pTruth[0] & 1) == 0 ); + pSpot = p->pTable + Tru_ManHash( pTruth, p->nWords, p->nTableSize, s_Primes ); + for ( pEntry = Tru_ManReadOne(p, *pSpot); pEntry; pSpot = &pEntry->Next, pEntry = Tru_ManReadOne(p, *pSpot) ) + if ( Tru_ManEqual(pEntry->pTruth, pTruth, p->nWords) ) + return pSpot; + return pSpot; +} + +/**Function************************************************************* + + Synopsis [Returns the given record.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tru_ManResize( Tru_Man_t * p ) +{ + Tru_One_t * pThis; + int * pTableOld, * pSpot; + int nTableSizeOld, iNext, Counter, i; + assert( p->pTable != NULL ); + // replace the table + pTableOld = p->pTable; + nTableSizeOld = p->nTableSize; + p->nTableSize = 2 * p->nTableSize + 1; + p->pTable = ABC_CALLOC( int, p->nTableSize ); + // rehash the entries from the old table + Counter = 0; + for ( i = 0; i < nTableSizeOld; i++ ) + for ( pThis = Tru_ManReadOne(p, pTableOld[i]), + iNext = (pThis? pThis->Next : 0); + pThis; pThis = Tru_ManReadOne(p, iNext), + iNext = (pThis? pThis->Next : 0) ) + { + assert( pThis->Handle ); + pThis->Next = 0; + pSpot = Tru_ManLookup( p, pThis->pTruth ); + assert( *pSpot == 0 ); // should not be there + *pSpot = pThis->Handle; + Counter++; + } + assert( Counter == Vec_RecEntryNum(p->pMem) ); + ABC_FREE( pTableOld ); +} + +/**Function************************************************************* + + Synopsis [Adds entry to the hash table.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tru_ManInsert( Tru_Man_t * p, word * pTruth ) +{ + int fCompl, * pSpot; + if ( Tru_ManEqual0(pTruth, p->nWords) ) + return 0; + if ( Tru_ManEqual1(pTruth, p->nWords) ) + return 1; + p->nTableLookups++; + if ( Vec_RecEntryNum(p->pMem) > 2 * p->nTableSize ) + Tru_ManResize( p ); + fCompl = pTruth[0] & 1; + if ( fCompl ) + Tru_ManNot( pTruth, p->nWords ); + pSpot = Tru_ManLookup( p, pTruth ); + if ( *pSpot == 0 ) + { + Tru_One_t * pEntry; + *pSpot = Vec_RecAppend( p->pMem, p->nEntrySize ); + assert( (*pSpot & 1) == 0 ); + pEntry = Tru_ManReadOne( p, *pSpot ); + Tru_ManCopy( pEntry->pTruth, pTruth, p->nWords ); + pEntry->Handle = *pSpot; + pEntry->Next = 0; + } + if ( fCompl ) + Tru_ManNot( pTruth, p->nWords ); + return *pSpot ^ fCompl; +} + +/**Function************************************************************* + + Synopsis [Start the truth table logging.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Tru_Man_t * Tru_ManAlloc( int nVars ) +{ + word Masks[6] = + { + 0xAAAAAAAAAAAAAAAA, + 0xCCCCCCCCCCCCCCCC, + 0xF0F0F0F0F0F0F0F0, + 0xFF00FF00FF00FF00, + 0xFFFF0000FFFF0000, + 0xFFFFFFFF00000000 + }; + Tru_Man_t * p; + int i, w; + assert( nVars > 0 && nVars <= 16 ); + p = ABC_CALLOC( Tru_Man_t, 1 ); + p->nVars = nVars; + p->nWords = (nVars < 6) ? 1 : (1 << (nVars-6)); + p->nEntrySize = (sizeof(Tru_One_t) + p->nWords * sizeof(word))/sizeof(int); + p->nTableSize = 8147; + p->pTable = ABC_CALLOC( int, p->nTableSize ); + p->pMem = Vec_RecAlloc(); + // initialize truth tables + p->pZero = ABC_ALLOC( word, p->nWords ); + for ( i = 0; i < nVars; i++ ) + { + for ( w = 0; w < p->nWords; w++ ) + if ( i < 6 ) + p->pZero[w] = Masks[i]; + else if ( w & (1 << (i-6)) ) + p->pZero[w] = ~(word)0; + else + p->pZero[w] = 0; + p->hIthVars[i] = Tru_ManInsert( p, p->pZero ); + assert( !i || p->hIthVars[i] > p->hIthVars[i-1] ); + } + Tru_ManClear( p->pZero, p->nWords ); + return p; +} + +/**Function************************************************************* + + Synopsis [Stop the truth table logging.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tru_ManFree( Tru_Man_t * p ) +{ + printf( "Lookups = %d. Entries = %d.\n", p->nTableLookups, Vec_RecEntryNum(p->pMem) ); + Vec_RecFree( p->pMem ); + ABC_FREE( p->pZero ); + ABC_FREE( p->pTable ); + ABC_FREE( p ); +} + +/**Function************************************************************* + + Synopsis [Returns elementary variable.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +word * Tru_ManVar( Tru_Man_t * p, int v ) +{ + assert( v >= 0 && v < p->nVars ); + return Tru_ManReadOne( p, p->hIthVars[v] )->pTruth; +} + +/**Function************************************************************* + + Synopsis [Returns stored truth table] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +word * Tru_ManFunc( Tru_Man_t * p, int h ) +{ + assert( (h & 1) == 0 ); + if ( h == 0 ) + return p->pZero; + assert( Vec_RecChunk(h) ); + return Tru_ManReadOne( p, h )->pTruth; +} + +/**Function************************************************************* + + Synopsis [Returns stored truth table] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Tru_ManHandleMax( Tru_Man_t * p ) +{ + return p->pMem->hCurrent; +} +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |