ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vecWrd.h
Go to the documentation of this file.
1
20
21#ifndef ABC__misc__vec__vecWrd_h
22#define ABC__misc__vec__vecWrd_h
23
24
28
29#include <stdio.h>
30
32
33
37
41
42typedef struct Vec_Wrd_t_ Vec_Wrd_t;
44{
45 int nCap;
46 int nSize;
48};
49
53
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 )
66
70
82static inline Vec_Wrd_t * Vec_WrdAlloc( int nCap )
83{
84 Vec_Wrd_t * p;
85 p = ABC_ALLOC( Vec_Wrd_t, 1 );
86 if ( nCap > 0 && nCap < 16 )
87 nCap = 16;
88 p->nSize = 0;
89 p->nCap = nCap;
90 p->pArray = p->nCap? ABC_ALLOC( word, p->nCap ) : NULL;
91 return p;
92}
93static inline Vec_Wrd_t * Vec_WrdAllocExact( int nCap )
94{
95 Vec_Wrd_t * p;
96 assert( nCap >= 0 );
97 p = ABC_ALLOC( Vec_Wrd_t, 1 );
98 p->nSize = 0;
99 p->nCap = nCap;
100 p->pArray = p->nCap? ABC_ALLOC( word, p->nCap ) : NULL;
101 return p;
102}
103
115static inline Vec_Wrd_t * Vec_WrdStart( int nSize )
116{
117 Vec_Wrd_t * p;
118 p = Vec_WrdAlloc( nSize );
119 p->nSize = nSize;
120 memset( p->pArray, 0, sizeof(word) * (size_t)nSize );
121 return p;
122}
123
135static inline Vec_Wrd_t * Vec_WrdStartFull( int nSize )
136{
137 Vec_Wrd_t * p;
138 p = Vec_WrdAlloc( nSize );
139 p->nSize = nSize;
140 memset( p->pArray, 0xff, sizeof(word) * (size_t)nSize );
141 return p;
142}
143
155static inline Vec_Wrd_t * Vec_WrdStartNatural( int nSize )
156{
157 Vec_Wrd_t * p;
158 int i;
159 p = Vec_WrdAlloc( nSize );
160 p->nSize = nSize;
161 for ( i = 0; i < nSize; i++ )
162 p->pArray[i] = i;
163 return p;
164}
165static inline Vec_Wrd_t * Vec_WrdStartRandom( int nSize )
166{
167 Vec_Wrd_t * vSims = Vec_WrdStart( nSize ); int i;
168 for ( i = 0; i < nSize; i++ )
169 vSims->pArray[i] = Abc_RandomW(0);
170 return vSims;
171}
172static inline Vec_Wrd_t * Vec_WrdStartTruthTables( int nVars )
173{
174 Vec_Wrd_t * p;
175 unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
176 int i, k, nWords;
177 nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
178 p = Vec_WrdStart( nWords * nVars );
179 for ( i = 0; i < nVars; i++ )
180 {
181 unsigned * pTruth = (unsigned *)(p->pArray + nWords * i);
182 if ( i < 5 )
183 {
184 for ( k = 0; k < 2*nWords; k++ )
185 pTruth[k] = Masks[i];
186 }
187 else
188 {
189 for ( k = 0; k < 2*nWords; k++ )
190 if ( k & (1 << (i-5)) )
191 pTruth[k] = ~(unsigned)0;
192 else
193 pTruth[k] = 0;
194 }
195 }
196 return p;
197}
198static inline Vec_Wrd_t * Vec_WrdStartTruthTablesRev( int nVars )
199{
200 Vec_Wrd_t * p;
201 unsigned Masks[5] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 };
202 int i, k, nWords;
203 nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
204 p = Vec_WrdStart( nWords * nVars );
205 for ( i = 0; i < nVars; i++ )
206 {
207 unsigned * pTruth = (unsigned *)(p->pArray + nWords * (nVars-1-i));
208 if ( i < 5 )
209 {
210 for ( k = 0; k < 2*nWords; k++ )
211 pTruth[k] = Masks[i];
212 }
213 else
214 {
215 for ( k = 0; k < 2*nWords; k++ )
216 if ( k & (1 << (i-5)) )
217 pTruth[k] = ~(unsigned)0;
218 else
219 pTruth[k] = 0;
220 }
221 }
222 return p;
223}
224static inline Vec_Wrd_t * Vec_WrdStartTruthTables6( int nVars )
225{
226 word Masks[6] = {
227 ABC_CONST(0xAAAAAAAAAAAAAAAA),
228 ABC_CONST(0xCCCCCCCCCCCCCCCC),
229 ABC_CONST(0xF0F0F0F0F0F0F0F0),
230 ABC_CONST(0xFF00FF00FF00FF00),
231 ABC_CONST(0xFFFF0000FFFF0000),
232 ABC_CONST(0xFFFFFFFF00000000)
233 };
234 int i, k, nWords = nVars <= 6 ? 1 : (1 << (nVars - 6));
235 Vec_Wrd_t * p = Vec_WrdStart( nWords * nVars );
236 for ( i = 0; i < nVars; i++ )
237 {
238 word * pTruth = p->pArray + nWords * i;
239 if ( i < 6 )
240 {
241 for ( k = 0; k < nWords; k++ )
242 pTruth[k] = Masks[i];
243 }
244 else
245 {
246 for ( k = 0; k < nWords; k++ )
247 if ( k & (1 << (i-6)) )
248 pTruth[k] = ~(word)0;
249 else
250 pTruth[k] = 0;
251 }
252 }
253 return p;
254}
255static inline int Vec_WrdShiftOne( Vec_Wrd_t * p, int nWords )
256{
257 int i, nObjs = p->nSize/nWords;
258 assert( nObjs * nWords == p->nSize );
259 for ( i = 0; i < nObjs; i++ )
260 p->pArray[i*nWords] <<= 1;
261 return nObjs;
262}
263
275static inline Vec_Wrd_t * Vec_WrdAllocArray( word * pArray, int nSize )
276{
277 Vec_Wrd_t * p;
278 p = ABC_ALLOC( Vec_Wrd_t, 1 );
279 p->nSize = nSize;
280 p->nCap = nSize;
281 p->pArray = pArray;
282 return p;
283}
284
296static inline Vec_Wrd_t * Vec_WrdAllocArrayCopy( word * pArray, int nSize )
297{
298 Vec_Wrd_t * p;
299 p = ABC_ALLOC( Vec_Wrd_t, 1 );
300 p->nSize = nSize;
301 p->nCap = nSize;
302 p->pArray = ABC_ALLOC( word, nSize );
303 memcpy( p->pArray, pArray, sizeof(word) * (size_t)nSize );
304 return p;
305}
306
318static inline Vec_Wrd_t * Vec_WrdDup( Vec_Wrd_t * pVec )
319{
320 Vec_Wrd_t * p;
321 p = ABC_ALLOC( Vec_Wrd_t, 1 );
322 p->nSize = pVec->nSize;
323 p->nCap = pVec->nSize;
324 p->pArray = p->nCap? ABC_ALLOC( word, p->nCap ) : NULL;
325 memcpy( p->pArray, pVec->pArray, sizeof(word) * (size_t)pVec->nSize );
326 return p;
327}
328
340static inline Vec_Wrd_t * Vec_WrdDupArray( Vec_Wrd_t * pVec )
341{
342 Vec_Wrd_t * p;
343 p = ABC_ALLOC( Vec_Wrd_t, 1 );
344 p->nSize = pVec->nSize;
345 p->nCap = pVec->nCap;
346 p->pArray = pVec->pArray;
347 pVec->nSize = 0;
348 pVec->nCap = 0;
349 pVec->pArray = NULL;
350 return p;
351}
352
364static inline void Vec_WrdErase( Vec_Wrd_t * p )
365{
366 ABC_FREE( p->pArray );
367 p->nSize = 0;
368 p->nCap = 0;
369}
370static inline void Vec_WrdFree( Vec_Wrd_t * p )
371{
372 ABC_FREE( p->pArray );
373 ABC_FREE( p );
374}
375
387static inline void Vec_WrdFreeP( Vec_Wrd_t ** p )
388{
389 if ( *p == NULL )
390 return;
391 ABC_FREE( (*p)->pArray );
392 ABC_FREE( (*p) );
393}
394
406static inline word * Vec_WrdReleaseArray( Vec_Wrd_t * p )
407{
408 word * pArray = p->pArray;
409 p->nCap = 0;
410 p->nSize = 0;
411 p->pArray = NULL;
412 return pArray;
413}
414
426static inline word * Vec_WrdArray( Vec_Wrd_t * p )
427{
428 return p->pArray;
429}
430static inline word * Vec_WrdLimit( Vec_Wrd_t * p )
431{
432 return p->pArray + p->nSize;
433}
434
446static inline int Vec_WrdSize( Vec_Wrd_t * p )
447{
448 return p->nSize;
449}
450static inline int Vec_WrdChangeSize( Vec_Wrd_t * p, int Shift )
451{
452 return p->nSize += Shift;
453}
454
466static inline int Vec_WrdCap( Vec_Wrd_t * p )
467{
468 return p->nCap;
469}
470
482static inline double Vec_WrdMemory( Vec_Wrd_t * p )
483{
484 return !p ? 0.0 : 1.0 * sizeof(word) * (size_t)p->nCap + sizeof(Vec_Wrd_t);
485}
486
498static inline word Vec_WrdEntry( Vec_Wrd_t * p, int i )
499{
500 assert( i >= 0 && i < p->nSize );
501 return p->pArray[i];
502}
503
515static inline word * Vec_WrdEntryP( Vec_Wrd_t * p, int i )
516{
517 assert( i >= 0 && i < p->nSize );
518 return p->pArray + i;
519}
520
532static inline void Vec_WrdWriteEntry( Vec_Wrd_t * p, int i, word Entry )
533{
534 assert( i >= 0 && i < p->nSize );
535 p->pArray[i] = Entry;
536}
537
549static inline word Vec_WrdAddToEntry( Vec_Wrd_t * p, int i, word Addition )
550{
551 assert( i >= 0 && i < p->nSize );
552 return p->pArray[i] += Addition;
553}
554
566static inline word Vec_WrdEntryLast( Vec_Wrd_t * p )
567{
568 assert( p->nSize > 0 );
569 return p->pArray[p->nSize-1];
570}
571
583static inline void Vec_WrdGrow( Vec_Wrd_t * p, int nCapMin )
584{
585 if ( p->nCap >= nCapMin )
586 return;
587 assert( p->nCap < ABC_INT_MAX );
588 p->pArray = ABC_REALLOC( word, p->pArray, nCapMin );
589 assert( p->pArray );
590 p->nCap = nCapMin;
591}
592
604static inline void Vec_WrdFill( Vec_Wrd_t * p, int nSize, word Fill )
605{
606 int i;
607 Vec_WrdGrow( p, nSize );
608 for ( i = 0; i < nSize; i++ )
609 p->pArray[i] = Fill;
610 p->nSize = nSize;
611}
612
624static inline void Vec_WrdFillExtra( Vec_Wrd_t * p, int nSize, word Fill )
625{
626 int i;
627 if ( nSize <= p->nSize )
628 return;
629 if ( nSize > 2 * p->nCap )
630 Vec_WrdGrow( p, nSize );
631 else if ( nSize > p->nCap )
632 Vec_WrdGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
633 for ( i = p->nSize; i < nSize; i++ )
634 p->pArray[i] = Fill;
635 p->nSize = nSize;
636}
637
649static inline word Vec_WrdGetEntry( Vec_Wrd_t * p, int i )
650{
651 Vec_WrdFillExtra( p, i + 1, 0 );
652 return Vec_WrdEntry( p, i );
653}
654
666static inline word * Vec_WrdGetEntryP( Vec_Wrd_t * p, int i )
667{
668 Vec_WrdFillExtra( p, i + 1, 0 );
669 return Vec_WrdEntryP( p, i );
670}
671
683static inline void Vec_WrdSetEntry( Vec_Wrd_t * p, int i, word Entry )
684{
685 Vec_WrdFillExtra( p, i + 1, 0 );
686 Vec_WrdWriteEntry( p, i, Entry );
687}
688
700static inline void Vec_WrdShrink( Vec_Wrd_t * p, int nSizeNew )
701{
702 assert( p->nSize >= nSizeNew );
703 p->nSize = nSizeNew;
704}
705
717static inline void Vec_WrdClear( Vec_Wrd_t * p )
718{
719 p->nSize = 0;
720}
721
733static inline void Vec_WrdPush( Vec_Wrd_t * p, word Entry )
734{
735 if ( p->nSize == p->nCap )
736 {
737 if ( p->nCap < 16 )
738 Vec_WrdGrow( p, 16 );
739 else
740 Vec_WrdGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
741 }
742 p->pArray[p->nSize++] = Entry;
743}
744static inline void Vec_WrdPushTwo( Vec_Wrd_t * p, word Entry1, word Entry2 )
745{
746 Vec_WrdPush( p, Entry1 );
747 Vec_WrdPush( p, Entry2 );
748}
749static inline void Vec_WrdPushThree( Vec_Wrd_t * p, word Entry1, word Entry2, word Entry3 )
750{
751 Vec_WrdPush( p, Entry1 );
752 Vec_WrdPush( p, Entry2 );
753 Vec_WrdPush( p, Entry3 );
754}
755static inline void Vec_WrdPushFour( Vec_Wrd_t * p, word Entry1, word Entry2, word Entry3, word Entry4 )
756{
757 Vec_WrdPush( p, Entry1 );
758 Vec_WrdPush( p, Entry2 );
759 Vec_WrdPush( p, Entry3 );
760 Vec_WrdPush( p, Entry4 );
761}
762static inline void Vec_WrdPushArray( Vec_Wrd_t * p, word * pEntries, int nEntries )
763{
764 int i;
765 for ( i = 0; i < nEntries; i++ )
766 Vec_WrdPush( p, pEntries[i] );
767}
768
780static inline void Vec_WrdPushFirst( Vec_Wrd_t * p, word Entry )
781{
782 int i;
783 if ( p->nSize == p->nCap )
784 {
785 if ( p->nCap < 16 )
786 Vec_WrdGrow( p, 16 );
787 else
788 Vec_WrdGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
789 }
790 p->nSize++;
791 for ( i = p->nSize - 1; i >= 1; i-- )
792 p->pArray[i] = p->pArray[i-1];
793 p->pArray[0] = Entry;
794}
795
807static inline void Vec_WrdPushOrder( Vec_Wrd_t * p, word Entry )
808{
809 int i;
810 if ( p->nSize == p->nCap )
811 {
812 if ( p->nCap < 16 )
813 Vec_WrdGrow( p, 16 );
814 else
815 Vec_WrdGrow( p, p->nCap < ABC_INT_MAX/2 ? 2 * p->nCap : ABC_INT_MAX );
816 }
817 p->nSize++;
818 for ( i = p->nSize-2; i >= 0; i-- )
819 if ( p->pArray[i] > Entry )
820 p->pArray[i+1] = p->pArray[i];
821 else
822 break;
823 p->pArray[i+1] = Entry;
824}
825
837static inline int Vec_WrdPushUniqueOrder( Vec_Wrd_t * p, word Entry )
838{
839 int i;
840 for ( i = 0; i < p->nSize; i++ )
841 if ( p->pArray[i] == Entry )
842 return 1;
843 Vec_WrdPushOrder( p, Entry );
844 return 0;
845}
846
858static inline int Vec_WrdPushUnique( Vec_Wrd_t * p, word Entry )
859{
860 int i;
861 for ( i = 0; i < p->nSize; i++ )
862 if ( p->pArray[i] == Entry )
863 return 1;
864 Vec_WrdPush( p, Entry );
865 return 0;
866}
867
879static inline word * Vec_WrdFetch( Vec_Wrd_t * p, int nWords )
880{
881 if ( nWords == 0 )
882 return NULL;
883 assert( nWords > 0 );
884 p->nSize += nWords;
885 if ( p->nSize > p->nCap )
886 {
887// Vec_WrdGrow( p, 2 * p->nSize );
888 return NULL;
889 }
890 return p->pArray + p->nSize - nWords;
891}
892
904static inline word Vec_WrdPop( Vec_Wrd_t * p )
905{
906 assert( p->nSize > 0 );
907 return p->pArray[--p->nSize];
908}
909
921static inline int Vec_WrdFind( Vec_Wrd_t * p, word Entry )
922{
923 int i;
924 for ( i = 0; i < p->nSize; i++ )
925 if ( p->pArray[i] == Entry )
926 return i;
927 return -1;
928}
929
941static inline int Vec_WrdRemove( Vec_Wrd_t * p, word Entry )
942{
943 int i;
944 for ( i = 0; i < p->nSize; i++ )
945 if ( p->pArray[i] == Entry )
946 break;
947 if ( i == p->nSize )
948 return 0;
949 assert( i < p->nSize );
950 for ( i++; i < p->nSize; i++ )
951 p->pArray[i-1] = p->pArray[i];
952 p->nSize--;
953 return 1;
954}
955
967static inline void Vec_WrdInsert( Vec_Wrd_t * p, int iHere, word Entry )
968{
969 int i;
970 assert( iHere >= 0 && iHere < p->nSize );
971 Vec_WrdPush( p, 0 );
972 for ( i = p->nSize - 1; i > iHere; i-- )
973 p->pArray[i] = p->pArray[i-1];
974 p->pArray[i] = Entry;
975}
976static inline void Vec_WrdDrop( Vec_Wrd_t * p, int i )
977{
978 int k;
979 assert( i >= 0 && i < Vec_WrdSize(p) );
980 p->nSize--;
981 for ( k = i; k < p->nSize; k++ )
982 p->pArray[k] = p->pArray[k+1];
983}
984
996static inline word Vec_WrdFindMax( Vec_Wrd_t * p )
997{
998 word Best;
999 int i;
1000 if ( p->nSize == 0 )
1001 return 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];
1006 return Best;
1007}
1008
1020static inline word Vec_WrdFindMin( Vec_Wrd_t * p )
1021{
1022 word Best;
1023 int i;
1024 if ( p->nSize == 0 )
1025 return 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];
1030 return Best;
1031}
1032
1044static inline void Vec_WrdReverseOrder( Vec_Wrd_t * p )
1045{
1046 word Temp;
1047 int i;
1048 for ( i = 0; i < p->nSize/2; i++ )
1049 {
1050 Temp = p->pArray[i];
1051 p->pArray[i] = p->pArray[p->nSize-1-i];
1052 p->pArray[p->nSize-1-i] = Temp;
1053 }
1054}
1055
1067static inline Vec_Wrd_t * Vec_WrdInvert( Vec_Wrd_t * p, word Fill )
1068{
1069 int i;
1070 word Entry;
1071 Vec_Wrd_t * vRes = Vec_WrdAlloc( 0 );
1072 Vec_WrdFill( vRes, Vec_WrdFindMax(p) + 1, Fill );
1073 Vec_WrdForEachEntry( p, Entry, i )
1074 if ( Entry != Fill )
1075 Vec_WrdWriteEntry( vRes, Entry, i );
1076 return vRes;
1077}
1078
1090static inline word Vec_WrdSum( Vec_Wrd_t * p )
1091{
1092 word Counter = 0;
1093 int i;
1094 for ( i = 0; i < p->nSize; i++ )
1095 Counter += p->pArray[i];
1096 return Counter;
1097}
1098
1110static inline int Vec_WrdCountZero( Vec_Wrd_t * p )
1111{
1112 int i, Counter = 0;
1113 for ( i = 0; i < p->nSize; i++ )
1114 Counter += (p->pArray[i] == 0);
1115 return Counter;
1116}
1117
1129static inline int Vec_WrdEqual( Vec_Wrd_t * p1, Vec_Wrd_t * p2 )
1130{
1131 int i;
1132 if ( p1->nSize != p2->nSize )
1133 return 0;
1134 for ( i = 0; i < p1->nSize; i++ )
1135 if ( p1->pArray[i] != p2->pArray[i] )
1136 return 0;
1137 return 1;
1138}
1139
1151static inline int Vec_WrdCountCommon( Vec_Wrd_t * p1, Vec_Wrd_t * p2 )
1152{
1153 Vec_Wrd_t * vTemp;
1154 word Entry;
1155 int i, Counter = 0;
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) );
1161 Vec_WrdForEachEntry( p1, Entry, i )
1162 if ( Vec_WrdEntry(vTemp, Entry) != ~((word)0) )
1163 Counter++;
1164 Vec_WrdFree( vTemp );
1165 return Counter;
1166}
1167
1179static int Vec_WrdSortCompare1( word * pp1, word * pp2 )
1180{
1181 // for some reason commenting out lines (as shown) led to crashing of the release version
1182 if ( *pp1 < *pp2 )
1183 return -1;
1184 if ( *pp1 > *pp2 ) //
1185 return 1;
1186 return 0; //
1187}
1188
1200static int Vec_WrdSortCompare2( word * pp1, word * pp2 )
1201{
1202 // for some reason commenting out lines (as shown) led to crashing of the release version
1203 if ( *pp1 > *pp2 )
1204 return -1;
1205 if ( *pp1 < *pp2 ) //
1206 return 1;
1207 return 0; //
1208}
1209
1221static inline void Vec_WrdSort( Vec_Wrd_t * p, int fReverse )
1222{
1223 if ( fReverse )
1224 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(word),
1225 (int (*)(const void *, const void *)) Vec_WrdSortCompare2 );
1226 else
1227 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(word),
1228 (int (*)(const void *, const void *)) Vec_WrdSortCompare1 );
1229}
1230
1242static inline void Vec_WrdUniqify( Vec_Wrd_t * p )
1243{
1244 int i, k;
1245 if ( p->nSize < 2 )
1246 return;
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];
1251 p->nSize = k;
1252}
1253static inline int Vec_WrdUniqueCount( Vec_Wrd_t * vData, int nWordSize, Vec_Int_t ** pvMap )
1254{
1255 int Result;
1256 Vec_Int_t * vDataInt = (Vec_Int_t *)vData;
1257 vDataInt->nSize *= 2;
1258 vDataInt->nCap *= 2;
1259 Result = Vec_IntUniqueCount( vDataInt, 2 * nWordSize, pvMap );
1260 vDataInt->nSize /= 2;
1261 vDataInt->nCap /= 2;
1262 return Result;
1263}
1264static inline Vec_Wrd_t * Vec_WrdUniqifyHash( Vec_Wrd_t * vData, int nWordSize )
1265{
1266 Vec_Int_t * vResInt;
1267 Vec_Int_t * vDataInt = (Vec_Int_t *)vData;
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;
1274 vResInt->nCap /= 2;
1275 return (Vec_Wrd_t *)vResInt;
1276}
1277
1289static inline int Vec_WrdTwoCountCommon( Vec_Wrd_t * vArr1, Vec_Wrd_t * vArr2 )
1290{
1291 word * pBeg1 = vArr1->pArray;
1292 word * pBeg2 = vArr2->pArray;
1293 word * pEnd1 = vArr1->pArray + vArr1->nSize;
1294 word * pEnd2 = vArr2->pArray + vArr2->nSize;
1295 int Counter = 0;
1296 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1297 {
1298 if ( *pBeg1 == *pBeg2 )
1299 pBeg1++, pBeg2++, Counter++;
1300 else if ( *pBeg1 < *pBeg2 )
1301 pBeg1++;
1302 else
1303 pBeg2++;
1304 }
1305 return Counter;
1306}
1307
1319static int Vec_WrdSortCompareUnsigned( word * pp1, word * pp2 )
1320{
1321 if ( *pp1 < *pp2 )
1322 return -1;
1323 if ( *pp1 > *pp2 )
1324 return 1;
1325 return 0;
1326}
1327
1339static inline void Vec_WrdSortUnsigned( Vec_Wrd_t * p )
1340{
1341 qsort( (void *)p->pArray, (size_t)p->nSize, sizeof(word),
1342 (int (*)(const void *, const void *)) Vec_WrdSortCompareUnsigned );
1343}
1344
1345
1357static inline void Vec_WrdAppend( Vec_Wrd_t * vVec1, Vec_Wrd_t * vVec2 )
1358{
1359 word Entry; int i;
1360 Vec_WrdForEachEntry( vVec2, Entry, i )
1361 Vec_WrdPush( vVec1, Entry );
1362}
1363
1375static inline void Vec_WrdDumpBoolOne( FILE * pFile, word * pSim, int nBits, int fReverse )
1376{
1377 int k;
1378 if ( fReverse )
1379 for ( k = nBits-1; k >= 0; k-- )
1380 fprintf( pFile, "%d", (int)((pSim[k/64] >> (k%64)) & 1) );
1381 else
1382 for ( k = 0; k < nBits; k++ )
1383 fprintf( pFile, "%d", (int)((pSim[k/64] >> (k%64)) & 1) );
1384 fprintf( pFile, "\n" );
1385}
1386static inline void Vec_WrdDumpBool( char * pFileName, Vec_Wrd_t * p, int nWords, int nBits, int fReverse, int fVerbose )
1387{
1388 int i, nNodes = Vec_WrdSize(p) / nWords;
1389 FILE * pFile = fopen( pFileName, "wb" );
1390 if ( pFile == NULL )
1391 {
1392 printf( "Cannot open file \"%s\" for writing.\n", pFileName );
1393 return;
1394 }
1395 assert( Vec_WrdSize(p) % nWords == 0 );
1396 for ( i = 0; i < nNodes; i++ )
1397 Vec_WrdDumpBoolOne( pFile, Vec_WrdEntryP(p, i*nWords), nBits, fReverse );
1398 fclose( pFile );
1399 if ( fVerbose )
1400 printf( "Written %d bits of simulation data for %d objects into file \"%s\".\n", nBits, Vec_WrdSize(p)/nWords, pFileName );
1401}
1402
1414static inline void Vec_WrdPrintBin( Vec_Wrd_t * p, int nWords )
1415{
1416 int i, k, nNodes = Vec_WrdSize(p) / nWords;
1417 assert( Vec_WrdSize(p) % nWords == 0 );
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) );
1422}
1423
1435static inline void Vec_WrdDumpHexOne( FILE * pFile, word * pSim, int nWords )
1436{
1437 int k, Digit, nDigits = nWords*16;
1438 for ( k = 0; k < nDigits; k++ )
1439 {
1440 Digit = (int)((pSim[k/16] >> ((k%16) * 4)) & 15);
1441 if ( Digit < 10 )
1442 fprintf( pFile, "%d", Digit );
1443 else
1444 fprintf( pFile, "%c", 'A' + Digit-10 );
1445 }
1446 fprintf( pFile, "\n" );
1447}
1448static inline void Vec_WrdPrintHex( Vec_Wrd_t * p, int nWords )
1449{
1450 int i, nNodes = Vec_WrdSize(p) / nWords;
1451 assert( Vec_WrdSize(p) % nWords == 0 );
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 );
1455}
1456static inline void Vec_WrdDumpHex( char * pFileName, Vec_Wrd_t * p, int nWords, int fVerbose )
1457{
1458 int i, nNodes = Vec_WrdSize(p) / nWords;
1459 FILE * pFile = fopen( pFileName, "wb" );
1460 if ( pFile == NULL )
1461 {
1462 printf( "Cannot open file \"%s\" for writing.\n", pFileName );
1463 return;
1464 }
1465 assert( Vec_WrdSize(p) % nWords == 0 );
1466 for ( i = 0; i < nNodes; i++ )
1467 Vec_WrdDumpHexOne( pFile, Vec_WrdEntryP(p, i*nWords), nWords );
1468 fclose( pFile );
1469 if ( fVerbose )
1470 printf( "Written %d words of simulation data for %d objects into file \"%s\".\n", nWords, Vec_WrdSize(p)/nWords, pFileName );
1471}
1472static inline int Vec_WrdReadHexOne( char c )
1473{
1474 int Digit = 0;
1475 if ( c >= '0' && c <= '9' )
1476 Digit = c - '0';
1477 else if ( c >= 'A' && c <= 'F' )
1478 Digit = c - 'A' + 10;
1479 else if ( c >= 'a' && c <= 'f' )
1480 Digit = c - 'a' + 10;
1481 else assert( 0 );
1482 assert( Digit >= 0 && Digit < 16 );
1483 return Digit;
1484}
1485static inline Vec_Wrd_t * Vec_WrdReadHex( char * pFileName, int * pnWords, int fVerbose )
1486{
1487 Vec_Wrd_t * p = NULL;
1488 int c, nWords = -1, nChars = 0; word Num = 0;
1489 FILE * pFile = fopen( pFileName, "rb" );
1490 if ( pFile == NULL )
1491 {
1492 printf( "Cannot open file \"%s\" for reading.\n", pFileName );
1493 return NULL;
1494 }
1495 p = Vec_WrdAlloc( 1000 );
1496 while ( (c = fgetc(pFile)) != EOF )
1497 {
1498 if ( c == '\r' || c == '\t' || c == ' ' )
1499 continue;
1500 if ( c == '\n' )
1501 {
1502 if ( nChars > 0 )
1503 {
1504 Vec_WrdPush( p, Num );
1505 nChars = 0;
1506 Num = 0;
1507 }
1508 if ( nWords == -1 && Vec_WrdSize(p) > 0 )
1509 nWords = Vec_WrdSize(p);
1510 continue;
1511 }
1512 Num |= (word)Vec_WrdReadHexOne((char)c) << (nChars * 4);
1513 if ( ++nChars < 16 )
1514 continue;
1515 Vec_WrdPush( p, Num );
1516 nChars = 0;
1517 Num = 0;
1518 }
1519 assert( Vec_WrdSize(p) % nWords == 0 );
1520 fclose( pFile );
1521 if ( pnWords )
1522 *pnWords = nWords;
1523 if ( fVerbose )
1524 printf( "Read %d words of simulation data for %d objects.\n", nWords, Vec_WrdSize(p)/nWords );
1525 return p;
1526}
1527
1539static inline void Vec_WrdDumpBin( char * pFileName, Vec_Wrd_t * p, int fVerbose )
1540{
1541 int RetValue;
1542 FILE * pFile = fopen( pFileName, "wb" );
1543 if ( pFile == NULL )
1544 {
1545 printf( "Cannot open file \"%s\" for writing.\n", pFileName );
1546 return;
1547 }
1548 RetValue = fwrite( Vec_WrdArray(p), 1, 8*Vec_WrdSize(p), pFile );
1549 fclose( pFile );
1550 if ( RetValue != 8*Vec_WrdSize(p) )
1551 printf( "Error reading data from file.\n" );
1552 if ( fVerbose )
1553 printf( "Written %d words of simulation data into file \"%s\".\n", Vec_WrdSize(p), pFileName );
1554}
1555static inline Vec_Wrd_t * Vec_WrdReadBin( char * pFileName, int fVerbose )
1556{
1557 Vec_Wrd_t * p = NULL; int nSize, RetValue;
1558 FILE * pFile = fopen( pFileName, "rb" );
1559 if ( pFile == NULL )
1560 {
1561 printf( "Cannot open file \"%s\" for reading.\n", pFileName );
1562 return NULL;
1563 }
1564 fseek( pFile, 0, SEEK_END );
1565 nSize = ftell( pFile );
1566 if ( nSize == 0 )
1567 {
1568 printf( "The input file is empty.\n" );
1569 fclose( pFile );
1570 return NULL;
1571 }
1572 if ( nSize % 8 > 0 )
1573 {
1574 printf( "Cannot read file with simulation data that is not aligned at 8 bytes (remainder = %d).\n", nSize % 8 );
1575 fclose( pFile );
1576 return NULL;
1577 }
1578 rewind( pFile );
1579 p = Vec_WrdStart( nSize/8 );
1580 RetValue = fread( Vec_WrdArray(p), 1, nSize, pFile );
1581 fclose( pFile );
1582 if ( RetValue != nSize )
1583 printf( "Error reading data from file.\n" );
1584 if ( fVerbose )
1585 printf( "Read %d words of simulation data from file \"%s\".\n", nSize/8, pFileName );
1586 return p;
1587}
1588
1590
1591#endif
1592
1596
int nWords
Definition abcNpn.c:127
word Abc_RandomW(int fReset)
Definition utilSort.c:1022
#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_CONST(number)
PARAMETERS ///.
Definition abc_global.h:240
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
int nCap
Definition vecWrd.h:45
int nSize
Definition vecWrd.h:46
word * pArray
Definition vecWrd.h:47
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
VOID_HACK rewind()
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecWrd.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42
#define SEEK_END
Definition zconf.h:392