89 vVars = Vec_IntAlloc( Aig_ManRegNum(pMan) );
91 Vec_IntPush( vVars, pCnf->
pVarNums[fCsVars? pObjLo->
Id : pObjLi->
Id] );
111 vVars = Vec_IntAlloc( Aig_ManCoNum(pMan) );
113 Vec_IntPush( vVars, pCnf->
pVarNums[pObj->
Id] );
133 vVars = Vec_IntAlloc( Aig_ManCiNum(pMan) - nStarting );
138 Vec_IntPush( vVars, pCnf->
pVarNums[pObj->
Id] );
156 int * pMapping,
Var, i;
157 assert( Vec_IntSize(vSatVarsFrom) == Vec_IntSize(vSatVarsTo) );
159 for ( i = 0; i < nVarsMax; i++ )
162 pMapping[
Var] = Vec_IntEntry(vSatVarsTo,i);
184 Vec_IntFree(
p->vSatVarsMainCs );
185 Vec_IntFree(
p->vSatVarsTestCs );
186 Vec_IntFree(
p->vSatVarsTestNs );
187 Vec_IntFree(
p->vSatVarsBmcNs );
188 Vec_IntFree(
p->vCexMain0 );
189 Vec_IntFree(
p->vCexMain );
190 Vec_IntFree(
p->vCexTest );
191 Vec_IntFree(
p->vCexBase );
192 Vec_IntFree(
p->vCexAssm );
193 Vec_IntFree(
p->vCexBmc );
220 assert( Aig_ManCoNum(pMan) - Aig_ManRegNum(pMan) == 1 );
225 p->vCexMain0 = Vec_IntAlloc( Aig_ManRegNum(pMan) );
226 p->vCexMain = Vec_IntAlloc( Aig_ManRegNum(pMan) );
227 p->vCexTest = Vec_IntAlloc( Aig_ManRegNum(pMan) );
228 p->vCexBase = Vec_IntAlloc( Aig_ManRegNum(pMan) );
229 p->vCexAssm = Vec_IntAlloc( Aig_ManRegNum(pMan) );
230 p->vCexBmc = Vec_IntAlloc( Aig_ManRegNum(pMan) );
235 assert( Aig_ManCoNum(pFramesMain) == 2 );
236 Aig_ObjChild0Flip( Aig_ManCo(pFramesMain, 0) );
252 assert( Aig_ManCoNum(pFramesTest) == Aig_ManRegNum(pMan) );
260 assert( Aig_ManCoNum(pFramesBmc) == Aig_ManRegNum(pMan) );
265 p->vSatVarsMainCs =
Fra_ClauSaveInputVars( pFramesMain, pCnfMain, 2 * (Aig_ManCiNum(pMan)-Aig_ManRegNum(pMan)) );
269 assert( Vec_IntSize(
p->vSatVarsTestCs) == Vec_IntSize(
p->vSatVarsMainCs) );
270 assert( Vec_IntSize(
p->vSatVarsTestCs) == Vec_IntSize(
p->vSatVarsBmcNs) );
273 p->pMapCsMainToCsTest =
Fra_ClauCreateMapping(
p->vSatVarsMainCs,
p->vSatVarsTestCs, Aig_ManObjNumMax(pFramesMain) );
274 p->pMapCsTestToCsMain =
Fra_ClauCreateMapping(
p->vSatVarsTestCs,
p->vSatVarsMainCs, Aig_ManObjNumMax(pFramesTest) );
275 p->pMapCsTestToNsTest =
Fra_ClauCreateMapping(
p->vSatVarsTestCs,
p->vSatVarsTestNs, Aig_ManObjNumMax(pFramesTest) );
285 if (
p->pSatMain == NULL ||
p->pSatTest == NULL ||
p->pSatBmc == NULL )
308 assert( Vec_IntSize(vVec) > 1 );
309 vPart = Vec_IntAlloc( Vec_IntSize(vVec) / 2 + 1 );
311 Vec_IntPush( vPart, Entry );
312 Vec_IntShrink( vVec, Vec_IntSize(vVec) / 2 );
327static
void Vec_IntComplement(
Vec_Int_t * vVec )
330 for ( i = 0; i < Vec_IntSize(vVec); i++ )
331 vVec->pArray[i] = lit_neg( vVec->pArray[i] );
348 int RetValue, iVar, i;
349 sat_solver_act_var_clear(
p->pSatMain );
350 RetValue =
sat_solver_solve(
p->pSatMain, NULL, NULL, (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
351 Vec_IntClear( vCex );
356 Vec_IntPush( vCex, sat_solver_var_literal(
p->pSatMain, iVar) );
383 RetValue =
sat_solver_solve(
p->pSatBmc, Vec_IntArray(vClause), Vec_IntArray(vClause) + Vec_IntSize(vClause),
384 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
405 Vec_IntClear( vRemapped );
408 assert( pMap[lit_var(iLit)] >= 0 );
409 iLit = toLitCond( pMap[lit_var(iLit)], lit_sign(iLit) ^ fInv );
410 Vec_IntPush( vRemapped, iLit );
428 int RetValue, iVar, i;
430 Vec_IntPush( vClause, toLit(
p->nSatVarsTestCur++ ) );
431 Vec_IntComplement( vClause );
433 RetValue =
sat_solver_addclause(
p->pSatTest, Vec_IntArray(vClause), Vec_IntArray(vClause) + Vec_IntSize(vClause) );
436 Vec_IntPop( vClause );
437 Vec_IntComplement( vClause );
441 for ( i =
p->nSatVarsTestBeg; i < p->nSatVarsTestCur - 1; i++ )
442 Vec_IntPush(
p->vCexAssm, toLitCond(i,1) );
443 Vec_IntPush(
p->vCexAssm, toLitCond(i,0) );
445 RetValue =
sat_solver_solve(
p->pSatTest, Vec_IntArray(
p->vCexAssm), Vec_IntArray(
p->vCexAssm) + Vec_IntSize(
p->vCexAssm),
446 (ABC_INT64_T)nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
448 Vec_IntClear( vCex );
455 Vec_IntPush( vCex, sat_solver_var_literal(
p->pSatTest, iVar) );
475 int LitM, LitN, VarM, VarN, i, j, k;
476 assert( Vec_IntSize(vMain) <= Vec_IntSize(vNew) );
477 for ( i = j = k = 0; i < Vec_IntSize(vMain) && j < Vec_IntSize(vNew); )
479 LitM = Vec_IntEntry( vMain, i );
480 LitN = Vec_IntEntry( vNew, j );
481 VarM = lit_var( LitM );
482 VarN = lit_var( LitN );
487 else if ( VarM > VarN )
496 Vec_IntWriteEntry( vMain, k++, LitM );
499 assert( i == Vec_IntSize(vMain) );
500 Vec_IntShrink( vMain, k );
519 if ( Vec_IntSize(vExtra) == 1 )
521 nSizeOld = Vec_IntSize( vBasis );
522 vExtra2 = Vec_IntSplitHalf( vExtra );
525 Vec_IntAppend( vBasis, vExtra );
528 Vec_IntShrink( vBasis, nSizeOld );
532 Vec_IntShrink( vBasis, nSizeOld );
535 Vec_IntAppend( vBasis, vExtra2 );
538 Vec_IntShrink( vBasis, nSizeOld );
546 Vec_IntShrink( vBasis, nSizeOld );
547 Vec_IntAppend( vBasis, vExtra );
550 Vec_IntShrink( vBasis, nSizeOld );
551 Vec_IntAppend( vExtra, vExtra2 );
552 Vec_IntFree( vExtra2 );
568 int iLit, iLit2, i, k;
572 Vec_IntClear( vBasis );
575 Vec_IntPush( vBasis, iLit2 );
581 for ( k = i; k < Vec_IntSize(vExtra)-1; k++ )
582 Vec_IntWriteEntry( vExtra, k, Vec_IntEntry(vExtra,k+1) );
583 Vec_IntShrink( vExtra, Vec_IntSize(vExtra)-1 );
600 int LitM, VarM, VarN, i, j, k;
601 assert( Vec_IntSize(vCex) <= Vec_IntSize(vSatCsVars) );
602 for ( i = j = k = 0; i < Vec_IntSize(vCex) && j < Vec_IntSize(vSatCsVars); )
604 LitM = Vec_IntEntry( vCex, i );
605 VarM = lit_var( LitM );
606 VarN = Vec_IntEntry( vSatCsVars, j );
611 else if ( VarM > VarN )
620 printf(
"%d", !lit_sign(LitM) );
623 assert( i == Vec_IntSize(vCex) );
640 int Iter, RetValue, fFailed, i;
641 assert( Aig_ManCoNum(pMan) - Aig_ManRegNum(pMan) == 1 );
646 printf(
"The property is trivially inductive.\n" );
653 printf(
"%4d : ", Iter );
656 if ( fVerbose && fVeryVerbose )
668 if ( Vec_IntSize(
p->vCexMain) < 1 )
670 Vec_IntComplement(
p->vCexMain0 );
671 RetValue =
sat_solver_addclause(
p->pSatMain, Vec_IntArray(
p->vCexMain0), Vec_IntArray(
p->vCexMain0) + Vec_IntSize(
p->vCexMain0) );
674 printf(
"\nProperty is proved after %d iterations.\n", Iter+1 );
684 printf(
" Reducing failed after %d iterations (BMC failed).\n", i );
687 if ( Vec_IntSize(
p->vCexMain) == 0 )
690 printf(
" Reducing failed after %d iterations (nothing left).\n", i );
695 if ( fVerbose && fVeryVerbose )
698 printf(
" LitsInd = %3d. ", Vec_IntSize(
p->vCexMain) );
700 Vec_IntClear(
p->vCexBase );
701 if ( Vec_IntSize(
p->vCexMain) > 1 )
704 assert( Vec_IntSize(
p->vCexMain) > 0 );
705 if ( fVerbose && fVeryVerbose )
708 printf(
" LitsRed = %3d. ", Vec_IntSize(
p->vCexMain) );
713 RetValue =
sat_solver_addclause(
p->pSatMain, Vec_IntArray(
p->vCexAssm), Vec_IntArray(
p->vCexAssm) + Vec_IntSize(
p->vCexAssm) );
719 if (
p->pSatMain->qtail !=
p->pSatMain->qhead )
723 assert(
p->pSatMain->qtail ==
p->pSatMain->qhead );
728 if ( Iter == nIters )
730 printf(
"Property is not proved after %d iterations.\n", nIters );
733 printf(
"Property is proved after %d iterations.\n", Iter );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManFrames(Aig_Man_t *pAig, int nFs, int fInit, int fOuts, int fRegs, int fEnlarge, Aig_Obj_t ***ppObjMap)
FUNCTION DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
#define Aig_ManForEachCo(p, pObj, i)
#define Aig_ManForEachLiLoSeq(p, pObjLi, pObjLo, k)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
Cnf_Dat_t * Cnf_DeriveSimple(Aig_Man_t *p, int nOutputs)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
Vec_Int_t * Fra_ClauSaveLatchVars(Aig_Man_t *pMan, Cnf_Dat_t *pCnf, int fCsVars)
FUNCTION DEFINITIONS ///.
Vec_Int_t * Fra_ClauSaveInputVars(Aig_Man_t *pMan, Cnf_Dat_t *pCnf, int nStarting)
Vec_Int_t * Fra_ClauSaveOutputVars(Aig_Man_t *pMan, Cnf_Dat_t *pCnf)
int Fra_Clau(Aig_Man_t *pMan, int nIters, int fVerbose, int fVeryVerbose)
int Fra_ClauCheckClause(Cla_Man_t *p, Vec_Int_t *vClause, Vec_Int_t *vCex)
void Fra_ClauRemapClause(int *pMap, Vec_Int_t *vClause, Vec_Int_t *vRemapped, int fInv)
void Fra_ClauMinimizeClause(Cla_Man_t *p, Vec_Int_t *vBasis, Vec_Int_t *vExtra)
void Fra_ClauStop(Cla_Man_t *p)
int Fra_ClauCheckBmc(Cla_Man_t *p, Vec_Int_t *vClause)
Cla_Man_t * Fra_ClauStart(Aig_Man_t *pMan)
typedefABC_NAMESPACE_IMPL_START struct Cla_Man_t_ Cla_Man_t
DECLARATIONS ///.
void Fra_ClauPrintClause(Vec_Int_t *vSatCsVars, Vec_Int_t *vCex)
void Fra_ClauReduceClause(Vec_Int_t *vMain, Vec_Int_t *vNew)
int * Fra_ClauCreateMapping(Vec_Int_t *vSatVarsFrom, Vec_Int_t *vSatVarsTo, int nVarsMax)
int Fra_ClauCheckProperty(Cla_Man_t *p, Vec_Int_t *vCex)
void Fra_ClauMinimizeClause_rec(Cla_Man_t *p, Vec_Int_t *vBasis, Vec_Int_t *vExtra)
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
int sat_solver_simplify(sat_solver *s)
int sat_solver_nvars(sat_solver *s)
void sat_solver_delete(sat_solver *s)
Vec_Int_t * vSatVarsTestNs
Vec_Int_t * vSatVarsTestCs
Vec_Int_t * vSatVarsBmcNs
Vec_Int_t * vSatVarsMainCs
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryReverse(vVec, pEntry, i)
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)