32#define Ree_ForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )
51 word Truths[8] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
54 for ( i = 0; i < 8; i++ )
57 Truth = Abc_Tt6SwapAdjacent( Truth, 1 );
58 Abc_TtPrintHexRev( stdout, &Truth, 3 );
62 for ( i = 0; i < 8; i++ )
65 Truth = Abc_Tt6SwapAdjacent( Truth, 1 );
66 Truth = Abc_Tt6SwapAdjacent( Truth, 0 );
67 Abc_TtPrintHexRev( stdout, &Truth, 3 );
75 for ( i = 0; i < 8; i++ )
78 for ( b = 0; b < 3; b++ )
80 Truth = Abc_Tt6Flip( Truth, b );
81 printf(
"%d = %X\n", i, 0xFF & (
int)Truth );
96static inline int Ree_ManCutMergeOne(
int * pCut0,
int * pCut1,
int * pCut )
99 for ( k = 0; k <= pCut1[0]; k++ )
101 for ( i = 1; i <= pCut0[0]; i++ )
103 for ( k = 1; k <= pCut1[0]; k++ )
104 if ( pCut0[i] == pCut1[k] )
110 pCut[1+pCut[0]++] = pCut0[i];
112 assert( pCut[0] == 2 || pCut[0] == 3 );
113 if ( pCut[1] > pCut[2] )
115 assert( pCut[1] < pCut[2] );
118 if ( pCut[2] > pCut[3] )
120 if ( pCut[1] > pCut[2] )
122 assert( pCut[1] < pCut[2] );
123 assert( pCut[2] < pCut[3] );
126static inline int Ree_ManCutCheckEqual(
Vec_Int_t * vCuts,
int * pCutNew )
128 int * pList = Vec_IntArray( vCuts );
132 for ( k = 0; k <= pCut[0]; k++ )
133 if ( pCut[k] != pCutNew[k] )
140static inline int Ree_ManCutFind(
int iObj,
int * pCut )
142 if ( pCut[1] == iObj )
return 0;
143 if ( pCut[2] == iObj )
return 1;
144 if ( pCut[3] == iObj )
return 2;
148static inline int Ree_ManCutNotFind(
int iObj1,
int iObj2,
int * pCut )
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;
157static inline int Ree_ManCutTruthOne(
int * pCut0,
int * pCut )
159 int Truth0 = pCut0[pCut0[0]+1];
160 int fComp0 = (Truth0 >> 7) & 1;
163 Truth0 = fComp0 ? ~Truth0 : Truth0;
169 { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },
170 { 0x00, 0x05, 0x0A, 0x0F, 0x50, 0x55, 0x5A, 0x5F },
171 { 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F }
173 int Truth = Truths[Ree_ManCutNotFind(pCut0[1], pCut0[2], pCut)][Truth0 & 0x7];
174 return 0xFF & (fComp0 ? ~Truth : Truth);
177 assert( pCut[1] == pCut0[1] && pCut[2] == pCut0[2] );
178 return pCut0[pCut0[0]+1];
182 int Truths[3] = { 0x55, 0x33, 0x0F };
183 int Truth = Truths[Ree_ManCutFind(pCut0[1], pCut)];
184 return 0xFF & (fComp0 ? ~Truth : Truth);
189static inline int Ree_ManCutTruth(
Gia_Obj_t * pObj,
int * pCut0,
int * pCut1,
int * pCut )
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);
200int Ree_ObjComputeTruth_rec(
Gia_Obj_t * pObj )
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));
211 return (pObj->
Value = (Gia_ObjFaninC0(pObj) ? ~Truth0 : Truth0) & (Gia_ObjFaninC1(pObj) ? ~Truth1 : Truth1));
213void Ree_ObjCleanTruth_rec(
Gia_Obj_t * pObj )
218 if ( !Gia_ObjIsAnd(pObj) )
220 Ree_ObjCleanTruth_rec( Gia_ObjFanin0(pObj) );
221 Ree_ObjCleanTruth_rec( Gia_ObjFanin1(pObj) );
223int Ree_ObjComputeTruth(
Gia_Man_t *
p,
int iObj,
int * pCut )
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) );
249 printf(
"%d : %d : ", Count, iObj );
250 for ( c = 1; c <= pCut[0]; c++ )
251 printf(
"%3d ", pCut[c] );
252 for ( ; c <= 4; c++ )
255 Abc_TtPrintHexRev( stdout, &Truth, 3 );
261 int i, k, c, Value, Truth, TruthC, * pCut0, * pCut1, pCut[6], Count = 0;
262 int iXor2 = -1, iXor3 = -1;
264 printf(
"Object %d\n", iObj );
265 Vec_IntFill( vCuts, 2, 1 );
266 Vec_IntPush( vCuts, iObj );
267 Vec_IntPush( vCuts, 0xAA );
271 if ( !Ree_ManCutMergeOne(pCut0, pCut1, pCut) )
273 if ( Ree_ManCutCheckEqual(vCuts, pCut) )
275 Truth = TruthC = Ree_ManCutTruth(Gia_ManObj(
p, iObj), pCut0, pCut1, pCut);
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 )
290 Value = Hsh_Int3ManInsert( pHash, pCut[1], pCut[2], 0 );
291 Vec_IntPushThree( vData, iObj, Value, TruthC );
293 else if ( Truth == 0x69 || Truth == 0x17 || Truth == 0x2B || Truth == 0x4D || Truth == 0x71 )
296 Value = Hsh_Int3ManInsert( pHash, pCut[1], pCut[2], pCut[3] );
297 Vec_IntPushThree( vData, iObj, Value, TruthC );
305 pCut0 = Vec_IntEntryP( vCuts, iXor2 );
306 else if ( iXor3 > 0 )
307 pCut0 = Vec_IntEntryP( vCuts, iXor3 );
310 Vec_IntPush( vXors, iObj );
311 for ( c = 1; c <= pCut0[0]; c++ )
312 Vec_IntPush( vXors, pCut0[c] );
314 Vec_IntPush( vXors, 0 );
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 );
340 assert( Value <= nEntries );
341 if ( Truth == 0x66 || Truth == 0x99 || Truth == 0x69 || Truth == 0x96 )
342 Vec_IntAddToEntry( vXors, Value, 1 );
344 Vec_IntAddToEntry( vMajs, Value, 1 );
348 if ( CountX && CountM )
350 Vec_IntPush( vIndexRev, i );
351 Vec_IntWriteEntry( vIndex, i, Index++ );
353 Vec_IntFree( vXors );
354 Vec_IntFree( vMajs );
358 vXorMap = Vec_WecStart( Index );
359 vMajMap = Vec_WecStart( Index );
362 Index = Vec_IntEntry( vIndex, Value );
365 if ( Truth == 0x66 || Truth == 0x99 || Truth == 0x69 || Truth == 0x96 )
366 Vec_IntPushTwo( Vec_WecEntry(vXorMap, Index), iObj, Truth );
368 Vec_IntPushTwo( Vec_WecEntry(vMajMap, Index), iObj, Truth );
370 Vec_IntFree( vIndex );
374 Vec_Int_t * vXorOne = Vec_WecEntry( vXorMap, i );
375 Vec_Int_t * vMajOne = Vec_WecEntry( vMajMap, i );
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] )
387 for ( n = 0; n < 8; n++ )
388 if ( Truth2 == SignAnd[n] )
391 Vec_IntPushThree( vAdds, pObj->iData0, pObj->iData1, pObj->iData2 );
392 Vec_IntPushThree( vAdds, iObj, iObj2, SignXor | n );
395 Vec_IntFree( vIndexRev );
396 Vec_WecFree( vXorMap );
397 Vec_WecFree( vMajMap );
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;
413 int * pList0, * pList1, i, nCuts = 0;
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 );
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 );
429 if ( pvXors ) *pvXors = Vec_IntAlloc( 1000 );
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 );
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 );
445 qsort( Vec_IntArray(vAdds), (
size_t)(Vec_IntSize(vAdds)/6), 24, (
int (*)(
const void *,
const void *))
Ree_ManCompare );
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 );
470 if ( Vec_BitEntry(vVisited, iObj) )
472 Vec_BitSetEntry( vVisited, iObj, 1 );
475 Vec_BitSetEntry( vInsiders, iObj, 1 );
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++ )
484 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 )
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 );
494 Entry1 = Vec_IntEntry( vAdds, 6*i + 3 );
495 Entry2 = Vec_IntEntry( vAdds, 6*i + 4 );
499 Vec_BitFree( vVisited );
521 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
523 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 )
525 pObjX = Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*i+3) );
526 pObjM = Gia_ManObj(
p, Vec_IntEntry(vAdds, 6*i+4) );
531 if ( (pObjM == Gia_ObjFanin0(pObjX) || pObjM == Gia_ObjFanin1(pObjX)) && Gia_ObjRefNum(
p, pObjM) == 1 )
534 memmove( Vec_IntArray(vAdds) + 6*k++, Vec_IntArray(vAdds) + 6*i, 6*
sizeof(
int) );
537 Vec_IntShrink( vAdds, 6*k );
544 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
546 if ( Vec_IntEntry(vAdds, 6*i+2) == 0 )
547 if ( Vec_BitEntry(vInsiders, Vec_IntEntry(vAdds, 6*i+3)) && Vec_BitEntry(vInsiders, Vec_IntEntry(vAdds, 6*i+4)) )
549 memmove( Vec_IntArray(vAdds) + 6*k++, Vec_IntArray(vAdds) + 6*i, 6*
sizeof(
int) );
552 Vec_IntShrink( vAdds, 6*k );
553 Vec_BitFree( vInsiders );
559 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
560 if ( Vec_IntEntry(vAdds, 6*i+2) != 0 )
567 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
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) );
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) );
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 );
#define ABC_SWAP(Type, a, b)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Ree_ManPrintAdders(Vec_Int_t *vAdds, int fVerbose)
int Ree_ManCompare(int *pCut0, int *pCut1)
Vec_Int_t * Ree_ManComputeCuts(Gia_Man_t *p, Vec_Int_t **pvXors, int fVerbose)
void Ree_CollectInsiders_rec(Gia_Man_t *pGia, int iObj, Vec_Bit_t *vVisited, Vec_Bit_t *vInsiders)
void Ree_ManRemoveContained(Gia_Man_t *p, Vec_Int_t *vAdds)
int Ree_ManCountFadds(Vec_Int_t *vAdds)
void Ree_TruthPrecompute()
FUNCTION DEFINITIONS ///.
void Ree_ManRemoveTrivial(Gia_Man_t *p, Vec_Int_t *vAdds)
Vec_Int_t * Ree_ManDeriveAdds(Hash_IntMan_t *p, Vec_Int_t *vData, int fVerbose)
void Ree_ManComputeCutsTest(Gia_Man_t *p)
#define Ree_ForEachCut(pList, pCut, i)
DECLARATIONS ///.
void Ree_TruthPrecompute2()
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)
Vec_Bit_t * Ree_CollectInsiders(Gia_Man_t *pGia, Vec_Int_t *vAdds)
void Ree_ManCutPrint(int *pCut, int Count, word Truth, int iObj)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ManForEachAnd(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
void Gia_ManCleanValue(Gia_Man_t *p)
void Gia_ManCreateRefs(Gia_Man_t *p)
#define Gia_ManForEachCi(p, pObj, i)
unsigned __int64 word
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Hash_IntObj_t_ Hash_IntObj_t
INCLUDES ///.
struct Hash_IntMan_t_ Hash_IntMan_t
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.