| /**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 |
| |