| /**CFile**************************************************************** |
| |
| FileName [llb1Hint.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [BDD based reachability.] |
| |
| Synopsis [Cofactors the circuit w.r.t. the high-fanout variables.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: llb1Hint.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "llbInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns CI index with the largest number of fanouts.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Llb_ManMaxFanoutCi( Aig_Man_t * pAig ) |
| { |
| Aig_Obj_t * pObj; |
| int i, WeightMax = -ABC_INFINITY, iInput = -1; |
| Aig_ManForEachCi( pAig, pObj, i ) |
| if ( WeightMax < Aig_ObjRefs(pObj) ) |
| { |
| WeightMax = Aig_ObjRefs(pObj); |
| iInput = i; |
| } |
| assert( iInput >= 0 ); |
| return iInput; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Derives AIG whose PI is substituted by a constant.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Aig_Man_t * Llb_ManPerformHints( Aig_Man_t * pAig, int nHintDepth ) |
| { |
| Aig_Man_t * pNew, * pTemp; |
| int i, iInput; |
| pNew = Aig_ManDupDfs( pAig ); |
| for ( i = 0; i < nHintDepth; i++ ) |
| { |
| iInput = Llb_ManMaxFanoutCi( pNew ); |
| Abc_Print( 1, "%d %3d\n", i, iInput ); |
| pNew = Aig_ManDupCof( pTemp = pNew, iInput, 1 ); |
| Aig_ManStop( pTemp ); |
| } |
| return pNew; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns CI index with the largest number of fanouts.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Vec_Int_t * Llb_ManCollectHighFanoutObjects( Aig_Man_t * pAig, int nCandMax, int fCisOnly ) |
| { |
| Vec_Int_t * vFanouts, * vResult; |
| Aig_Obj_t * pObj; |
| int i, fChanges, PivotValue; |
| // int Entry; |
| // collect fanout counts |
| vFanouts = Vec_IntAlloc( 100 ); |
| Aig_ManForEachObj( pAig, pObj, i ) |
| { |
| // if ( !Aig_ObjIsCi(pObj) && (fCisOnly || !Aig_ObjIsNode(pObj)) ) |
| if ( !Saig_ObjIsLo(pAig,pObj) && (fCisOnly || !Aig_ObjIsNode(pObj)) ) |
| continue; |
| Vec_IntPush( vFanouts, Aig_ObjRefs(pObj) ); |
| } |
| Vec_IntSort( vFanouts, 1 ); |
| // pick the separator |
| nCandMax = Abc_MinInt( nCandMax, Vec_IntSize(vFanouts) - 1 ); |
| PivotValue = Vec_IntEntry( vFanouts, nCandMax ); |
| Vec_IntFree( vFanouts ); |
| // collect obj satisfying the constraints |
| vResult = Vec_IntAlloc( 100 ); |
| Aig_ManForEachObj( pAig, pObj, i ) |
| { |
| // if ( !Aig_ObjIsCi(pObj) && (fCisOnly || !Aig_ObjIsNode(pObj)) ) |
| if ( !Saig_ObjIsLo(pAig,pObj) && (fCisOnly || !Aig_ObjIsNode(pObj)) ) |
| continue; |
| if ( Aig_ObjRefs(pObj) < PivotValue ) |
| continue; |
| Vec_IntPush( vResult, Aig_ObjId(pObj) ); |
| } |
| assert( Vec_IntSize(vResult) >= nCandMax ); |
| // order in the decreasing order of fanouts |
| do |
| { |
| fChanges = 0; |
| for ( i = 0; i < Vec_IntSize(vResult) - 1; i++ ) |
| if ( Aig_ObjRefs(Aig_ManObj(pAig, Vec_IntEntry(vResult, i))) < |
| Aig_ObjRefs(Aig_ManObj(pAig, Vec_IntEntry(vResult, i+1))) ) |
| { |
| int Temp = Vec_IntEntry( vResult, i ); |
| Vec_IntWriteEntry( vResult, i, Vec_IntEntry(vResult, i+1) ); |
| Vec_IntWriteEntry( vResult, i+1, Temp ); |
| fChanges = 1; |
| } |
| } |
| while ( fChanges ); |
| /* |
| Vec_IntForEachEntry( vResult, Entry, i ) |
| printf( "%d ", Aig_ObjRefs(Aig_ManObj(pAig, Entry)) ); |
| printf( "\n" ); |
| */ |
| return vResult; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Derives AIG whose PI is substituted by a constant.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Llb_ManModelCheckAigWithHints( Aig_Man_t * pAigGlo, Gia_ParLlb_t * pPars ) |
| { |
| DdManager * ddGlo = NULL; |
| Vec_Int_t * vHints; |
| Vec_Int_t * vHFCands; |
| int i, Entry, RetValue = -1; |
| abctime clk = Abc_Clock(); |
| assert( pPars->nHintDepth > 0 ); |
| /* |
| // perform reachability without hints |
| RetValue = Llb_ManModelCheckAig( pAigGlo, pPars, NULL, NULL ); |
| if ( RetValue >= 0 ) |
| return RetValue; |
| */ |
| // create hints representation |
| vHFCands = Llb_ManCollectHighFanoutObjects( pAigGlo, pPars->nHintDepth+pPars->HintFirst, 1 ); |
| vHints = Vec_IntStartFull( Aig_ManObjNumMax(pAigGlo) ); |
| // add one hint at a time till the problem is solved |
| Vec_IntForEachEntryStart( vHFCands, Entry, i, pPars->HintFirst ) |
| { |
| Vec_IntWriteEntry( vHints, Entry, 1 ); // change to 1 to start from zero cof!!! |
| // solve under hints |
| RetValue = Llb_ManModelCheckAig( pAigGlo, pPars, vHints, &ddGlo ); |
| if ( RetValue == 0 ) |
| goto Finish; |
| if ( RetValue == 1 ) |
| break; |
| } |
| if ( RetValue == -1 ) |
| goto Finish; |
| // undo the hints one at a time |
| for ( ; i >= pPars->HintFirst; i-- ) |
| { |
| Entry = Vec_IntEntry( vHFCands, i ); |
| Vec_IntWriteEntry( vHints, Entry, -1 ); |
| // solve under relaxed hints |
| RetValue = Llb_ManModelCheckAig( pAigGlo, pPars, vHints, &ddGlo ); |
| if ( RetValue == 0 ) |
| goto Finish; |
| if ( RetValue == 1 ) |
| continue; |
| break; |
| } |
| Finish: |
| if ( ddGlo ) |
| { |
| if ( ddGlo->bFunc ) |
| Cudd_RecursiveDeref( ddGlo, ddGlo->bFunc ); |
| Extra_StopManager( ddGlo ); |
| } |
| Vec_IntFreeP( &vHFCands ); |
| Vec_IntFreeP( &vHints ); |
| if ( pPars->fVerbose ) |
| Abc_PrintTime( 1, "Total runtime", Abc_Clock() - clk ); |
| return RetValue; |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |