abc-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
satTruth.c File Reference
#include "satTruth.h"
#include "misc/vec/vecSet.h"

Go to the source code of this file.

Data Structures

struct  Tru_Man_t_
 DECLARATIONS ///. More...
 
struct  Tru_One_t_
 

Typedefs

typedef struct Tru_One_t_ Tru_One_t
 

Functions

static Tru_One_tTru_ManReadOne (Tru_Man_t *p, int h)
 
static unsigned Tru_ManHash (word *pTruth, int nWords, int nBins, int *pPrimes)
 FUNCTION DEFINITIONS ///. More...
 
int * Tru_ManLookup (Tru_Man_t *p, word *pTruth)
 
void Tru_ManResize (Tru_Man_t *p)
 
int Tru_ManInsert (Tru_Man_t *p, word *pTruth)
 
Tru_Man_tTru_ManAlloc (int nVars)
 FUNCTION DECLARATIONS ///. More...
 
void Tru_ManFree (Tru_Man_t *p)
 
wordTru_ManVar (Tru_Man_t *p, int v)
 
wordTru_ManFunc (Tru_Man_t *p, int h)
 

Typedef Documentation

typedef struct Tru_One_t_ Tru_One_t

Definition at line 48 of file satTruth.c.

Function Documentation

Tru_Man_t* Tru_ManAlloc ( int  nVars)

FUNCTION DECLARATIONS ///.

Function*************************************************************

Synopsis [Start the truth table logging.]

Description []

SideEffects []

SeeAlso []

Definition at line 198 of file satTruth.c.

199 {
200  word Masks[6] =
201  {
202  ABC_CONST(0xAAAAAAAAAAAAAAAA),
203  ABC_CONST(0xCCCCCCCCCCCCCCCC),
204  ABC_CONST(0xF0F0F0F0F0F0F0F0),
205  ABC_CONST(0xFF00FF00FF00FF00),
206  ABC_CONST(0xFFFF0000FFFF0000),
207  ABC_CONST(0xFFFFFFFF00000000)
208  };
209  Tru_Man_t * p;
210  int i, w;
211  assert( nVars > 0 && nVars <= 16 );
212  p = ABC_CALLOC( Tru_Man_t, 1 );
213  p->nVars = nVars;
214  p->nWords = (nVars < 6) ? 1 : (1 << (nVars-6));
215  p->nEntrySize = (sizeof(Tru_One_t) + p->nWords * sizeof(word))/sizeof(int);
216  p->nTableSize = 8147;
217  p->pTable = ABC_CALLOC( int, p->nTableSize );
218  p->pMem = Vec_SetAlloc( 16 );
219  // initialize truth tables
220  p->pZero = ABC_ALLOC( word, p->nWords );
221  for ( i = 0; i < nVars; i++ )
222  {
223  for ( w = 0; w < p->nWords; w++ )
224  if ( i < 6 )
225  p->pZero[w] = Masks[i];
226  else if ( w & (1 << (i-6)) )
227  p->pZero[w] = ~(word)0;
228  else
229  p->pZero[w] = 0;
230  p->hIthVars[i] = Tru_ManInsert( p, p->pZero );
231  assert( !i || p->hIthVars[i] > p->hIthVars[i-1] );
232  }
233  Tru_ManClear( p->pZero, p->nWords );
234  return p;
235 }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
static Vec_Set_t * Vec_SetAlloc(int nPageSize)
Definition: vecSet.h:128
#define ABC_ALLOC(type, num)
Definition: abc_global.h:229
struct Tru_One_t_ Tru_One_t
Definition: satTruth.c:48
unsigned __int64 word
DECLARATIONS ///.
Definition: kitPerm.c:36
typedefABC_NAMESPACE_HEADER_START struct Tru_Man_t_ Tru_Man_t
INCLUDES ///.
Definition: satTruth.h:44
int Tru_ManInsert(Tru_Man_t *p, word *pTruth)
Definition: satTruth.c:158
static word * Tru_ManClear(word *pOut, int nWords)
Definition: satTruth.h:58
#define ABC_CONST(number)
PARAMETERS ///.
Definition: abc_global.h:206
#define ABC_CALLOC(type, num)
Definition: abc_global.h:230
#define assert(ex)
Definition: util_old.h:213
void Tru_ManFree ( Tru_Man_t p)

Function*************************************************************

Synopsis [Stop the truth table logging.]

Description []

SideEffects []

SeeAlso []

Definition at line 248 of file satTruth.c.

