diff options
Diffstat (limited to 'src/proof/abs/absRefSelect.c')
| -rw-r--r-- | src/proof/abs/absRefSelect.c | 220 | 
1 files changed, 220 insertions, 0 deletions
| diff --git a/src/proof/abs/absRefSelect.c b/src/proof/abs/absRefSelect.c new file mode 100644 index 00000000..871eb79b --- /dev/null +++ b/src/proof/abs/absRefSelect.c @@ -0,0 +1,220 @@ +/**CFile**************************************************************** + +  FileName    [absRefSelect.c] + +  SystemName  [ABC: Logic synthesis and verification system.] + +  PackageName [Abstraction package.] + +  Synopsis    [Post-processes the set of selected refinement objects.] + +  Author      [Alan Mishchenko] +   +  Affiliation [UC Berkeley] + +  Date        [Ver. 1.0. Started - June 20, 2005.] + +  Revision    [$Id: absRefSelect.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ +  +#include "abs.h" +#include "absRef.h" + +ABC_NAMESPACE_IMPL_START  + +//////////////////////////////////////////////////////////////////////// +///                        DECLARATIONS                              /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +///                     FUNCTION DEFINITIONS                         /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + +  Synopsis    [] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Rnm_ManPrintSelected( Rnm_Man_t * p, Vec_Int_t * vNewPPis ) +{ +    Gia_Obj_t * pObj; +    int i, Counter = 0; +    Gia_ManForEachObjVec( p->vMap, p->pGia, pObj, i ) +        if ( Gia_ObjIsPi(p->pGia, pObj) )  +            printf( "-" ); +        else if ( Vec_IntFind(vNewPPis, Gia_ObjId(p->pGia, pObj)) >= 0 )// this is PPI +            printf( "1" ), Counter++; +        else +            printf( "0" ); +    printf( " %3d\n", Counter ); +} + +/**Function************************************************************* + +  Synopsis    [Perform structural analysis.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Ga2_StructAnalize( Gia_Man_t * p, Vec_Int_t * vFront, Vec_Int_t * vInter, Vec_Int_t * vNewPPis ) +{ +    Vec_Int_t * vLeaves; +    Gia_Obj_t * pObj, * pFanin; +    int i, k; +    // clean labels +    Gia_ManForEachObj( p, pObj, i ) +        pObj->fMark0 = pObj->fMark1 = 0; +    // label frontier +    Gia_ManForEachObjVec( vFront, p, pObj, i ) +        pObj->fMark0 = 1, pObj->fMark1 = 0; +    // label objects +    Gia_ManForEachObjVec( vInter, p, pObj, i ) +        pObj->fMark1 = 0, pObj->fMark1 = 1; +    // label selected +    Gia_ManForEachObjVec( vNewPPis, p, pObj, i ) +        pObj->fMark1 = 1, pObj->fMark1 = 1; +    // explore selected +    Gia_ManForEachObjVec( vNewPPis, p, pObj, i ) +    { +        printf( "Selected PPI %3d : ", i+1 ); +        printf( "%6d ",  Gia_ObjId(p, pObj) ); +        printf( "\n" ); +        vLeaves = Ga2_ObjLeaves( p, pObj ); +        Gia_ManForEachObjVec( vLeaves, p, pFanin, k ) +        { +            printf( "    " ); +            printf( "%6d ", Gia_ObjId(p, pFanin) ); +            if ( pFanin->fMark0 && pFanin->fMark1 ) +                printf( "selected PPI" ); +            else if ( pFanin->fMark0 && !pFanin->fMark1 ) +                printf( "frontier (original PI or PPI)" ); +            else if ( !pFanin->fMark0 &&  pFanin->fMark1 ) +                printf( "abstracted node" ); +            else if ( !pFanin->fMark0 && !pFanin->fMark1 ) +                printf( "free variable" ); +            printf( "\n" ); +        } +    } +} + +/**Function************************************************************* + +  Synopsis    [Postprocessing the set of PPIs using structural analysis.] + +  Description [The following sets are used: +  The set of all PI+PPI is in p->vMap. +  The set of all abstracted objects is in p->vObjs; +  The set of important PPIs is in vOldPPis. +  The new set of selected PPIs is in vNewPPis.] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Rnm_ManFilterSelected( Rnm_Man_t * p, Vec_Int_t * vOldPPis ) +{ +   int fVerbose = 0; +    Vec_Int_t * vNewPPis, * vLeaves; +    Gia_Obj_t * pObj, * pFanin; +    int i, k, RetValue, Counters[3] = {0}; + +    // (0) make sure fanin counters are 0 at the beginning +//    Gia_ManForEachObj( p->pGia, pObj, i ) +//        assert( Rnm_ObjCount(p, pObj) == 0 ); + +    // (1) increment PPI fanin counters +    Vec_IntClear( p->vFanins ); +    Gia_ManForEachObjVec( vOldPPis, p->pGia, pObj, i ) +    { +        vLeaves = Ga2_ObjLeaves( p->pGia, pObj ); +        Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k ) +            if ( Rnm_ObjAddToCount(p, pFanin) == 0 ) // fanin counter is 0 -- save it +                Vec_IntPush( p->vFanins, Gia_ObjId(p->pGia, pFanin) ); +    } + +    // (3) select objects with reconvergence, which create potential constraints +    // - flop objects +    // - objects whose fanin belongs to the justified area +    // - objects whose fanins overlap +    // (these do not guantee reconvergence, but may potentially have it) +    // (other objects cannot have reconvergence, even if they are added) +    vNewPPis = Vec_IntAlloc( 100 ); +    Gia_ManForEachObjVec( vOldPPis, p->pGia, pObj, i ) +    { +        if ( Gia_ObjIsRo(p->pGia, pObj) ) +        { +            if ( fVerbose ) +                Counters[0]++; +            Vec_IntPush( vNewPPis, Gia_ObjId(p->pGia, pObj) ); +            continue; +        } +        vLeaves = Ga2_ObjLeaves( p->pGia, pObj ); +        Gia_ManForEachObjVec( vLeaves, p->pGia, pFanin, k ) +        { +            if ( Rnm_ObjIsJust(p, pFanin) || Rnm_ObjCount(p, pFanin) > 1 ) +            { +                if ( fVerbose ) +                    Counters[1] += Rnm_ObjIsJust(p, pFanin); +                if ( fVerbose ) +                    Counters[2] += (Rnm_ObjCount(p, pFanin) > 1); +                Vec_IntPush( vNewPPis, Gia_ObjId(p->pGia, pObj) ); +                break; +            } +        } +    } +    RetValue = Vec_IntUniqify( vNewPPis ); +    assert( RetValue == 0 ); + +    // (4) clear fanin counters +    // this is important for counters to be correctly set in the future iterations -- see step (0) +    Gia_ManForEachObjVec( p->vFanins, p->pGia, pObj, i ) +        Rnm_ObjSetCount( p, pObj, 0 ); + +    // visualize +    if ( fVerbose ) +        printf( "*** Refinement %3d : PI+PPI =%4d. Old =%4d. New =%4d.   FF =%4d. Just =%4d. Shared =%4d.\n",  +            p->nRefId, Vec_IntSize(p->vMap), Vec_IntSize(vOldPPis), Vec_IntSize(vNewPPis), Counters[0], Counters[1], Counters[2] ); + +//    Rnm_ManPrintSelected( p, vNewPPis ); +//    Ga2_StructAnalize( p->pGia, p->vMap, p->vObjs, vNewPPis ); +    return vNewPPis; +} + + +/**Function************************************************************* + +  Synopsis    [Improved postprocessing the set of PPIs.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Rnm_ManFilterSelectedNew( Rnm_Man_t * p, Vec_Int_t * vOldPPis ) +{ +    Vec_Int_t * vNewPPis; +    vNewPPis = Vec_IntDup( vOldPPis ); +    return vNewPPis; +} + +//////////////////////////////////////////////////////////////////////// +///                       END OF FILE                                /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + | 
