/**CFile**************************************************************** FileName [llb1Man.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [BDD based reachability.] Synopsis [Reachability manager.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: llb1Man.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 [] ***********************************************************************/ void Llb_ManPrepareVarMap( Llb_Man_t * p ) { Aig_Obj_t * pObjLi, * pObjLo; int i, iVarLi, iVarLo; assert( p->vNs2Glo == NULL ); assert( p->vCs2Glo == NULL ); assert( p->vGlo2Cs == NULL ); assert( p->vGlo2Ns == NULL ); p->vNs2Glo = Vec_IntStartFull( Vec_IntSize(p->vVar2Obj) ); p->vCs2Glo = Vec_IntStartFull( Vec_IntSize(p->vVar2Obj) ); p->vGlo2Cs = Vec_IntStartFull( Aig_ManRegNum(p->pAig) ); p->vGlo2Ns = Vec_IntStartFull( Aig_ManRegNum(p->pAig) ); Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) { iVarLi = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLi)); iVarLo = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLo)); assert( iVarLi >= 0 && iVarLi < Vec_IntSize(p->vVar2Obj) ); assert( iVarLo >= 0 && iVarLo < Vec_IntSize(p->vVar2Obj) ); Vec_IntWriteEntry( p->vNs2Glo, iVarLi, i ); Vec_IntWriteEntry( p->vCs2Glo, iVarLo, i ); Vec_IntWriteEntry( p->vGlo2Cs, i, iVarLo ); Vec_IntWriteEntry( p->vGlo2Ns, i, iVarLi ); } // add mapping of the PIs Saig_ManForEachPi( p->pAig, pObjLo, i ) { iVarLo = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLo)); Vec_IntWriteEntry( p->vCs2Glo, iVarLo, Aig_ManRegNum(p->pAig)+i ); Vec_IntWriteEntry( p->vNs2Glo, iVarLo, Aig_ManRegNum(p->pAig)+i ); } } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManPrepareVarLimits( Llb_Man_t * p ) { Llb_Grp_t * pGroup; Aig_Obj_t * pVar; int i, k; assert( p->vVarBegs == NULL ); assert( p->vVarEnds == NULL ); p->vVarEnds = Vec_IntStart( Aig_ManObjNumMax(p->pAig) ); p->vVarBegs = Vec_IntStart( Aig_ManObjNumMax(p->pAig) ); Vec_IntFill( p->vVarBegs, Aig_ManObjNumMax(p->pAig), p->pMatrix->nCols ); for ( i = 0; i < p->pMatrix->nCols; i++ ) { pGroup = p->pMatrix->pColGrps[i]; Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vIns, pVar, k ) if ( Vec_IntEntry(p->vVarBegs, pVar->Id) > i ) Vec_IntWriteEntry( p->vVarBegs, pVar->Id, i ); Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vOuts, pVar, k ) if ( Vec_IntEntry(p->vVarBegs, pVar->Id) > i ) Vec_IntWriteEntry( p->vVarBegs, pVar->Id, i ); Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vIns, pVar, k ) if ( Vec_IntEntry(p->vVarEnds, pVar->Id) < i ) Vec_IntWriteEntry( p->vVarEnds, pVar->Id, i ); Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vOuts, pVar, k ) if ( Vec_IntEntry(p->vVarEnds, pVar->Id) < i ) Vec_IntWriteEntry( p->vVarEnds, pVar->Id, i ); } } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Llb_ManStop( Llb_Man_t * p ) { Llb_Grp_t * pGrp; DdNode * bTemp; int i; // Vec_IntFreeP( &p->vMem ); // Vec_PtrFreeP( &p->vTops ); // Vec_PtrFreeP( &p->vBots ); // Vec_VecFreeP( (Vec_Vec_t **)&p->vCuts ); if ( p->pMatrix ) Llb_MtrFree( p->pMatrix ); Vec_PtrForEachEntry( Llb_Grp_t *, p->vGroups, pGrp, i ) Llb_ManGroupStop( pGrp ); if ( p->dd ) { // printf( "Manager dd\n" ); Extra_StopManager( p->dd ); } if ( p->ddG ) { // printf( "Manager ddG\n" ); if ( p->ddG->bFunc ) Cudd_RecursiveDeref( p->ddG, p->ddG->bFunc ); Extra_StopManager( p->ddG ); } if ( p->ddR ) { // printf( "Manager ddR\n" ); if ( p->ddR->bFunc ) Cudd_RecursiveDeref( p->ddR, p->ddR->bFunc ); Vec_PtrForEachEntry( DdNode *, p->vRings, bTemp, i ) Cudd_RecursiveDeref( p->ddR, bTemp ); Extra_StopManager( p->ddR ); } Aig_ManStop( p->pAig ); Vec_PtrFreeP( &p->vGroups ); Vec_IntFreeP( &p->vVar2Obj ); Vec_IntFreeP( &p->vObj2Var ); Vec_IntFreeP( &p->vVarBegs ); Vec_IntFreeP( &p->vVarEnds ); Vec_PtrFreeP( &p->vRings ); Vec_IntFreeP( &p->vNs2Glo ); Vec_IntFreeP( &p->vCs2Glo ); Vec_IntFreeP( &p->vGlo2Cs ); Vec_IntFreeP( &p->vGlo2Ns ); // Vec_IntFreeP( &p->vHints ); ABC_FREE( p ); } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Llb_Man_t * Llb_ManStart( Aig_Man_t * pAigGlo, Aig_Man_t * pAig, Gia_ParLlb_t * pPars ) { Llb_Man_t * p; Aig_ManCleanMarkA( pAig ); p = ABC_CALLOC( Llb_Man_t, 1 ); p->pAigGlo = pAigGlo; p->pPars = pPars; p->pAig = pAig; p->vVar2Obj = Llb_ManMarkPivotNodes( p->pAig, pPars->fUsePivots ); p->vObj2Var = Vec_IntInvert( p->vVar2Obj, -1 ); p->vRings = Vec_PtrAlloc( 100 ); Llb_ManPrepareVarMap( p ); Llb_ManPrepareGroups( p ); Aig_ManCleanMarkA( pAig ); p->pMatrix = Llb_MtrCreate( p ); p->pMatrix->pMan = p; return p; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END