249 {
250  printf( "Lookups = %d. Entries = %d.\n", p->nTableLookups, Vec_SetEntryNum(p->pMem) );
251  Vec_SetFree( p->pMem );
252  ABC_FREE( p->pZero );
253  ABC_FREE( p->pTable );
254  ABC_FREE( p );
255 }
static void Vec_SetFree(Vec_Set_t *p)
Definition: vecSet.h:176
static Llb_Mgr_t * p
Definition: llb3Image.c:950
static int Vec_SetEntryNum(Vec_Set_t *p)
Definition: vecSet.h:71
#define ABC_FREE(obj)
Definition: abc_global.h:232
word* Tru_ManFunc ( Tru_Man_t p,
int  h 
)

Function*************************************************************

Synopsis [Returns stored truth table]

Description []

SideEffects []

SeeAlso []

Definition at line 285 of file satTruth.c.

286 {
287  assert( (h & 1) == 0 );
288  if ( h == 0 )
289  return p->pZero;
290  return Tru_ManReadOne( p, h )->pTruth;
291 }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
word pTruth[0]
Definition: satTruth.c:53
static Tru_One_t * Tru_ManReadOne(Tru_Man_t *p, int h)
Definition: satTruth.c:56
#define assert(ex)
Definition: util_old.h:213
static unsigned Tru_ManHash ( word pTruth,
int  nWords,
int  nBins,
int *  pPrimes 
)
inlinestatic

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis [Returns the hash key.]

Description []

SideEffects []

SeeAlso []

Definition at line 73 of file satTruth.c.

74 {
75  int i;
76  unsigned uHash = 0;
77  for ( i = 0; i < nWords; i++ )
78  uHash ^= pTruth[i] * pPrimes[i & 0x7];
79  return uHash % nBins;
80 }
int nWords
Definition: abcNpn.c:127
int Tru_ManInsert ( Tru_Man_t p,
word pTruth 
)

Function*************************************************************

Synopsis [Adds entry to the hash table.]

Description []

SideEffects []

SeeAlso []

Definition at line 158 of file satTruth.c.

159 {
160  int fCompl, * pSpot;
161  if ( Tru_ManEqual0(pTruth, p->nWords) )
162  return 0;
163  if ( Tru_ManEqual1(pTruth, p->nWords) )
164  return 1;
165  p->nTableLookups++;
166  if ( Vec_SetEntryNum(p->pMem) > 2 * p->nTableSize )
167  Tru_ManResize( p );
168  fCompl = pTruth[0] & 1;
169  if ( fCompl )
170  Tru_ManNot( pTruth, p->nWords );
171  pSpot = Tru_ManLookup( p, pTruth );
172  if ( *pSpot == 0 )
173  {
174  Tru_One_t * pEntry;
175  *pSpot = Vec_SetAppend( p->pMem, NULL, p->nEntrySize );
176  assert( (*pSpot & 1) == 0 );
177  pEntry = Tru_ManReadOne( p, *pSpot );
178  Tru_ManCopy( pEntry->pTruth, pTruth, p->nWords );
179  pEntry->Handle = *pSpot;
180  pEntry->Next = 0;
181  }
182  if ( fCompl )
183  Tru_ManNot( pTruth, p->nWords );
184  return *pSpot ^ fCompl;
185 }
static word * Tru_ManNot(word *pOut, int nWords)
Definition: satTruth.h:60
static Llb_Mgr_t * p
Definition: llb3Image.c:950
void Tru_ManResize(Tru_Man_t *p)
Definition: satTruth.c:117
static int Vec_SetAppend(Vec_Set_t *p, int *pArray, int nSize)
Definition: vecSet.h:213
word pTruth[0]
Definition: satTruth.c:53
static int Vec_SetEntryNum(Vec_Set_t *p)
Definition: vecSet.h:71
static int Tru_ManEqual0(word *pOut, int nWords)
Definition: satTruth.h:55
static Tru_One_t * Tru_ManReadOne(Tru_Man_t *p, int h)
Definition: satTruth.c:56
int * Tru_ManLookup(Tru_Man_t *p, word *pTruth)
Definition: satTruth.c:93
static word * Tru_ManCopy(word *pOut, word *pIn, int nWords)
Definition: satTruth.h:57
static int Tru_ManEqual1(word *pOut, int nWords)
Definition: satTruth.h:56
int Next
Definition: satTruth.c:52
int Handle
Definition: satTruth.c:51
#define assert(ex)
Definition: util_old.h:213
int* Tru_ManLookup ( Tru_Man_t p,
word pTruth 
)

Function*************************************************************

Synopsis [Returns the given record.]

Description []

SideEffects []

SeeAlso []

Definition at line 93 of file satTruth.c.

