21#ifndef ABC__misc__vec__vecWrd_h
22#define ABC__misc__vec__vecWrd_h
54#define Vec_WrdForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_WrdSize(vVec)) && (((Entry) = Vec_WrdEntry(vVec, i)), 1); i++ )
56#define Vec_WrdForEachEntryStart( vVec, Entry, i, Start ) \
57 for ( i = Start; (i < Vec_WrdSize(vVec)) && (((Entry) = Vec_WrdEntry(vVec, i)), 1); i++ )
58#define Vec_WrdForEachEntryStop( vVec, Entry, i, Stop ) \
59 for ( i = 0; (i < Stop) && (((Entry) = Vec_WrdEntry(vVec, i)), 1); i++ )
60#define Vec_WrdForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
61 for ( i = Start; (i < Stop) && (((Entry) = Vec_WrdEntry(vVec, i)), 1); i++ )
62#define Vec_WrdForEachEntryReverse( vVec, pEntry, i ) \
63 for ( i = Vec_WrdSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_WrdEntry(vVec, i)), 1); i-- )
64#define Vec_WrdForEachEntryDouble( vVec, Entry1, Entry2, i ) \
65 for ( i = 0; (i+1 < Vec_WrdSize(vVec)) && (((Entry1) = Vec_WrdEntry(vVec, i)), 1) && (((Entry2) = Vec_WrdEntry(vVec, i+1)), 1); i += 2 )
82static inline Vec_Wrd_t * Vec_WrdAlloc(
int nCap )
86 if ( nCap > 0 && nCap < 16 )
93static inline Vec_Wrd_t * Vec_WrdAllocExact(
int nCap )
115static inline Vec_Wrd_t * Vec_WrdStart(
int nSize )
118 p = Vec_WrdAlloc( nSize );
120 memset(
p->pArray, 0,
sizeof(
word) * (
size_t)nSize );
135static inline Vec_Wrd_t * Vec_WrdStartFull(
int nSize )
138 p = Vec_WrdAlloc( nSize );
140 memset(
p->pArray, 0xff,
sizeof(
word) * (
size_t)nSize );
155static inline Vec_Wrd_t * Vec_WrdStartNatural(
int nSize )
159 p = Vec_WrdAlloc( nSize );
161 for ( i = 0; i < nSize; i++ )
165static inline Vec_Wrd_t * Vec_WrdStartRandom(
int nSize )
167 Vec_Wrd_t * vSims = Vec_WrdStart( nSize );
int i;
168 for ( i = 0; i < nSize; i++ )
172static inline Vec_Wrd_t * Vec_WrdStartTruthTables(
int nVars )
175 unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
177 nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
178 p = Vec_WrdStart(
nWords * nVars );
179 for ( i = 0; i < nVars; i++ )
181 unsigned * pTruth = (
unsigned *)(
p->pArray +
nWords * i);
184 for ( k = 0; k < 2*
nWords; k++ )
185 pTruth[k] = Masks[i];
189 for ( k = 0; k < 2*
nWords; k++ )
190 if ( k & (1 << (i-5)) )
191 pTruth[k] = ~(unsigned)0;
198static inline Vec_Wrd_t * Vec_WrdStartTruthTablesRev(
int nVars )
201 unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
203 nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
204 p = Vec_WrdStart(
nWords * nVars );
205 for ( i = 0; i < nVars; i++ )
207 unsigned * pTruth = (
unsigned *)(
p->pArray +
nWords * (nVars-1-i));
210 for ( k = 0; k < 2*
nWords; k++ )
211 pTruth[k] = Masks[i];
215 for ( k = 0; k < 2*
nWords; k++ )
216 if ( k & (1 << (i-5)) )
217 pTruth[k] = ~(unsigned)0;
224static inline Vec_Wrd_t * Vec_WrdStartTruthTables6(
int nVars )
234 int i, k,
nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
236 for ( i = 0; i < nVars; i++ )
241 for ( k = 0; k <
nWords; k++ )
242 pTruth[k] = Masks[i];
246 for ( k = 0; k <
nWords; k++ )
247 if ( k & (1 << (i-6)) )
248 pTruth[k] = ~(
word)0;
257 int i, nObjs =
p->nSize/
nWords;
259 for ( i = 0; i < nObjs; i++ )
275static inline Vec_Wrd_t * Vec_WrdAllocArray(
word * pArray,
int nSize )
296static inline Vec_Wrd_t * Vec_WrdAllocArrayCopy(
word * pArray,
int nSize )
303 memcpy(
p->pArray, pArray,
sizeof(
word) * (
size_t)nSize );
322 p->nSize = pVec->nSize;
323 p->nCap = pVec->nSize;
325 memcpy(
p->pArray, pVec->pArray,
sizeof(
word) * (
size_t)pVec->nSize );
344 p->nSize = pVec->nSize;
345 p->nCap = pVec->nCap;
346 p->pArray = pVec->pArray;
364static inline void Vec_WrdErase(
Vec_Wrd_t *
p )
370static inline void Vec_WrdFree(
Vec_Wrd_t *
p )
387static inline void Vec_WrdFreeP(
Vec_Wrd_t **
p )
408 word * pArray =
p->pArray;
432 return p->pArray +
p->nSize;
450static inline int Vec_WrdChangeSize(
Vec_Wrd_t *
p,
int Shift )
452 return p->nSize += Shift;
482static inline double Vec_WrdMemory(
Vec_Wrd_t *
p )
484 return !
p ? 0.0 : 1.0 *
sizeof(
word) * (
size_t)
p->nCap +
sizeof(
Vec_Wrd_t);
500 assert( i >= 0 && i < p->nSize );
517 assert( i >= 0 && i < p->nSize );
518 return p->pArray + i;
532static inline void Vec_WrdWriteEntry(
Vec_Wrd_t *
p,
int i,
word Entry )
534 assert( i >= 0 && i < p->nSize );
535 p->pArray[i] = Entry;
551 assert( i >= 0 && i < p->nSize );
552 return p->pArray[i] += Addition;
569 return p->pArray[
p->nSize-1];
583static inline void Vec_WrdGrow(
Vec_Wrd_t *
p,
int nCapMin )
585 if (
p->nCap >= nCapMin )
604static inline void Vec_WrdFill(
Vec_Wrd_t *
p,
int nSize,
word Fill )
607 Vec_WrdGrow(
p, nSize );
608 for ( i = 0; i < nSize; i++ )
624static inline void Vec_WrdFillExtra(
Vec_Wrd_t *
p,
int nSize,
word Fill )
627 if ( nSize <= p->nSize )
629 if ( nSize > 2 *
p->nCap )
630 Vec_WrdGrow(
p, nSize );
631 else if ( nSize >
p->nCap )
633 for ( i =
p->nSize; i < nSize; i++ )
651 Vec_WrdFillExtra(
p, i + 1, 0 );
652 return Vec_WrdEntry(
p, i );
668 Vec_WrdFillExtra(
p, i + 1, 0 );
669 return Vec_WrdEntryP(
p, i );
683static inline void Vec_WrdSetEntry(
Vec_Wrd_t *
p,
int i,
word Entry )
685 Vec_WrdFillExtra(
p, i + 1, 0 );
686 Vec_WrdWriteEntry(
p, i, Entry );
700static inline void Vec_WrdShrink(
Vec_Wrd_t *
p,
int nSizeNew )
702 assert(
p->nSize >= nSizeNew );
717static inline void Vec_WrdClear(
Vec_Wrd_t *
p )
735 if (
p->nSize ==
p->nCap )
738 Vec_WrdGrow(
p, 16 );
742 p->pArray[
p->nSize++] = Entry;
746 Vec_WrdPush(
p, Entry1 );
747 Vec_WrdPush(
p, Entry2 );
751 Vec_WrdPush(
p, Entry1 );
752 Vec_WrdPush(
p, Entry2 );
753 Vec_WrdPush(
p, Entry3 );
757 Vec_WrdPush(
p, Entry1 );
758 Vec_WrdPush(
p, Entry2 );
759 Vec_WrdPush(
p, Entry3 );
760 Vec_WrdPush(
p, Entry4 );
762static inline void Vec_WrdPushArray(
Vec_Wrd_t *
p,
word * pEntries,
int nEntries )
765 for ( i = 0; i < nEntries; i++ )
766 Vec_WrdPush(
p, pEntries[i] );
783 if (
p->nSize ==
p->nCap )
786 Vec_WrdGrow(
p, 16 );
791 for ( i =
p->nSize - 1; i >= 1; i-- )
792 p->pArray[i] =
p->pArray[i-1];
793 p->pArray[0] = Entry;
810 if (
p->nSize ==
p->nCap )
813 Vec_WrdGrow(
p, 16 );
818 for ( i =
p->nSize-2; i >= 0; i-- )
819 if (
p->pArray[i] > Entry )
820 p->pArray[i+1] =
p->pArray[i];
823 p->pArray[i+1] = Entry;
837static inline int Vec_WrdPushUniqueOrder(
Vec_Wrd_t *
p,
word Entry )
840 for ( i = 0; i <
p->nSize; i++ )
841 if (
p->pArray[i] == Entry )
843 Vec_WrdPushOrder(
p, Entry );
861 for ( i = 0; i <
p->nSize; i++ )
862 if (
p->pArray[i] == Entry )
864 Vec_WrdPush(
p, Entry );
885 if (
p->nSize >
p->nCap )
890 return p->pArray +
p->nSize -
nWords;
907 return p->pArray[--
p->nSize];
924 for ( i = 0; i <
p->nSize; i++ )
925 if (
p->pArray[i] == Entry )
944 for ( i = 0; i <
p->nSize; i++ )
945 if (
p->pArray[i] == Entry )
950 for ( i++; i <
p->nSize; i++ )
951 p->pArray[i-1] =
p->pArray[i];
967static inline void Vec_WrdInsert(
Vec_Wrd_t *
p,
int iHere,
word Entry )
970 assert( iHere >= 0 && iHere < p->nSize );
972 for ( i =
p->nSize - 1; i > iHere; i-- )
973 p->pArray[i] =
p->pArray[i-1];
974 p->pArray[i] = Entry;
976static inline void Vec_WrdDrop(
Vec_Wrd_t *
p,
int i )
979 assert( i >= 0 && i < Vec_WrdSize(
p) );
981 for ( k = i; k <
p->nSize; k++ )
982 p->pArray[k] =
p->pArray[k+1];
1000 if (
p->nSize == 0 )
1002 Best =
p->pArray[0];
1003 for ( i = 1; i <
p->nSize; i++ )
1004 if ( Best < p->pArray[i] )
1005 Best =
p->pArray[i];
1024 if (
p->nSize == 0 )
1026 Best =
p->pArray[0];
1027 for ( i = 1; i <
p->nSize; i++ )
1028 if ( Best >
p->pArray[i] )
1029 Best =
p->pArray[i];
1044static inline void Vec_WrdReverseOrder(
Vec_Wrd_t *
p )
1048 for ( i = 0; i <
p->nSize/2; i++ )
1050 Temp =
p->pArray[i];
1051 p->pArray[i] =
p->pArray[
p->nSize-1-i];
1052 p->pArray[
p->nSize-1-i] = Temp;
1072 Vec_WrdFill( vRes, Vec_WrdFindMax(
p) + 1, Fill );
1074 if ( Entry != Fill )
1075 Vec_WrdWriteEntry( vRes, Entry, i );
1094 for ( i = 0; i <
p->nSize; i++ )
1095 Counter +=
p->pArray[i];
1110static inline int Vec_WrdCountZero(
Vec_Wrd_t *
p )
1113 for ( i = 0; i <
p->nSize; i++ )
1114 Counter += (
p->pArray[i] == 0);
1132 if ( p1->nSize != p2->nSize )
1134 for ( i = 0; i < p1->nSize; i++ )
1135 if ( p1->pArray[i] != p2->pArray[i] )
1156 if ( Vec_WrdSize(p1) < Vec_WrdSize(p2) )
1157 vTemp = p1, p1 = p2, p2 = vTemp;
1158 assert( Vec_WrdSize(p1) >= Vec_WrdSize(p2) );
1159 vTemp = Vec_WrdInvert( p2, -1 );
1160 Vec_WrdFillExtra( vTemp, Vec_WrdFindMax(p1) + 1, ~((
word)0) );
1162 if ( Vec_WrdEntry(vTemp, Entry) != ~((
word)0) )
1164 Vec_WrdFree( vTemp );
1179static int Vec_WrdSortCompare1(
word * pp1,
word * pp2 )
1200static int Vec_WrdSortCompare2(
word * pp1,
word * pp2 )
1221static inline void Vec_WrdSort(
Vec_Wrd_t *
p,
int fReverse )
1224 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
word),
1225 (int (*)(
const void *,
const void *)) Vec_WrdSortCompare2 );
1227 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
word),
1228 (int (*)(
const void *,
const void *)) Vec_WrdSortCompare1 );
1242static inline void Vec_WrdUniqify(
Vec_Wrd_t *
p )
1247 Vec_WrdSort(
p, 0 );
1248 for ( i = k = 1; i <
p->nSize; i++ )
1249 if (
p->pArray[i] !=
p->pArray[i-1] )
1250 p->pArray[k++] =
p->pArray[i];
1253static inline int Vec_WrdUniqueCount(
Vec_Wrd_t * vData,
int nWordSize,
Vec_Int_t ** pvMap )
1257 vDataInt->nSize *= 2;
1258 vDataInt->nCap *= 2;
1259 Result = Vec_IntUniqueCount( vDataInt, 2 * nWordSize, pvMap );
1260 vDataInt->nSize /= 2;
1261 vDataInt->nCap /= 2;
1268 vDataInt->nSize *= 2;
1269 vDataInt->nCap *= 2;
1270 vResInt = Vec_IntUniqifyHash( vDataInt, 2 * nWordSize );
1271 vDataInt->nSize /= 2;
1272 vDataInt->nCap /= 2;
1273 vResInt->nSize /= 2;
1291 word * pBeg1 = vArr1->pArray;
1292 word * pBeg2 = vArr2->pArray;
1293 word * pEnd1 = vArr1->pArray + vArr1->nSize;
1294 word * pEnd2 = vArr2->pArray + vArr2->nSize;
1296 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1298 if ( *pBeg1 == *pBeg2 )
1299 pBeg1++, pBeg2++, Counter++;
1300 else if ( *pBeg1 < *pBeg2 )
1319static int Vec_WrdSortCompareUnsigned(
word * pp1,
word * pp2 )
1339static inline void Vec_WrdSortUnsigned(
Vec_Wrd_t *
p )
1341 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
word),
1342 (int (*)(
const void *,
const void *)) Vec_WrdSortCompareUnsigned );
1361 Vec_WrdPush( vVec1, Entry );
1375static inline void Vec_WrdDumpBoolOne( FILE * pFile,
word * pSim,
int nBits,
int fReverse )
1379 for ( k = nBits-1; k >= 0; k-- )
1380 fprintf( pFile,
"%d", (
int)((pSim[k/64] >> (k%64)) & 1) );
1382 for ( k = 0; k < nBits; k++ )
1383 fprintf( pFile,
"%d", (
int)((pSim[k/64] >> (k%64)) & 1) );
1384 fprintf( pFile,
"\n" );
1386static inline void Vec_WrdDumpBool(
char * pFileName,
Vec_Wrd_t *
p,
int nWords,
int nBits,
int fReverse,
int fVerbose )
1388 int i, nNodes = Vec_WrdSize(
p) /
nWords;
1389 FILE * pFile = fopen( pFileName,
"wb" );
1390 if ( pFile == NULL )
1392 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
1396 for ( i = 0; i < nNodes; i++ )
1397 Vec_WrdDumpBoolOne( pFile, Vec_WrdEntryP(
p, i*
nWords), nBits, fReverse );
1400 printf(
"Written %d bits of simulation data for %d objects into file \"%s\".\n", nBits, Vec_WrdSize(
p)/
nWords, pFileName );
1416 int i, k, nNodes = Vec_WrdSize(
p) /
nWords;
1418 printf(
"The array contains %d bit-strings of %d bits:\n", nNodes, 64*
nWords );
1419 for ( i = 0; i < nNodes; i++, printf(
"\n") )
1420 for ( k = 0; k < 64*
nWords; k++ )
1421 printf(
"%d", Abc_InfoHasBit((
unsigned*)Vec_WrdEntryP(
p, i*
nWords), k) );
1435static inline void Vec_WrdDumpHexOne( FILE * pFile,
word * pSim,
int nWords )
1437 int k, Digit, nDigits =
nWords*16;
1438 for ( k = 0; k < nDigits; k++ )
1440 Digit = (int)((pSim[k/16] >> ((k%16) * 4)) & 15);
1442 fprintf( pFile,
"%d", Digit );
1444 fprintf( pFile,
"%c",
'A' + Digit-10 );
1446 fprintf( pFile,
"\n" );
1450 int i, nNodes = Vec_WrdSize(
p) /
nWords;
1452 printf(
"The array contains %d bit-strings of %d bits:\n", nNodes, 64*
nWords );
1453 for ( i = 0; i < nNodes; i++ )
1454 Vec_WrdDumpHexOne( stdout, Vec_WrdEntryP(
p, i*
nWords),
nWords );
1456static inline void Vec_WrdDumpHex(
char * pFileName,
Vec_Wrd_t *
p,
int nWords,
int fVerbose )
1458 int i, nNodes = Vec_WrdSize(
p) /
nWords;
1459 FILE * pFile = fopen( pFileName,
"wb" );
1460 if ( pFile == NULL )
1462 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
1466 for ( i = 0; i < nNodes; i++ )
1467 Vec_WrdDumpHexOne( pFile, Vec_WrdEntryP(
p, i*
nWords),
nWords );
1470 printf(
"Written %d words of simulation data for %d objects into file \"%s\".\n",
nWords, Vec_WrdSize(
p)/
nWords, pFileName );
1472static inline int Vec_WrdReadHexOne(
char c )
1475 if ( c >=
'0' && c <=
'9' )
1477 else if ( c >=
'A' && c <=
'F' )
1478 Digit = c -
'A' + 10;
1479 else if ( c >=
'a' && c <=
'f' )
1480 Digit = c -
'a' + 10;
1482 assert( Digit >= 0 && Digit < 16 );
1485static inline Vec_Wrd_t * Vec_WrdReadHex(
char * pFileName,
int * pnWords,
int fVerbose )
1488 int c,
nWords = -1, nChars = 0;
word Num = 0;
1489 FILE * pFile = fopen( pFileName,
"rb" );
1490 if ( pFile == NULL )
1492 printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
1495 p = Vec_WrdAlloc( 1000 );
1496 while ( (c = fgetc(pFile)) != EOF )
1498 if ( c ==
'\r' || c ==
'\t' || c ==
' ' )
1504 Vec_WrdPush(
p, Num );
1508 if (
nWords == -1 && Vec_WrdSize(
p) > 0 )
1512 Num |= (
word)Vec_WrdReadHexOne((
char)c) << (nChars * 4);
1513 if ( ++nChars < 16 )
1515 Vec_WrdPush(
p, Num );
1524 printf(
"Read %d words of simulation data for %d objects.\n",
nWords, Vec_WrdSize(
p)/
nWords );
1539static inline void Vec_WrdDumpBin(
char * pFileName,
Vec_Wrd_t *
p,
int fVerbose )
1542 FILE * pFile = fopen( pFileName,
"wb" );
1543 if ( pFile == NULL )
1545 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
1548 RetValue = fwrite( Vec_WrdArray(
p), 1, 8*Vec_WrdSize(
p), pFile );
1550 if ( RetValue != 8*Vec_WrdSize(
p) )
1551 printf(
"Error reading data from file.\n" );
1553 printf(
"Written %d words of simulation data into file \"%s\".\n", Vec_WrdSize(
p), pFileName );
1555static inline Vec_Wrd_t * Vec_WrdReadBin(
char * pFileName,
int fVerbose )
1558 FILE * pFile = fopen( pFileName,
"rb" );
1559 if ( pFile == NULL )
1561 printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
1565 nSize = ftell( pFile );
1568 printf(
"The input file is empty.\n" );
1572 if ( nSize % 8 > 0 )
1574 printf(
"Cannot read file with simulation data that is not aligned at 8 bytes (remainder = %d).\n", nSize % 8 );
1579 p = Vec_WrdStart( nSize/8 );
1580 RetValue = fread( Vec_WrdArray(
p), 1, nSize, pFile );
1582 if ( RetValue != nSize )
1583 printf(
"Error reading data from file.\n" );
1585 printf(
"Read %d words of simulation data from file \"%s\".\n", nSize/8, pFileName );
word Abc_RandomW(int fReset)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_CONST(number)
PARAMETERS ///.
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
unsigned __int64 word
DECLARATIONS ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.