diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2015-02-09 15:36:25 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2015-02-09 15:36:25 -0800 |
commit | fd877c3f376fb50c5c5f863ad975867ad2eda994 (patch) | |
tree | 135a064add47a756c17db335388b6f35f6f4efcc /src/base/cba/cbaNtk.c | |
parent | 0f9001c956749682e002cb229264dbd6c4882fc2 (diff) | |
download | abc-fd877c3f376fb50c5c5f863ad975867ad2eda994.tar.gz abc-fd877c3f376fb50c5c5f863ad975867ad2eda994.tar.bz2 abc-fd877c3f376fb50c5c5f863ad975867ad2eda994.zip |
Several improvements to CBA data-structure.
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r-- | src/base/cba/cbaNtk.c | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c index 5189eed5..838f961f 100644 --- a/src/base/cba/cbaNtk.c +++ b/src/base/cba/cbaNtk.c @@ -115,7 +115,7 @@ int Cba_ManClpObjNum_rec( Cba_Ntk_t * p ) if ( p->Count >= 0 ) return p->Count; Cba_NtkForEachBox( p, i ) - Counter += Cba_ObjIsBoxUser(p, i) ? Cba_ManClpObjNum_rec( Cba_BoxNtk(p, i) ) : Cba_BoxSize(p, i); + Counter += Cba_ObjIsBoxUser(p, i) ? Cba_ManClpObjNum_rec( Cba_BoxNtk(p, i) ) + 3*Cba_BoxBoNum(p, i) : Cba_BoxSize(p, i); return (p->Count = Counter); } int Cba_ManClpObjNum( Cba_Man_t * p ) @@ -220,37 +220,49 @@ int Cba_NtkDfsUserBoxes( Cba_Ntk_t * p ) ***********************************************************************/ void Cba_NtkCollapse_rec( Cba_Ntk_t * pNew, Cba_Ntk_t * p, Vec_Int_t * vSigs ) { - int i, k, iObj, iTerm; + int i, iObj, iObjNew, iTerm; Cba_NtkStartCopies( p ); // set PI copies assert( Vec_IntSize(vSigs) == Cba_NtkPiNum(p) ); Cba_NtkForEachPi( p, iObj, i ) Cba_ObjSetCopy( p, iObj, Vec_IntEntry(vSigs, i) ); - // duplicate internal objects + // duplicate internal objects and create buffers for hierarchy instances Cba_NtkForEachBox( p, iObj ) - if ( Cba_ObjIsBoxPrim(p, iObj) ) + if ( Cba_ObjIsBoxPrim( p, iObj ) ) Cba_BoxDup( pNew, p, iObj ); - // duplicate user moduled in DFS order - Vec_IntForEachEntry( &p->vArray, iObj, i ) - { - assert( Cba_ObjIsBoxUser(p, iObj) ); - Vec_IntClear( vSigs ); - Cba_BoxForEachBi( p, iObj, iTerm, k ) - Vec_IntPush( vSigs, Cba_ObjCopy(p, Cba_ObjFanin(p, iTerm)) ); - Cba_NtkCollapse_rec( pNew, Cba_BoxNtk(p, iObj), vSigs ); - assert( Vec_IntSize(vSigs) == Cba_BoxBoNum(p, iObj) ); - Cba_BoxForEachBo( p, iObj, iTerm, k ) - Cba_ObjSetCopy( p, iTerm, Vec_IntEntry(vSigs, k) ); - } - // connect objects - Cba_NtkForEachBi( p, iObj ) - Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iObj), Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) ); + else + { + Cba_BoxForEachBo( p, iObj, iTerm, i ) + { + iObjNew = Cba_ObjAlloc( pNew, CBA_OBJ_BI, -1 ); + iObjNew = Cba_ObjAlloc( pNew, CBA_BOX_BUF, -1 ); // buffer + iObjNew = Cba_ObjAlloc( pNew, CBA_OBJ_BO, -1 ); + Cba_ObjSetCopy( p, iTerm, iObjNew ); + } + } + // duplicate user modules and connect objects + Cba_NtkForEachBox( p, iObj ) + if ( Cba_ObjIsBoxPrim( p, iObj ) ) + { + Cba_BoxForEachBi( p, iObj, iTerm, i ) + Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iTerm), Cba_ObjCopy(p, Cba_ObjFanin(p, iTerm)) ); + } + else + { + Vec_IntClear( vSigs ); + Cba_BoxForEachBi( p, iObj, iTerm, i ) + Vec_IntPush( vSigs, Cba_ObjCopy(p, Cba_ObjFanin(p, iTerm)) ); + Cba_NtkCollapse_rec( pNew, Cba_BoxNtk(p, iObj), vSigs ); + assert( Vec_IntSize(vSigs) == Cba_BoxBoNum(p, iObj) ); + Cba_BoxForEachBo( p, iObj, iTerm, i ) + Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iTerm)-2, Vec_IntEntry(vSigs, i) ); + } // collect POs Vec_IntClear( vSigs ); Cba_NtkForEachPo( p, iObj, i ) Vec_IntPush( vSigs, Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) ); } -Cba_Man_t * Cba_ManCollapseInt( Cba_Man_t * p ) +Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ) { int i, iObj; Vec_Int_t * vSigs = Vec_IntAlloc( 1000 ); @@ -259,29 +271,26 @@ Cba_Man_t * Cba_ManCollapseInt( Cba_Man_t * p ) Cba_Ntk_t * pRootNew = Cba_ManRoot( pNew ); Cba_NtkAlloc( pRootNew, Cba_NtkNameId(pRoot), Cba_NtkPiNum(pRoot), Cba_NtkPoNum(pRoot), Cba_ManClpObjNum(p) ); Cba_NtkForEachPi( pRoot, iObj, i ) - Vec_IntPush( vSigs, Cba_ObjAlloc(pRootNew, CBA_OBJ_PI, i, -1) ); + Vec_IntPush( vSigs, Cba_ObjAlloc(pRootNew, CBA_OBJ_PI, -1) ); Cba_NtkCollapse_rec( pRootNew, pRoot, vSigs ); assert( Vec_IntSize(vSigs) == Cba_NtkPoNum(pRoot) ); Cba_NtkForEachPo( pRoot, iObj, i ) - Cba_ObjAlloc( pRootNew, CBA_OBJ_PO, i, Vec_IntEntry(vSigs, i) ); + Cba_ObjAlloc( pRootNew, CBA_OBJ_PO, Vec_IntEntry(vSigs, i) ); assert( Cba_NtkObjNum(pRootNew) == Cba_NtkObjNumAlloc(pRootNew) ); Vec_IntFree( vSigs ); +/* // transfer PI/PO names - Cba_NtkStartNames( pRootNew ); - Cba_NtkForEachPo( pRoot, iObj, i ) - Cba_ObjSetName( pRootNew, Cba_NtkPo(pRootNew, i), Cba_ObjName(pRoot, iObj) ); - Cba_NtkForEachPo( pRoot, iObj, i ) - Cba_ObjSetName( pRootNew, Cba_NtkPo(pRootNew, i), Cba_ObjName(pRoot, iObj) ); + if ( Cba_NtkHasNames(pRoot) ) + { + Cba_NtkStartNames( pRootNew ); + Cba_NtkForEachPo( pRoot, iObj, i ) + Cba_ObjSetName( pRootNew, Cba_NtkPo(pRootNew, i), Cba_ObjName(pRoot, iObj) ); + Cba_NtkForEachPo( pRoot, iObj, i ) + Cba_ObjSetName( pRootNew, Cba_NtkPo(pRootNew, i), Cba_ObjName(pRoot, iObj) ); + } +*/ return pNew; } -Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ) -{ - Cba_Ntk_t * pNtk; int i; - Cba_ManForEachNtk( p, pNtk, i ) - if ( !Cba_NtkDfsUserBoxes(pNtk) ) - return NULL; - return Cba_ManCollapseInt( p ); -} //////////////////////////////////////////////////////////////////////// /// END OF FILE /// |