diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2021-12-16 21:31:09 +0700 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2021-12-16 21:31:09 +0700 | 
| commit | 25b1a0d81c113bca545fd3b2f477e07e1d33e509 (patch) | |
| tree | 68b72acfd285ab5ddc0e10f67957772fcb9c313f | |
| parent | f1b64be84071a431eac9871f8cdc71bc912fd75a (diff) | |
| download | abc-25b1a0d81c113bca545fd3b2f477e07e1d33e509.tar.gz abc-25b1a0d81c113bca545fd3b2f477e07e1d33e509.tar.bz2 abc-25b1a0d81c113bca545fd3b2f477e07e1d33e509.zip | |
Fixing a rare problem with choice nodes.
| -rw-r--r-- | src/aig/gia/giaAig.c | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/src/aig/gia/giaAig.c b/src/aig/gia/giaAig.c index 91a9c600..c764a099 100644 --- a/src/aig/gia/giaAig.c +++ b/src/aig/gia/giaAig.c @@ -611,6 +611,27 @@ Gia_Man_t * Gia_ManCompress2( Gia_Man_t * p, int fUpdateLevel, int fVerbose )    SeeAlso     []  ***********************************************************************/ +int Gia_ManTestChoices( Gia_Man_t * p ) +{ +    Gia_Obj_t * pObj; int i; +    Vec_Int_t * vPointed = Vec_IntStart( Gia_ManObjNum(p) ); +    Gia_ManForEachAnd( p, pObj, i ) +        if ( Gia_ObjSibl(p, i) ) +            Vec_IntWriteEntry( vPointed, Gia_ObjSibl(p, i), 1 ); +    Gia_ManCreateRefs( p ); +    Gia_ManForEachAnd( p, pObj, i ) +        if ( Vec_IntEntry(vPointed, i) && Gia_ObjRefNumId(p, i) > 0 ) +        { +            printf( "Gia_ManCheckChoices: Member %d", i ); +            printf( " of a choice node has %d fanouts.\n", Gia_ObjRefNumId(p, i) ); +            ABC_FREE( p->pRefs ); +            Vec_IntFree( vPointed ); +            return 0; +        } +    ABC_FREE( p->pRefs ); +    Vec_IntFree( vPointed ); +    return 1; +}  Gia_Man_t * Gia_ManPerformDch( Gia_Man_t * p, void * pPars )  {      int fUseMapping = 0; @@ -628,6 +649,11 @@ Gia_Man_t * Gia_ManPerformDch( Gia_Man_t * p, void * pPars )  //    pGia = Gia_ManFromAig( pNew );      pGia = Gia_ManFromAigChoices( pNew );      Aig_ManStop( pNew ); +    if ( !p->pManTime && !Gia_ManTestChoices(pGia) ) +    { +        Gia_ManStop( pGia ); +        pGia = Gia_ManDup( p ); +    }      Gia_ManTransferTiming( pGia, p );      return pGia;  } | 
