59 int VarPar = nVars + nStrs;
62 for ( pStr = pStr0; pStr < pStr0 + nStrs; pStr++, VarOut++ )
66 int nMints = 1 << pStr->
nVarIns;
68 for ( m = 0; m < nMints; m++, VarPar++ )
70 for ( k = 0; k < pStr->
nVarIns; k++ )
71 pLits[k] = Abc_Var2Lit( pVars[pStr->
VarIns[k]], (m >> k) & 1 );
72 for ( n = 0; n < 2; n++ )
74 pLits[pStr->
nVarIns] = Abc_Var2Lit( pVars[VarPar], n );
75 pLits[pStr->
nVarIns+1] = Abc_Var2Lit( pVars[VarOut], !n );
85 for ( k = 0; k < pStr->
nVarIns; k++, VarPar++ )
87 for ( n = 0; n < 2; n++ )
89 pLits[0] = Abc_Var2Lit( pVars[VarPar], 1 );
90 pLits[1] = Abc_Var2Lit( pVars[VarOut], n );
91 pLits[2] = Abc_Var2Lit( pVars[pStr->
VarIns[k]], !n );
104 int VarPar = nVars + nStrs;
107 for ( pStr = pStr0; pStr < pStr0 + nStrs; VarPar += pStr->
fLut ? 1 << pStr->
nVarIns : pStr->
nVarIns, pStr++ )
113 for ( m = 0; m < pStr->
nVarIns; m++ )
114 pLits[m] = Abc_Var2Lit( pVars[VarPar + m], 0 );
118 for ( m = 0; m < pStr->
nVarIns; m++ )
119 for ( m2 = m+1; m2 < pStr->
nVarIns; m2++ )
121 pLits[0] = Abc_Var2Lit( pVars[VarPar + m], 1 );
122 pLits[1] = Abc_Var2Lit( pVars[VarPar + m2], 1 );
200 int nVars = Vec_IntSize( vDivSet );
203 int VarCecOut = Vec_IntSize(vWinObjs) + Vec_IntSize(vTfo) + Vec_IntSize(vRoots);
204 int VarCecPar = VarCecOut + nStrs;
207 int VarQbfFree = nPars;
211 int i, iVar, iLit, nIters;
215 assert( nVars + nStrs + nPars <= 256 );
220 for ( i = 0; i < nStrs; i++ )
221 pVarsCec[nVars + i] = VarCecOut + i;
222 for ( i = 0; i < nPars; i++ )
223 pVarsCec[nVars + nStrs + i] = VarCecPar + i;
226 for ( i = 0; i < nVars + nStrs; i++ )
228 for ( i = 0; i < nPars; i++ )
229 pVarsQbf[nVars + nStrs + i] = VarQbfPar + i;
239 Vec_IntClear( vLits );
240 for ( i = 0; i < nPars; i++ )
241 Vec_IntPush( vLits, Abc_Var2Lit(VarCecPar + i, 1) );
242 for ( nIters = 0; nIters < (1 << nVars); nIters++ )
245 int status =
sat_solver_solve( pSatCec, Vec_IntArray(vLits), Vec_IntLimit(vLits), 0, 0, 0, 0 );
252 printf(
"Iter %3d : ", nIters );
253 for ( i = 0; i < nPars; i++ )
254 printf(
"%d", !Abc_LitIsCompl(Vec_IntEntry(vLits, i)) );
258 Vec_IntClear( vLits );
260 for ( i = 0; i < nVars + nStrs; i++ )
261 pVarsQbf[i] = VarQbfFree++;
265 iLit = Abc_Var2Lit( pVarsQbf[i], !sat_solver_var_value(pSatCec, iVar) );
269 printf(
"%d", sat_solver_var_value(pSatCec, iVar) );
271 iLit = Abc_Var2Lit( pVarsQbf[nVars], sat_solver_var_value(pSatCec, VarCecOut) );
275 printf(
" %d\n", !sat_solver_var_value(pSatCec, VarCecOut) );
285 assert( Vec_IntSize(vLits) == 0 );
286 for ( i = 0; i < nPars; i++ )
287 Vec_IntPush( vLits, Abc_Var2Lit(VarCecPar + i, !sat_solver_var_value(pSatQbf, VarQbfPar + i)) );
289 if ( Vec_IntSize(vLits) > 0 )
297 Vec_IntFree( vLits );
300 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
sat_solver * Sbd_ManSatSolver(sat_solver *pSat, Gia_Man_t *p, Vec_Int_t *vMirrors, int Pivot, Vec_Int_t *vWinObjs, Vec_Int_t *vObj2Var, Vec_Int_t *vTfo, Vec_Int_t *vRoots, int fQbf)
DECLARATIONS ///.
int Sbd_ProblemSolve(Gia_Man_t *p, Vec_Int_t *vMirrors, int Pivot, Vec_Int_t *vWinObjs, Vec_Int_t *vObj2Var, Vec_Int_t *vTfo, Vec_Int_t *vRoots, Vec_Int_t *vDivSet, int nStrs, Sbd_Str_t *pStr0)