sscUtil.c 4.96 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/**CFile****************************************************************

  FileName    [sscUtil.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [SAT sweeping under constraints.]

  Synopsis    [Various utilities.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

  Date        [Ver. 1.0. Started - June 29, 2008.]

  Revision    [$Id: sscUtil.c,v 1.00 2008/07/29 00:00:00 alanmi Exp $]

***********************************************************************/

#include "sscInt.h"
22 23
#include "sat/cnf/cnf.h"
#include "aig/gia/giaAig.h"
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

ABC_NAMESPACE_IMPL_START


////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////
///                     FUNCTION DEFINITIONS                         ///
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
47 48 49 50 51 52 53 54
Gia_Man_t * Gia_ManDropContained( Gia_Man_t * p )
{
    Gia_Man_t * pNew;
    Aig_Man_t * pMan = Gia_ManToAigSimple( p );
    Cnf_Dat_t * pDat = Cnf_Derive( pMan, Gia_ManPoNum(p) );
    Gia_Obj_t * pObj;
    Vec_Int_t * vLits, * vKeep;
    sat_solver * pSat;
55
    int ConstLit = Abc_Var2Lit(pDat->pVarNums[0], 0);
Alan Mishchenko committed
56
    int i, status;//, Count = 0;
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    Aig_ManStop( pMan );

    vLits = Vec_IntAlloc( Gia_ManPoNum(p) );
    Gia_ManForEachPo( p, pObj, i )
    {
        int iObj = Gia_ObjId( p, pObj );
        Vec_IntPush( vLits, Abc_Var2Lit(pDat->pVarNums[iObj], 1) );
    }

    // start the SAT solver
    pSat = sat_solver_new();
    sat_solver_setnvars( pSat, pDat->nVars );
    for ( i = 0; i < pDat->nClauses; i++ )
    {
        if ( !sat_solver_addclause( pSat, pDat->pClauses[i], pDat->pClauses[i+1] ) )
        {
            Cnf_DataFree( pDat );
            sat_solver_delete( pSat );
            Vec_IntFree( vLits );
            return NULL;
        }
    }
79
    Cnf_DataFree( pDat );
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    status = sat_solver_simplify( pSat );
    if ( status == 0 )
    {
        sat_solver_delete( pSat );
        Vec_IntFree( vLits );
        return NULL;
    }

    // iterate over POs
    vKeep = Vec_IntAlloc( Gia_ManPoNum(p) );
    Gia_ManForEachPo( p, pObj, i )
    {
        Vec_IntWriteEntry( vLits, i, Abc_LitNot(Vec_IntEntry(vLits,i)) );
        status = sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), 0, 0, 0, 0 );
        Vec_IntWriteEntry( vLits, i, Abc_LitNot(Vec_IntEntry(vLits,i)) );
        if ( status == l_False )
96
            Vec_IntWriteEntry( vLits, i, ConstLit ); // const1 SAT var is always true
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
        else 
        {
            assert( status = l_True );
            Vec_IntPush( vKeep, i );
        }
    }
    sat_solver_delete( pSat );
    Vec_IntFree( vLits );
    if ( Vec_IntSize(vKeep) == Gia_ManPoNum(p) )
    {
        Vec_IntFree( vKeep );
        return Gia_ManDup(p);
    }
    pNew = Gia_ManDupCones( p, Vec_IntArray(vKeep), Vec_IntSize(vKeep), 0 );
    Vec_IntFree( vKeep );
    return pNew;
}

/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Gia_Man_t * Gia_ManOptimizeRing( Gia_Man_t * p )
{
    Ssc_Pars_t Pars, * pPars = &Pars;
    Gia_Man_t * pTemp, * pAux;
    int i;
    assert( p->nConstrs == 0 );
    printf( "User AIG: " );
133
    Gia_ManPrintStats( p, NULL );
134 135
    pTemp = Gia_ManDropContained( p );
    printf( "Drop AIG: " );
136
    Gia_ManPrintStats( pTemp, NULL );
137 138 139 140 141
//    return pTemp;
    if ( Gia_ManPoNum(pTemp) == 1 )
        return pTemp;
    Ssc_ManSetDefaultParams( pPars );
    pPars->fAppend  = 1;
142
    pPars->fVerbose = 0;
143 144 145
    pTemp->nConstrs = Gia_ManPoNum(pTemp) - 1;    
    for ( i = 0; i < Gia_ManPoNum(pTemp); i++ )
    {
146
        // move i-th PO forward
147
        Gia_ManSwapPos( pTemp, i );
148 149 150
        pTemp = Gia_ManDupDfs( pAux = pTemp );
        Gia_ManStop( pAux );
        // minimize this PO
151 152
        pTemp = Ssc_PerformSweepingConstr( pAux = pTemp, pPars );
        Gia_ManStop( pAux );
153
        pTemp = Gia_ManDupDfs( pAux = pTemp );
154
        Gia_ManStop( pAux );
155
        // move i-th PO back
156
        Gia_ManSwapPos( pTemp, i );
157 158 159
        pTemp = Gia_ManDupDfs( pAux = pTemp );
        Gia_ManStop( pAux );
        // report results
Alan Mishchenko committed
160
        printf( "AIG%3d  : ", i );
161
        Gia_ManPrintStats( pTemp, NULL );
162
    }
163
    pTemp->nConstrs = 0;
164 165
    return pTemp;
}
166 167 168 169 170 171 172 173

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////


ABC_NAMESPACE_IMPL_END