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; } |