summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaCone.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-02-25 08:20:44 -0500
committerAlan Mishchenko <alanmi@berkeley.edu>2013-02-25 08:20:44 -0500
commit95ea102d9764f2ec441d46141e0608878c3863f3 (patch)
treedeea70d0c00be155dfb5cc82ec1bb21da7c1a2e1 /src/aig/gia/giaCone.c
parent69dd1337b03cb8817e54d41b18e96a7c01f64966 (diff)
downloadabc-95ea102d9764f2ec441d46141e0608878c3863f3.tar.gz
abc-95ea102d9764f2ec441d46141e0608878c3863f3.tar.bz2
abc-95ea102d9764f2ec441d46141e0608878c3863f3.zip
Started PO partitioning command.
Diffstat (limited to 'src/aig/gia/giaCone.c')
-rw-r--r--src/aig/gia/giaCone.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/aig/gia/giaCone.c b/src/aig/gia/giaCone.c
index 0b1b55f0..0659b700 100644
--- a/src/aig/gia/giaCone.c
+++ b/src/aig/gia/giaCone.c
@@ -27,9 +27,174 @@ ABC_NAMESPACE_IMPL_START
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
+typedef struct Opa_Man_t_ Opa_Man_t;
+struct Opa_Man_t_
+{
+ Gia_Man_t * pGia;
+ Vec_Int_t * vFront;
+ Vec_Int_t * pvParts;
+ int * pId2Part;
+ int nParts;
+};
+
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline Opa_Man_t * Opa_ManStart( Gia_Man_t * pGia)
+{
+ Opa_Man_t * p;
+ Gia_Obj_t * pObj;
+ int i;
+ p = ABC_CALLOC( Opa_Man_t, 1 );
+ p->pGia = pGia;
+ p->pvParts = ABC_CALLOC( Vec_Int_t, Gia_ManPoNum(pGia) );
+ p->pId2Part = ABC_FALLOC( int, Gia_ManObjNum(pGia) );
+ p->vFront = Vec_IntAlloc( 100 );
+ Gia_ManForEachPo( pGia, pObj, i )
+ {
+ Vec_IntPush( p->pvParts + i, Gia_ObjId(pGia, pObj) );
+ p->pId2Part[Gia_ObjId(pGia, pObj)] = i;
+ Vec_IntPush( p->vFront, Gia_ObjId(pGia, pObj) );
+ }
+ p->nParts = Gia_ManPoNum(pGia);
+ return p;
+}
+static inline void Opa_ManStop( Opa_Man_t * p )
+{
+ int i;
+ Vec_IntFree( p->vFront );
+ for ( i = 0; i < Gia_ManPoNum(p->pGia); i++ )
+ ABC_FREE( p->pvParts[i].pArray );
+ ABC_FREE( p->pvParts );
+ ABC_FREE( p->pId2Part );
+ ABC_FREE( p );
+}
+static inline void Opa_ManPrint( Opa_Man_t * p )
+{
+ int i, k;
+ printf( "Groups:\n" );
+ for ( i = 0; i < Gia_ManPoNum(p->pGia); i++ )
+ {
+ if ( p->pvParts[i].nSize == 0 )
+ continue;
+ printf( "%3d : ", i );
+ for ( k = 0; k < p->pvParts[i].nSize; k++ )
+ printf( "%d ", p->pvParts[i].pArray[k] );
+ printf( "\n" );
+ }
+}
+static inline void Opa_ManPrint2( Opa_Man_t * p )
+{
+ Gia_Obj_t * pObj;
+ int i, k, Count;
+ printf( "Groups %d: ", p->nParts );
+ for ( i = 0; i < Gia_ManPoNum(p->pGia); i++ )
+ {
+ if ( p->pvParts[i].nSize == 0 )
+ continue;
+ // count POs in this group
+ Count = 0;
+ Gia_ManForEachObjVec( p->pvParts + i, p->pGia, pObj, k )
+ Count += Gia_ObjIsPo(p->pGia, pObj);
+ printf( "%d ", Count );
+ }
+ printf( "\n" );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Opa_ManMoveOne( Opa_Man_t * p, Gia_Obj_t * pObj, Gia_Obj_t * pFanin )
+{
+ int iObj = Gia_ObjId(p->pGia, pObj);
+ int iFanin = Gia_ObjId(p->pGia, pFanin);
+ if ( iFanin == 0 )
+ return;
+ assert( p->pId2Part[ iObj ] >= 0 );
+ if ( p->pId2Part[ iFanin ] == -1 )
+ {
+ p->pId2Part[ iFanin ] = p->pId2Part[ iObj ];
+ Vec_IntPush( p->pvParts + p->pId2Part[ iObj ], iFanin );
+ assert( Gia_ObjIsCi(pFanin) || Gia_ObjIsAnd(pFanin) );
+ if ( Gia_ObjIsAnd(pFanin) )
+ Vec_IntPush( p->vFront, iFanin );
+ else if ( Gia_ObjIsRo(p->pGia, pFanin) )
+ {
+ pFanin = Gia_ObjRoToRi(p->pGia, pFanin);
+ iFanin = Gia_ObjId(p->pGia, pFanin);
+ assert( p->pId2Part[ iFanin ] == -1 );
+ p->pId2Part[ iFanin ] = p->pId2Part[ iObj ];
+ Vec_IntPush( p->pvParts + p->pId2Part[ iObj ], iFanin );
+ Vec_IntPush( p->vFront, iFanin );
+ }
+ }
+ else if ( p->pId2Part[ iObj ] != p->pId2Part[ iFanin ] )
+ {
+ Vec_Int_t * vPartObj = p->pvParts + p->pId2Part[ iObj ];
+ Vec_Int_t * vPartFan = p->pvParts + p->pId2Part[ iFanin ];
+ int iTemp, i;
+// printf( "Moving %d to %d (%d -> %d)\n", iObj, iFanin, Vec_IntSize(vPartObj), Vec_IntSize(vPartFan) );
+ // add group of iObj to group of iFanin
+ assert( Vec_IntSize(vPartObj) > 0 );
+ Vec_IntForEachEntry( vPartObj, iTemp, i )
+ {
+ Vec_IntPush( vPartFan, iTemp );
+ p->pId2Part[ iTemp ] = p->pId2Part[ iFanin ];
+ }
+ Vec_IntShrink( vPartObj, 0 );
+ p->nParts--;
+ }
+}
+void Opa_ManPerform( Gia_Man_t * pGia )
+{
+ Opa_Man_t * p;
+ Gia_Obj_t * pObj;
+ int i;
+
+ p = Opa_ManStart( pGia );
+//Opa_ManPrint2( p );
+ Gia_ManForEachObjVec( p->vFront, pGia, pObj, i )
+ {
+// printf( "*** Object %d ", Gia_ObjId(pGia, pObj) );
+ if ( Gia_ObjIsAnd(pObj) )
+ {
+ Opa_ManMoveOne( p, pObj, Gia_ObjFanin0(pObj) );
+ Opa_ManMoveOne( p, pObj, Gia_ObjFanin1(pObj) );
+ }
+ else if ( Gia_ObjIsCo(pObj) )
+ Opa_ManMoveOne( p, pObj, Gia_ObjFanin0(pObj) );
+ else assert( 0 );
+ if ( i % 10 == 0 )
+ printf( "%d ", p->nParts );
+//Opa_ManPrint2( p );
+ if ( p->nParts == 1 )
+ break;
+ }
+ printf( "\n" );
+ Opa_ManStop( p );
+}
+
+
/**Function*************************************************************
@@ -99,6 +264,7 @@ int Gia_ManConeMark( Gia_Man_t * p, int iOut, int Limit )
***********************************************************************/
Gia_Man_t * Gia_ManConeExtract( Gia_Man_t * p, int iOut, int nDelta, int nOutsMin, int nOutsMax )
{
+/*
int i, Count = 0;
// mark nodes belonging to output 'iOut'
for ( i = 0; i < Gia_ManPoNum(p); i++ )
@@ -107,6 +273,8 @@ Gia_Man_t * Gia_ManConeExtract( Gia_Man_t * p, int iOut, int nDelta, int nOutsMi
printf( "%d out of %d\n", Count, Gia_ManPoNum(p) );
// add other outputs as long as they are nDelta away
+*/
+ Opa_ManPerform( p );
return NULL;
}