summaryrefslogtreecommitdiff
path: root/src/base/wln/wlnNtk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/wln/wlnNtk.c')
-rw-r--r--src/base/wln/wlnNtk.c321
1 files changed, 321 insertions, 0 deletions
diff --git a/src/base/wln/wlnNtk.c b/src/base/wln/wlnNtk.c
new file mode 100644
index 0000000..39c0396
--- /dev/null
+++ b/src/base/wln/wlnNtk.c
@@ -0,0 +1,321 @@
+/**CFile****************************************************************
+
+ FileName [wlnNtk.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Word-level network.]
+
+ Synopsis [Network construction procedures.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 23, 2018.]
+
+ Revision [$Id: wlnNtk.c,v 1.00 2018/09/23 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "wln.h"
+
+ABC_NAMESPACE_IMPL_START
+
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Creating networks.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Wln_Ntk_t * Wln_NtkAlloc( char * pName, int nObjsMax )
+{
+ Wln_Ntk_t * p; int i;
+ p = ABC_CALLOC( Wln_Ntk_t, 1 );
+ p->pName = pName ? Extra_FileNameGeneric( pName ) : NULL;
+ Vec_IntGrow( &p->vCis, 111 );
+ Vec_IntGrow( &p->vCos, 111 );
+ Vec_IntGrow( &p->vFfs, 111 );
+ Vec_IntGrow( &p->vTypes, nObjsMax+1 );
+ Vec_StrGrow( &p->vSigns, nObjsMax+1 );
+ Vec_IntGrow( &p->vRanges, nObjsMax+1 );
+ Vec_IntPush( &p->vTypes, -1 );
+ Vec_StrPush( &p->vSigns, -1 );
+ Vec_IntPush( &p->vRanges, -1 );
+ p->vFanins = ABC_CALLOC( Wln_Vec_t, nObjsMax+1 );
+ p->pRanges = Hash_IntManStart( 1000 );
+ for ( i = 0; i < 65; i++ )
+ Hash_Int2ManInsert( p->pRanges, i, i, 0 );
+ for ( i = 1; i < 64; i++ )
+ Hash_Int2ManInsert( p->pRanges, i, 0, 0 );
+ assert( Hash_IntManEntryNum(p->pRanges) == 128 );
+ return p;
+}
+void Wln_NtkFree( Wln_Ntk_t * p )
+{
+ int i;
+ for ( i = 0; i < Wln_NtkObjNum(p); i++ )
+ if ( Wln_ObjFaninNum(p, i) > 2 )
+ ABC_FREE( p->vFanins[i].pArray[0] );
+ ABC_FREE( p->vFanins );
+
+ if ( p->pRanges ) Hash_IntManStop( p->pRanges );
+ if ( p->pManName ) Abc_NamStop( p->pManName );
+
+ ABC_FREE( p->vCis.pArray );
+ ABC_FREE( p->vCos.pArray );
+ ABC_FREE( p->vFfs.pArray );
+
+ ABC_FREE( p->vTypes.pArray );
+ ABC_FREE( p->vSigns.pArray );
+ ABC_FREE( p->vRanges.pArray );
+ ABC_FREE( p->vNameIds.pArray );
+ ABC_FREE( p->vInstIds.pArray );
+ ABC_FREE( p->vTravIds.pArray );
+ ABC_FREE( p->vCopies.pArray );
+ ABC_FREE( p->vBits.pArray );
+ ABC_FREE( p->vLevels.pArray );
+ ABC_FREE( p->vRefs.pArray );
+ ABC_FREE( p->vFanout.pArray );
+ ABC_FREE( p->vFaninAttrs.pArray );
+ ABC_FREE( p->vFaninLists.pArray );
+
+ ABC_FREE( p->pName );
+ ABC_FREE( p->pSpec );
+ ABC_FREE( p );
+}
+int Wln_NtkMemUsage( Wln_Ntk_t * p )
+{
+ int Mem = sizeof(Wln_Ntk_t);
+ Mem += 4 * p->vCis.nCap;
+ Mem += 4 * p->vCos.nCap;
+ Mem += 4 * p->vFfs.nCap;
+ Mem += 1 * p->vTypes.nCap;
+ Mem += 4 * p->vRanges.nCap;
+ Mem += 4 * p->vNameIds.nCap;
+ Mem += 4 * p->vInstIds.nCap;
+ Mem += 4 * p->vTravIds.nCap;
+ Mem += 4 * p->vCopies.nCap;
+ Mem += 4 * p->vBits.nCap;
+ Mem += 4 * p->vLevels.nCap;
+ Mem += 4 * p->vRefs.nCap;
+ Mem += 4 * p->vFanout.nCap;
+ Mem += 4 * p->vFaninAttrs.nCap;
+ Mem += 4 * p->vFaninLists.nCap;
+ Mem += 20 * Hash_IntManEntryNum(p->pRanges);
+ Mem += Abc_NamMemUsed(p->pManName);
+ return Mem;
+}
+void Wln_NtkPrint( Wln_Ntk_t * p )
+{
+ int iObj;
+ printf( "Printing %d objects of network \"%s\":\n", Wln_NtkObjNum(p), p->pName );
+ Wln_NtkForEachObj( p, iObj )
+ Wln_ObjPrint( p, iObj );
+ printf( "\n" );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Duplicating network.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Wln_NtkTransferNames( Wln_Ntk_t * pNew, Wln_Ntk_t * p )
+{
+ assert( pNew->pManName == NULL && p->pManName != NULL );
+ pNew->pManName = p->pManName;
+ p->pManName = NULL;
+ assert( !Wln_NtkHasCopy(pNew) && Wln_NtkHasCopy(p) );
+ if ( Wln_NtkHasNameId(p) )
+ {
+ int i;
+ assert( !Wln_NtkHasNameId(pNew) && Wln_NtkHasNameId(p) );
+ Wln_NtkCleanNameId( pNew );
+ Wln_NtkForEachObj( p, i )
+ if ( Wln_ObjCopy(p, i) && i < Vec_IntSize(&p->vNameIds) && Wln_ObjNameId(p, i) )
+ Wln_ObjSetNameId( pNew, Wln_ObjCopy(p, i), Wln_ObjNameId(p, i) );
+ Vec_IntErase( &p->vNameIds );
+ }
+ if ( Wln_NtkHasInstId(p) )
+ {
+ int i;
+ assert( !Wln_NtkHasInstId(pNew) && Wln_NtkHasInstId(p) );
+ Wln_NtkCleanInstId( pNew );
+ Wln_NtkForEachObj( p, i )
+ if ( Wln_ObjCopy(p, i) && i < Vec_IntSize(&p->vInstIds) && Wln_ObjInstId(p, i) )
+ Wln_ObjSetInstId( pNew, Wln_ObjCopy(p, i), Wln_ObjInstId(p, i) );
+ Vec_IntErase( &p->vInstIds );
+ }
+}
+int Wln_ObjDup( Wln_Ntk_t * pNew, Wln_Ntk_t * p, int iObj )
+{
+ int i, iFanin, iObjNew = Wln_ObjClone( pNew, p, iObj );
+ Wln_ObjForEachFanin( p, iObj, iFanin, i )
+ Wln_ObjAddFanin( pNew, iObjNew, Wln_ObjCopy(p, iFanin) );
+ if ( Wln_ObjIsConst(p, iObj) )
+ Wln_ObjSetConst( pNew, iObjNew, Wln_ObjFanin0(p, iObj) );
+ else if ( Wln_ObjIsSlice(p, iObj) || Wln_ObjIsRotate(p, iObj) || Wln_ObjIsTable(p, iObj) )
+ Wln_ObjSetFanin( p, iObjNew, 1, Wln_ObjFanin1(p, iObj) );
+ Wln_ObjSetCopy( p, iObj, iObjNew );
+ return iObjNew;
+}
+int Wln_NtkDupDfs_rec( Wln_Ntk_t * pNew, Wln_Ntk_t * p, int iObj )
+{
+ int i, iFanin;
+ if ( iObj == 0 )
+ return 0;
+ if ( Wln_ObjCopy(p, iObj) )
+ return Wln_ObjCopy(p, iObj);
+ //printf( "Visiting node %d\n", iObj );
+ assert( !Wln_ObjIsFf(p, iObj) );
+ Wln_ObjForEachFanin( p, iObj, iFanin, i )
+ Wln_NtkDupDfs_rec( pNew, p, iFanin );
+ return Wln_ObjDup( pNew, p, iObj );
+}
+Wln_Ntk_t * Wln_NtkDupDfs( Wln_Ntk_t * p )
+{
+ int i, k, iObj, iFanin;
+ Wln_Ntk_t * pNew = Wln_NtkAlloc( p->pName, Wln_NtkObjNum(p) );
+ pNew->fSmtLib = p->fSmtLib;
+ if ( p->pSpec ) pNew->pSpec = Abc_UtilStrsav( p->pSpec );
+ Wln_NtkCleanCopy( p );
+ Wln_NtkForEachCi( p, iObj, i )
+ Wln_ObjDup( pNew, p, iObj );
+ Wln_NtkForEachFf( p, iObj, i )
+ Wln_ObjSetCopy( p, iObj, Wln_ObjClone(pNew, p, iObj) );
+ Wln_NtkForEachCo( p, iObj, i )
+ Wln_NtkDupDfs_rec( pNew, p, iObj );
+ Wln_NtkForEachFf( p, iObj, i )
+ Wln_ObjForEachFanin( p, iObj, iFanin, k )
+ Wln_ObjAddFanin( pNew, Wln_ObjCopy(p, iObj), Wln_NtkDupDfs_rec(pNew, p, iFanin) );
+ if ( Wln_NtkHasNameId(p) )
+ Wln_NtkTransferNames( pNew, p );
+ return pNew;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Create fanin/fanout map.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Wln_NtkCreateRefs( Wln_Ntk_t * p )
+{
+ int k, iObj, iFanin;
+ Wln_NtkCleanRefs( p );
+ Wln_NtkForEachObj( p, iObj )
+ Wln_ObjForEachFanin( p, iObj, iFanin, k )
+ Wln_ObjRefsInc( p, iFanin );
+}
+int Wln_NtkFaninNum( Wln_Ntk_t * p )
+{
+ int iObj, nEdges = 0;
+ Wln_NtkForEachObj( p, iObj )
+ nEdges += Wln_ObjFaninNum(p, iObj);
+ return nEdges;
+}
+void Wln_NtkStartFaninMap( Wln_Ntk_t * p, Vec_Int_t * vFaninMap, int nMulti )
+{
+ int iObj, iOffset = Wln_NtkObjNum(p);
+ Vec_IntFill( vFaninMap, iOffset + nMulti * Wln_NtkFaninNum(p), 0 );
+ Wln_NtkForEachObj( p, iObj )
+ {
+ Vec_IntWriteEntry( vFaninMap, iObj, iOffset );
+ iOffset += nMulti * Wln_ObjFaninNum(p, iObj);
+ }
+ assert( iOffset == Vec_IntSize(vFaninMap) );
+}
+void Wln_NtkStartFanoutMap( Wln_Ntk_t * p, Vec_Int_t * vFanoutMap, Vec_Int_t * vFanoutNums, int nMulti )
+{
+ int iObj, iOffset = Wln_NtkObjNum(p);
+ Vec_IntFill( vFanoutMap, iOffset + nMulti * Vec_IntSum(vFanoutNums), 0 );
+ Wln_NtkForEachObj( p, iObj )
+ {
+ Vec_IntWriteEntry( vFanoutMap, iObj, iOffset );
+ iOffset += nMulti * Wln_ObjRefs(p, iObj);
+ }
+ assert( iOffset == Vec_IntSize(vFanoutMap) );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Static fanout.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Wln_NtkStaticFanoutStart( Wln_Ntk_t * p )
+{
+ int k, iObj, iFanin;
+ Vec_Int_t * vRefsCopy = Vec_IntAlloc(0);
+ Wln_NtkCreateRefs( p );
+ Wln_NtkStartFanoutMap( p, &p->vFanout, &p->vRefs, 1 );
+ ABC_SWAP( Vec_Int_t, *vRefsCopy, p->vRefs );
+ // add fanouts
+ Wln_NtkCleanRefs( p );
+ Wln_NtkForEachObj( p, iObj )
+ Wln_ObjForEachFanin( p, iObj, iFanin, k )
+ Wln_ObjSetFanout( p, iFanin, Wln_ObjRefsInc(p, iFanin), iObj );
+ // double-check the current number of fanouts added
+ Wln_NtkForEachObj( p, iObj )
+ assert( Wln_ObjRefs(p, iObj) == Vec_IntEntry(vRefsCopy, iObj) );
+ Vec_IntFree( vRefsCopy );
+}
+void Wln_NtkStaticFanoutStop( Wln_Ntk_t * p )
+{
+ Vec_IntErase( &p->vRefs );
+ Vec_IntErase( &p->vFanout );
+}
+void Wln_NtkStaticFanoutTest( Wln_Ntk_t * p )
+{
+ int k, iObj, iFanout;
+ printf( "Printing fanouts of %d objects of network \"%s\":\n", Wln_NtkObjNum(p), p->pName );
+ Wln_NtkStaticFanoutStart( p );
+ Wln_NtkForEachObj( p, iObj )
+ {
+ Wln_ObjPrint( p, iObj );
+ printf( " Fanouts : " );
+ Wln_ObjForEachFanoutStatic( p, iObj, iFanout, k )
+ printf( "%5d ", iFanout );
+ printf( "\n" );
+ }
+ Wln_NtkStaticFanoutStop( p );
+ printf( "\n" );
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+