summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaNtk.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-02-11 16:55:18 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2015-02-11 16:55:18 -0800
commite363727c62d5fbbf0edadb73a02e4efa324e1509 (patch)
tree303fb0fddff729206062beaa192f067f42f6da5a /src/base/cba/cbaNtk.c
parent8cabdcb55d0a390ea45cfed631118af35796dac2 (diff)
downloadabc-e363727c62d5fbbf0edadb73a02e4efa324e1509.tar.gz
abc-e363727c62d5fbbf0edadb73a02e4efa324e1509.tar.bz2
abc-e363727c62d5fbbf0edadb73a02e4efa324e1509.zip
Several improvements to CBA data-structure.
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r--src/base/cba/cbaNtk.c107
1 files changed, 69 insertions, 38 deletions
diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c
index 13ed5c08..fb9b5fb3 100644
--- a/src/base/cba/cbaNtk.c
+++ b/src/base/cba/cbaNtk.c
@@ -41,60 +41,91 @@ ABC_NAMESPACE_IMPL_START
SeeAlso []
***********************************************************************/
-void Cba_ManAssignInternNamesNtk( Cba_Ntk_t * p )
+int Cba_ManSetInternOne( Cba_Ntk_t * p, int iTerm, Vec_Int_t * vMap )
{
- char Buffer[100];
- int i, iObj, iTerm, NameId, fFound, nNameLess = 0;
- int nDigits = Abc_Base10Log( Cba_NtkObjNum(p) );
- // PI/PO should have NameId
+ if ( !Cba_ObjName(p, iTerm) )
+ return 1;
+ assert( Vec_IntEntry(vMap, Cba_ObjName(p, iTerm)) == 0 );
+ Vec_IntWriteEntry( vMap, Cba_ObjName(p, iTerm), iTerm+1 );
+ return 0;
+}
+int Cba_ManAssignInternOne( Cba_Ntk_t * p, int iTerm, Vec_Int_t * vMap )
+{
+ char Buffer[16];
+ int i = 0, NameId, nDigits;
+ if ( Cba_ObjName(p, iTerm) )
+ return 0;
+ do
+ {
+ nDigits = Abc_Base10Log( Cba_NtkObjNum(p) );
+ if ( i == 0 )
+ sprintf( Buffer, "%s%0*d", "_n_", nDigits, iTerm );
+ else
+ sprintf( Buffer, "%s%0*d_%d", "_n_", nDigits, iTerm, ++i );
+ NameId = Abc_NamStrFindOrAdd( p->pDesign->pStrs, Buffer, NULL );
+ }
+ while ( Vec_IntEntry(vMap, NameId) );
+ Cba_ObjSetName( p, iTerm, NameId );
+ Vec_IntWriteEntry( vMap, NameId, iTerm+1 );
+ return 1;
+}
+void Cba_ManAssignInternNamesNtk( Cba_Ntk_t * p, Vec_Int_t * vMap )
+{
+ int i, iObj, iTerm, nNameless = 0;
+ if ( !Cba_NtkHasNames(p) )
+ Cba_NtkStartNames(p);
+ // set all names
Cba_NtkForEachPi( p, iObj, i )
- assert( Cba_ObjName(p, iObj) );
+ nNameless += Cba_ManSetInternOne( p, iObj, vMap );
Cba_NtkForEachPo( p, iObj, i )
- assert( Cba_ObjName(p, iObj) );
- // user BI/BO should have NameId
- Cba_NtkForEachBoxUser( p, iObj )
+ nNameless += Cba_ManSetInternOne( p, iObj, vMap );
+ Cba_NtkForEachBox( p, iObj )
{
Cba_BoxForEachBi( p, iObj, iTerm, i )
- assert( Cba_ObjName(p, iTerm) );
+ nNameless += Cba_ManSetInternOne( p, iTerm, vMap );
Cba_BoxForEachBo( p, iObj, iTerm, i )
- assert( Cba_ObjName(p, iTerm) );
+ nNameless += Cba_ManSetInternOne( p, iTerm, vMap );
}
- // check missing IDs
- Cba_NtkForEachBoxPrim( p, iObj )
+ if ( nNameless )
{
- Cba_BoxForEachBi( p, iObj, iTerm, i )
- nNameLess += !Cba_ObjName(p, iTerm);
- Cba_BoxForEachBo( p, iObj, iTerm, i )
- nNameLess += !Cba_ObjName(p, iTerm);
- }
- if ( !nNameLess )
- return;
- // create names for prim BO
- Cba_NtkForEachBoxPrim( p, iObj )
- Cba_BoxForEachBo( p, iObj, iTerm, i )
+ int nNameless2 = 0;
+ // generate new names
+ Cba_NtkForEachPi( p, iObj, i )
+ nNameless2 += Cba_ManAssignInternOne( p, iObj, vMap );
+ Cba_NtkForEachPo( p, iObj, i )
+ nNameless2 += Cba_ManAssignInternOne( p, iObj, vMap );
+ Cba_NtkForEachBox( p, iObj )
{
- if ( Cba_ObjName(p, iTerm) )
- continue;
- sprintf( Buffer, "%s%0*d", "_n_", nDigits, iTerm );
- NameId = Abc_NamStrFindOrAdd( p->pDesign->pStrs, Buffer, &fFound );
- //assert( !fFound );
- Cba_ObjSetName( p, iTerm, NameId );
+ Cba_BoxForEachBi( p, iObj, iTerm, i )
+ nNameless2 += Cba_ManAssignInternOne( p, iTerm, vMap );
+ Cba_BoxForEachBo( p, iObj, iTerm, i )
+ nNameless2 += Cba_ManAssignInternOne( p, iTerm, vMap );
}
- // transfer names for prim BI
- Cba_NtkForEachBoxPrim( p, iObj )
+ assert( nNameless == nNameless2 );
+ if ( nNameless )
+ printf( "Generated unique names for %d objects in network \"%s\".\n", nNameless, Cba_NtkName(p) );
+ }
+ // unmark all names
+ Cba_NtkForEachPi( p, iObj, i )
+ Vec_IntWriteEntry( vMap, Cba_ObjName(p, iObj), 0 );
+ Cba_NtkForEachPo( p, iObj, i )
+ Vec_IntWriteEntry( vMap, Cba_ObjName(p, iObj), 0 );
+ Cba_NtkForEachBox( p, iObj )
+ {
Cba_BoxForEachBi( p, iObj, iTerm, i )
- {
- if ( Cba_ObjName(p, iTerm) )
- continue;
- assert( Cba_ObjName(p, Cba_ObjFanin(p, iTerm)) );
- Cba_ObjSetName( p, iTerm, Cba_ObjName(p, Cba_ObjFanin(p, iTerm)) );
- }
+ Vec_IntWriteEntry( vMap, Cba_ObjName(p, iTerm), 0 );
+ Cba_BoxForEachBo( p, iObj, iTerm, i )
+ Vec_IntWriteEntry( vMap, Cba_ObjName(p, iTerm), 0 );
+ }
+
}
void Cba_ManAssignInternNames( Cba_Man_t * p )
{
+ Vec_Int_t * vMap = Vec_IntStart( Cba_ManObjNum(p) );
Cba_Ntk_t * pNtk; int i;
Cba_ManForEachNtk( p, pNtk, i )
- Cba_ManAssignInternNamesNtk( pNtk );
+ Cba_ManAssignInternNamesNtk( pNtk, vMap );
+ Vec_IntFree( vMap );
}