From 2b2f05bacd6349310ba05b5123570705892768f0 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Tue, 13 Jan 2015 17:05:22 -0800 Subject: Various transformations of Cba_Ntk_t. --- src/base/cba/cbaNtk.c | 171 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 1 deletion(-) (limited to 'src/base/cba/cbaNtk.c') diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c index c0c63bec..30e721a6 100644 --- a/src/base/cba/cbaNtk.c +++ b/src/base/cba/cbaNtk.c @@ -47,7 +47,7 @@ void Cba_ManAssignInternNamesNtk( Cba_Ntk_t * p ) int nDigits = Abc_Base10Log( Cba_NtkObjNum(p) ); Cba_NtkForEachObjType( p, Type, i ) { - if ( Type == CBA_OBJ_NODE || Type == CBA_OBJ_PIN ) + if ( Type == CBA_OBJ_NODE ) { char Buffer[100]; sprintf( Buffer, "%s%0*d", "_n_", nDigits, i ); @@ -63,6 +63,175 @@ void Cba_ManAssignInternNames( Cba_Man_t * p ) Cba_ManAssignInternNamesNtk( pNtk ); } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Cba_NtkNodeNum( Cba_Ntk_t * p ) +{ + int iObj, Count = 0; + Cba_NtkForEachNode( p, iObj ) + Count++; + return Count; +} +int Cba_ManObjNum( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk; + int i, Count = 0; + Cba_ManForEachNtk( p, pNtk, i ) + { + pNtk->iObjStart = Count; + Count += Cba_NtkObjNum(pNtk); + } + return Count; +} +void Cba_ManSetNtkBoxes( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk, * pBox; + int i, k, Type; + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkForEachObjType( pNtk, Type, k ) + if ( Type == CBA_OBJ_BOX ) + { + pBox = Cba_ObjBoxModel(pNtk, k); + assert( pBox->iBoxNtk == 0 ); + pBox->iBoxNtk = i; + pBox->iBoxObj = k; + } +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Cba_ObjDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int iObj ) +{ + if ( Cba_ObjIsPi(p, iObj) ) + Vec_IntWriteEntry( &pNew->vInputs, Cba_ObjFuncId(pNew, iObj), pNew->nObjs ); + if ( Cba_ObjIsPo(p, iObj) ) + Vec_IntWriteEntry( &pNew->vOutputs, Cba_ObjFuncId(pNew, iObj), pNew->nObjs ); + if ( Cba_ObjIsBox(p, iObj) ) + Vec_IntPush( &pNew->vBoxes, pNew->nObjs ); + Vec_IntWriteEntry( &pNew->vTypes, pNew->nObjs, Cba_ObjType(p, iObj) ); + Vec_IntWriteEntry( &pNew->vFuncs, pNew->nObjs, Cba_ObjFuncId(pNew, iObj) ); + Vec_IntWriteEntry( &pNew->vNameIds, pNew->nObjs, Cba_ObjNameId(p, iObj) ); + Cba_NtkSetCopy( p, iObj, pNew->nObjs++ ); +} + +// allocates memory +Cba_Ntk_t * Cba_NtkDupAlloc( Cba_Man_t * pNew, Cba_Ntk_t * pNtk, int nObjs ) +{ + Cba_Ntk_t * pNtkNew = Cba_NtkAlloc( pNew, Cba_NtkName(pNtk) ); + Cba_ManFetchArray( pNew, &pNtkNew->vInputs, Cba_NtkPiNum(pNtk) ); + Cba_ManFetchArray( pNew, &pNtkNew->vOutputs, Cba_NtkPoNum(pNtk) ); + Cba_ManFetchArray( pNew, &pNtkNew->vTypes, nObjs ); + Cba_ManFetchArray( pNew, &pNtkNew->vFuncs, nObjs ); + Cba_ManFetchArray( pNew, &pNtkNew->vFanins, nObjs ); + Cba_ManFetchArray( pNew, &pNtkNew->vNameIds, nObjs ); + Cba_ManFetchArray( pNew, &pNtkNew->vBoxes, Cba_NtkBoxNum(pNtk) ); + Vec_IntShrink( &pNtkNew->vBoxes, 0 ); + return pNtkNew; +} +// duplicate PI/PO/boxes +int Cba_NtkDupStart( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) +{ + int i, k, iObj; + pNew->nObjs = 0; + Cba_NtkForEachPi( p, iObj, i ) + Cba_ObjDup( pNew, p, iObj ); + Cba_NtkForEachPo( p, iObj, i ) + Cba_ObjDup( pNew, p, iObj ); + Cba_NtkForEachBox( p, iObj, i ) + { + Cba_Ntk_t * pBox = Cba_ObjBoxModel( p, iObj ); + for ( k = 0; k < Cba_NtkPiNum(pBox); k++ ) + Cba_ObjDup( pNew, p, Cba_ObjBoxBi(p, iObj, k) ); + Cba_ObjDup( pNew, p, iObj ); + for ( k = 0; k < Cba_NtkPoNum(pBox); k++ ) + Cba_ObjDup( pNew, p, Cba_ObjBoxBo(p, iObj, k) ); + } + return pNew->nObjs; +} +// duplicate internal nodes +void Cba_NtkDupNodes( Cba_Ntk_t * pNew, Cba_Ntk_t * p, Vec_Int_t * vTemp ) +{ + Vec_Int_t * vFanins; + int i, k, Type, iTerm, iObj; + Cba_NtkForEachNode( p, iObj ) + Cba_ObjDup( pNew, p, iObj ); + // connect + Cba_NtkForEachObjType( p, Type, i ) + { + if ( Type == CBA_OBJ_PI || Type == CBA_OBJ_BOX ) + continue; + if ( Type == CBA_OBJ_PO || Type == CBA_OBJ_BI || Type == CBA_OBJ_BO ) + { + Vec_IntWriteEntry( &pNew->vFanins, Cba_NtkCopy(p, i), Cba_NtkCopy(p, Cba_ObjFanin0(p, i)) ); + continue; + } + assert( Type == CBA_OBJ_NODE ); + Vec_IntClear( vTemp ); + vFanins = Cba_ObjFaninVec( p, i ); + Vec_IntForEachEntry( vFanins, iTerm, k ) + Vec_IntPush( vTemp, Cba_NtkCopy(p, iTerm) ); + Vec_IntWriteEntry( &pNew->vFanins, Cba_NtkCopy(p, i), Cba_ManHandleArray(pNew->pDesign, vTemp) ); + } + +} +// finalize network +void Cba_NtkDupFinish( Cba_Ntk_t * pNew ) +{ + int iObj; + // add constant drivers + Cba_NtkForEachCo( pNew, iObj ) + { + } + // restrict + Vec_IntShrink( &pNew->vTypes, pNew->nObjs ); + Vec_IntShrink( &pNew->vFuncs, pNew->nObjs ); + Vec_IntShrink( &pNew->vFanins, pNew->nObjs ); + Vec_IntShrink( &pNew->vNameIds, pNew->nObjs ); +} + +Cba_Man_t * Cba_ManDupStart( Cba_Man_t * p, Vec_Int_t * vObjCounts ) +{ + Cba_Ntk_t * pNtk; int i; + Cba_Man_t * pNew = Cba_ManAlloc( Cba_ManName(p) ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkDupAlloc( pNew, pNtk, vObjCounts ? Cba_NtkObjNum(pNtk) : Vec_IntEntry(vObjCounts, i) ); + Vec_IntFill( &p->vCopies, Cba_ManObjNum(pNew), -1 ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkDupStart( Cba_ManNtk(pNew, i), pNtk ); + return pNew; +} +Cba_Man_t * Cba_ManDup( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk; int i; + Vec_Int_t * vTemp = Vec_IntAlloc( 100 ); + Cba_Man_t * pNew = Cba_ManDupStart( p, NULL ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkDupNodes( Cba_ManNtk(pNew, i), pNtk, vTemp ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkDupFinish( Cba_ManNtk(pNew, i) ); + Vec_IntClear( vTemp ); + return pNew; + +} + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// -- cgit v1.2.3