/**CFile**************************************************************** FileName [acecUtil.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [CEC for arithmetic circuits.] Synopsis [Various utilities.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: acecUtil.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "acecInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Gia_PolynCollectXors_rec( Gia_Man_t * pGia, int iObj, Vec_Int_t * vXors ) { Gia_Obj_t * pObj = Gia_ManObj( pGia, iObj ); if ( Gia_ObjIsTravIdCurrent(pGia, pObj) ) return; Gia_ObjSetTravIdCurrent(pGia, pObj); if ( !Gia_ObjIsAnd(pObj) || !Gia_ObjIsXor(pObj) || Gia_ObjRefNum(pGia, pObj) > 1 ) return; Gia_PolynCollectXors_rec( pGia, Gia_ObjFaninId0(pObj, iObj), vXors ); Gia_PolynCollectXors_rec( pGia, Gia_ObjFaninId1(pObj, iObj), vXors ); Vec_IntPushUnique( vXors, iObj ); } Vec_Int_t * Gia_PolynCollectLastXor( Gia_Man_t * pGia, int fVerbose ) { Vec_Int_t * vXors = Vec_IntAlloc( 100 ); Gia_Obj_t * pObj = Gia_ManCo( pGia, Gia_ManCoNum(pGia)-1 ); ABC_FREE( pGia->pRefs ); Gia_ManCreateRefs( pGia ); Gia_ManIncrementTravId( pGia ); Gia_PolynCollectXors_rec( pGia, Gia_ObjFaninId0p(pGia, pObj), vXors ); Vec_IntReverseOrder( vXors ); ABC_FREE( pGia->pRefs ); return vXors; } void Gia_PolynAnalyzeXors( Gia_Man_t * pGia, int fVerbose ) { int i, iDriver, Count = 0; Vec_Int_t * vXors = Vec_IntAlloc( 100 ); if ( pGia->pMuxes == NULL ) { printf( "AIG does not have XORs extracted.\n" ); return; } assert( pGia->pMuxes ); Gia_ManForEachCoDriverId( pGia, iDriver, i ) { Vec_IntClear( vXors ); Gia_ManIncrementTravId( pGia ); Gia_PolynCollectXors_rec( pGia, iDriver, vXors ); //printf( "%3d : ", i ); //Vec_IntPrint( vXors ); printf( "%d=%d ", i, Vec_IntSize(vXors) ); Count += Vec_IntSize(vXors); } printf( "Total = %d.\n", Count ); Vec_IntFree( vXors ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Gia_Man_t * Gia_ManDupTopMostRange( Gia_Man_t * p ) { Gia_Man_t * pNew; Vec_Int_t * vTops = Vec_IntAlloc( 10 ); int i; for ( i = 45; i < 52; i++ ) Vec_IntPush( vTops, Gia_ObjId( p, Gia_ObjFanin0(Gia_ManCo(p, i)) ) ); pNew = Gia_ManDupAndConesLimit( p, Vec_IntArray(vTops), Vec_IntSize(vTops), 100 ); Vec_IntFree( vTops ); return pNew; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END