94 {
95  static int s_Primes[10] = { 1291, 1699, 2357, 4177, 5147, 5647, 6343, 7103, 7873, 8147 };
96  Tru_One_t * pEntry;
97  int * pSpot;
98  assert( (pTruth[0] & 1) == 0 );
99  pSpot = p->pTable + Tru_ManHash( pTruth, p->nWords, p->nTableSize, s_Primes );
100  for ( pEntry = Tru_ManReadOne(p, *pSpot); pEntry; pSpot = &pEntry->Next, pEntry = Tru_ManReadOne(p, *pSpot) )
101  if ( Tru_ManEqual(pEntry->pTruth, pTruth, p->nWords) )
102  return pSpot;
103  return pSpot;
104 }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
word pTruth[0]
Definition: satTruth.c:53
static int s_Primes[MAX_PRIMES]
Definition: fxuPair.c:30
static Tru_One_t * Tru_ManReadOne(Tru_Man_t *p, int h)
Definition: satTruth.c:56
static unsigned Tru_ManHash(word *pTruth, int nWords, int nBins, int *pPrimes)
FUNCTION DEFINITIONS ///.
Definition: satTruth.c:73
int Next
Definition: satTruth.c:52
#define assert(ex)
Definition: util_old.h:213
static int Tru_ManEqual(word *pOut, word *pIn, int nWords)
GLOBAL VARIABLES ///.
Definition: satTruth.h:54
static Tru_One_t* Tru_ManReadOne ( Tru_Man_t p,
int  h 
)
inlinestatic

Definition at line 56 of file satTruth.c.

56 { return h ? (Tru_One_t *)Vec_SetEntry(p->pMem, h) : NULL; }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
static word * Vec_SetEntry(Vec_Set_t *p, int h)
Definition: vecSet.h:70
void Tru_ManResize ( Tru_Man_t p)

Function*************************************************************

Synopsis [Returns the given record.]

Description []

SideEffects []

SeeAlso []

Definition at line 117 of file satTruth.c.

118 {
119  Tru_One_t * pThis;
120  int * pTableOld, * pSpot;
121  int nTableSizeOld, iNext, Counter, i;
122  assert( p->pTable != NULL );
123  // replace the table
124  pTableOld = p->pTable;
125  nTableSizeOld = p->nTableSize;
126  p->nTableSize = 2 * p->nTableSize + 1;
127  p->pTable = ABC_CALLOC( int, p->nTableSize );
128  // rehash the entries from the old table
129  Counter = 0;
130  for ( i = 0; i < nTableSizeOld; i++ )
131  for ( pThis = Tru_ManReadOne(p, pTableOld[i]),
132  iNext = (pThis? pThis->Next : 0);
133  pThis; pThis = Tru_ManReadOne(p, iNext),
134  iNext = (pThis? pThis->Next : 0) )
135  {
136  assert( pThis->Handle );
137  pThis->Next = 0;
138  pSpot = Tru_ManLookup( p, pThis->pTruth );
139  assert( *pSpot == 0 ); // should not be there
140  *pSpot = pThis->Handle;
141  Counter++;
142  }
143  assert( Counter == Vec_SetEntryNum(p->pMem) );
144  ABC_FREE( pTableOld );
145 }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
word pTruth[0]
Definition: satTruth.c:53
static int Vec_SetEntryNum(Vec_Set_t *p)
Definition: vecSet.h:71
static Tru_One_t * Tru_ManReadOne(Tru_Man_t *p, int h)
Definition: satTruth.c:56
int * Tru_ManLookup(Tru_Man_t *p, word *pTruth)
Definition: satTruth.c:93
static int Counter
#define ABC_FREE(obj)
Definition: abc_global.h:232
#define ABC_CALLOC(type, num)
Definition: abc_global.h:230
int Next
Definition: satTruth.c:52
int Handle
Definition: satTruth.c:51
#define assert(ex)
Definition: util_old.h:213
word* Tru_ManVar ( Tru_Man_t p,
int  v 
)

Function*************************************************************

Synopsis [Returns elementary variable.]

Description []

SideEffects []

SeeAlso []

Definition at line 268 of file satTruth.c.

269 {
270  assert( v >= 0 && v < p->nVars );
271  return Tru_ManReadOne( p, p->hIthVars[v] )->pTruth;
272 }
static Llb_Mgr_t * p
Definition: llb3Image.c:950
word pTruth[0]
Definition: satTruth.c:53
static Tru_One_t * Tru_ManReadOne(Tru_Man_t *p, int h)
Definition: satTruth.c:56
#define assert(ex)
Definition: util_old.h:213