/**CFile**************************************************************** FileName [saigCone.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Sequential AIG package.] Synopsis [Cone of influence computation.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: saigCone.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "saig.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Counts the support size of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Saig_ManSupport_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Vec_Ptr_t * vSupp ) { if ( Aig_ObjIsTravIdCurrent(p, pObj) ) return; Aig_ObjSetTravIdCurrent(p, pObj); if ( Aig_ObjIsConst1(pObj) ) return; if ( Aig_ObjIsCi(pObj) ) { if ( Saig_ObjIsLo(p,pObj) ) { pObj = Saig_ManLi( p, Aig_ObjCioId(pObj)-Saig_ManPiNum(p) ); Vec_PtrPush( vSupp, pObj ); } return; } assert( Aig_ObjIsNode(pObj) ); Saig_ManSupport_rec( p, Aig_ObjFanin0(pObj), vSupp ); Saig_ManSupport_rec( p, Aig_ObjFanin1(pObj), vSupp ); } /**Function************************************************************* Synopsis [Counts the support size of the node.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Ptr_t * Saig_ManSupport( Aig_Man_t * p, Vec_Ptr_t * vNodes ) { Vec_Ptr_t * vSupp; Aig_Obj_t * pObj; int i; vSupp = Vec_PtrAlloc( 100 ); Aig_ManIncrementTravId( p ); Vec_PtrForEachEntry( Aig_Obj_t *, vNodes, pObj, i ) { assert( Aig_ObjIsCo(pObj) ); Saig_ManSupport_rec( p, Aig_ObjFanin0(pObj), vSupp ); } return vSupp; } /**Function************************************************************* Synopsis [Prints information about cones of influence of the POs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Saig_ManPrintConeOne( Aig_Man_t * p, Aig_Obj_t * pObj ) { Vec_Ptr_t * vPrev, * vCur, * vTotal; int s, i, nCurNew, nCurPrev, nCurOld; assert( Saig_ObjIsPo(p, pObj) ); // start the array vPrev = Vec_PtrAlloc( 100 ); Vec_PtrPush( vPrev, pObj ); // get the current support vCur = Saig_ManSupport( p, vPrev ); Vec_PtrClear( vPrev ); printf( " PO %3d ", Aig_ObjCioId(pObj) ); // continue computing supports as long as there are now nodes vTotal = Vec_PtrAlloc( 100 ); for ( s = 0; ; s++ ) { // classify current into those new, prev, and older nCurNew = nCurPrev = nCurOld = 0; Vec_PtrForEachEntry( Aig_Obj_t *, vCur, pObj, i ) { if ( Vec_PtrFind(vTotal, pObj) == -1 ) { Vec_PtrPush( vTotal, pObj ); nCurNew++; } else if ( Vec_PtrFind(vPrev, pObj) >= 0 ) nCurPrev++; else nCurOld++; } assert( nCurNew + nCurPrev + nCurOld == Vec_PtrSize(vCur) ); // print the result printf( "%d:%d %d=%d+%d+%d ", s, Vec_PtrSize(vTotal), Vec_PtrSize(vCur), nCurNew, nCurPrev, nCurOld ); if ( nCurNew == 0 ) break; // compute one more step Vec_PtrFree( vPrev ); vCur = Saig_ManSupport( p, vPrev = vCur ); } printf( "\n" ); Vec_PtrFree( vPrev ); Vec_PtrFree( vCur ); Vec_PtrFree( vTotal ); } /**Function************************************************************* Synopsis [Prints information about cones of influence of the POs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Saig_ManPrintCones( Aig_Man_t * p ) { Aig_Obj_t * pObj; int i; printf( "The format of this print-out: For each PO, x:a b=c+d+e, where \n" ); printf( "- x is the time-frame counting back from the PO\n" ); printf( "- a is the total number of registers in the COI of the PO so far\n" ); printf( "- b is the number of registers in the COI of the PO in this time-frame\n" ); printf( "- c is the number of registers in b that are new (appear for the first time)\n" ); printf( "- d is the number of registers in b in common with the previous time-frame\n" ); printf( "- e is the number of registers in b in common with other time-frames\n" ); Aig_ManSetCioIds( p ); Saig_ManForEachPo( p, pObj, i ) Saig_ManPrintConeOne( p, pObj ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END