summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaNtk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r--src/base/cba/cbaNtk.c127
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 ///
////////////////////////////////////////////////////////////////////////