ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
acecRe.c File Reference
#include "acecInt.h"
#include "misc/vec/vecHash.h"
#include "misc/util/utilTruth.h"
Include dependency graph for acecRe.c:

Go to the source code of this file.

Macros

#define Ree_ForEachCut(pList, pCut, i)
 DECLARATIONS ///.
 

Functions

void Ree_TruthPrecompute ()
 FUNCTION DEFINITIONS ///.
 
void Ree_TruthPrecompute2 ()
 
void Ree_ManCutPrint (int *pCut, int Count, word Truth, int iObj)
 
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_Int_tRee_ManDeriveAdds (Hash_IntMan_t *p, Vec_Int_t *vData, int fVerbose)
 
int Ree_ManCompare (int *pCut0, int *pCut1)
 
Vec_Int_tRee_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)
 
Vec_Bit_tRee_CollectInsiders (Gia_Man_t *pGia, Vec_Int_t *vAdds)
 
void Ree_ManRemoveTrivial (Gia_Man_t *p, Vec_Int_t *vAdds)
 
void Ree_ManRemoveContained (Gia_Man_t *p, Vec_Int_t *vAdds)
 
int Ree_ManCountFadds (Vec_Int_t *vAdds)
 
void Ree_ManPrintAdders (Vec_Int_t *vAdds, int fVerbose)
 
void Ree_ManComputeCutsTest (Gia_Man_t *p)
 

Macro Definition Documentation

◆ Ree_ForEachCut

#define Ree_ForEachCut ( pList,
pCut,
i )
Value:
for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )

DECLARATIONS ///.

CFile****************************************************************

FileName [acecRe.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [CEC for arithmetic circuits.]

Synopsis [Core procedures.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
acecRe.c,v 1.00 2005/06/20 00:00:00 alanmi Exp

]

Definition at line 32 of file acecRe.c.

Function Documentation

◆ Ree_CollectInsiders()

Vec_Bit_t * Ree_CollectInsiders ( Gia_Man_t * pGia,
Vec_Int_t * vAdds )

Definition at line 477 of file acecRe.c.

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}
void Ree_CollectInsiders_rec(Gia_Man_t *pGia, int iObj, Vec_Bit_t *vVisited, Vec_Bit_t *vInsiders)
Definition acecRe.c:468
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_CollectInsiders_rec()

void Ree_CollectInsiders_rec ( Gia_Man_t * pGia,
int iObj,
Vec_Bit_t * vVisited,
Vec_Bit_t * vInsiders )

Function*************************************************************

Synopsis [Highlight nodes inside FAs.]

Description []

SideEffects []

SeeAlso []

Definition at line 468 of file acecRe.c.

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}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_ManCompare()

int Ree_ManCompare ( int * pCut0,
int * pCut1 )

Definition at line 400 of file acecRe.c.

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}
Here is the caller graph for this function:

◆ Ree_ManComputeCuts()

Vec_Int_t * Ree_ManComputeCuts ( Gia_Man_t * p,
Vec_Int_t ** pvXors,
int fVerbose )

Definition at line 408 of file acecRe.c.

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}
int Ree_ManCompare(int *pCut0, int *pCut1)
Definition acecRe.c:400
void Ree_ManRemoveContained(Gia_Man_t *p, Vec_Int_t *vAdds)
Definition acecRe.c:540
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_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
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
#define Gia_ManForEachCi(p, pObj, i)
Definition gia.h:1228
struct Hash_IntMan_t_ Hash_IntMan_t
Definition vecHash.h:51
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_ManComputeCutsTest()

void Ree_ManComputeCutsTest ( Gia_Man_t * p)

Definition at line 584 of file acecRe.c.

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}
ABC_INT64_T abctime
Definition abc_global.h:332
void Ree_ManPrintAdders(Vec_Int_t *vAdds, int fVerbose)
Definition acecRe.c:564
Vec_Int_t * Ree_ManComputeCuts(Gia_Man_t *p, Vec_Int_t **pvXors, int fVerbose)
Definition acecRe.c:408
int Ree_ManCountFadds(Vec_Int_t *vAdds)
Definition acecRe.c:556
Here is the call graph for this function:

◆ Ree_ManCountFadds()

int Ree_ManCountFadds ( Vec_Int_t * vAdds)

Definition at line 556 of file acecRe.c.

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}
Here is the caller graph for this function:

◆ Ree_ManCutMerge()

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 at line 258 of file acecRe.c.

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}
#define Ree_ForEachCut(pList, pCut, i)
DECLARATIONS ///.
Definition acecRe.c:32
void Ree_ManCutPrint(int *pCut, int Count, word Truth, int iObj)
Definition acecRe.c:246
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_ManCutPrint()

void Ree_ManCutPrint ( int * pCut,
int Count,
word Truth,
int iObj )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 246 of file acecRe.c.

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}
Here is the caller graph for this function:

◆ Ree_ManDeriveAdds()

Vec_Int_t * Ree_ManDeriveAdds ( Hash_IntMan_t * p,
Vec_Int_t * vData,
int fVerbose )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 328 of file acecRe.c.

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}
typedefABC_NAMESPACE_HEADER_START struct Hash_IntObj_t_ Hash_IntObj_t
INCLUDES ///.
Definition vecHash.h:42
#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
Here is the caller graph for this function:

◆ Ree_ManPrintAdders()

void Ree_ManPrintAdders ( Vec_Int_t * vAdds,
int fVerbose )

Definition at line 564 of file acecRe.c.

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}
Here is the caller graph for this function:

◆ Ree_ManRemoveContained()

void Ree_ManRemoveContained ( Gia_Man_t * p,
Vec_Int_t * vAdds )

Definition at line 540 of file acecRe.c.

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}
Vec_Bit_t * Ree_CollectInsiders(Gia_Man_t *pGia, Vec_Int_t *vAdds)
Definition acecRe.c:477
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_ManRemoveTrivial()

void Ree_ManRemoveTrivial ( Gia_Man_t * p,
Vec_Int_t * vAdds )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 515 of file acecRe.c.

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}
#define ABC_FREE(obj)
Definition abc_global.h:267
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Ree_TruthPrecompute()

void Ree_TruthPrecompute ( )

FUNCTION DEFINITIONS ///.

Function*************************************************************

Synopsis [Detecting FADDs in the AIG.]

Description []

SideEffects []

SeeAlso []

Definition at line 49 of file acecRe.c.

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}
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36

◆ Ree_TruthPrecompute2()

void Ree_TruthPrecompute2 ( )

Definition at line 72 of file acecRe.c.

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}