71 int iObjLit = Vec_IntEntry( vFrame, Aig_ObjId(pObj) );
74 pRes = Aig_ManObj(
p->pFrm, Abc_Lit2Var(iObjLit) );
76 Vec_IntWriteEntry( vFrame, Aig_ObjId(pObj), -1 );
78 pRes = Aig_NotCond( pRes, Abc_LitIsCompl(iObjLit) );
86 if ( i == Vec_PtrSize(
p->vAig2Frm) )
87 Vec_PtrPush(
p->vAig2Frm, Vec_IntStartFull(
p->nObjs) );
88 assert( i < Vec_PtrSize(
p->vAig2Frm) );
89 vFrame = (
Vec_Int_t *)Vec_PtrEntry(
p->vAig2Frm, i );
93 iObjLit = Abc_Var2Lit( Aig_ObjId(Aig_Regular(pNode)), Aig_IsComplement(pNode) );
94 Vec_IntWriteEntry( vFrame, Aig_ObjId(pObj), iObjLit );
97static inline Aig_Obj_t * Saig_BmcObjChild0(
Saig_Bmc_t *
p,
Aig_Obj_t * pObj,
int i ) {
assert( !Aig_IsComplement(pObj) );
return Aig_NotCond(Saig_BmcObjFrame(
p, Aig_ObjFanin0(pObj), i), Aig_ObjFaninC0(pObj)); }
98static inline Aig_Obj_t * Saig_BmcObjChild1(
Saig_Bmc_t *
p,
Aig_Obj_t * pObj,
int i ) {
assert( !Aig_IsComplement(pObj) );
return Aig_NotCond(Saig_BmcObjFrame(
p, Aig_ObjFanin1(pObj), i), Aig_ObjFaninC1(pObj)); }
100static inline int Saig_BmcSatNum(
Saig_Bmc_t *
p,
Aig_Obj_t * pObj ) {
return Vec_IntGetEntry(
p->vObj2Var, pObj->
Id ); }
101static inline void Saig_BmcSetSatNum(
Saig_Bmc_t *
p,
Aig_Obj_t * pObj,
int Num ) { Vec_IntSetEntry(
p->vObj2Var, pObj->
Id, Num); }
111static inline int Abs_ManSimInfoNot(
int Value )
120static inline int Abs_ManSimInfoAnd(
int Value0,
int Value1 )
129static inline int Abs_ManSimInfoGet(
Vec_Ptr_t * vSimInfo,
Aig_Obj_t * pObj,
int iFrame )
131 unsigned * pInfo = (
unsigned *)Vec_PtrEntry( vSimInfo, iFrame );
132 return 3 & (pInfo[Aig_ObjId(pObj) >> 4] >> ((Aig_ObjId(pObj) & 15) << 1));
135static inline void Abs_ManSimInfoSet(
Vec_Ptr_t * vSimInfo,
Aig_Obj_t * pObj,
int iFrame,
int Value )
137 unsigned * pInfo = (
unsigned *)Vec_PtrEntry( vSimInfo, iFrame );
139 Value ^= Abs_ManSimInfoGet( vSimInfo, pObj, iFrame );
140 pInfo[Aig_ObjId(pObj) >> 4] ^= (Value << ((Aig_ObjId(pObj) & 15) << 1));
156 int Value0, Value1, Value;
157 Value = Abs_ManSimInfoGet( vSimInfo, pObj, iFrame );
160 if ( Aig_ObjIsCi(pObj) )
162 assert( Saig_ObjIsLo(
p, pObj) );
164 Abs_ManSimInfoSet( vSimInfo, pObj, iFrame, Value );
168 if ( Aig_ObjFaninC0(pObj) )
169 Value0 = Abs_ManSimInfoNot( Value0 );
170 if ( Aig_ObjIsCo(pObj) )
172 Abs_ManSimInfoSet( vSimInfo, pObj, iFrame, Value0 );
175 assert( Aig_ObjIsNode(pObj) );
181 if ( Aig_ObjFaninC1(pObj) )
182 Value1 = Abs_ManSimInfoNot( Value1 );
183 Value = Abs_ManSimInfoAnd( Value0, Value1 );
185 Abs_ManSimInfoSet( vSimInfo, pObj, iFrame, Value );
206 int i, f, nFramesLimit, nFrameWords;
208 assert( Aig_ManRegNum(
p) > 0 );
210 nFramesLimit = 1 + (200000000 * 4)/Aig_ManObjNum(
p);
211 nFramesLimit = Abc_MinInt( nFramesLimit, nFramesMax );
212 nFrameWords = Abc_BitWordNum( 2 * Aig_ManObjNum(
p) );
214 vSimInfo = Vec_PtrAlloc( nFramesLimit );
215 for ( f = 0; f < nFramesLimit; f++ )
217 Vec_PtrPush( vSimInfo,
ABC_CALLOC(
unsigned, nFrameWords) );
221 Abs_ManSimInfoSet( vSimInfo, pObj, 0,
ABS_ZER );
223 Abs_ManSimInfoSet( vSimInfo, Aig_ManConst1(
p), f,
ABS_ONE );
225 Abs_ManSimInfoSet( vSimInfo, pObj, f,
ABS_UND );
230 if ( Abs_ManSimInfoGet(vSimInfo, pObj, f) !=
ABS_ZER )
234 printf(
"Ternary sim found non-zero output in frame %d. Used %5.2f MB. ",
235 f, 0.25 * (f+1) * Aig_ManObjNum(
p) / (1<<20) );
236 ABC_PRT(
"Time", Abc_Clock() - clk );
243 printf(
"Ternary sim proved all outputs in the first %d frames. Used %5.2f MB. ",
244 nFramesLimit, 0.25 * nFramesLimit * Aig_ManObjNum(
p) / (1<<20) );
245 ABC_PRT(
"Time", Abc_Clock() - clk );
291 p->nFramesMax = nFramesMax;
292 p->nNodesMax = nNodesMax;
293 p->nConfMaxOne = nConfMaxOne;
294 p->nConfMaxAll = nConfMaxAll;
295 p->fVerbose = fVerbose;
297 p->nObjs = Aig_ManObjNumMax(pAig);
299 p->vAig2Frm = Vec_PtrAlloc( 100 );
300 p->vObj2Var = Vec_IntAlloc( 0 );
301 Vec_IntFill(
p->vObj2Var,
p->nObjs, 0 );
305 Saig_BmcObjSetFrame(
p, pObj, 0, Aig_ManConst0(
p->pFrm) );
308 Lit = toLit(
p->nSatVars );
322 p->pSat->nLearntStart = 10000;
323 p->pSat->nLearntDelta = 5000;
324 p->pSat->nLearntRatio = 75;
325 p->pSat->nLearntMax =
p->pSat->nLearntStart;
329 Saig_BmcSetSatNum(
p, Aig_ManConst1(
p->pFrm),
p->nSatVars++ );
331 p->vTargets = Vec_PtrAlloc( 1000 );
332 p->vVisited = Vec_IntAlloc( 1000 );
353 Vec_IntFree(
p->vObj2Var );
356 Vec_PtrFree(
p->vTargets );
357 Vec_IntFree(
p->vVisited );
429 pRes = Saig_BmcObjFrame(
p, pObj, i );
432 if ( Saig_ObjIsPi(
p->pAig, pObj ) )
434 else if ( Saig_ObjIsLo(
p->pAig, pObj ) )
436 else if ( Aig_ObjIsCo( pObj ) )
439 pRes = Saig_BmcObjChild0(
p, pObj, i );
444 if ( Saig_BmcObjChild0(
p, pObj, i) == Aig_ManConst0(
p->pFrm) )
445 pRes = Aig_ManConst0(
p->pFrm);
449 pRes =
Aig_And(
p->pFrm, Saig_BmcObjChild0(
p, pObj, i), Saig_BmcObjChild1(
p, pObj, i) );
453 Saig_BmcObjSetFrame(
p, pObj, i, pRes );
454 Vec_IntPush( vVisited, Aig_ObjId(pObj) );
455 Vec_IntPush( vVisited, i );
474 int nNodes = Aig_ManObjNum(
p->pFrm );
475 Vec_PtrClear(
p->vTargets );
476 p->iFramePrev =
p->iFrameLast;
477 for ( ;
p->iFrameLast <
p->nFramesMax;
p->iFrameLast++,
p->iOutputLast = 0 )
479 if (
p->iOutputLast == 0 )
481 Saig_BmcObjSetFrame(
p, Aig_ManConst1(
p->pAig),
p->iFrameLast, Aig_ManConst1(
p->pFrm) );
483 for ( ;
p->iOutputLast < Saig_ManPoNum(
p->pAig);
p->iOutputLast++ )
485 if ( Aig_ManObjNum(
p->pFrm) >= nNodes +
p->nNodesMax )
488 Vec_IntClear(
p->vVisited );
490 Vec_PtrPush(
p->vTargets, pTarget );
495 Saig_BmcObjFrame(
p, Aig_ManObj(
p->pAig, iObj), iFrame );
516 Vec_IntPush(
p->vVisited, Aig_ObjId(pObj) );
517 if ( Saig_BmcSatNum(
p, pObj) || Aig_ObjIsCi(pObj) )
519 p->nStitchVars += !Aig_ObjIsCi(pObj);
525 return (
Aig_Obj_t *)(pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ));
548 Aig_ManConst1(
p->pFrm)->pData = Aig_ManConst1(pNew);
549 Vec_IntClear(
p->vVisited );
550 Vec_IntPush(
p->vVisited, Aig_ObjId(Aig_ManConst1(
p->pFrm)) );
555 assert( !Aig_IsComplement(pObjNew) );
575 int i, Lits[2], VarNumOld, VarNumNew;
582 if ( VarNumNew == -1 )
585 VarNumOld = Saig_BmcSatNum(
p, pObj );
586 if ( VarNumOld == 0 )
588 Saig_BmcSetSatNum(
p, pObj, VarNumNew );
592 Lits[0] = toLitCond( VarNumOld, 0 );
593 Lits[1] = toLitCond( VarNumNew, 1 );
604 Lits[0] = toLitCond( VarNumOld, 1 );
605 Lits[1] = toLitCond( VarNumNew, 0 );
620 for ( i = 0; i < pCnf->
nClauses; i++ )
626 for ( i = 0; i < pCnf->
nClauses; i++ )
630 if ( i < pCnf->nClauses )
631 printf(
"SAT solver became UNSAT after adding clauses.\n" );
648 p->iOutputFail =
p->iOutputLast;
649 p->iFrameFail =
p->iFrameLast;
650 for ( k = Vec_PtrSize(
p->vTargets); k > iTargetFail; k-- )
652 if (
p->iOutputFail == 0 )
654 p->iOutputFail = Saig_ManPoNum(
p->pAig);
678 pCex =
Abc_CexAlloc( Aig_ManRegNum(
p->pAig), Saig_ManPiNum(
p->pAig),
p->iFrameFail+1 );
679 pCex->iFrame =
p->iFrameFail;
680 pCex->iPo =
p->iOutputFail;
682 for ( f = 0; f <=
p->iFrameFail; f++ )
686 pObjFrm = Saig_BmcObjFrame(
p, pObj, f );
687 if ( pObjFrm == NULL )
689 iVarNum = Saig_BmcSatNum(
p, pObjFrm );
693 Abc_InfoSetBit( pCex->pData, pCex->nRegs + Saig_ManPiNum(
p->pAig) * f + i );
699 printf(
"Saig_BmcGenerateCounterExample(): Counter-example is invalid.\n" );
720 int i, k, VarNum, Lit, status, RetValue;
721 assert( Vec_PtrSize(
p->vTargets) > 0 );
722 if (
p->pSat &&
p->pSat->qtail !=
p->pSat->qhead )
729 if ( ((*pnOutsSolved)++ / Saig_ManPoNum(
p->pAig)) < nStart )
733 VarNum = Saig_BmcSatNum(
p, Aig_Regular(pObj) );
734 Lit = toLitCond( VarNum, Aig_IsComplement(pObj) );
738 RetValue =
sat_solver_solve(
p->pSat, &Lit, &Lit + 1, (ABC_INT64_T)
p->nConfMaxOne, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
742 Lit = lit_neg( Lit );
751 for ( k = 0; k < veci_size(&
p->pSat->unit_lits); k++ )
753 Lit = veci_begin(&
p->pSat->unit_lits)[k];
757 veci_resize(&
p->pSat->unit_lits, 0);
759 sat_solver_compress(
p->pSat );
811int Saig_BmcPerform(
Aig_Man_t * pAig,
int nStart,
int nFramesMax,
int nNodesMax,
int nTimeOut,
int nConfMaxOne,
int nConfMaxAll,
int fVerbose,
int fVerbOverwrite,
int * piFrames,
int fSilent,
int fUseSatoko )
817 int Iter, RetValue = -1;
818 abctime nTimeToStop = nTimeOut ? nTimeOut * CLOCKS_PER_SEC + Abc_Clock(): 0;
819 abctime clk = Abc_Clock(), clk2, clkTotal = Abc_Clock();
828 printf(
"Running \"bmc2\". AIG: PI/PO/Reg = %d/%d/%d. Node = %6d. Lev = %5d.\n",
829 Saig_ManPiNum(pAig), Saig_ManPoNum(pAig), Saig_ManRegNum(pAig),
831 printf(
"Params: FramesMax = %d. NodesDelta = %d. ConfMaxOne = %d. ConfMaxAll = %d.\n",
832 nFramesMax, nNodesMax, nConfMaxOne, nConfMaxAll );
835 p =
Saig_BmcManStart( pAig, nFramesMax, nNodesMax, nConfMaxOne, nConfMaxAll, fVerbose, fUseSatoko );
842 sat_solver_set_runtime_limit(
p->pSat, nTimeToStop );
844 for ( Iter = 0; ; Iter++ )
850 if ( Vec_PtrSize(
p->vTargets) == 0 )
856 pCnf =
Cnf_Derive( pNew, Aig_ManCoNum(pNew) );
858 p->nSatVars += pCnf->
nVars;
867 printf(
"%4d : F =%5d. O =%4d. And =%8d. Var =%8d. Conf =%7d. ",
868 Iter,
p->iFrameLast,
p->iOutputLast, Aig_ManNodeNum(
p->pFrm),
p->nSatVars,
870 printf(
"%4.0f MB", 4.0*(
p->iFrameLast+1)*
p->nObjs/(1<<20) );
871 printf(
"%9.2f sec", (
float)(Abc_Clock() - clkTotal)/(
float)(CLOCKS_PER_SEC) );
878 if ( nTimeOut && Abc_Clock() > nTimeToStop )
881 printf(
"Reached timeout (%d seconds).\n", nTimeOut );
883 *piFrames =
p->iFrameLast-1;
890 assert(
p->iFrameFail * Saig_ManPoNum(
p->pAig) +
p->iOutputFail + 1 == nOutsSolved );
892 Abc_Print( 1,
"Output %d of miter \"%s\" was asserted in frame %d. ",
893 p->iOutputFail,
p->pAig->pName,
p->iFrameFail );
896 *piFrames =
p->iFrameFail - 1;
901 Abc_Print( 1,
"No output failed in %d frames. ", Abc_MaxInt(
p->iFramePrev-1, 0) );
904 if (
p->iOutputLast > 0 )
905 *piFrames =
p->iFramePrev - 2;
907 *piFrames =
p->iFramePrev - 1;
912 if ( fVerbOverwrite )
914 ABC_PRTr(
"Time", Abc_Clock() - clk );
918 ABC_PRT(
"Time", Abc_Clock() - clk );
922 if (
p->iFrameLast >=
p->nFramesMax )
923 printf(
"Reached limit on the number of timeframes (%d).\n",
p->nFramesMax );
924 else if (
p->nConfMaxAll && (
p->pSat ? (
int)
p->pSat->stats.conflicts :
satoko_conflictnum(
p->pSat2)) >
p->nConfMaxAll )
925 printf(
"Reached global conflict limit (%d).\n",
p->nConfMaxAll );
926 else if ( nTimeOut && Abc_Clock() > nTimeToStop )
927 printf(
"Reached timeout (%d seconds).\n", nTimeOut );
929 printf(
"Reached local conflict limit (%d).\n",
p->nConfMaxOne );
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_ManLevelNum(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
void Aig_ManPrintStats(Aig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachObjVec(vIds, p, pObj, i)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define ABS_ZER
FUNCTION DEFINITIONS ///.
Vec_Ptr_t * Abs_ManTernarySimulate(Aig_Man_t *p, int nFramesMax, int fVerbose)
Aig_Obj_t * Saig_BmcIntervalConstruct_rec(Saig_Bmc_t *p, Aig_Obj_t *pObj, int i, Vec_Int_t *vVisited)
int Saig_BmcPerform(Aig_Man_t *pAig, int nStart, int nFramesMax, int nNodesMax, int nTimeOut, int nConfMaxOne, int nConfMaxAll, int fVerbose, int fVerbOverwrite, int *piFrames, int fSilent, int fUseSatoko)
int Abs_ManExtendOneEval_rec(Vec_Ptr_t *vSimInfo, Aig_Man_t *p, Aig_Obj_t *pObj, int iFrame)
typedefABC_NAMESPACE_IMPL_START struct Saig_Bmc_t_ Saig_Bmc_t
DECLARATIONS ///.
void Saig_BmcLoadCnf(Saig_Bmc_t *p, Cnf_Dat_t *pCnf)
void Saig_BmcAddTargetsAsPos(Saig_Bmc_t *p)
void Saig_BmcInterval(Saig_Bmc_t *p)
void Saig_BmcManStop(Saig_Bmc_t *p)
Aig_Obj_t * Saig_BmcIntervalToAig_rec(Saig_Bmc_t *p, Aig_Man_t *pNew, Aig_Obj_t *pObj)
int Saig_BmcSolveTargets(Saig_Bmc_t *p, int nStart, int *pnOutsSolved)
Abc_Cex_t * Saig_BmcGenerateCounterExample(Saig_Bmc_t *p)
void Saig_BmcDeriveFailed(Saig_Bmc_t *p, int iTargetFail)
Aig_Man_t * Saig_BmcIntervalToAig(Saig_Bmc_t *p)
Saig_Bmc_t * Saig_BmcManStart(Aig_Man_t *pAig, int nFramesMax, int nNodesMax, int nConfMaxOne, int nConfMaxAll, int fVerbose, int fUseSatoko)
void Abs_ManFreeAray(Vec_Ptr_t *p)
#define sat_solver_addclause
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
void Cnf_DataLift(Cnf_Dat_t *p, int nVarsPlus)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
int Saig_ManVerifyCex(Aig_Man_t *pAig, Abc_Cex_t *p)
sat_solver * sat_solver_new(void)
int sat_solver_simplify(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
void satoko_setnvars(satoko_t *, int)
int satoko_conflictnum(satoko_t *)
struct satoko_opts satoko_opts_t
abctime satoko_set_runtime_limit(satoko_t *, abctime)
int satoko_solve_assumptions_limit(satoko_t *s, int *plits, int nlits, int nconflim)
void satoko_default_opts(satoko_opts_t *)
int satoko_add_clause(satoko_t *, int *, int)
struct solver_t_ satoko_t
int satoko_read_cex_varvalue(satoko_t *, int)
void satoko_destroy(satoko_t *)
satoko_t * satoko_create(void)
void satoko_configure(satoko_t *, satoko_opts_t *)
void Abc_CexFree(Abc_Cex_t *p)
ABC_NAMESPACE_IMPL_START Abc_Cex_t * Abc_CexAlloc(int nRegs, int nRealPis, int nFrames)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.