ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
acecRe.c
Go to the documentation of this file.
1
20
21#include "acecInt.h"
22#include "misc/vec/vecHash.h"
23#include "misc/util/utilTruth.h"
24
26
27
31
32#define Ree_ForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )
33
37
50{
51 word Truths[8] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
52 word Truth;
53 int i;
54 for ( i = 0; i < 8; i++ )
55 {
56 Truth = Truths[i];
57 Truth = Abc_Tt6SwapAdjacent( Truth, 1 );
58 Abc_TtPrintHexRev( stdout, &Truth, 3 );
59 printf( "\n" );
60 }
61 printf( "\n" );
62 for ( i = 0; i < 8; i++ )
63 {
64 Truth = Truths[i];
65 Truth = Abc_Tt6SwapAdjacent( Truth, 1 );
66 Truth = Abc_Tt6SwapAdjacent( Truth, 0 );
67 Abc_TtPrintHexRev( stdout, &Truth, 3 );
68 printf( "\n" );
69 }
70 printf( "\n" );
71}
73{
74 int i, b;
75 for ( i = 0; i < 8; i++ )
76 {
77 word Truth = 0xE8;
78 for ( b = 0; b < 3; b++ )
79 if ( (i >> b) & 1 )
80 Truth = Abc_Tt6Flip( Truth, b );
81 printf( "%d = %X\n", i, 0xFF & (int)Truth );
82 }
83}
84
96static inline int Ree_ManCutMergeOne( int * pCut0, int * pCut1, int * pCut )
97{
98 int i, k;
99 for ( k = 0; k <= pCut1[0]; k++ )
100 pCut[k] = pCut1[k];
101 for ( i = 1; i <= pCut0[0]; i++ )
102 {
103 for ( k = 1; k <= pCut1[0]; k++ )
104 if ( pCut0[i] == pCut1[k] )
105 break;
106 if ( k <= pCut1[0] )
107 continue;
108 if ( pCut[0] == 3 )
109 return 0;
110 pCut[1+pCut[0]++] = pCut0[i];
111 }
112 assert( pCut[0] == 2 || pCut[0] == 3 );
113 if ( pCut[1] > pCut[2] )
114 ABC_SWAP( int, pCut[1], pCut[2] );
115 assert( pCut[1] < pCut[2] );
116 if ( pCut[0] == 2 )
117 return 1;
118 if ( pCut[2] > pCut[3] )
119 ABC_SWAP( int, pCut[2], pCut[3] );
120 if ( pCut[1] > pCut[2] )
121 ABC_SWAP( int, pCut[1], pCut[2] );
122 assert( pCut[1] < pCut[2] );
123 assert( pCut[2] < pCut[3] );
124 return 1;
125}
126static inline int Ree_ManCutCheckEqual( Vec_Int_t * vCuts, int * pCutNew )
127{
128 int * pList = Vec_IntArray( vCuts );
129 int i, k, * pCut;
130 Ree_ForEachCut( pList, pCut, i )
131 {
132 for ( k = 0; k <= pCut[0]; k++ )
133 if ( pCut[k] != pCutNew[k] )
134 break;
135 if ( k > pCut[0] )
136 return 1;
137 }
138 return 0;
139}
140static inline int Ree_ManCutFind( int iObj, int * pCut )
141{
142 if ( pCut[1] == iObj ) return 0;
143 if ( pCut[2] == iObj ) return 1;
144 if ( pCut[3] == iObj ) return 2;
145 assert( 0 );
146 return -1;
147}
148static inline int Ree_ManCutNotFind( int iObj1, int iObj2, int * pCut )
149{
150 assert( pCut[0] == 3 );
151 if ( pCut[3] != iObj1 && pCut[3] != iObj2 ) return 0;
152 if ( pCut[2] != iObj1 && pCut[2] != iObj2 ) return 1;
153 if ( pCut[1] != iObj1 && pCut[1] != iObj2 ) return 2;
154 assert( 0 );
155 return -1;
156}
157static inline int Ree_ManCutTruthOne( int * pCut0, int * pCut )
158{
159 int Truth0 = pCut0[pCut0[0]+1];
160 int fComp0 = (Truth0 >> 7) & 1;
161 if ( pCut0[0] == 3 )
162 return Truth0;
163 Truth0 = fComp0 ? ~Truth0 : Truth0;
164 if ( pCut0[0] == 2 )
165 {
166 if ( pCut[0] == 3 )
167 {
168 int Truths[3][8] = {
169 { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, // {0,1,-}
170 { 0x00, 0x05, 0x0A, 0x0F, 0x50, 0x55, 0x5A, 0x5F }, // {0,-,1}
171 { 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F } // {-,0,1}
172 };
173 int Truth = Truths[Ree_ManCutNotFind(pCut0[1], pCut0[2], pCut)][Truth0 & 0x7];
174 return 0xFF & (fComp0 ? ~Truth : Truth);
175 }
176 assert( pCut[0] == 2 );
177 assert( pCut[1] == pCut0[1] && pCut[2] == pCut0[2] );
178 return pCut0[pCut0[0]+1];
179 }
180 if ( pCut0[0] == 1 )
181 {
182 int Truths[3] = { 0x55, 0x33, 0x0F };
183 int Truth = Truths[Ree_ManCutFind(pCut0[1], pCut)];
184 return 0xFF & (fComp0 ? ~Truth : Truth);
185 }
186 assert( 0 );
187 return -1;
188}
189static inline int Ree_ManCutTruth( Gia_Obj_t * pObj, int * pCut0, int * pCut1, int * pCut )
190{
191 int Truth0 = Ree_ManCutTruthOne( pCut0, pCut );
192 int Truth1 = Ree_ManCutTruthOne( pCut1, pCut );
193 Truth0 = Gia_ObjFaninC0(pObj) ? ~Truth0 : Truth0;
194 Truth1 = Gia_ObjFaninC1(pObj) ? ~Truth1 : Truth1;
195 return 0xFF & (Gia_ObjIsXor(pObj) ? Truth0 ^ Truth1 : Truth0 & Truth1);
196}
197
198#if 0
199
200int Ree_ObjComputeTruth_rec( Gia_Obj_t * pObj )
201{
202 int Truth0, Truth1;
203 if ( pObj->Value )
204 return pObj->Value;
205 assert( Gia_ObjIsAnd(pObj) );
206 Truth0 = Ree_ObjComputeTruth_rec( Gia_ObjFanin0(pObj) );
207 Truth1 = Ree_ObjComputeTruth_rec( Gia_ObjFanin1(pObj) );
208 if ( Gia_ObjIsXor(pObj) )
209 return (pObj->Value = (Gia_ObjFaninC0(pObj) ? ~Truth0 : Truth0) ^ (Gia_ObjFaninC1(pObj) ? ~Truth1 : Truth1));
210 else
211 return (pObj->Value = (Gia_ObjFaninC0(pObj) ? ~Truth0 : Truth0) & (Gia_ObjFaninC1(pObj) ? ~Truth1 : Truth1));
212}
213void Ree_ObjCleanTruth_rec( Gia_Obj_t * pObj )
214{
215 if ( !pObj->Value )
216 return;
217 pObj->Value = 0;
218 if ( !Gia_ObjIsAnd(pObj) )
219 return;
220 Ree_ObjCleanTruth_rec( Gia_ObjFanin0(pObj) );
221 Ree_ObjCleanTruth_rec( Gia_ObjFanin1(pObj) );
222}
223int Ree_ObjComputeTruth( Gia_Man_t * p, int iObj, int * pCut )
224{
225 unsigned Truth, Truths[3] = { 0xAA, 0xCC, 0xF0 }; int i;
226 for ( i = 1; i <= pCut[0]; i++ )
227 Gia_ManObj(p, pCut[i])->Value = Truths[i-1];
228 Truth = 0xFF & Ree_ObjComputeTruth_rec( Gia_ManObj(p, iObj) );
229 Ree_ObjCleanTruth_rec( Gia_ManObj(p, iObj) );
230 return Truth;
231}
232
233#endif
234
246void Ree_ManCutPrint( int * pCut, int Count, word Truth, int iObj )
247{
248 int c;
249 printf( "%d : %d : ", Count, iObj );
250 for ( c = 1; c <= pCut[0]; c++ )
251 printf( "%3d ", pCut[c] );
252 for ( ; c <= 4; c++ )
253 printf( " " );
254 printf( "0x" );
255 Abc_TtPrintHexRev( stdout, &Truth, 3 );
256 printf( "\n" );
257}
258void Ree_ManCutMerge( Gia_Man_t * p, int iObj, int * pList0, int * pList1, Vec_Int_t * vCuts, Hash_IntMan_t * pHash, Vec_Int_t * vData, Vec_Int_t * vXors )
259{
260 int fVerbose = 0;
261 int i, k, c, Value, Truth, TruthC, * pCut0, * pCut1, pCut[6], Count = 0;
262 int iXor2 = -1, iXor3 = -1;
263 if ( fVerbose )
264 printf( "Object %d\n", iObj );
265 Vec_IntFill( vCuts, 2, 1 );
266 Vec_IntPush( vCuts, iObj );
267 Vec_IntPush( vCuts, 0xAA );
268 Ree_ForEachCut( pList0, pCut0, i )
269 Ree_ForEachCut( pList1, pCut1, k )
270 {
271 if ( !Ree_ManCutMergeOne(pCut0, pCut1, pCut) )
272 continue;
273 if ( Ree_ManCutCheckEqual(vCuts, pCut) )
274 continue;
275 Truth = TruthC = Ree_ManCutTruth(Gia_ManObj(p, iObj), pCut0, pCut1, pCut);
276 //assert( Truth == Ree_ObjComputeTruth(p, iObj, pCut) );
277 if ( Truth & 0x80 )
278 Truth = 0xFF & ~Truth;
279 if ( Truth == 0x66 && iXor2 == -1 )
280 iXor2 = Vec_IntSize(vCuts);
281 else if ( Truth == 0x69 && iXor3 == -1 )
282 iXor3 = Vec_IntSize(vCuts);
283 Vec_IntAddToEntry( vCuts, 0, 1 );
284 for ( c = 0; c <= pCut[0]; c++ )
285 Vec_IntPush( vCuts, pCut[c] );
286 Vec_IntPush( vCuts, TruthC );
287 if ( (Truth == 0x66 || Truth == 0x11 || Truth == 0x22 || Truth == 0x44 || Truth == 0x77) && pCut[0] == 2 )
288 {
289 assert( pCut[0] == 2 );
290 Value = Hsh_Int3ManInsert( pHash, pCut[1], pCut[2], 0 );
291 Vec_IntPushThree( vData, iObj, Value, TruthC );
292 }
293 else if ( Truth == 0x69 || Truth == 0x17 || Truth == 0x2B || Truth == 0x4D || Truth == 0x71 )
294 {
295 assert( pCut[0] == 3 );
296 Value = Hsh_Int3ManInsert( pHash, pCut[1], pCut[2], pCut[3] );
297 Vec_IntPushThree( vData, iObj, Value, TruthC );
298 }
299 if ( fVerbose )
300 Ree_ManCutPrint( pCut, ++Count, TruthC, iObj );
301 }
302 if ( !vXors )
303 return;
304 if ( iXor2 > 0 )
305 pCut0 = Vec_IntEntryP( vCuts, iXor2 );
306 else if ( iXor3 > 0 )
307 pCut0 = Vec_IntEntryP( vCuts, iXor3 );
308 else
309 return;
310 Vec_IntPush( vXors, iObj );
311 for ( c = 1; c <= pCut0[0]; c++ )
312 Vec_IntPush( vXors, pCut0[c] );
313 if ( pCut0[0] == 2 )
314 Vec_IntPush( vXors, 0 );
315}
316
329{
330 int i, j, k, iObj, iObj2, Value, Truth, Truth2, CountX, CountM, Index = 0;
331 int nEntries = Hash_IntManEntryNum(p);
332 Vec_Int_t * vAdds = Vec_IntAlloc( 1000 );
333 Vec_Int_t * vXors = Vec_IntStart( nEntries + 1 );
334 Vec_Int_t * vMajs = Vec_IntStart( nEntries + 1 );
335 Vec_Int_t * vIndex = Vec_IntStartFull( nEntries + 1 );
336 Vec_Int_t * vIndexRev = Vec_IntAlloc( 1000 );
337 Vec_Wec_t * vXorMap, * vMajMap;
338 Vec_IntForEachEntryTriple( vData, iObj, Value, Truth, i )
339 {
340 assert( Value <= nEntries );
341 if ( Truth == 0x66 || Truth == 0x99 || Truth == 0x69 || Truth == 0x96 )
342 Vec_IntAddToEntry( vXors, Value, 1 );
343 else
344 Vec_IntAddToEntry( vMajs, Value, 1 );
345 }
346 // remap these into indexes
347 Vec_IntForEachEntryTwo( vXors, vMajs, CountX, CountM, i )
348 if ( CountX && CountM )
349 {
350 Vec_IntPush( vIndexRev, i );
351 Vec_IntWriteEntry( vIndex, i, Index++ );
352 }
353 Vec_IntFree( vXors );
354 Vec_IntFree( vMajs );
355 //if ( fVerbose )
356 // printf( "Detected %d shared cuts among %d hashed cuts.\n", Index, nEntries );
357 // collect nodes
358 vXorMap = Vec_WecStart( Index );
359 vMajMap = Vec_WecStart( Index );
360 Vec_IntForEachEntryTriple( vData, iObj, Value, Truth, i )
361 {
362 Index = Vec_IntEntry( vIndex, Value );
363 if ( Index == -1 )
364 continue;
365 if ( Truth == 0x66 || Truth == 0x99 || Truth == 0x69 || Truth == 0x96 )
366 Vec_IntPushTwo( Vec_WecEntry(vXorMap, Index), iObj, Truth );
367 else
368 Vec_IntPushTwo( Vec_WecEntry(vMajMap, Index), iObj, Truth );
369 }
370 Vec_IntFree( vIndex );
371 // create pairs
372 Vec_IntForEachEntry( vIndexRev, Value, i )
373 {
374 Vec_Int_t * vXorOne = Vec_WecEntry( vXorMap, i );
375 Vec_Int_t * vMajOne = Vec_WecEntry( vMajMap, i );
376 Hash_IntObj_t * pObj = Hash_IntObj( p, Value );
377 Vec_IntForEachEntryDouble( vXorOne, iObj, Truth, j )
378 Vec_IntForEachEntryDouble( vMajOne, iObj2, Truth2, k )
379 {
380 int SignAnd[8] = {0x88, 0x44, 0x22, 0x11, 0x77, 0xBB, 0xDD, 0xEE};
381 int SignMaj[8] = {0xE8, 0xD4, 0xB2, 0x71, 0x8E, 0x4D, 0x2B, 0x17};
382 int n, SignXor = (Truth == 0x99 || Truth == 0x69) << 3;
383 for ( n = 0; n < 8; n++ )
384 if ( Truth2 == SignMaj[n] )
385 break;
386 if ( n == 8 )
387 for ( n = 0; n < 8; n++ )
388 if ( Truth2 == SignAnd[n] )
389 break;
390 assert( n < 8 );
391 Vec_IntPushThree( vAdds, pObj->iData0, pObj->iData1, pObj->iData2 );
392 Vec_IntPushThree( vAdds, iObj, iObj2, SignXor | n );
393 }
394 }
395 Vec_IntFree( vIndexRev );
396 Vec_WecFree( vXorMap );
397 Vec_WecFree( vMajMap );
398 return vAdds;
399}
400int Ree_ManCompare( int * pCut0, int * pCut1 )
401{
402 if ( pCut0[3] < pCut1[3] ) return -1;
403 if ( pCut0[3] > pCut1[3] ) return 1;
404 if ( pCut0[4] < pCut1[4] ) return -1;
405 if ( pCut0[4] > pCut1[4] ) return 1;
406 return 0;
407}
408Vec_Int_t * Ree_ManComputeCuts( Gia_Man_t * p, Vec_Int_t ** pvXors, int fVerbose )
409{
410 extern void Ree_ManRemoveTrivial( Gia_Man_t * p, Vec_Int_t * vAdds );
411 extern void Ree_ManRemoveContained( Gia_Man_t * p, Vec_Int_t * vAdds );
412 Gia_Obj_t * pObj;
413 int * pList0, * pList1, i, nCuts = 0;
414 Hash_IntMan_t * pHash = Hash_IntManStart( 1000 );
415 Vec_Int_t * vAdds;
416 Vec_Int_t * vTemp = Vec_IntAlloc( 1000 );
417 Vec_Int_t * vData = Vec_IntAlloc( 1000 );
418 Vec_Int_t * vCuts = Vec_IntAlloc( 30 * Gia_ManAndNum(p) );
419 Vec_IntFill( vCuts, Gia_ManObjNum(p), 0 );
421 Gia_ManForEachCi( p, pObj, i )
422 {
423 Vec_IntWriteEntry( vCuts, Gia_ObjId(p, pObj), Vec_IntSize(vCuts) );
424 Vec_IntPush( vCuts, 1 );
425 Vec_IntPush( vCuts, 1 );
426 Vec_IntPush( vCuts, Gia_ObjId(p, pObj) );
427 Vec_IntPush( vCuts, 0xAA );
428 }
429 if ( pvXors ) *pvXors = Vec_IntAlloc( 1000 );
430 Gia_ManForEachAnd( p, pObj, i )
431 {
432 pList0 = Vec_IntEntryP( vCuts, Vec_IntEntry(vCuts, Gia_ObjFaninId0(pObj, i)) );
433 pList1 = Vec_IntEntryP( vCuts, Vec_IntEntry(vCuts, Gia_ObjFaninId1(pObj, i)) );
434 Ree_ManCutMerge( p, i, pList0, pList1, vTemp, pHash, vData, pvXors ? *pvXors : NULL );
435 Vec_IntWriteEntry( vCuts, i, Vec_IntSize(vCuts) );
436 Vec_IntAppend( vCuts, vTemp );
437 nCuts += Vec_IntEntry( vTemp, 0 );
438 }
439 if ( fVerbose )
440 printf( "AIG nodes = %d. Cuts = %d. Cuts/Node = %.2f. Ints/Node = %.2f.\n",
441 Gia_ManAndNum(p), nCuts, 1.0*nCuts/Gia_ManAndNum(p), 1.0*Vec_IntSize(vCuts)/Gia_ManAndNum(p) );
442 Vec_IntFree( vTemp );
443 Vec_IntFree( vCuts );
444 vAdds = Ree_ManDeriveAdds( pHash, vData, fVerbose );
445 qsort( Vec_IntArray(vAdds), (size_t)(Vec_IntSize(vAdds)/6), 24, (int (*)(const void *, const void *))Ree_ManCompare );
446 if ( fVerbose )
447 printf( "Adders = %d. Total cuts = %d. Hashed cuts = %d. Hashed/Adders = %.2f.\n",
448 Vec_IntSize(vAdds)/6, Vec_IntSize(vData)/3, Hash_IntManEntryNum(pHash), 6.0*Hash_IntManEntryNum(pHash)/Vec_IntSize(vAdds) );
449 Vec_IntFree( vData );
450 Hash_IntManStop( pHash );
451 Ree_ManRemoveTrivial( p, vAdds );
452 Ree_ManRemoveContained( p, vAdds );
453 //Ree_ManPrintAdders( vAdds, 1 );
454 return vAdds;
455}
456
468void Ree_CollectInsiders_rec( Gia_Man_t * pGia, int iObj, Vec_Bit_t * vVisited, Vec_Bit_t * vInsiders )
469{
470 if ( Vec_BitEntry(vVisited, iObj) )
471 return;
472 Vec_BitSetEntry( vVisited, iObj, 1 );
473 Ree_CollectInsiders_rec( pGia, Gia_ObjFaninId0p(pGia, Gia_ManObj(pGia, iObj)), vVisited, vInsiders );
474 Ree_CollectInsiders_rec( pGia, Gia_ObjFaninId1p(pGia, Gia_ManObj(pGia, iObj)), vVisited, vInsiders );
475 Vec_BitSetEntry( vInsiders, iObj, 1 );
476}
478{
479 Vec_Bit_t * vVisited = Vec_BitStart( Gia_ManObjNum(pGia) );
480 Vec_Bit_t * vInsiders = Vec_BitStart( Gia_ManObjNum(pGia) );
481 int i, Entry1, Entry2, Entry3;
482 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
483 {
484 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 ) // HADD
485 continue;
486 // mark inputs
487 Entry1 = Vec_IntEntry( vAdds, 6*i + 0 );
488 Entry2 = Vec_IntEntry( vAdds, 6*i + 1 );
489 Entry3 = Vec_IntEntry( vAdds, 6*i + 2 );
490 Vec_BitWriteEntry( vVisited, Entry1, 1 );
491 Vec_BitWriteEntry( vVisited, Entry2, 1 );
492 Vec_BitWriteEntry( vVisited, Entry3, 1 );
493 // traverse from outputs
494 Entry1 = Vec_IntEntry( vAdds, 6*i + 3 );
495 Entry2 = Vec_IntEntry( vAdds, 6*i + 4 );
496 Ree_CollectInsiders_rec( pGia, Entry1, vVisited, vInsiders );
497 Ree_CollectInsiders_rec( pGia, Entry2, vVisited, vInsiders );
498 }
499 Vec_BitFree( vVisited );
500 return vInsiders;
501}
502
514// removes HAs whose AND2 is part of XOR2 without additional fanout
516{
517 Gia_Obj_t * pObjX, * pObjM;
518 int i, k = 0;
519 ABC_FREE( p->pRefs );
521 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
522 {
523 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 ) // HADD
524 {
525 pObjX = Gia_ManObj( p, Vec_IntEntry(vAdds, 6*i+3) );
526 pObjM = Gia_ManObj( p, Vec_IntEntry(vAdds, 6*i+4) );
527 // rule out if MAJ is a fanout of XOR
528 //if ( pObjX == Gia_ObjFanin0(pObjM) || pObjX == Gia_ObjFanin1(pObjM) )
529 // continue;
530 // rule out if MAJ is a fanin of XOR and has no other fanouts
531 if ( (pObjM == Gia_ObjFanin0(pObjX) || pObjM == Gia_ObjFanin1(pObjX)) && Gia_ObjRefNum(p, pObjM) == 1 )
532 continue;
533 }
534 memmove( Vec_IntArray(vAdds) + 6*k++, Vec_IntArray(vAdds) + 6*i, 6*sizeof(int) );
535 }
536 assert( k <= i );
537 Vec_IntShrink( vAdds, 6*k );
538}
539// removes HAs fully contained inside FAs
541{
542 Vec_Bit_t * vInsiders = Ree_CollectInsiders( p, vAdds );
543 int i, k = 0;
544 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
545 {
546 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 ) // HADD
547 if ( Vec_BitEntry(vInsiders, Vec_IntEntry(vAdds, 6*i+3)) && Vec_BitEntry(vInsiders, Vec_IntEntry(vAdds, 6*i+4)) )
548 continue;
549 memmove( Vec_IntArray(vAdds) + 6*k++, Vec_IntArray(vAdds) + 6*i, 6*sizeof(int) );
550 }
551 assert( k <= i );
552 Vec_IntShrink( vAdds, 6*k );
553 Vec_BitFree( vInsiders );
554}
555
557{
558 int i, Count = 0;
559 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
560 if ( Vec_IntEntry(vAdds, 6*i+2) != 0 )
561 Count++;
562 return Count;
563}
564void Ree_ManPrintAdders( Vec_Int_t * vAdds, int fVerbose )
565{
566 int i;
567 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
568 {
569 //if ( Vec_IntEntry(vAdds, 6*i+2) == 0 )
570 // continue;
571 if ( !fVerbose )
572 continue;
573 printf( "%6d : ", i );
574 printf( "%6d ", Vec_IntEntry(vAdds, 6*i+0) );
575 printf( "%6d ", Vec_IntEntry(vAdds, 6*i+1) );
576 printf( "%6d ", Vec_IntEntry(vAdds, 6*i+2) );
577 printf( " -> " );
578 printf( "%6d ", Vec_IntEntry(vAdds, 6*i+3) );
579 printf( "%6d ", Vec_IntEntry(vAdds, 6*i+4) );
580 printf( " (%d)", Vec_IntEntry(vAdds, 6*i+5) );
581 printf( "\n" );
582 }
583}
585{
586 abctime clk = Abc_Clock();
587 Vec_Int_t * vAdds = Ree_ManComputeCuts( p, NULL, 1 );
588 int nFadds = Ree_ManCountFadds( vAdds );
589 Ree_ManPrintAdders( vAdds, 1 );
590 printf( "Detected %d FAs and %d HAs. ", nFadds, Vec_IntSize(vAdds)/6-nFadds );
591 Vec_IntFree( vAdds );
592 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
593}
594
595
599
600
602
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Ree_ManPrintAdders(Vec_Int_t *vAdds, int fVerbose)
Definition acecRe.c:564
int Ree_ManCompare(int *pCut0, int *pCut1)
Definition acecRe.c:400
Vec_Int_t * Ree_ManComputeCuts(Gia_Man_t *p, Vec_Int_t **pvXors, int fVerbose)
Definition acecRe.c:408
void Ree_CollectInsiders_rec(Gia_Man_t *pGia, int iObj, Vec_Bit_t *vVisited, Vec_Bit_t *vInsiders)
Definition acecRe.c:468
void Ree_ManRemoveContained(Gia_Man_t *p, Vec_Int_t *vAdds)
Definition acecRe.c:540
int Ree_ManCountFadds(Vec_Int_t *vAdds)
Definition acecRe.c:556
void Ree_TruthPrecompute()
FUNCTION DEFINITIONS ///.
Definition acecRe.c:49
void Ree_ManRemoveTrivial(Gia_Man_t *p, Vec_Int_t *vAdds)
Definition acecRe.c:515
Vec_Int_t * Ree_ManDeriveAdds(Hash_IntMan_t *p, Vec_Int_t *vData, int fVerbose)
Definition acecRe.c:328
void Ree_ManComputeCutsTest(Gia_Man_t *p)
Definition acecRe.c:584
#define Ree_ForEachCut(pList, pCut, i)
DECLARATIONS ///.
Definition acecRe.c:32
void Ree_TruthPrecompute2()
Definition acecRe.c:72
void Ree_ManCutMerge(Gia_Man_t *p, int iObj, int *pList0, int *pList1, Vec_Int_t *vCuts, Hash_IntMan_t *pHash, Vec_Int_t *vData, Vec_Int_t *vXors)
Definition acecRe.c:258
Vec_Bit_t * Ree_CollectInsiders(Gia_Man_t *pGia, Vec_Int_t *vAdds)
Definition acecRe.c:477
void Ree_ManCutPrint(int *pCut, int Count, word Truth, int iObj)
Definition acecRe.c:246
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
void Gia_ManCleanValue(Gia_Man_t *p)
Definition giaUtil.c:351
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
#define Gia_ManForEachCi(p, pObj, i)
Definition gia.h:1228
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
unsigned Value
Definition gia.h:89
#define assert(ex)
Definition util_old.h:213
char * memmove()
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
typedefABC_NAMESPACE_HEADER_START struct Hash_IntObj_t_ Hash_IntObj_t
INCLUDES ///.
Definition vecHash.h:42
struct Hash_IntMan_t_ Hash_IntMan_t
Definition vecHash.h:51
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
Definition vecInt.h:72
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
Definition vecInt.h:66
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
Definition vecInt.h:76
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42