/**Function************************************************************* Synopsis [Stops the trace recording.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sat_SolverTraceStop( sat_solver * pSat ) { if ( pSat->pFile == NULL ) return; rewind( pSat->pFile ); fprintf( pSat->pFile, "p %d %d %d", sat_solver_nvars(pSat), pSat->nClauses, pSat->nRoots ); fclose( pSat->pFile ); pSat->pFile = NULL; }
/**Function************************************************************* Synopsis [Solve the enumeration problem.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Bmc_EcoSolve( sat_solver * pSat, int Root, Vec_Int_t * vVars ) { int nBTLimit = 1000000; Vec_Int_t * vLits = Vec_IntAlloc( Vec_IntSize(vVars) ); int status, i, Div, iVar, nFinal, * pFinal, nIter = 0, RetValue = 0; int pLits[2], nVars = sat_solver_nvars( pSat ); sat_solver_setnvars( pSat, nVars + 1 ); pLits[0] = Abc_Var2Lit( Root, 0 ); // F = 1 pLits[1] = Abc_Var2Lit( nVars, 0 ); // iNewLit while ( 1 ) { // find onset minterm status = sat_solver_solve( pSat, pLits, pLits + 2, nBTLimit, 0, 0, 0 ); if ( status == l_Undef ) { RetValue = -1; break; } if ( status == l_False ) { RetValue = 1; break; } assert( status == l_True ); // collect divisor literals Vec_IntClear( vLits ); Vec_IntPush( vLits, Abc_LitNot(pLits[0]) ); // F = 0 Vec_IntForEachEntry( vVars, Div, i ) Vec_IntPush( vLits, sat_solver_var_literal(pSat, Div) ); // check against offset status = sat_solver_solve( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits), nBTLimit, 0, 0, 0 ); if ( status == l_Undef ) { RetValue = -1; break; } if ( status == l_True ) break; assert( status == l_False ); // compute cube and add clause nFinal = sat_solver_final( pSat, &pFinal ); Vec_IntClear( vLits ); Vec_IntPush( vLits, Abc_LitNot(pLits[1]) ); // NOT(iNewLit) printf( "Cube %d : ", nIter ); for ( i = 0; i < nFinal; i++ ) { if ( pFinal[i] == pLits[0] ) continue; Vec_IntPush( vLits, pFinal[i] ); iVar = Vec_IntFind( vVars, Abc_Lit2Var(pFinal[i]) ); assert( iVar >= 0 ); printf( "%s%d ", Abc_LitIsCompl(pFinal[i]) ? "+":"-", iVar ); } printf( "\n" ); status = sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits) + Vec_IntSize(vLits) ); assert( status ); nIter++; } // assert( status == l_True ); Vec_IntFree( vLits ); return RetValue; }
void Ssc_ManPrintStats( Ssc_Man_t * p ) { Abc_Print( 1, "Parameters: SimWords = %d. SatConfs = %d. SatVarMax = %d. CallsRec = %d. Verbose = %d.\n", p->pPars->nWords, p->pPars->nBTLimit, p->pPars->nSatVarMax, p->pPars->nCallsRecycle, p->pPars->fVerbose ); Abc_Print( 1, "SAT calls : Total = %d. Proof = %d. Cex = %d. Undec = %d.\n", p->nSatCalls, p->nSatCallsUnsat, p->nSatCallsSat, p->nSatCallsUndec ); Abc_Print( 1, "SAT solver: Vars = %d. Clauses = %d. Recycles = %d. Sim rounds = %d.\n", sat_solver_nvars(p->pSat), sat_solver_nclauses(p->pSat), p->nRecycles, p->nSimRounds ); p->timeOther = p->timeTotal - p->timeSimInit - p->timeSimSat - p->timeCnfGen - p->timeSatSat - p->timeSatUnsat - p->timeSatUndec; ABC_PRTP( "Initialization ", p->timeSimInit, p->timeTotal ); ABC_PRTP( "SAT simulation ", p->timeSimSat, p->timeTotal ); ABC_PRTP( "CNF generation ", p->timeSimSat, p->timeTotal ); ABC_PRTP( "SAT solving ", p->timeSat-p->timeCnfGen, p->timeTotal ); ABC_PRTP( " unsat ", p->timeSatUnsat, p->timeTotal ); ABC_PRTP( " sat ", p->timeSatSat, p->timeTotal ); ABC_PRTP( " undecided ", p->timeSatUndec, p->timeTotal ); ABC_PRTP( "Other ", p->timeOther, p->timeTotal ); ABC_PRTP( "TOTAL ", p->timeTotal, p->timeTotal ); }
/**Function************************************************************* Synopsis [Add constraint that no more than 1 variable is 1.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Cnf_AddCardinConstr( sat_solver * p, Vec_Int_t * vVars ) { int i, k, pLits[2], iVar, nVars = sat_solver_nvars(p); Vec_IntForEachEntry( vVars, iVar, i ) assert( iVar >= 0 && iVar < nVars ); iVar = nVars; sat_solver_setnvars( p, nVars + Vec_IntSize(vVars) - 1 ); while ( Vec_IntSize(vVars) > 1 ) { for ( k = i = 0; i < Vec_IntSize(vVars)/2; i++ ) { pLits[0] = Abc_Var2Lit( Vec_IntEntry(vVars, 2*i), 1 ); pLits[1] = Abc_Var2Lit( Vec_IntEntry(vVars, 2*i+1), 1 ); sat_solver_addclause( p, pLits, pLits + 2 ); sat_solver_add_and( p, iVar, Vec_IntEntry(vVars, 2*i), Vec_IntEntry(vVars, 2*i+1), 1, 1, 1 ); Vec_IntWriteEntry( vVars, k++, iVar++ ); } if ( Vec_IntSize(vVars) & 1 ) Vec_IntWriteEntry( vVars, k++, Vec_IntEntryLast(vVars) ); Vec_IntShrink( vVars, k ); } return iVar; }
/**Function************************************************************* Synopsis [Takes the AIG with the single output to be checked.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Cla_Man_t * Fra_ClauStart( Aig_Man_t * pMan ) { Cla_Man_t * p; Cnf_Dat_t * pCnfMain; Cnf_Dat_t * pCnfTest; Cnf_Dat_t * pCnfBmc; Aig_Man_t * pFramesMain; Aig_Man_t * pFramesTest; Aig_Man_t * pFramesBmc; assert( Aig_ManCoNum(pMan) - Aig_ManRegNum(pMan) == 1 ); // start the manager p = ABC_ALLOC( Cla_Man_t, 1 ); memset( p, 0, sizeof(Cla_Man_t) ); p->vCexMain0 = Vec_IntAlloc( Aig_ManRegNum(pMan) ); p->vCexMain = Vec_IntAlloc( Aig_ManRegNum(pMan) ); p->vCexTest = Vec_IntAlloc( Aig_ManRegNum(pMan) ); p->vCexBase = Vec_IntAlloc( Aig_ManRegNum(pMan) ); p->vCexAssm = Vec_IntAlloc( Aig_ManRegNum(pMan) ); p->vCexBmc = Vec_IntAlloc( Aig_ManRegNum(pMan) ); // derive two timeframes to be checked pFramesMain = Aig_ManFrames( pMan, 2, 0, 1, 0, 0, NULL ); // nFrames, fInit, fOuts, fRegs //Aig_ManShow( pFramesMain, 0, NULL ); assert( Aig_ManCoNum(pFramesMain) == 2 ); Aig_ObjChild0Flip( Aig_ManCo(pFramesMain, 0) ); // complement the first output pCnfMain = Cnf_DeriveSimple( pFramesMain, 0 ); //Cnf_DataWriteIntoFile( pCnfMain, "temp.cnf", 1 ); p->pSatMain = (sat_solver *)Cnf_DataWriteIntoSolver( pCnfMain, 1, 0 ); /* { int i; Aig_Obj_t * pObj; Aig_ManForEachObj( pFramesMain, pObj, i ) printf( "%d -> %d \n", pObj->Id, pCnfMain->pVarNums[pObj->Id] ); printf( "\n" ); } */ // derive one timeframe to be checked pFramesTest = Aig_ManFrames( pMan, 1, 0, 0, 1, 0, NULL ); assert( Aig_ManCoNum(pFramesTest) == Aig_ManRegNum(pMan) ); pCnfTest = Cnf_DeriveSimple( pFramesTest, Aig_ManRegNum(pMan) ); p->pSatTest = (sat_solver *)Cnf_DataWriteIntoSolver( pCnfTest, 1, 0 ); p->nSatVarsTestBeg = p->nSatVarsTestCur = sat_solver_nvars( p->pSatTest ); // derive one timeframe to be checked for BMC pFramesBmc = Aig_ManFrames( pMan, 1, 1, 0, 1, 0, NULL ); //Aig_ManShow( pFramesBmc, 0, NULL ); assert( Aig_ManCoNum(pFramesBmc) == Aig_ManRegNum(pMan) ); pCnfBmc = Cnf_DeriveSimple( pFramesBmc, Aig_ManRegNum(pMan) ); p->pSatBmc = (sat_solver *)Cnf_DataWriteIntoSolver( pCnfBmc, 1, 0 ); // create variable sets p->vSatVarsMainCs = Fra_ClauSaveInputVars( pFramesMain, pCnfMain, 2 * (Aig_ManCiNum(pMan)-Aig_ManRegNum(pMan)) ); p->vSatVarsTestCs = Fra_ClauSaveLatchVars( pFramesTest, pCnfTest, 1 ); p->vSatVarsTestNs = Fra_ClauSaveLatchVars( pFramesTest, pCnfTest, 0 ); p->vSatVarsBmcNs = Fra_ClauSaveOutputVars( pFramesBmc, pCnfBmc ); assert( Vec_IntSize(p->vSatVarsTestCs) == Vec_IntSize(p->vSatVarsMainCs) ); assert( Vec_IntSize(p->vSatVarsTestCs) == Vec_IntSize(p->vSatVarsBmcNs) ); // create mapping of CS into NS vars p->pMapCsMainToCsTest = Fra_ClauCreateMapping( p->vSatVarsMainCs, p->vSatVarsTestCs, Aig_ManObjNumMax(pFramesMain) ); p->pMapCsTestToCsMain = Fra_ClauCreateMapping( p->vSatVarsTestCs, p->vSatVarsMainCs, Aig_ManObjNumMax(pFramesTest) ); p->pMapCsTestToNsTest = Fra_ClauCreateMapping( p->vSatVarsTestCs, p->vSatVarsTestNs, Aig_ManObjNumMax(pFramesTest) ); p->pMapCsTestToNsBmc = Fra_ClauCreateMapping( p->vSatVarsTestCs, p->vSatVarsBmcNs, Aig_ManObjNumMax(pFramesTest) ); // cleanup Cnf_DataFree( pCnfMain ); Cnf_DataFree( pCnfTest ); Cnf_DataFree( pCnfBmc ); Aig_ManStop( pFramesMain ); Aig_ManStop( pFramesTest ); Aig_ManStop( pFramesBmc ); if ( p->pSatMain == NULL || p->pSatTest == NULL || p->pSatBmc == NULL ) { Fra_ClauStop( p ); return NULL; } return p; }