| /**CFile**************************************************************** |
| |
| FileName [mpmMig.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Configurable technology mapper.] |
| |
| Synopsis [Subject graph data structure.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 1, 2013.] |
| |
| Revision [$Id: mpmMig.c,v 1.00 2013/06/01 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "mpmInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Mig_Man_t * Mig_ManStart() |
| { |
| Mig_Man_t * p; |
| assert( sizeof(Mig_Obj_t) >= 16 ); |
| assert( (1 << MIG_BASE) == MIG_MASK + 1 ); |
| p = ABC_CALLOC( Mig_Man_t, 1 ); |
| Vec_IntGrow( &p->vCis, 1024 ); |
| Vec_IntGrow( &p->vCos, 1024 ); |
| Mig_ManAppendObj( p ); // const0 |
| return p; |
| } |
| void Mig_ManStop( Mig_Man_t * p ) |
| { |
| if ( 0 ) |
| printf( "Subject graph uses %d pages of %d objects with %d entries. Total memory = %.2f MB.\n", |
| Vec_PtrSize(&p->vPages), MIG_MASK + 1, p->nObjs, |
| 1.0 * Vec_PtrSize(&p->vPages) * (MIG_MASK + 1) * 16 / (1 << 20) ); |
| // attributes |
| ABC_FREE( p->vTravIds.pArray ); |
| ABC_FREE( p->vCopies.pArray ); |
| ABC_FREE( p->vLevels.pArray ); |
| ABC_FREE( p->vRefs.pArray ); |
| ABC_FREE( p->vSibls.pArray ); |
| // pages |
| Vec_PtrForEachEntry( Mig_Obj_t *, &p->vPages, p->pPage, p->iPage ) |
| --p->pPage, ABC_FREE( p->pPage ); |
| // objects |
| ABC_FREE( p->vPages.pArray ); |
| ABC_FREE( p->vCis.pArray ); |
| ABC_FREE( p->vCos.pArray ); |
| ABC_FREE( p->pName ); |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Mig_ManTypeNum( Mig_Man_t * p, int Type ) |
| { |
| Mig_Obj_t * pObj; |
| int Counter = 0; |
| Mig_ManForEachNode( p, pObj ) |
| Counter += (Mig_ObjNodeType(pObj) == Type); |
| return Counter; |
| } |
| int Mig_ManAndNum( Mig_Man_t * p ) |
| { |
| return Mig_ManTypeNum(p, 1); |
| } |
| int Mig_ManXorNum( Mig_Man_t * p ) |
| { |
| return Mig_ManTypeNum(p, 2); |
| } |
| int Mig_ManMuxNum( Mig_Man_t * p ) |
| { |
| return Mig_ManTypeNum(p, 3); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Mig_ManSetRefs( Mig_Man_t * p ) |
| { |
| Mig_Obj_t * pObj; |
| int i, iFanin; |
| // increment references |
| Vec_IntFill( &p->vRefs, Mig_ManObjNum(p), 0 ); |
| Mig_ManForEachObj( p, pObj ) |
| { |
| Mig_ObjForEachFaninId( pObj, iFanin, i ) |
| Vec_IntAddToEntry( &p->vRefs, iFanin, 1 ); |
| if ( Mig_ObjSiblId(pObj) ) |
| Vec_IntAddToEntry( &p->vRefs, Mig_ObjSiblId(pObj), 1 ); |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Mig_ManSuppSize_rec( Mig_Obj_t * pObj ) |
| { |
| if ( pObj == NULL ) |
| return 0; |
| if ( Mig_ObjIsTravIdCurrent(pObj) ) |
| return 0; |
| Mig_ObjSetTravIdCurrent(pObj); |
| if ( Mig_ObjIsCi(pObj) ) |
| return 1; |
| assert( Mig_ObjIsNode(pObj) ); |
| return Mig_ManSuppSize_rec( Mig_ObjFanin0(pObj) ) + |
| Mig_ManSuppSize_rec( Mig_ObjFanin1(pObj) ) + |
| Mig_ManSuppSize_rec( Mig_ObjFanin2(pObj) ); |
| } |
| int Mig_ManSuppSize2_rec( Mig_Man_t * p, int iObj ) |
| { |
| Mig_Obj_t * pObj; |
| if ( iObj == MIG_NONE ) |
| return 0; |
| if ( Mig_ObjIsTravIdCurrentId(p, iObj) ) |
| return 0; |
| Mig_ObjSetTravIdCurrentId(p, iObj); |
| pObj = Mig_ManObj( p, iObj ); |
| if ( Mig_ObjIsCi(pObj) ) |
| return 1; |
| assert( Mig_ObjIsNode(pObj) ); |
| return Mig_ManSuppSize2_rec( p, Mig_ObjFaninId0(pObj) ) + |
| Mig_ManSuppSize2_rec( p, Mig_ObjFaninId1(pObj) ) + |
| Mig_ManSuppSize2_rec( p, Mig_ObjFaninId2(pObj) ); |
| } |
| int Mig_ManSuppSizeOne( Mig_Obj_t * pObj ) |
| { |
| Mig_ObjIncrementTravId( pObj ); |
| // return Mig_ManSuppSize_rec( pObj ); |
| return Mig_ManSuppSize2_rec( Mig_ObjMan(pObj), Mig_ObjId(pObj) ); |
| } |
| int Mig_ManSuppSizeTest( Mig_Man_t * p ) |
| { |
| Mig_Obj_t * pObj; |
| int Counter = 0; |
| abctime clk = Abc_Clock(); |
| Mig_ManForEachObj( p, pObj ) |
| if ( Mig_ObjIsNode(pObj) ) |
| Counter += (Mig_ManSuppSizeOne(pObj) <= 16); |
| printf( "Nodes with small support %d (out of %d)\n", Counter, Mig_ManNodeNum(p) ); |
| Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); |
| return Counter; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |