ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
satTruth.c
Go to the documentation of this file.
1
20
21#include "satTruth.h"
22#include "misc/vec/vecSet.h"
23
25
26
30
34
36{
37 int nVars; // the number of variables
38 int nWords; // the number of words in the truth table
39 int nEntrySize; // the size of one entry in 'int'
40 int nTableSize; // hash table size
41 int * pTable; // hash table
42 Vec_Set_t * pMem; // memory for truth tables
43 word * pZero; // temporary truth table
44 int hIthVars[16]; // variable handles
46};
47
48typedef struct Tru_One_t_ Tru_One_t; // 16 bytes minimum
50{
51 int Handle; // support
52 int Next; // next one in the table
53 word pTruth[0]; // truth table
54};
55
56static inline Tru_One_t * Tru_ManReadOne( Tru_Man_t * p, int h ) { return h ? (Tru_One_t *)Vec_SetEntry(p->pMem, h) : NULL; }
57
61
73static inline unsigned Tru_ManHash( word * pTruth, int nWords, int nBins, int * pPrimes )
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}
81
93int * Tru_ManLookup( Tru_Man_t * p, word * pTruth )
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}
105
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}
146
158int Tru_ManInsert( Tru_Man_t * p, word * pTruth )
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}
186
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}
236
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}
256
269{
270 assert( v >= 0 && v < p->nVars );
271 return Tru_ManReadOne( p, p->hIthVars[v] )->pTruth;
272}
273
286{
287 assert( (h & 1) == 0 );
288 if ( h == 0 )
289 return p->pZero;
290 return Tru_ManReadOne( p, h )->pTruth;
291}
292
296
297
299
int nWords
Definition abcNpn.c:127
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_CONST(number)
PARAMETERS ///.
Definition abc_global.h:240
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
Tru_Man_t * Tru_ManAlloc(int nVars)
FUNCTION DECLARATIONS ///.
Definition satTruth.c:198
word * Tru_ManVar(Tru_Man_t *p, int v)
Definition satTruth.c:268
int * Tru_ManLookup(Tru_Man_t *p, word *pTruth)
Definition satTruth.c:93
int Tru_ManInsert(Tru_Man_t *p, word *pTruth)
Definition satTruth.c:158
void Tru_ManResize(Tru_Man_t *p)
Definition satTruth.c:117
struct Tru_One_t_ Tru_One_t
Definition satTruth.c:48
word * Tru_ManFunc(Tru_Man_t *p, int h)
Definition satTruth.c:285
void Tru_ManFree(Tru_Man_t *p)
Definition satTruth.c:248
typedefABC_NAMESPACE_HEADER_START struct Tru_Man_t_ Tru_Man_t
INCLUDES ///.
Definition satTruth.h:44
DECLARATIONS ///.
Definition satTruth.c:36
int nVars
Definition satTruth.c:37
int hIthVars[16]
Definition satTruth.c:44
int * pTable
Definition satTruth.c:41
int nTableSize
Definition satTruth.c:40
int nEntrySize
Definition satTruth.c:39
word * pZero
Definition satTruth.c:43
Vec_Set_t * pMem
Definition satTruth.c:42
int nWords
Definition satTruth.c:38
int nTableLookups
Definition satTruth.c:45
word pTruth[0]
Definition satTruth.c:53
int Handle
Definition satTruth.c:51
#define assert(ex)
Definition util_old.h:213
typedefABC_NAMESPACE_HEADER_START struct Vec_Set_t_ Vec_Set_t
INCLUDES ///.
Definition vecSet.h:49