/**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"
#include "sat/cnf/cnf.h"
#include "aig/gia/giaAig.h"

ABC_NAMESPACE_IMPL_START


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

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

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

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
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;
    int ConstLit = Abc_Var2Lit(pDat->pVarNums[0], 0);
    int i, status;//, Count = 0;
    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;
        }
    }
    Cnf_DataFree( pDat );
    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 )
            Vec_IntWriteEntry( vLits, i, ConstLit ); // const1 SAT var is always true
        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: " );
    Gia_ManPrintStats( p, NULL );
    pTemp = Gia_ManDropContained( p );
    printf( "Drop AIG: " );
    Gia_ManPrintStats( pTemp, NULL );
//    return pTemp;
    if ( Gia_ManPoNum(pTemp) == 1 )
        return pTemp;
    Ssc_ManSetDefaultParams( pPars );
    pPars->fAppend  = 1;
    pPars->fVerbose = 0;
    pTemp->nConstrs = Gia_ManPoNum(pTemp) - 1;    
    for ( i = 0; i < Gia_ManPoNum(pTemp); i++ )
    {
        // move i-th PO forward
        Gia_ManSwapPos( pTemp, i );
        pTemp = Gia_ManDupDfs( pAux = pTemp );
        Gia_ManStop( pAux );
        // minimize this PO
        pTemp = Ssc_PerformSweepingConstr( pAux = pTemp, pPars );
        Gia_ManStop( pAux );
        pTemp = Gia_ManDupDfs( pAux = pTemp );
        Gia_ManStop( pAux );
        // move i-th PO back
        Gia_ManSwapPos( pTemp, i );
        pTemp = Gia_ManDupDfs( pAux = pTemp );
        Gia_ManStop( pAux );
        // report results
        printf( "AIG%3d  : ", i );
        Gia_ManPrintStats( pTemp, NULL );
    }
    pTemp->nConstrs = 0;
    return pTemp;
}

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


ABC_NAMESPACE_IMPL_END

