| /**CFile**************************************************************** |
| |
| FileName [fraIndVer.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [New FRAIG package.] |
| |
| Synopsis [Verification of the inductive invariant.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 30, 2007.] |
| |
| Revision [$Id: fraIndVer.c,v 1.00 2007/06/30 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "fra.h" |
| #include "sat/cnf/cnf.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Verifies the inductive invariant.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Fra_InvariantVerify( Aig_Man_t * pAig, int nFrames, Vec_Int_t * vClauses, Vec_Int_t * vLits ) |
| { |
| Cnf_Dat_t * pCnf; |
| sat_solver * pSat; |
| int * pStart; |
| int RetValue, Beg, End, i, k; |
| int CounterBase = 0, CounterInd = 0; |
| abctime clk = Abc_Clock(); |
| |
| if ( nFrames != 1 ) |
| { |
| printf( "Invariant verification: Can only verify for K = 1\n" ); |
| return 1; |
| } |
| |
| // derive CNF |
| pCnf = Cnf_DeriveSimple( pAig, Aig_ManCoNum(pAig) ); |
| /* |
| // add the property |
| { |
| Aig_Obj_t * pObj; |
| int Lits[1]; |
| |
| pObj = Aig_ManCo( pAig, 0 ); |
| Lits[0] = toLitCond( pCnf->pVarNums[pObj->Id], 1 ); |
| |
| Vec_IntPush( vLits, Lits[0] ); |
| Vec_IntPush( vClauses, Vec_IntSize(vLits) ); |
| printf( "Added the target property to the set of clauses to be inductively checked.\n" ); |
| } |
| */ |
| // derive initialized frames for the base case |
| pSat = (sat_solver *)Cnf_DataWriteIntoSolver( pCnf, nFrames, 1 ); |
| // check clauses in the base case |
| Beg = 0; |
| pStart = Vec_IntArray( vLits ); |
| Vec_IntForEachEntry( vClauses, End, i ) |
| { |
| // complement the literals |
| for ( k = Beg; k < End; k++ ) |
| pStart[k] = lit_neg(pStart[k]); |
| RetValue = sat_solver_solve( pSat, pStart + Beg, pStart + End, 0, 0, 0, 0 ); |
| for ( k = Beg; k < End; k++ ) |
| pStart[k] = lit_neg(pStart[k]); |
| Beg = End; |
| if ( RetValue == l_False ) |
| continue; |
| // printf( "Clause %d failed the base case.\n", i ); |
| CounterBase++; |
| } |
| sat_solver_delete( pSat ); |
| |
| // derive initialized frames for the base case |
| pSat = (sat_solver *)Cnf_DataWriteIntoSolver( pCnf, nFrames + 1, 0 ); |
| assert( pSat->size == 2 * pCnf->nVars ); |
| // add clauses to the first frame |
| Beg = 0; |
| pStart = Vec_IntArray( vLits ); |
| Vec_IntForEachEntry( vClauses, End, i ) |
| { |
| RetValue = sat_solver_addclause( pSat, pStart + Beg, pStart + End ); |
| Beg = End; |
| if ( RetValue == 0 ) |
| { |
| Cnf_DataFree( pCnf ); |
| sat_solver_delete( pSat ); |
| printf( "Invariant verification: SAT solver is unsat after adding a clause.\n" ); |
| return 0; |
| } |
| } |
| // simplify the solver |
| if ( pSat->qtail != pSat->qhead ) |
| { |
| RetValue = sat_solver_simplify(pSat); |
| assert( RetValue != 0 ); |
| assert( pSat->qtail == pSat->qhead ); |
| } |
| |
| // check clauses in the base case |
| Beg = 0; |
| pStart = Vec_IntArray( vLits ); |
| Vec_IntForEachEntry( vClauses, End, i ) |
| { |
| // complement the literals |
| for ( k = Beg; k < End; k++ ) |
| { |
| pStart[k] += 2 * pCnf->nVars; |
| pStart[k] = lit_neg(pStart[k]); |
| } |
| RetValue = sat_solver_solve( pSat, pStart + Beg, pStart + End, 0, 0, 0, 0 ); |
| for ( k = Beg; k < End; k++ ) |
| { |
| pStart[k] = lit_neg(pStart[k]); |
| pStart[k] -= 2 * pCnf->nVars; |
| } |
| Beg = End; |
| if ( RetValue == l_False ) |
| continue; |
| // printf( "Clause %d failed the inductive case.\n", i ); |
| CounterInd++; |
| } |
| sat_solver_delete( pSat ); |
| Cnf_DataFree( pCnf ); |
| if ( CounterBase ) |
| printf( "Invariant verification: %d clauses (out of %d) FAILED the base case.\n", CounterBase, Vec_IntSize(vClauses) ); |
| if ( CounterInd ) |
| printf( "Invariant verification: %d clauses (out of %d) FAILED the inductive case.\n", CounterInd, Vec_IntSize(vClauses) ); |
| if ( CounterBase || CounterInd ) |
| return 0; |
| printf( "Invariant verification: %d clauses verified correctly. ", Vec_IntSize(vClauses) ); |
| ABC_PRT( "Time", Abc_Clock() - clk ); |
| return 1; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |