diff options
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r-- | src/base/cba/cbaNtk.c | 127 |
1 files changed, 49 insertions, 78 deletions
diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c index 30e721a6..9d2fe6d1 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 ) + if ( Type == CBA_OBJ_NODE && Cba_ObjNameId(p, i) == -1 ) { char Buffer[100]; sprintf( Buffer, "%s%0*d", "_n_", nDigits, i ); @@ -92,20 +92,6 @@ int Cba_ManObjNum( Cba_Man_t * p ) } 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************************************************************* @@ -118,61 +104,74 @@ void Cba_ManSetNtkBoxes( Cba_Man_t * p ) SeeAlso [] ***********************************************************************/ -void Cba_ObjDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int iObj ) +// duplicate PI/PO/boxes +void Cba_ObjDupStart( 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 ); + Vec_IntWriteEntry( &pNew->vInputs, Cba_ObjFuncId(p, 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->vOutputs, Cba_ObjFuncId(p, iObj), 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->vFuncs, pNew->nObjs, Cba_ObjFuncId(p, iObj) ); Vec_IntWriteEntry( &pNew->vNameIds, pNew->nObjs, Cba_ObjNameId(p, iObj) ); + if ( Cba_ObjIsBox(p, iObj) ) + Cba_NtkSetHost( Cba_ObjBoxModel(pNew, pNew->nObjs), Cba_NtkId(pNew), pNew->nObjs ); + if ( Cba_ObjIsBox(p, iObj) ) + Vec_IntPush( &pNew->vBoxes, pNew->nObjs ); 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 ) +void Cba_NtkDupStart( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { - int i, k, iObj; + int i, k, iObj, iTerm; + assert( Vec_IntSize(&pNew->vBoxes) == 0 ); pNew->nObjs = 0; Cba_NtkForEachPi( p, iObj, i ) - Cba_ObjDup( pNew, p, iObj ); + Cba_ObjDupStart( pNew, p, iObj ); Cba_NtkForEachPo( p, iObj, i ) - Cba_ObjDup( pNew, p, iObj ); + Cba_ObjDupStart( 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) ); + Cba_BoxForEachBi( p, iObj, iTerm, k ) + Cba_ObjDupStart( pNew, p, iTerm ); + Cba_ObjDupStart( pNew, p, iObj ); + Cba_BoxForEachBo( p, iObj, iTerm, k ) + Cba_ObjDupStart( pNew, p, iTerm ); } - return pNew->nObjs; + assert( Cba_NtkBoxNum(p) == Cba_NtkBoxNum(pNew) ); +} +Cba_Man_t * Cba_ManDupStart( Cba_Man_t * p, Vec_Int_t * vNtkSizes ) +{ + Cba_Ntk_t * pNtk; int i; + Cba_Man_t * pNew = Cba_ManClone( p ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkResize( Cba_ManNtk(pNew, i), vNtkSizes ? Vec_IntEntry(vNtkSizes, i) : Cba_NtkObjNum(pNtk) ); + Vec_IntFill( &p->vCopies, Cba_ManObjNum(p), -1 ); + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkDupStart( Cba_ManNtk(pNew, i), pNtk ); + return pNew; } + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ // 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; + // dup nodes Cba_NtkForEachNode( p, iObj ) - Cba_ObjDup( pNew, p, iObj ); + Cba_ObjDupStart( pNew, p, iObj ); + assert( pNew->nObjs == Cba_NtkObjNum(pNew) ); // connect Cba_NtkForEachObjType( p, Type, i ) { @@ -190,33 +189,6 @@ void Cba_NtkDupNodes( Cba_Ntk_t * pNew, Cba_Ntk_t * p, Vec_Int_t * vTemp ) 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 ) { @@ -225,13 +197,12 @@ Cba_Man_t * Cba_ManDup( Cba_Man_t * p ) 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 ); + Vec_IntFree( vTemp ); return pNew; } + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// |