summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaDup.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2019-09-04 19:36:48 +0900
committerAlan Mishchenko <alanmi@berkeley.edu>2019-09-04 19:36:48 +0900
commit5081b41dc0b500cc4e6fadfa0292f00c42340c9e (patch)
tree9bf71169f0f86b63f3a6121aebfab34b6b6e2977 /src/aig/gia/giaDup.c
parent379b6a2b777aab8fb20b8f6d4c5362176d2c727c (diff)
downloadabc-5081b41dc0b500cc4e6fadfa0292f00c42340c9e.tar.gz
abc-5081b41dc0b500cc4e6fadfa0292f00c42340c9e.tar.bz2
abc-5081b41dc0b500cc4e6fadfa0292f00c42340c9e.zip
Upgrading reparametrization to perform (non-range-equivalent) removal of logic.
Diffstat (limited to 'src/aig/gia/giaDup.c')
-rw-r--r--src/aig/gia/giaDup.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/aig/gia/giaDup.c b/src/aig/gia/giaDup.c
index fe0ed932..988d50a2 100644
--- a/src/aig/gia/giaDup.c
+++ b/src/aig/gia/giaDup.c
@@ -4814,6 +4814,62 @@ Gia_Man_t * Gia_ManScorrDivideTest( Gia_Man_t * p, Cec_ParCor_t * pPars )
return pNew;
}
+/**Function*************************************************************
+
+ Synopsis [Duplicate AIG by creating a cut between logic fed by PIs]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Gia_ManHighLightFlopLogic( Gia_Man_t * p )
+{
+ Gia_Obj_t * pObj; int i;
+ Gia_ManForEachPi( p, pObj, i )
+ pObj->fMark0 = 0;
+ Gia_ManForEachRo( p, pObj, i )
+ pObj->fMark0 = 1;
+ Gia_ManForEachAnd( p, pObj, i )
+ pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0 | Gia_ObjFanin1(pObj)->fMark0;
+ Gia_ManForEachCo( p, pObj, i )
+ pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0;
+}
+Gia_Man_t * Gia_ManDupReplaceCut( Gia_Man_t * p )
+{
+ Gia_Man_t * pNew; int i;
+ Gia_Obj_t * pObj, * pFanin;
+ Gia_ManHighLightFlopLogic( p );
+ pNew = Gia_ManStart( Gia_ManObjNum(p) );
+ pNew->pName = Abc_UtilStrsav( p->pName );
+ pNew->pSpec = Abc_UtilStrsav( p->pSpec );
+ // create PIs for nodes pointed to from above the cut
+ Gia_ManFillValue( p );
+ Gia_ManConst0(p)->Value = 0;
+ Gia_ManForEachAnd( p, pObj, i )
+ {
+ if ( !pObj->fMark0 )
+ continue;
+ pFanin = Gia_ObjFanin0(pObj);
+ if ( !pFanin->fMark0 && !~pFanin->Value )
+ pFanin->Value = Gia_ManAppendCi(pNew);
+ pFanin = Gia_ObjFanin1(pObj);
+ if ( !pFanin->fMark0 && !~pFanin->Value )
+ pFanin->Value = Gia_ManAppendCi(pNew);
+ }
+ // create flop outputs
+ Gia_ManForEachRo( p, pObj, i )
+ pObj->Value = Gia_ManAppendCi(pNew);
+ // create internal nodes
+ Gia_ManForEachCo( p, pObj, i )
+ Gia_ManDupOrderDfs_rec( pNew, p, pObj );
+ Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
+ Gia_ManCleanMark0( p );
+ return pNew;
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////