ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vecBit.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__vec__vecBit_h
22#define ABC__misc__vec__vecBit_h
23
24
28
29#include <stdio.h>
30
32
33
37
41
42typedef struct Vec_Bit_t_ Vec_Bit_t;
44{
45 int nCap;
46 int nSize;
47 int * pArray;
48};
49
53
54#define Vec_BitForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
56#define Vec_BitForEachEntryStart( vVec, Entry, i, Start ) \
57 for ( i = Start; (i < Vec_BitSize(vVec)) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
58#define Vec_BitForEachEntryStop( vVec, Entry, i, Stop ) \
59 for ( i = 0; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
60#define Vec_BitForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
61 for ( i = Start; (i < Stop) && (((Entry) = Vec_BitEntry(vVec, i)), 1); i++ )
62#define Vec_BitForEachEntryReverse( vVec, pEntry, i ) \
63 for ( i = Vec_BitSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_BitEntry(vVec, i)), 1); i-- )
64
68
80static inline Vec_Bit_t * Vec_BitAlloc( int nCap )
81{
82 Vec_Bit_t * p;
83 nCap = (nCap >> 5) + ((nCap & 31) > 0);
84 p = ABC_ALLOC( Vec_Bit_t, 1 );
85 p->nSize = 0;
86 p->nCap = nCap * 32;
87 p->pArray = nCap? ABC_ALLOC( int, nCap ) : NULL;
88 return p;
89}
90
102static inline Vec_Bit_t * Vec_BitStart( int nSize )
103{
104 Vec_Bit_t * p;
105 nSize = (nSize >> 5) + ((nSize & 31) > 0);
106 p = Vec_BitAlloc( nSize * 32 );
107 p->nSize = nSize * 32;
108 memset( p->pArray, 0, sizeof(int) * (size_t)nSize );
109 return p;
110}
111
123static inline Vec_Bit_t * Vec_BitStartFull( int nSize )
124{
125 Vec_Bit_t * p;
126 nSize = (nSize >> 5) + ((nSize & 31) > 0);
127 p = Vec_BitAlloc( nSize * 32 );
128 p->nSize = nSize * 32;
129 memset( p->pArray, 0xff, sizeof(int) * (size_t)nSize );
130 return p;
131}
132
144static inline Vec_Bit_t * Vec_BitDup( Vec_Bit_t * pVec )
145{
146 Vec_Bit_t * p;
147 assert( (pVec->nSize & 31) == 0 );
148 p = ABC_ALLOC( Vec_Bit_t, 1 );
149 p->nSize = pVec->nSize;
150 p->nCap = pVec->nSize;
151 p->pArray = p->nCap? ABC_ALLOC( int, p->nCap >> 5 ) : NULL;
152 memcpy( p->pArray, pVec->pArray, sizeof(int) * (size_t)(p->nCap >> 5) );
153 return p;
154}
155
167static inline void Vec_BitFree( Vec_Bit_t * p )
168{
169 ABC_FREE( p->pArray );
170 ABC_FREE( p );
171}
172
184static inline void Vec_BitFreeP( Vec_Bit_t ** p )
185{
186 if ( *p == NULL )
187 return;
188 ABC_FREE( (*p)->pArray );
189 ABC_FREE( (*p) );
190}
191
203static inline int * Vec_BitReleaseArray( Vec_Bit_t * p )
204{
205 int * pArray = p->pArray;
206 p->nCap = 0;
207 p->nSize = 0;
208 p->pArray = NULL;
209 return pArray;
210}
211
223static inline int * Vec_BitArray( Vec_Bit_t * p )
224{
225 return p->pArray;
226}
227
239static inline int Vec_BitSize( Vec_Bit_t * p )
240{
241 return p->nSize;
242}
243
255static inline int Vec_BitCap( Vec_Bit_t * p )
256{
257 return p->nCap;
258}
259
271static inline double Vec_BitMemory( Vec_Bit_t * p )
272{
273 return !p ? 0.0 : 1.0 * sizeof(int) * p->nCap + sizeof(Vec_Bit_t);
274}
275
287static inline int Vec_BitEntry( Vec_Bit_t * p, int i )
288{
289 assert( i >= 0 && i < p->nSize );
290 return (p->pArray[i >> 5] >> (i & 31)) & 1;
291}
292
304static inline void Vec_BitWriteEntry( Vec_Bit_t * p, int i, int Entry )
305{
306 assert( i >= 0 && i < p->nSize );
307 if ( Entry == 1 )
308 p->pArray[i >> 5] |= (1 << (i & 31));
309 else if ( Entry == 0 )
310 p->pArray[i >> 5] &= ~(1 << (i & 31));
311 else assert(0);
312}
313static inline int Vec_BitAddEntry( Vec_Bit_t * p, int i )
314{
315 if ( Vec_BitEntry(p, i) )
316 return 1;
317 Vec_BitWriteEntry( p, i, 1 );
318 return 0;
319}
320
332static inline int Vec_BitEntryLast( Vec_Bit_t * p )
333{
334 assert( p->nSize > 0 );
335 return Vec_BitEntry( p, p->nSize-1 );
336}
337
349static inline void Vec_BitGrow( Vec_Bit_t * p, int nCapMin )
350{
351 if ( p->nCap >= nCapMin )
352 return;
353 assert( p->nCap < ABC_INT_MAX );
354 nCapMin = (nCapMin >> 5) + ((nCapMin & 31) > 0);
355 p->pArray = ABC_REALLOC( int, p->pArray, nCapMin );
356 assert( p->pArray );
357 p->nCap = nCapMin * 32;
358}
359
371static inline void Vec_BitFill( Vec_Bit_t * p, int nSize, int Fill )
372{
373 int i;
374 Vec_BitGrow( p, nSize );
375 nSize = (nSize >> 5) + ((nSize & 31) > 0);
376 if ( Fill == 0 )
377 {
378 for ( i = 0; i < nSize; i++ )
379 p->pArray[i] = 0;
380 }
381 else if ( Fill == 1 )
382 {
383 for ( i = 0; i < nSize; i++ )
384 p->pArray[i] = ~0;
385 }
386 else assert( 0 );
387 p->nSize = nSize * 32;
388}
389
401static inline void Vec_BitFillExtra( Vec_Bit_t * p, int nSize, int Fill )
402{
403 int i;
404 if ( nSize <= p->nSize )
405 return;
406 if ( nSize > 2 * p->nCap )
407 Vec_BitGrow( p, nSize );
408 else if ( nSize > p->nCap )
409 Vec_BitGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
410
411 assert( p->nSize < nSize );
412 if ( (p->nSize >> 5) == (nSize >> 5) )
413 {
414 unsigned Mask = (~(~0 << (nSize-p->nSize)) << p->nSize);
415 if ( Fill == 1 )
416 p->pArray[nSize >> 5] |= Mask;
417 else if ( Fill == 0 )
418 p->pArray[nSize >> 5] &= ~Mask;
419 else assert( 0 );
420 }
421 else
422 {
423 unsigned Mask1 = (p->nSize & 31) ? ~0 << (p->nSize & 31) : 0;
424 unsigned Mask2 = (nSize & 31) ? ~(~0 << (nSize & 31)) : 0;
425 int w1 = (p->nSize >> 5);
426 int w2 = (nSize >> 5);
427 if ( Fill == 1 )
428 {
429 p->pArray[w1] |= Mask1;
430 p->pArray[w2] |= Mask2;
431 for ( i = w1 + 1; i < w2; i++ )
432 p->pArray[i] = ~0;
433 }
434 else if ( Fill == 0 )
435 {
436 p->pArray[w1] &= ~Mask1;
437 p->pArray[w2] &= ~Mask2;
438 for ( i = w1 + 1; i < w2; i++ )
439 p->pArray[i] = 0;
440 }
441 else assert( 0 );
442 }
443 p->nSize = nSize;
444}
445
457static inline int Vec_BitGetEntry( Vec_Bit_t * p, int i )
458{
459 Vec_BitFillExtra( p, i + 1, 0 );
460 return Vec_BitEntry( p, i );
461}
462
474static inline void Vec_BitSetEntry( Vec_Bit_t * p, int i, int Entry )
475{
476 Vec_BitFillExtra( p, i + 1, 0 );
477 Vec_BitWriteEntry( p, i, Entry );
478}
479
491static inline void Vec_BitShrink( Vec_Bit_t * p, int nSizeNew )
492{
493 assert( p->nSize >= nSizeNew );
494 p->nSize = nSizeNew;
495}
496
508static inline void Vec_BitClear( Vec_Bit_t * p )
509{
510 p->nSize = 0;
511}
512
524static inline void Vec_BitPush( Vec_Bit_t * p, int Entry )
525{
526 if ( p->nSize == p->nCap )
527 {
528 if ( p->nCap < 16 )
529 Vec_BitGrow( p, 16 );
530 else
531 Vec_BitGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
532 }
533 if ( Entry == 1 )
534 p->pArray[p->nSize >> 5] |= (1 << (p->nSize & 31));
535 else if ( Entry == 0 )
536 p->pArray[p->nSize >> 5] &= ~(1 << (p->nSize & 31));
537 else assert( 0 );
538 p->nSize++;
539}
540
552static inline int Vec_BitPop( Vec_Bit_t * p )
553{
554 int Entry;
555 assert( p->nSize > 0 );
556 Entry = Vec_BitEntryLast( p );
557 p->nSize--;
558 return Entry;
559}
560
572static inline int Vec_BitCountWord( unsigned uWord )
573{
574 uWord = (uWord & 0x55555555) + ((uWord>>1) & 0x55555555);
575 uWord = (uWord & 0x33333333) + ((uWord>>2) & 0x33333333);
576 uWord = (uWord & 0x0F0F0F0F) + ((uWord>>4) & 0x0F0F0F0F);
577 uWord = (uWord & 0x00FF00FF) + ((uWord>>8) & 0x00FF00FF);
578 return (uWord & 0x0000FFFF) + (uWord>>16);
579}
580
592static inline int Vec_BitCount( Vec_Bit_t * p )
593{
594 unsigned * pArray = (unsigned *)p->pArray;
595 int nWords = (p->nSize >> 5) + ((p->nSize & 31) > 0);
596 int i, Counter = 0;
597 if ( p->nSize & 31 )
598 {
599 assert( nWords > 0 );
600 for ( i = 0; i < nWords-1; i++ )
601 Counter += Vec_BitCountWord( pArray[i] );
602 Counter += Vec_BitCountWord( pArray[i] & ~(~0 << (p->nSize & 31)) );
603 }
604 else
605 {
606 for ( i = 0; i < nWords; i++ )
607 Counter += Vec_BitCountWord( pArray[i] );
608 }
609 return Counter;
610}
611
623static inline void Vec_BitReset( Vec_Bit_t * p )
624{
625 int i, nWords = (p->nSize >> 5) + ((p->nSize & 31) > 0);
626 for ( i = 0; i < nWords; i++ )
627 p->pArray[i] = 0;
628}
629
630
642static inline void Vec_BitPrint( Vec_Bit_t * p )
643{
644 int i, Entry;
645 printf( "Vector has %d entries: {", Vec_BitSize(p) );
646 Vec_BitForEachEntry( p, Entry, i )
647 printf( " %d", Entry );
648 printf( " }\n" );
649}
650
652
653#endif
654
658
int nWords
Definition abcNpn.c:127
#define ABC_INT_MAX
Definition abc_global.h:251
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_REALLOC(type, obj, num)
Definition abc_global.h:268
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Cube * p
Definition exorList.c:222
int nCap
Definition vecBit.h:45
int * pArray
Definition vecBit.h:47
int nSize
Definition vecBit.h:46
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
#define Vec_BitForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecBit.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42