mirror of https://github.com/YosysHQ/abc.git
167 lines
5.2 KiB
C
167 lines
5.2 KiB
C
/**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
|
|
|