/**CFile**************************************************************** FileName [llb1Pivot.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [BDD based reachability.] Synopsis [Determining pivot variables.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: llb1Pivot.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "llbInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Llb_ManTracePaths_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pPivot ) { Aig_Obj_t * pFanout; int k, iFan = -1; if ( Aig_ObjIsTravIdPrevious(p, pObj) ) return 0; if ( Aig_ObjIsTravIdCurrent(p, pObj) ) return 1; if ( Saig_ObjIsLi(p, pObj) ) return 0; if ( Saig_ObjIsPo(p, pObj) ) return 0; if ( pObj == pPivot ) return 1; assert( Aig_ObjIsCand(pObj) ); Aig_ObjForEachFanout( p, pObj, pFanout, iFan, k ) if ( !Llb_ManTracePaths_rec( p, pFanout, pPivot ) ) { Aig_ObjSetTravIdPrevious(p, pObj); return 0; } Aig_ObjSetTravIdCurrent(p, pObj); return 1; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Llb_ManTracePaths( Aig_Man_t * p, Aig_Obj_t * pPivot ) { Aig_Obj_t * pObj; int i, Counter = 0; Aig_ManIncrementTravId( p ); // prev = visited with path to LI (value 0) Aig_ManIncrementTravId( p ); // cur = visited w/o path to LI (value 1) Saig_ManForEachLo( p, pObj, i ) Counter += Llb_ManTracePaths_rec( p, pObj, pPivot ); return Counter; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManTestCuts( Aig_Man_t * p ) { Aig_Obj_t * pObj; int i, Count; Aig_ManFanoutStart( p ); Aig_ManForEachNode( p, pObj, i ) { if ( Aig_ObjRefs(pObj) <= 1 ) continue; Count = Llb_ManTracePaths( p, pObj ); printf( "Obj =%5d. Lev =%3d. Fanout =%5d. Count = %3d.\n", i, Aig_ObjLevel(pObj), Aig_ObjRefs(pObj), Count ); } Aig_ManFanoutStop( p ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManLabelLiCones_rec( Aig_Man_t * p, Aig_Obj_t * pObj ) { if ( pObj->fMarkB ) return; pObj->fMarkB = 1; assert( Aig_ObjIsNode(pObj) ); Llb_ManLabelLiCones_rec( p, Aig_ObjFanin0(pObj) ); Llb_ManLabelLiCones_rec( p, Aig_ObjFanin1(pObj) ); } /**Function************************************************************* Synopsis [Determine starting cut-points.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManLabelLiCones( Aig_Man_t * p ) { Aig_Obj_t * pObj; int i; // mark const and PIs Aig_ManConst1(p)->fMarkB = 1; Aig_ManForEachCi( p, pObj, i ) pObj->fMarkB = 1; // mark cones Saig_ManForEachLi( p, pObj, i ) Llb_ManLabelLiCones_rec( p, Aig_ObjFanin0(pObj) ); } /**Function************************************************************* Synopsis [Determine starting cut-points.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManMarkInternalPivots( Aig_Man_t * p ) { Vec_Ptr_t * vMuxes; Aig_Obj_t * pObj; int i, Counter = 0; // remove refs due to MUXes vMuxes = Aig_ManMuxesCollect( p ); Aig_ManMuxesDeref( p, vMuxes ); // mark nodes feeding into LIs Aig_ManCleanMarkB( p ); Llb_ManLabelLiCones( p ); // mark internal nodes Aig_ManFanoutStart( p ); Aig_ManForEachNode( p, pObj, i ) if ( pObj->fMarkB && pObj->nRefs > 1 ) { if ( Llb_ManTracePaths(p, pObj) > 0 ) pObj->fMarkA = 1; Counter++; } Aig_ManFanoutStop( p ); // printf( "TracePath tried = %d.\n", Counter ); // mark nodes feeding into LIs Aig_ManCleanMarkB( p ); // add refs due to MUXes Aig_ManMuxesRef( p, vMuxes ); Vec_PtrFree( vMuxes ); } /**Function************************************************************* Synopsis [Determine starting cut-points.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Llb_ManMarkPivotNodes( Aig_Man_t * p, int fUseInternal ) { Vec_Int_t * vVar2Obj; Aig_Obj_t * pObj; int i; // mark inputs/outputs Aig_ManForEachCi( p, pObj, i ) pObj->fMarkA = 1; Saig_ManForEachLi( p, pObj, i ) pObj->fMarkA = 1; // mark internal pivot nodes if ( fUseInternal ) Llb_ManMarkInternalPivots( p ); // assign variable numbers Aig_ManConst1(p)->fMarkA = 0; vVar2Obj = Vec_IntAlloc( 100 ); Aig_ManForEachCi( p, pObj, i ) Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) ); Aig_ManForEachNode( p, pObj, i ) if ( pObj->fMarkA ) Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) ); Saig_ManForEachLi( p, pObj, i ) Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) ); return vVar2Obj; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END