/**CFile**************************************************************** FileName [pdrSat.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Property driven reachability.] Synopsis [SAT solver procedures.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - November 20, 2010.] Revision [$Id: pdrSat.c,v 1.00 2010/11/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "pdrInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Creates new SAT solver.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ sat_solver * Pdr_ManCreateSolver( Pdr_Man_t * p, int k ) { sat_solver * pSat; Aig_Obj_t * pObj; int i; assert( Vec_PtrSize(p->vSolvers) == k ); assert( Vec_VecSize(p->vClauses) == k ); assert( Vec_IntSize(p->vActVars) == k ); // create new solver // pSat = sat_solver_new(); pSat = zsat_solver_new_seed(p->pPars->nRandomSeed); pSat = Pdr_ManNewSolver( pSat, p, k, (int)(k == 0) ); Vec_PtrPush( p->vSolvers, pSat ); Vec_VecExpand( p->vClauses, k ); Vec_IntPush( p->vActVars, 0 ); // add property cone Saig_ManForEachPo( p->pAig, pObj, i ) Pdr_ObjSatVar( p, k, 1, pObj ); return pSat; } /**Function************************************************************* Synopsis [Returns old or restarted solver.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ sat_solver * Pdr_ManFetchSolver( Pdr_Man_t * p, int k ) { sat_solver * pSat; Vec_Ptr_t * vArrayK; Pdr_Set_t * pCube; int i, j; pSat = Pdr_ManSolver(p, k); if ( Vec_IntEntry(p->vActVars, k) < p->pPars->nRecycle ) return pSat; assert( k < Vec_PtrSize(p->vSolvers) - 1 ); p->nStarts++; // sat_solver_delete( pSat ); // pSat = sat_solver_new(); // sat_solver_restart( pSat ); zsat_solver_restart_seed( pSat, p->pPars->nRandomSeed ); // create new SAT solver pSat = Pdr_ManNewSolver( pSat, p, k, (int)(k == 0) ); // write new SAT solver Vec_PtrWriteEntry( p->vSolvers, k, pSat ); Vec_IntWriteEntry( p->vActVars, k, 0 ); // set the property output Pdr_ManSetPropertyOutput( p, k ); // add the clauses Vec_VecForEachLevelStart( p->vClauses, vArrayK, i, k ) Vec_PtrForEachEntry( Pdr_Set_t *, vArrayK, pCube, j ) Pdr_ManSolverAddClause( p, k, pCube ); return pSat; } /**Function************************************************************* Synopsis [Converts SAT variables into register IDs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Pdr_ManLitsToCube( Pdr_Man_t * p, int k, int * pArray, int nArray ) { int i, RegId; Vec_IntClear( p->vLits ); for ( i = 0; i < nArray; i++ ) { RegId = Pdr_ObjRegNum( p, k, Abc_Lit2Var(pArray[i]) ); if ( RegId == -1 ) continue; assert( RegId >= 0 && RegId < Aig_ManRegNum(p->pAig) ); Vec_IntPush( p->vLits, Abc_Var2Lit(RegId, !Abc_LitIsCompl(pArray[i])) ); } assert( Vec_IntSize(p->vLits) >= 0 && Vec_IntSize(p->vLits) <= nArray ); return p->vLits; } /**Function************************************************************* Synopsis [Converts the cube in terms of RO numbers into array of CNF literals.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Pdr_ManCubeToLits( Pdr_Man_t * p, int k, Pdr_Set_t * pCube, int fCompl, int fNext ) { Aig_Obj_t * pObj; int i, iVar, iVarMax = 0; abctime clk = Abc_Clock(); Vec_IntClear( p->vLits ); // assert( !(fNext && fCompl) ); for ( i = 0; i < pCube->nLits; i++ ) { if ( pCube->Lits[i] == -1 ) continue; if ( fNext ) pObj = Saig_ManLi( p->pAig, Abc_Lit2Var(pCube->Lits[i]) ); else pObj = Saig_ManLo( p->pAig, Abc_Lit2Var(pCube->Lits[i]) ); iVar = Pdr_ObjSatVar( p, k, fNext ? 2 - Abc_LitIsCompl(pCube->Lits[i]) : 3, pObj ); assert( iVar >= 0 ); iVarMax = Abc_MaxInt( iVarMax, iVar ); Vec_IntPush( p->vLits, Abc_Var2Lit( iVar, fCompl ^ Abc_LitIsCompl(pCube->Lits[i]) ) ); } // sat_solver_setnvars( Pdr_ManSolver(p, k), iVarMax + 1 ); p->tCnf += Abc_Clock() - clk; return p->vLits; } /**Function************************************************************* Synopsis [Sets the property output to 0 (sat) forever.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Pdr_ManSetPropertyOutput( Pdr_Man_t * p, int k ) { sat_solver * pSat; Aig