| /**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 |
| |