summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaUtil.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2020-11-15 21:06:58 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2020-11-15 21:06:58 -0800
commitb28c4b5c17e0e3d390edab32c9346be8267e0627 (patch)
tree0e85e0d635ef8534d8b01c87a15dc8f2cee64a68 /src/aig/gia/giaUtil.c
parentdd07ec57be48b79d07b39d4e5607f4178a32dc1b (diff)
downloadabc-b28c4b5c17e0e3d390edab32c9346be8267e0627.tar.gz
abc-b28c4b5c17e0e3d390edab32c9346be8267e0627.tar.bz2
abc-b28c4b5c17e0e3d390edab32c9346be8267e0627.zip
Experiments with MFFC computation.
Diffstat (limited to 'src/aig/gia/giaUtil.c')
-rw-r--r--src/aig/gia/giaUtil.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/aig/gia/giaUtil.c b/src/aig/gia/giaUtil.c
index 2e1830c5..b8f33b69 100644
--- a/src/aig/gia/giaUtil.c
+++ b/src/aig/gia/giaUtil.c
@@ -1236,6 +1236,53 @@ int Gia_NodeMffcSizeSupp( Gia_Man_t * p, Gia_Obj_t * pNode, Vec_Int_t * vSupp )
/**Function*************************************************************
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Gia_NodeMffcMapping_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vMapping, Vec_Int_t * vSupp )
+{
+ Gia_Obj_t * pObj; int i, iNode, Count = 1;
+ if ( !iObj || Vec_IntEntry(vMapping, iObj) )
+ return 0;
+ pObj = Gia_ManObj( p, iObj );
+ if ( Gia_ObjIsCi(pObj) )
+ return 0;
+ Gia_NodeMffcSizeSupp( p, pObj, vSupp );
+ Vec_IntSort( vSupp, 0 );
+ Vec_IntWriteEntry( vMapping, iObj, Vec_IntSize(vMapping) );
+ Vec_IntPush( vMapping, Vec_IntSize(vSupp) );
+ Vec_IntAppend( vMapping, vSupp );
+ Vec_IntPush( vMapping, iObj );
+ Vec_IntForEachEntry( vSupp, iNode, i )
+ Count += Gia_NodeMffcMapping_rec( p, iNode, vMapping, vSupp );
+ return Count;
+}
+int Gia_NodeMffcMapping( Gia_Man_t * p )
+{
+ int i, Id, Count = 0;
+ int * pRefsOld;
+ Vec_Int_t * vMapping, * vSupp = Vec_IntAlloc( 100 );
+ vMapping = Vec_IntAlloc( 2 * Gia_ManObjNum(p) );
+ Vec_IntFill( vMapping, Gia_ManObjNum(p), 0 );
+ pRefsOld = p->pRefs; p->pRefs = NULL;
+ Gia_ManCreateRefs( p );
+ p->pRefs = pRefsOld;
+ Gia_ManForEachCoDriverId( p, Id, i )
+ Count += Gia_NodeMffcMapping_rec( p, Id, vMapping, vSupp );
+ Vec_IntFree( vSupp );
+ p->vMapping = vMapping;
+ //printf( "Mapping is %.2fx larger than AIG manager.\n", 1.0*Vec_IntSize(vMapping)/Gia_ManObjNum(p) );
+ return Count;
+}
+
+/**Function*************************************************************
+
Synopsis [Returns 1 if AIG has dangling nodes.]
Description []