diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-12 13:40:48 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-12 13:40:48 -0700 |
commit | dcb7d0d3fcf7f8736031b6966e47d71efe79450f (patch) | |
tree | 0982ed27132f7e04edc400b0b912c25312471b6c /src/base/wlc/wlcNtk.c | |
parent | ae7e286213a03babd7db9ff155f702999bf60b0d (diff) | |
download | abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.tar.gz abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.tar.bz2 abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.zip |
New word-level representation package.
Diffstat (limited to 'src/base/wlc/wlcNtk.c')
-rw-r--r-- | src/base/wlc/wlcNtk.c | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/base/wlc/wlcNtk.c b/src/base/wlc/wlcNtk.c new file mode 100644 index 00000000..026f6b21 --- /dev/null +++ b/src/base/wlc/wlcNtk.c @@ -0,0 +1,283 @@ +/**CFile**************************************************************** + + FileName [wlcNtk.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Verilog parser.] + + Synopsis [Network data-structure.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - August 22, 2014.] + + Revision [$Id: wlcNtk.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "wlc.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Working with models.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Wlc_Ntk_t * Wlc_NtkAlloc( char * pName, int nObjsAlloc ) +{ + Wlc_Ntk_t * p; + p = ABC_CALLOC( Wlc_Ntk_t, 1 ); + p->pName = Extra_FileNameGeneric( pName ); + Vec_IntGrow( &p->vPis, 111 ); + Vec_IntGrow( &p->vPos, 111 ); + Vec_IntGrow( &p->vCis, 111 ); + Vec_IntGrow( &p->vCos, 111 ); + Vec_IntGrow( &p->vFfs, 111 ); + p->pMemFanin = Mem_FlexStart(); + p->nObjsAlloc = nObjsAlloc; + p->pObjs = ABC_CALLOC( Wlc_Obj_t, p->nObjsAlloc ); + p->iObj = 1; + return p; +} +int Wlc_ObjAlloc( Wlc_Ntk_t * p, int Type, int Signed, int End, int Beg ) +{ + Wlc_Obj_t * pObj; + if ( p->iObj == p->nObjsAlloc ) + { + p->pObjs = ABC_REALLOC( Wlc_Obj_t, p->pObjs, 2 * p->nObjsAlloc ); + memset( p->pObjs + p->nObjsAlloc, 0, sizeof(Wlc_Obj_t) * p->nObjsAlloc ); + p->nObjsAlloc *= 2; + } + pObj = Wlc_NtkObj( p, p->iObj ); + pObj->Type = Type; + pObj->Signed = Signed; + pObj->End = End; + pObj->Beg = Beg; + if ( Type == WLC_OBJ_PI ) + { + pObj->Fanins[1] = Vec_IntSize(&p->vPis); + Vec_IntPush( &p->vPis, p->iObj ); + } + else if ( Type == WLC_OBJ_PO ) + { + pObj->Fanins[1] = Vec_IntSize(&p->vPos); + Vec_IntPush( &p->vPos, p->iObj ); + } + p->nObjs[Type]++; + return p->iObj++; +} +char * Wlc_ObjName( Wlc_Ntk_t * p, int iObj ) +{ + static char Buffer[100]; + if ( Wlc_NtkHasNameId(p) && Wlc_ObjNameId(p, iObj) ) + return Abc_NamStr( p->pManName, Wlc_ObjNameId(p, iObj) ); + sprintf( Buffer, "n%d", iObj ); + return Buffer; +} +void Wlc_ObjUpdateType( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, int Type ) +{ + if ( pObj->Type == WLC_OBJ_PO ) + { + assert( Type == WLC_OBJ_BUF ); + return; + } + p->nObjs[pObj->Type]--; + pObj->Type = Type; + p->nObjs[pObj->Type]++; +} +void Wlc_ObjAddFanins( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, Vec_Int_t * vFanins ) +{ + assert( pObj->nFanins == 0 ); + pObj->nFanins = Vec_IntSize(vFanins); + if ( Wlc_ObjHasArray(pObj) ) + pObj->pFanins[0] = (int *)Mem_FlexEntryFetch( p->pMemFanin, Vec_IntSize(vFanins) * sizeof(int) ); + memcpy( Wlc_ObjFanins(pObj), Vec_IntArray(vFanins), sizeof(int) * Vec_IntSize(vFanins) ); + // special treatment of CONST and SELECT + if ( pObj->Type == WLC_OBJ_CONST ) + pObj->nFanins = 0; + else if ( pObj->Type == WLC_OBJ_BIT_SELECT ) + pObj->nFanins = 1; +} +void Wlc_NtkFree( Wlc_Ntk_t * p ) +{ + if ( p->pManName ) + Abc_NamStop( p->pManName ); + if ( p->pMemFanin ) + Mem_FlexStop( p->pMemFanin, 0 ); + ABC_FREE( p->vPis.pArray ); + ABC_FREE( p->vPos.pArray ); + ABC_FREE( p->vCis.pArray ); + ABC_FREE( p->vCos.pArray ); + ABC_FREE( p->vFfs.pArray ); + ABC_FREE( p->vTravIds.pArray ); + ABC_FREE( p->vNameIds.pArray ); + ABC_FREE( p->vCopies.pArray ); + ABC_FREE( p->pObjs ); + ABC_FREE( p->pName ); + ABC_FREE( p ); +} +int Wlc_NtkMemUsage( Wlc_Ntk_t * p ) +{ + int Mem = sizeof(Wlc_Ntk_t); + Mem += 4 * p->vPis.nCap; + Mem += 4 * p->vPos.nCap; + Mem += 4 * p->vCis.nCap; + Mem += 4 * p->vCos.nCap; + Mem += 4 * p->vFfs.nCap; + Mem += sizeof(Wlc_Obj_t) * p->nObjsAlloc; + Mem += Abc_NamMemUsed(p->pManName); + Mem += Mem_FlexReadMemUsage(p->pMemFanin); + return Mem; +} +void Wlc_NtkPrintNodes( Wlc_Ntk_t * p, int Type ) +{ + Wlc_Obj_t * pObj; + int i, Counter = 0; + printf( "Operation %s\n", Wlc_Names[Type] ); + Wlc_NtkForEachObj( p, pObj, i ) + { + if ( (int)pObj->Type != Type ) + continue; + printf( "%8d :", Counter++ ); + printf( "%8d : ", i ); + printf( "%3d%s = ", Wlc_ObjRange(pObj), pObj->Signed ? "s" : " " ); + printf( "%3d%s %s ", Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), Wlc_ObjFanin0(p, pObj)->Signed ? "s" : " ", Wlc_Names[Type] ); + printf( "%3d%s ", Wlc_ObjRange(Wlc_ObjFanin1(p, pObj)), Wlc_ObjFanin1(p, pObj)->Signed ? "s" : " " ); + printf( " : " ); + printf( "%-12s = ", Wlc_ObjName(p, i) ); + printf( "%-12s %s ", Wlc_ObjName(p, Wlc_ObjFaninId0(pObj)), Wlc_Names[Type] ); + printf( "%-12s ", Wlc_ObjName(p, Wlc_ObjFaninId1(pObj)) ); + printf( "\n" ); + } +} +void Wlc_NtkPrintStats( Wlc_Ntk_t * p, int fVerbose ) +{ + int i; + printf( "%-20s : ", p->pName ); + printf( "PI = %4d ", Wlc_NtkPiNum(p) ); + printf( "PO = %4d ", Wlc_NtkPoNum(p) ); + printf( "FF = %4d ", Wlc_NtkFfNum(p) ); + printf( "Obj = %6d ", Wlc_NtkObjNum(p) ); + printf( "Mem = %.3f MB", 1.0*Wlc_NtkMemUsage(p)/(1<<20) ); + printf( "\n" ); + if ( !fVerbose ) + return; + printf( "Node type statisticts:\n" ); + for ( i = 0; i < WLC_OBJ_NUMBER; i++ ) + if ( p->nObjs[i] ) + printf( "%2d : %6d %-8s\n", i, p->nObjs[i], Wlc_Names[i] ); +// Wlc_NtkPrintNodes( p, WLC_OBJ_ARI_MULTI ); +} + +/**Function************************************************************* + + Synopsis [Duplicates the network in a topological order.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Wlc_ObjCollectCopyFanins( Wlc_Ntk_t * p, int iObj, Vec_Int_t * vFanins ) +{ + int i, iFanin; + Wlc_Obj_t * pObj = Wlc_NtkObj( p, iObj ); + Vec_IntClear( vFanins ); + Wlc_ObjForEachFanin( pObj, iFanin, i ) + Vec_IntPush( vFanins, Wlc_ObjCopy(p, iFanin) ); + // special treatment of CONST and SELECT + if ( pObj->Type == WLC_OBJ_CONST ) + { + int * pInts = Wlc_ObjConstValue( pObj ); + int nInts = Abc_BitWordNum( Wlc_ObjRange(pObj) ); + for ( i = 0; i < nInts; i++ ) + Vec_IntPush( vFanins, pInts[i] ); + } + else if ( pObj->Type == WLC_OBJ_BIT_SELECT ) + { + assert( Vec_IntSize(vFanins) == 1 ); + Vec_IntPush( vFanins, pObj->Fanins[1] ); + } +} +int Wlc_ObjDup( Wlc_Ntk_t * pNew, Wlc_Ntk_t * p, int iObj, Vec_Int_t * vFanins ) +{ + Wlc_Obj_t * pObj = Wlc_NtkObj( p, iObj ); + int iFaninNew = Wlc_ObjAlloc( pNew, pObj->Type, pObj->Signed, pObj->End, pObj->Beg ); + Wlc_Obj_t * pObjNew = Wlc_NtkObj(pNew, iFaninNew); + Wlc_ObjCollectCopyFanins( p, iObj, vFanins ); + Wlc_ObjAddFanins( pNew, pObjNew, vFanins ); + Wlc_ObjSetCopy( p, iObj, iFaninNew ); + return iFaninNew; +} +void Wlc_NtkDupDfs_rec( Wlc_Ntk_t * pNew, Wlc_Ntk_t * p, int iObj, Vec_Int_t * vFanins ) +{ + Wlc_Obj_t * pObj; + int i, iFanin; + if ( Wlc_ObjCopy(p, iObj) ) + return; + pObj = Wlc_NtkObj( p, iObj ); + Wlc_ObjForEachFanin( pObj, iFanin, i ) + Wlc_NtkDupDfs_rec( pNew, p, iFanin, vFanins ); + Wlc_ObjDup( pNew, p, iObj, vFanins ); +} +Wlc_Ntk_t * Wlc_NtkDupDfs( Wlc_Ntk_t * p ) +{ + Wlc_Ntk_t * pNew; + Wlc_Obj_t * pObj; + Vec_Int_t * vFanins; + int i; + Wlc_NtkCleanCopy( p ); + vFanins = Vec_IntAlloc( 100 ); + pNew = Wlc_NtkAlloc( p->pName, p->nObjsAlloc ); + Wlc_NtkForEachPi( p, pObj, i ) + Wlc_ObjDup( pNew, p, Wlc_ObjId(p, pObj), vFanins ); + Wlc_NtkForEachPo( p, pObj, i ) + Wlc_NtkDupDfs_rec( pNew, p, Wlc_ObjFaninId0(pObj), vFanins ); + Wlc_NtkForEachPo( p, pObj, i ) + Wlc_ObjDup( pNew, p, Wlc_ObjId(p, pObj), vFanins ); + Vec_IntFree( vFanins ); + return pNew; +} +void Wlc_NtkTransferNames( Wlc_Ntk_t * pNew, Wlc_Ntk_t * p ) +{ + int i; + assert( !Wlc_NtkHasCopy(pNew) && Wlc_NtkHasCopy(p) ); + assert( !Wlc_NtkHasNameId(pNew) && Wlc_NtkHasNameId(p) ); + assert( pNew->pManName == NULL && p->pManName != NULL ); + Wlc_NtkCleanNameId( pNew ); + for ( i = 0; i < p->nObjsAlloc; i++ ) + if ( Wlc_ObjCopy(p, i) && Wlc_ObjNameId(p, i) ) + Wlc_ObjSetNameId( pNew, Wlc_ObjCopy(p, i), Wlc_ObjNameId(p, i) ); + pNew->pManName = p->pManName; + p->pManName = NULL; + Vec_IntErase( &p->vNameIds ); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |