ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
extraUtilBitMatrix.c
Go to the documentation of this file.
1
18
19#include "extra.h"
20
22
23
24/*---------------------------------------------------------------------------*/
25/* Constant declarations */
26/*---------------------------------------------------------------------------*/
27
28/*---------------------------------------------------------------------------*/
29/* Stucture declarations */
30/*---------------------------------------------------------------------------*/
31
33{
34 unsigned ** ppData; // bit data
35 int nSize; // the number of bits in one dimension
36 int nWords; // the number of words in one dimension
37 int nBitShift; // the number of bits to shift to get words
38 unsigned uMask; // the mask to get the number of bits in the word
39 int nLookups; // the number of lookups
40 int nInserts; // the number of inserts
41 int nDeletes; // the number of deletions
42};
43
44/*---------------------------------------------------------------------------*/
45/* Type declarations */
46/*---------------------------------------------------------------------------*/
47
48/*---------------------------------------------------------------------------*/
49/* Variable declarations */
50/*---------------------------------------------------------------------------*/
51
52/*---------------------------------------------------------------------------*/
53/* Macro declarations */
54/*---------------------------------------------------------------------------*/
55
56
58
59/*---------------------------------------------------------------------------*/
60/* Static function prototypes */
61/*---------------------------------------------------------------------------*/
62
64
65
66/*---------------------------------------------------------------------------*/
67/* Definition of exported functions */
68/*---------------------------------------------------------------------------*/
69
82{
84 int i;
86 memset( p, 0, sizeof(Extra_BitMat_t) );
87 p->nSize = nSize;
88 p->nBitShift = (sizeof(unsigned) == 4) ? 5: 6;
89 p->uMask = (sizeof(unsigned) == 4) ? 31: 63;
90 p->nWords = nSize / (8 * sizeof(unsigned)) + ((nSize % (8 * sizeof(unsigned))) > 0);
91 p->ppData = ABC_ALLOC( unsigned *, nSize );
92 p->ppData[0] = ABC_ALLOC( unsigned, nSize * p->nWords );
93 memset( p->ppData[0], 0, sizeof(unsigned) * nSize * p->nWords );
94 for ( i = 1; i < nSize; i++ )
95 p->ppData[i] = p->ppData[i-1] + p->nWords;
96 return p;
97}
98
111{
112 memset( p->ppData[0], 0, sizeof(unsigned) * p->nSize * p->nWords );
113}
114
127{
128 ABC_FREE( p->ppData[0] );
129 ABC_FREE( p->ppData );
130 ABC_FREE( p );
131}
132
145{
146 int i, k, nVars;
147 printf( "\n" );
148 nVars = Extra_BitMatrixReadSize( pMat );
149 for ( i = 0; i < nVars; i++ )
150 {
151 for ( k = 0; k <= i; k++ )
152 printf( " " );
153 for ( k = i+1; k < nVars; k++ )
154 if ( Extra_BitMatrixLookup1( pMat, i, k ) )
155 printf( "1" );
156 else
157 printf( "." );
158 printf( "\n" );
159 }
160}
161
162
175{
176 return p->nSize;
177}
178
191{
192 p->nInserts++;
193 if ( i < k )
194 p->ppData[i][k>>p->nBitShift] |= (1<<(k & p->uMask));
195 else
196 p->ppData[k][i>>p->nBitShift] |= (1<<(i & p->uMask));
197}
198
211{
212 p->nLookups++;
213 if ( i < k )
214 return ((p->ppData[i][k>>p->nBitShift] & (1<<(k & p->uMask))) > 0);
215 else
216 return ((p->ppData[k][i>>p->nBitShift] & (1<<(i & p->uMask))) > 0);
217}
218
231{
232 p->nDeletes++;
233 if ( i < k )
234 p->ppData[i][k>>p->nBitShift] &= ~(1<<(k & p->uMask));
235 else
236 p->ppData[k][i>>p->nBitShift] &= ~(1<<(i & p->uMask));
237}
238
239
240
253{
254 p->nInserts++;
255 if ( i > k )
256 p->ppData[i][k>>p->nBitShift] |= (1<<(k & p->uMask));
257 else
258 p->ppData[k][i>>p->nBitShift] |= (1<<(i & p->uMask));
259}
260
273{
274 p->nLookups++;
275 if ( i > k )
276 return ((p->ppData[i][k>>p->nBitShift] & (1<<(k & p->uMask))) > 0);
277 else
278 return ((p->ppData[k][i>>p->nBitShift] & (1<<(i & p->uMask))) > 0);
279}
280
293{
294 p->nDeletes++;
295 if ( i > k )
296 p->ppData[i][k>>p->nBitShift] &= ~(1<<(k & p->uMask));
297 else
298 p->ppData[k][i>>p->nBitShift] &= ~(1<<(i & p->uMask));
299}
300
301
313void Extra_BitMatrixOr( Extra_BitMat_t * p, int i, unsigned * pInfo )
314{
315 int w;
316 for ( w = 0; w < p->nWords; w++ )
317 p->ppData[i][w] |= pInfo[w];
318}
319
331void Extra_BitMatrixOrTwo( Extra_BitMat_t * p, int i, int j )
332{
333 int w;
334 for ( w = 0; w < p->nWords; w++ )
335 p->ppData[i][w] = p->ppData[j][w] = (p->ppData[i][w] | p->ppData[j][w]);
336}
337
350{
351 int i, k, nTotal = 0;
352 for ( i = 0; i < p->nSize; i++ )
353 for ( k = i + 1; k < p->nSize; k++ )
354 nTotal += ( (p->ppData[i][k>>5] & (1 << (k&31))) > 0 );
355 return nTotal;
356}
357
370{
371 int i, w;
372 assert( p1->nSize == p2->nSize );
373 for ( i = 0; i < p1->nSize; i++ )
374 for ( w = 0; w < p1->nWords; w++ )
375 if ( p1->ppData[i][w] & p2->ppData[i][w] )
376 return 0;
377 return 1;
378}
379
392{
393 int v, u, i;
394 for ( v = 0; v < pMat->nSize; v++ )
395 for ( u = v+1; u < pMat->nSize; u++ )
396 {
397 if ( !Extra_BitMatrixLookup1( pMat, v, u ) )
398 continue;
399 // v and u are symmetric
400 for ( i = 0; i < pMat->nSize; i++ )
401 {
402 if ( i == v || i == u )
403 continue;
404 // i is neither v nor u
405 // the symmetry status of i is the same w.r.t. to v and u
406 if ( Extra_BitMatrixLookup1( pMat, i, v ) != Extra_BitMatrixLookup1( pMat, i, u ) )
407 return 0;
408 }
409 }
410 return 1;
411}
412
413
417
418
420
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int nTotal
DECLARATIONS ///.
Definition cutTruth.c:37
Cube * p
Definition exorList.c:222
void Extra_BitMatrixDelete2(Extra_BitMat_t *p, int i, int k)
void Extra_BitMatrixClean(Extra_BitMat_t *p)
Extra_BitMat_t * Extra_BitMatrixStart(int nSize)
void Extra_BitMatrixPrint(Extra_BitMat_t *pMat)
int Extra_BitMatrixReadSize(Extra_BitMat_t *p)
void Extra_BitMatrixInsert1(Extra_BitMat_t *p, int i, int k)
int Extra_BitMatrixCountOnesUpper(Extra_BitMat_t *p)
int Extra_BitMatrixIsClique(Extra_BitMat_t *pMat)
int Extra_BitMatrixLookup2(Extra_BitMat_t *p, int i, int k)
void Extra_BitMatrixOr(Extra_BitMat_t *p, int i, unsigned *pInfo)
void Extra_BitMatrixDelete1(Extra_BitMat_t *p, int i, int k)
void Extra_BitMatrixOrTwo(Extra_BitMat_t *p, int i, int j)
void Extra_BitMatrixInsert2(Extra_BitMat_t *p, int i, int k)
int Extra_BitMatrixIsDisjoint(Extra_BitMat_t *p1, Extra_BitMat_t *p2)
void Extra_BitMatrixStop(Extra_BitMat_t *p)
int Extra_BitMatrixLookup1(Extra_BitMat_t *p, int i, int k)
struct Extra_BitMat_t_ Extra_BitMat_t
Definition extra.h:81
#define assert(ex)
Definition util_old.h:213
char * memset()