diff options
Diffstat (limited to 'src/base/wlc/wlcWin.c')
-rw-r--r-- | src/base/wlc/wlcWin.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/base/wlc/wlcWin.c b/src/base/wlc/wlcWin.c new file mode 100644 index 00000000..4dc748f4 --- /dev/null +++ b/src/base/wlc/wlcWin.c @@ -0,0 +1,166 @@ +/**CFile**************************************************************** + + FileName [wlcWin.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Verilog parser.] + + Synopsis [Parses several flavors of word-level Verilog.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - August 22, 2014.] + + Revision [$Id: wlcWin.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "wlc.h" +#include "base/abc/abc.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Collect arithmetic nodes.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Wlc_ObjIsArithm( Wlc_Obj_t * pObj ) +{ + return pObj->Type == WLC_OBJ_CONST || + pObj->Type == WLC_OBJ_BUF || pObj->Type == WLC_OBJ_BIT_NOT || + pObj->Type == WLC_OBJ_BIT_ZEROPAD || pObj->Type == WLC_OBJ_BIT_SIGNEXT || +// pObj->Type == WLC_OBJ_BIT_SELECT || pObj->Type == WLC_OBJ_BIT_CONCAT || + pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB || + pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS; +} +int Wlc_ObjIsArithmReal( Wlc_Obj_t * pObj ) +{ + return pObj->Type == WLC_OBJ_BIT_NOT || + pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB || + pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS; +} +int Wlc_ManCountArithmReal( Wlc_Ntk_t * p, Vec_Int_t * vNodes ) +{ + Wlc_Obj_t * pObj; + int i, Counter = 0; + Wlc_NtkForEachObjVec( vNodes, p, pObj, i ) + Counter += Wlc_ObjIsArithmReal( pObj ); + return Counter; +} +int Wlc_ObjHasArithm_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj ) +{ + if ( pObj->Type == WLC_OBJ_CONST ) + return 0; + if ( pObj->Type == WLC_OBJ_BUF || pObj->Type == WLC_OBJ_BIT_NOT || + pObj->Type == WLC_OBJ_BIT_ZEROPAD || pObj->Type == WLC_OBJ_BIT_SIGNEXT ) + return Wlc_ObjHasArithm_rec( p, Wlc_ObjFanin0(p, pObj) ); + return pObj->Type == WLC_OBJ_ARI_ADD || pObj->Type == WLC_OBJ_ARI_SUB || + pObj->Type == WLC_OBJ_ARI_MULTI || pObj->Type == WLC_OBJ_ARI_MINUS; +} +int Wlc_ObjHasArithmFanins( Wlc_Ntk_t * p, Wlc_Obj_t * pObj ) +{ + Wlc_Obj_t * pFanin; int i; + assert( !Wlc_ObjHasArithm_rec(p, pObj) ); + Wlc_ObjForEachFaninObj( p, pObj, pFanin, i ) + if ( Wlc_ObjHasArithm_rec(p, pFanin) ) + return 1; + return 0; +} +void Wlc_WinCompute_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, Vec_Int_t * vLeaves, Vec_Int_t * vNodes ) +{ + Wlc_Obj_t * pFanin; int i; + if ( pObj->Mark ) + return; + pObj->Mark = 1; + if ( !Wlc_ObjIsArithm(pObj) ) + { + Vec_IntPush( vLeaves, Wlc_ObjId(p, pObj) ); + return; + } + Wlc_ObjForEachFaninObj( p, pObj, pFanin, i ) + Wlc_WinCompute_rec( p, pFanin, vLeaves, vNodes ); + Vec_IntPush( vNodes, Wlc_ObjId(p, pObj) ); +} +void Wlc_WinCleanMark_rec( Wlc_Ntk_t * p, Wlc_Obj_t * pObj ) +{ + Wlc_Obj_t * pFanin; int i; + if ( !pObj->Mark ) + return; + pObj->Mark = 0; + Wlc_ObjForEachFaninObj( p, pObj, pFanin, i ) + Wlc_WinCleanMark_rec( p, pFanin ); +} +void Wlc_WinCompute( Wlc_Ntk_t * p, Wlc_Obj_t * pObj, Vec_Int_t * vLeaves, Vec_Int_t * vNodes ) +{ + Vec_IntClear( vLeaves ); + Vec_IntClear( vNodes ); + if ( Wlc_ObjHasArithm_rec(p, pObj) ) + { + Wlc_WinCompute_rec( p, pObj, vLeaves, vNodes ); + Wlc_WinCleanMark_rec( p, pObj ); + } + else if ( Wlc_ObjHasArithmFanins(p, pObj) ) + { + Wlc_Obj_t * pFanin; int i; + Wlc_ObjForEachFaninObj( p, pObj, pFanin, i ) + if ( Wlc_ObjHasArithm_rec(p, pFanin) ) + Wlc_WinCompute_rec( p, pFanin, vLeaves, vNodes ); + Wlc_ObjForEachFaninObj( p, pObj, pFanin, i ) + if ( Wlc_ObjHasArithm_rec(p, pFanin) ) + Wlc_WinCleanMark_rec( p, pFanin ); + } + else assert( 0 ); +} +void Wlc_WinProfileArith( Wlc_Ntk_t * p ) +{ + Vec_Int_t * vLeaves = Vec_IntAlloc( 1000 ); + Vec_Int_t * vNodes = Vec_IntAlloc( 1000 ); + Wlc_Obj_t * pObj; int i, Count = 0; + Wlc_NtkForEachObj( p, pObj, i ) + pObj->Mark = 0; + Wlc_NtkForEachObj( p, pObj, i ) + if ( Wlc_ObjHasArithm_rec(p, pObj) ? Wlc_ObjIsCo(pObj) : Wlc_ObjHasArithmFanins(p, pObj) ) + { + Wlc_WinCompute( p, pObj, vLeaves, vNodes ); + if ( Wlc_ManCountArithmReal(p, vNodes) < 2 ) + continue; + + printf( "Arithmetic cone of node %d (%s):\n", Wlc_ObjId(p, pObj), Wlc_ObjName(p, Wlc_ObjId(p, pObj)) ); + Wlc_NtkPrintNode( p, pObj ); + Vec_IntReverseOrder( vNodes ); + Wlc_NtkPrintNodeArray( p, vNodes ); + printf( "\n" ); + Count++; + } + Wlc_NtkForEachObj( p, pObj, i ) + assert( pObj->Mark == 0 ); + printf( "Finished printing %d arithmetic cones.\n", Count ); + Vec_IntFree( vLeaves ); + Vec_IntFree( vNodes ); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |