21#ifndef ABC__misc__vec__vecWec_h
22#define ABC__misc__vec__vecWec_h
55#define Vec_WecForEachLevel( vGlob, vVec, i ) \
56 for ( i = 0; (i < Vec_WecSize(vGlob)) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i++ )
57#define Vec_WecForEachLevelVec( vLevels, vGlob, vVec, i ) \
58 for ( i = 0; (i < Vec_IntSize(vLevels)) && (((vVec) = Vec_WecEntry(vGlob, Vec_IntEntry(vLevels, i))), 1); i++ )
59#define Vec_WecForEachLevelStart( vGlob, vVec, i, LevelStart ) \
60 for ( i = LevelStart; (i < Vec_WecSize(vGlob)) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i++ )
61#define Vec_WecForEachLevelStop( vGlob, vVec, i, LevelStop ) \
62 for ( i = 0; (i < LevelStop) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i++ )
63#define Vec_WecForEachLevelStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
64 for ( i = LevelStart; (i < LevelStop) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i++ )
65#define Vec_WecForEachLevelReverse( vGlob, vVec, i ) \
66 for ( i = Vec_WecSize(vGlob)-1; (i >= 0) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i-- )
67#define Vec_WecForEachLevelReverseStartStop( vGlob, vVec, i, LevelStart, LevelStop ) \
68 for ( i = LevelStart-1; (i >= LevelStop) && (((vVec) = Vec_WecEntry(vGlob, i)), 1); i-- )
69#define Vec_WecForEachLevelTwo( vGlob1, vGlob2, vVec1, vVec2, i ) \
70 for ( i = 0; (i < Vec_WecSize(vGlob1)) && (((vVec1) = Vec_WecEntry(vGlob1, i)), 1) && (((vVec2) = Vec_WecEntry(vGlob2, i)), 1); i++ )
71#define Vec_WecForEachLevelDouble( vGlob, vVec1, vVec2, i ) \
72 for ( i = 0; (i < Vec_WecSize(vGlob)) && (((vVec1) = Vec_WecEntry(vGlob, i)), 1) && (((vVec2) = Vec_WecEntry(vGlob, i+1)), 1); i += 2 )
89static inline Vec_Wec_t * Vec_WecAlloc(
int nCap )
93 if ( nCap > 0 && nCap < 8 )
100static inline Vec_Wec_t * Vec_WecAllocExact(
int nCap )
110static inline Vec_Wec_t * Vec_WecStart(
int nSize )
113 p = Vec_WecAlloc( nSize );
129static inline void Vec_WecGrow(
Vec_Wec_t *
p,
int nCapMin )
131 if (
p->nCap >= nCapMin )
137static inline void Vec_WecInit(
Vec_Wec_t *
p,
int nSize )
139 Vec_WecGrow(
p, nSize );
156 assert( i >= 0 && i < p->nSize );
157 return p->pArray + i;
162 return p->pArray +
p->nSize - 1;
164static inline int Vec_WecEntryEntry(
Vec_Wec_t *
p,
int i,
int k )
166 return Vec_IntEntry( Vec_WecEntry(
p, i), k );
186 assert(
p->pArray <= vLevel && vLevel < p->pArray +
p->nSize );
187 return vLevel -
p->pArray;
209static inline int Vec_WecLevelSize(
Vec_Wec_t *
p,
int i )
211 assert( i >= 0 && i < p->nSize );
212 return Vec_IntSize(
p->pArray + i );
214static inline int Vec_WecSizeSize(
Vec_Wec_t *
p )
219 Counter += Vec_IntSize(vVec);
222static inline int Vec_WecSizeUsed(
Vec_Wec_t *
p )
227 Counter += (int)(Vec_IntSize(vVec) > 0);
230static inline int Vec_WecSizeUsedLimits(
Vec_Wec_t *
p,
int iStart,
int iStop )
235 Counter += (int)(Vec_IntSize(vVec) > 0);
250static inline void Vec_WecShrink(
Vec_Wec_t *
p,
int nSizeNew )
254 Vec_IntShrink( vVec, 0 );
255 assert(
p->nSize >= nSizeNew );
270static inline void Vec_WecClear(
Vec_Wec_t *
p )
275 Vec_IntClear( vVec );
278static inline void Vec_WecClearLevels(
Vec_Wec_t *
p )
283 Vec_IntClear( vVec );
297static inline void Vec_WecPush(
Vec_Wec_t *
p,
int Level,
int Entry )
299 if (
p->nSize < Level + 1 )
301 Vec_WecGrow(
p, Abc_MaxInt(2*
p->nSize, Level + 1) );
302 p->nSize = Level + 1;
304 Vec_IntPush( Vec_WecEntry(
p, Level), Entry );
306static inline void Vec_WecPushTwo(
Vec_Wec_t *
p,
int Level,
int Entry1,
int Entry2 )
308 if (
p->nSize < Level + 1 )
310 Vec_WecGrow(
p, Abc_MaxInt(2*
p->nSize, Level + 1) );
311 p->nSize = Level + 1;
313 Vec_IntPushTwo( Vec_WecEntry(
p, Level), Entry1, Entry2 );
317 if (
p->nSize ==
p->nCap )
320 Vec_WecGrow(
p, 16 );
322 Vec_WecGrow(
p, 2 *
p->nCap );
325 return Vec_WecEntryLast(
p );
330 if (
p->nSize ==
p->nCap )
333 Vec_WecGrow(
p, 16 );
335 Vec_WecGrow(
p, 2 *
p->nCap );
338 assert( i >= 0 && i < p->nSize );
339 for ( pTemp =
p->pArray +
p->nSize - 2; pTemp >=
p->pArray + i; pTemp-- )
341 Vec_IntZero(
p->pArray + i );
342 return p->pArray + i;
356static inline double Vec_WecMemory(
Vec_Wec_t *
p )
360 if (
p == NULL )
return 0.0;
362 for ( i = 0; i <
p->nSize; i++ )
363 Mem +=
sizeof(
int) * (size_t)Vec_IntCap( Vec_WecEntry(
p, i) );
378static inline void Vec_WecZero(
Vec_Wec_t *
p )
384static inline void Vec_WecErase(
Vec_Wec_t *
p )
387 for ( i = 0; i <
p->nCap; i++ )
393static inline void Vec_WecFree(
Vec_Wec_t *
p )
398static inline void Vec_WecFreeP(
Vec_Wec_t **
p )
417static inline void Vec_WecPushUnique(
Vec_Wec_t *
p,
int Level,
int Entry )
419 if (
p->nSize < Level + 1 )
420 Vec_WecPush(
p, Level, Entry );
422 Vec_IntPushUnique( Vec_WecEntry(
p, Level), Entry );
441 vNew = Vec_WecStart( Vec_WecSize(
p) );
444 Vec_WecPush( vNew, i, Entry );
452 vNew = Vec_WecStart( Vec_WecSize(
p) );
454 Vec_IntFill( Vec_WecEntry(vNew, i), Vec_IntSize(vVec), 0 );
471 if ( Vec_IntSize(p1) < Vec_IntSize(p2) )
473 if ( Vec_IntSize(p1) > Vec_IntSize(p2) )
479 if ( Vec_IntSize(p1) > Vec_IntSize(p2) )
481 if ( Vec_IntSize(p1) < Vec_IntSize(p2) )
485static inline void Vec_WecSort(
Vec_Wec_t *
p,
int fReverse )
488 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
489 (int (*)(
const void *,
const void *)) Vec_WecSortCompare2 );
491 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
492 (int (*)(
const void *,
const void *)) Vec_WecSortCompare1 );
509 if ( Vec_IntEntry(p1,0) < Vec_IntEntry(p2,0) )
511 if ( Vec_IntEntry(p1,0) > Vec_IntEntry(p2,0) )
517 if ( Vec_IntEntry(p1,0) > Vec_IntEntry(p2,0) )
519 if ( Vec_IntEntry(p1,0) < Vec_IntEntry(p2,0) )
523static inline void Vec_WecSortByFirstInt(
Vec_Wec_t *
p,
int fReverse )
526 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
527 (int (*)(
const void *,
const void *)) Vec_WecSortCompare4 );
529 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
530 (int (*)(
const void *,
const void *)) Vec_WecSortCompare3 );
546 if ( Vec_IntEntryLast(p1) < Vec_IntEntryLast(p2) )
548 if ( Vec_IntEntryLast(p1) > Vec_IntEntryLast(p2) )
554 if ( Vec_IntEntryLast(p1) > Vec_IntEntryLast(p2) )
556 if ( Vec_IntEntryLast(p1) < Vec_IntEntryLast(p2) )
560static inline void Vec_WecSortByLastInt(
Vec_Wec_t *
p,
int fReverse )
563 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
564 (int (*)(
const void *,
const void *)) Vec_WecSortCompare6 );
566 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
Vec_Int_t),
567 (int (*)(
const void *,
const void *)) Vec_WecSortCompare5 );
581static inline void Vec_WecKeepLevels(
Vec_Wec_t *
p,
int Limit )
585 if ( Vec_IntSize(vLevel) > Limit )
590 Vec_WecShrink(
p, k );
604static inline void Vec_WecPrint(
Vec_Wec_t *
p,
int fSkipSingles )
610 if ( fSkipSingles && Vec_IntSize(vVec) == 1 )
612 printf(
" %4d : {", i );
614 printf(
" %d", Entry );
618static inline void Vec_WecPrintLits(
Vec_Wec_t *
p )
624 printf(
" %4d : %2d {", i, Vec_IntSize(vVec) );
626 printf(
" %c%d", Abc_LitIsCompl(iLit) ?
'-' :
'+', Abc_Lit2Var(iLit) );
646 vClasses = Vec_WecStart( Vec_IntFindMax(vMap) + 1 );
648 Vec_WecPush( vClasses, Entry, i );
663static inline int Vec_WecCountNonTrivial(
Vec_Wec_t *
p,
int * pnUsed )
670 if ( Vec_IntSize(vClass) < 2 )
673 (*pnUsed) += Vec_IntSize(vClass);
689static inline int Vec_WecMaxLevelSize(
Vec_Wec_t *
p )
693 Res = Abc_MaxInt( Res, Vec_IntSize(vTemp) );
696static inline int Vec_WecMaxEntry(
Vec_Wec_t *
p )
700 Res = Abc_MaxInt( Res, Vec_IntFindMax(vTemp) );
719 vFirsts = Vec_IntAlloc( Vec_WecSize(
p) );
721 if ( Vec_IntSize(vLevel) > 0 )
722 Vec_IntPush( vFirsts, Vec_IntEntry(vLevel, 0) );
742 vCopy = Vec_PtrAlloc( Vec_WecSize(
p) );
744 Vec_PtrPush( vCopy, Vec_IntDup(vLevel) );
760static inline int Vec_WecIntHasMark(
Vec_Int_t * vVec ) {
return (vVec->nCap >> 30) & 1; }
761static inline void Vec_WecIntSetMark(
Vec_Int_t * vVec ) { vVec->nCap |= (1<<30); }
762static inline void Vec_WecIntXorMark(
Vec_Int_t * vVec ) { vVec->nCap ^= (1<<30); }
769 assert( !Vec_WecIntHasMark( vCube ) );
770 Vec_WecIntXorMark( vCube );
779 assert( Vec_WecIntHasMark( vCube ) );
780 Vec_WecIntXorMark( vCube );
795static inline void Vec_WecRemoveEmpty(
Vec_Wec_t * vCubes )
800 if ( Vec_IntSize(vCube) > 0 )
801 vCubes->pArray[k++] = *vCube;
804 for ( i = k; i < Vec_WecSize(vCubes); i++ )
805 Vec_IntZero( Vec_WecEntry(vCubes, i) );
806 Vec_WecShrink( vCubes, k );
822static inline void Vec_WecDumpBin(
char * pFileName,
Vec_Wec_t *
p,
int fVerbose )
825 int i, nSize, RetValue;
826 FILE * pFile = fopen( pFileName,
"wb" );
829 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
832 nSize = Vec_WecSize(
p);
833 RetValue = fwrite( &nSize, 1,
sizeof(
int), pFile );
836 nSize = Vec_IntSize(vLevel);
837 RetValue += fwrite( &nSize, 1,
sizeof(
int), pFile );
838 RetValue += fwrite( Vec_IntArray(vLevel), 1,
sizeof(
int)*nSize, pFile );
841 if ( RetValue != (
int)
sizeof(
int)*(Vec_WecSizeSize(
p)+Vec_WecSize(
p)+1) )
842 printf(
"Error writing data into file.\n" );
844 printf(
"Written %d integer arrays into file \"%s\".\n", Vec_WecSize(
p), pFileName );
846static inline Vec_Wec_t * Vec_WecReadBin(
char * pFileName,
int fVerbose )
849 FILE * pFile = fopen( pFileName,
"rb" );
852 printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
856 nSize = ftell( pFile );
859 printf(
"The input file is empty.\n" );
863 if ( nSize %
sizeof(
int) > 0 )
865 printf(
"Cannot read file with integers because it is not aligned at 4 bytes (remainder = %d).\n", (
int)(nSize %
sizeof(
int)) );
870 RetValue = fread( &nSize, 1,
sizeof(
int), pFile );
872 p = Vec_WecStart( nSize );
875 RetValue = fread( &nSize, 1,
sizeof(
int), pFile );
877 Vec_IntFill( vLevel, nSize, 0 );
878 RetValue = fread( Vec_IntArray(vLevel), 1,
sizeof(
int)*nSize, pFile );
879 assert( RetValue == 4*nSize );
883 printf(
"Read %d integer arrays from file \"%s\".\n", Vec_WecSize(
p), pFileName );
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelStart(vGlob, vVec, i, LevelStart)
#define Vec_WecForEachLevelVec(vLevels, vGlob, vVec, i)
#define Vec_WecForEachLevelStartStop(vGlob, vVec, i, LevelStart, LevelStop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.