56 return p->pCnf1->pVarNums[ Aig_ObjId(pObj) ];
74 Vec_Int_t * vId2Vars =
p->pvId2Vars + Aig_ObjId(pObj);
75 assert(
p->pCnf2->pObj2Count[Aig_ObjId(pObj)] >= 0 );
76 if ( Vec_IntSize(vId2Vars) == 0 )
77 Vec_IntGrow(vId2Vars, 2 * k + 1);
78 if ( Vec_IntGetEntry(vId2Vars, k) == 0 )
82 int iVarNew = Vec_IntSize( vVar2Ids );
84 Vec_IntPush( vVar2Ids, Aig_ObjId(pObj) );
85 Vec_IntWriteEntry( vId2Vars, k, iVarNew << 2 );
87 if ( k == 0 && Saig_ObjIsLo(
p->pAig, pObj) )
89 int Lit = Abc_Var2Lit( iVarNew, 1 );
93 sat_solver_compress( pSat );
96 return Vec_IntEntry( vId2Vars, k );
103 int nVarCount = Vec_IntSize(vVar2Ids);
104 int iVarThis = Pdr_ObjSatVar2FindOrAdd(
p, k, pObj );
105 int * pLit, i, iVar, iClaBeg, iClaEnd, RetValue;
106 int PolPres = (iVarThis & 3);
108 if ( Aig_ObjIsCi(pObj) )
112 if ( (Pol & ~PolPres) )
114 *Vec_IntEntryP(
p->pvId2Vars + Aig_ObjId(pObj), k ) |= Pol;
115 iClaBeg =
p->pCnf2->pObj2Clause[Aig_ObjId(pObj)];
116 iClaEnd = iClaBeg +
p->pCnf2->pObj2Count[Aig_ObjId(pObj)];
117 assert( iClaBeg < iClaEnd );
131 pSat = Pdr_ManSolver(
p, k);
132 vLits = Vec_WecEntry(
p->vVLits, Level );
133 if ( (Pol & ~PolPres) == 3 )
135 assert( nVarCount + 1 == Vec_IntSize(vVar2Ids) );
136 for ( i = iClaBeg; i < iClaEnd; i++ )
138 Vec_IntClear( vLits );
139 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(
p->pCnf2->pClauses[i][0]) ) );
140 for ( pLit =
p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
142 iVar =
Pdr_ObjSatVar2(
p, k, Aig_ManObj(
p->pAig, Abc_Lit2Var(*pLit)), Level+1, 3 );
143 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
145 RetValue =
sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
152 assert( (Pol & ~PolPres) );
153 for ( i = iClaBeg; i < iClaEnd; i++ )
154 if ( 2 - !Abc_LitIsCompl(
p->pCnf2->pClauses[i][0]) == (Pol & ~PolPres) )
156 Vec_IntClear( vLits );
157 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(
p->pCnf2->pClauses[i][0]) ) );
158 for ( pLit =
p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
160 iVar =
Pdr_ObjSatVar2(
p, k, Aig_ManObj(
p->pAig, Abc_Lit2Var(*pLit)), Level+1, ((
unsigned)
p->pCnf2->pClaPols[i] >> (2*(pLit-
p->pCnf2->pClauses[i]-1))) & 3 );
161 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
163 RetValue =
sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
173static inline int Pdr_ObjSatVar2FindOrAdd(
Pdr_Man_t *
p,
int k,
Aig_Obj_t * pObj,
int * pfNewVar )
175 Vec_Int_t * vId2Vars =
p->pvId2Vars + Aig_ObjId(pObj);
176 assert(
p->pCnf2->pObj2Count[Aig_ObjId(pObj)] >= 0 );
177 if ( Vec_IntSize(vId2Vars) == 0 )
178 Vec_IntGrow(vId2Vars, 2 * k + 1);
179 if ( Vec_IntGetEntry(vId2Vars, k) == 0 )
183 int iVarNew = Vec_IntSize( vVar2Ids );
185 Vec_IntPush( vVar2Ids, Aig_ObjId(pObj) );
186 Vec_IntWriteEntry( vId2Vars, k, iVarNew );
188 if ( k == 0 && Saig_ObjIsLo(
p->pAig, pObj) )
190 int Lit = Abc_Var2Lit( iVarNew, 1 );
194 sat_solver_compress( pSat );
198 return Vec_IntEntry( vId2Vars, k );
204 int fNewVar = 0, iVarThis = Pdr_ObjSatVar2FindOrAdd(
p, k, pObj, &fNewVar );
205 int * pLit, i, iVar, iClaBeg, iClaEnd, RetValue;
206 if ( Aig_ObjIsCi(pObj) || !fNewVar )
208 iClaBeg =
p->pCnf2->pObj2Clause[Aig_ObjId(pObj)];
209 iClaEnd = iClaBeg +
p->pCnf2->pObj2Count[Aig_ObjId(pObj)];
210 assert( iClaBeg < iClaEnd );
211 pSat = Pdr_ManSolver(
p, k);
212 vLits = Vec_WecEntry(
p->vVLits, Level );
213 for ( i = iClaBeg; i < iClaEnd; i++ )
215 Vec_IntClear( vLits );
216 Vec_IntPush( vLits, Abc_Var2Lit( iVarThis, Abc_LitIsCompl(
p->pCnf2->pClauses[i][0]) ) );
217 for ( pLit =
p->pCnf2->pClauses[i]+1; pLit < p->pCnf2->pClauses[i+1]; pLit++ )
219 iVar =
Pdr_ObjSatVar2(
p, k, Aig_ManObj(
p->pAig, Abc_Lit2Var(*pLit)), Level+1, Pol );
220 Vec_IntPush( vLits, Abc_Var2Lit( iVar, Abc_LitIsCompl(*pLit) ) );
222 RetValue =
sat_solver_addclause( pSat, Vec_IntArray(vLits), Vec_IntArray(vLits)+Vec_IntSize(vLits) );
243 if (
p->pPars->fMonoCnf )
244 return Pdr_ObjSatVar1(
p, k, pObj );
261static inline int Pdr_ObjRegNum1(
Pdr_Man_t *
p,
int k,
int iSatVar )
266 if ( iSatVar >=
p->pCnf1->nVars )
269 RegId = Vec_IntEntry(
p->vVar2Reg, iSatVar );
270 assert( RegId >= 0 && RegId < Aig_ManRegNum(
p->pAig) );
285static inline int Pdr_ObjRegNum2(
Pdr_Man_t *
p,
int k,
int iSatVar )
290 assert( iSatVar > 0 && iSatVar < Vec_IntSize(vVar2Ids) );
291 ObjId = Vec_IntEntry( vVar2Ids, iSatVar );
294 pObj = Aig_ManObj(
p->pAig, ObjId );
295 if ( Saig_ObjIsLi(
p->pAig, pObj ) )
296 return Aig_ObjCioId(pObj)-Saig_ManPoNum(
p->pAig);
314 if (
p->pPars->fMonoCnf )
315 return Pdr_ObjRegNum1(
p, k, iSatVar );
317 return Pdr_ObjRegNum2(
p, k, iSatVar );
334 if (
p->pPars->fMonoCnf )
339 Vec_IntPush( vVar2Ids, -1 );
340 return Vec_IntSize( vVar2Ids ) - 1;
360 if (
p->pCnf1 == NULL )
362 int nRegs =
p->pAig->nRegs;
363 p->pAig->nRegs = Aig_ManCoNum(
p->pAig);
365 p->pAig->nRegs = nRegs;
367 p->vVar2Reg = Vec_IntStartFull(
p->pCnf1->nVars );
372 sat_solver_set_runtime_limit( pSat,
p->timeToStop );
373 sat_solver_set_runid( pSat,
p->pPars->RunId );
374 sat_solver_set_stop_func( pSat,
p->pPars->pFuncStop );
394 if (
p->pCnf2 == NULL )
401 Vec_PtrGrow( &
p->vVar2Ids, 256 );
404 vVar2Ids = (
Vec_Int_t *)Vec_PtrGetEntry( &
p->vVar2Ids, k );
405 if ( vVar2Ids == NULL )
407 vVar2Ids = Vec_IntAlloc( 500 );
408 Vec_PtrWriteEntry( &
p->vVar2Ids, k, vVar2Ids );
414 assert( Vec_IntEntry(
p->pvId2Vars + Entry, k ) > 0 );
415 Vec_IntWriteEntry(
p->pvId2Vars + Entry, k, 0 );
417 Vec_IntClear( vVar2Ids );
418 Vec_IntPush( vVar2Ids, -1 );
422 sat_solver_set_runtime_limit( pSat,
p->timeToStop );
423 sat_solver_set_runid( pSat,
p->pPars->RunId );
424 sat_solver_set_stop_func( pSat,
p->pPars->pFuncStop );
442 if (
p->pPars->fMonoCnf )
443 return Pdr_ManNewSolver1( pSat,
p, k, fInit );
445 return Pdr_ManNewSolver2( pSat,
p, k, fInit );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
unsigned char * Cnf_DataDeriveLitPolarities(Cnf_Dat_t *p)
void * Cnf_DataWriteIntoSolverInt(void *pSat, Cnf_Dat_t *p, int nFrames, int fInit)
Cnf_Dat_t * Cnf_DeriveWithMan(Cnf_Man_t *p, Aig_Man_t *pAig, int nOutputs)
Cnf_Dat_t * Cnf_DeriveOtherWithMan(Cnf_Man_t *p, Aig_Man_t *pAig, int fSkipTtMin)
sat_solver * Pdr_ManNewSolver(sat_solver *pSat, Pdr_Man_t *p, int k, int fInit)
int Pdr_ManFreeVar(Pdr_Man_t *p, int k)
int Pdr_ObjSatVar2(Pdr_Man_t *p, int k, Aig_Obj_t *pObj, int Level, int Pol)
int Pdr_ObjSatVar(Pdr_Man_t *p, int k, int Pol, Aig_Obj_t *pObj)
FUNCTION DECLARATIONS ///.
int Pdr_ObjRegNum(Pdr_Man_t *p, int k, int iSatVar)
struct Pdr_Man_t_ Pdr_Man_t
#define Saig_ManForEachLi(p, pObj, i)
void sat_solver_setnvars(sat_solver *s, int n)
int sat_solver_nvars(sat_solver *s)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.