57 int i, iLit = 1, iObj, Fan0, Fan1, Lit0m, Lit1m, Node, fCompl0, fCompl1, RetValue;
58 int TfoStart = Vec_IntSize(vWinObjs) - Vec_IntSize(vTfo);
59 int PivotVar = Vec_IntEntry(vObj2Var, Pivot);
60 int LastVar = Vec_IntSize(vWinObjs) + Vec_IntSize(vTfo) + Vec_IntSize(vRoots);
75 pObj = Gia_ManObj(
p, iObj );
76 if ( Gia_ObjIsCi(pObj) )
78 assert( Gia_ObjIsAnd(pObj) );
79 assert( Vec_IntEntry( vMirrors, iObj ) < 0 );
80 Node = Vec_IntEntry( vObj2Var, iObj );
81 Lit0m = Vec_IntEntry( vMirrors, Gia_ObjFaninId0(pObj, iObj) );
82 Lit1m = Vec_IntEntry( vMirrors, Gia_ObjFaninId1(pObj, iObj) );
83 Fan0 = Lit0m >= 0 ? Abc_Lit2Var(Lit0m) : Gia_ObjFaninId0(pObj, iObj);
84 Fan1 = Lit1m >= 0 ? Abc_Lit2Var(Lit1m) : Gia_ObjFaninId1(pObj, iObj);
85 Fan0 = Vec_IntEntry( vObj2Var, Fan0 );
86 Fan1 = Vec_IntEntry( vObj2Var, Fan1 );
87 fCompl0 = Gia_ObjFaninC0(pObj) ^ (Lit0m >= 0 && Abc_LitIsCompl(Lit0m));
88 fCompl1 = Gia_ObjFaninC1(pObj) ^ (Lit1m >= 0 && Abc_LitIsCompl(Lit1m));
89 if ( Gia_ObjIsXor(pObj) )
97 pObj = Gia_ManObj(
p, iObj );
98 assert( Gia_ObjIsAnd(pObj) );
99 assert( Vec_IntEntry( vMirrors, iObj ) < 0 );
100 Node = Vec_IntEntry( vObj2Var, iObj ) + Vec_IntSize(vTfo);
101 Lit0m = Vec_IntEntry( vMirrors, Gia_ObjFaninId0(pObj, iObj) );
102 Lit1m = Vec_IntEntry( vMirrors, Gia_ObjFaninId1(pObj, iObj) );
103 Fan0 = Lit0m >= 0 ? Abc_Lit2Var(Lit0m) : Gia_ObjFaninId0(pObj, iObj);
104 Fan1 = Lit1m >= 0 ? Abc_Lit2Var(Lit1m) : Gia_ObjFaninId1(pObj, iObj);
105 Fan0 = Vec_IntEntry( vObj2Var, Fan0 );
106 Fan1 = Vec_IntEntry( vObj2Var, Fan1 );
107 Fan0 = Fan0 < TfoStart ? Fan0 : Fan0 + Vec_IntSize(vTfo);
108 Fan1 = Fan1 < TfoStart ? Fan1 : Fan1 + Vec_IntSize(vTfo);
111 Fan0 = Fan0 == PivotVar ? LastVar : Fan0;
112 Fan1 = Fan1 == PivotVar ? LastVar : Fan1;
114 fCompl0 = Gia_ObjFaninC0(pObj) ^ (!fQbf && Fan0 == PivotVar) ^ (Lit0m >= 0 && Abc_LitIsCompl(Lit0m));
115 fCompl1 = Gia_ObjFaninC1(pObj) ^ (!fQbf && Fan1 == PivotVar) ^ (Lit1m >= 0 && Abc_LitIsCompl(Lit1m));
116 if ( Gia_ObjIsXor(pObj) )
121 if ( Vec_IntSize(vRoots) > 0 )
124 int nVars = Vec_IntSize(vWinObjs) + Vec_IntSize(vTfo);
125 Vec_Int_t * vFaninVars = Vec_IntAlloc( Vec_IntSize(vRoots) );
128 assert( Vec_IntEntry( vMirrors, iObj ) < 0 );
129 Node = Vec_IntEntry( vObj2Var, iObj );
130 Vec_IntPush( vFaninVars, Abc_Var2Lit(nVars, 0) );
135 Vec_IntFree( vFaninVars );
146 for ( n = 0; n < 2; n++ )
148 pLits[0] = Abc_Var2Lit( PivotVar, n );
149 pLits[1] = Abc_Var2Lit( LastVar, n );
181 word uCube, uTruth = 0;
182 int status, i, iVar, nFinal, * pFinal, pLits[2], nIter = 0;
184 assert( Vec_IntSize(vDivVars) == Vec_IntSize(vDivValues) );
185 pLits[0] = Abc_Var2Lit( PivotVar, 0 );
186 pLits[1] = Abc_Var2Lit( FreeVar, 0 );
198 Vec_IntWriteEntry( vDivValues, i, 2*sat_solver_var_value(pSat, iVar) );
200 Vec_IntClear( vTemp );
201 Vec_IntPush( vTemp, Abc_LitNot(pLits[0]) );
203 Vec_IntPush( vTemp, sat_solver_var_literal(pSat, iVar) );
205 status =
sat_solver_solve( pSat, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + Vec_IntSize(vTemp), nBTLimit, 0, 0, 0 );
212 nFinal = sat_solver_final( pSat, &pFinal );
214 Vec_IntClear( vTemp );
215 Vec_IntPush( vTemp, Abc_LitNot(pLits[1]) );
216 for ( i = 0; i < nFinal; i++ )
218 if ( pFinal[i] == pLits[0] )
220 Vec_IntPush( vTemp, pFinal[i] );
221 iVar = Vec_IntFind( vDivSet, Abc_Lit2Var(pFinal[i]) );
assert( iVar >= 0 );
222 uCube &= Abc_LitIsCompl(pFinal[i]) ? s_Truths6[iVar] : ~s_Truths6[iVar];
225 status =
sat_solver_addclause( pSat, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + Vec_IntSize(vTemp) );
232 Vec_IntAddToEntry( vDivValues, i, sat_solver_var_value(pSat, iVar) );
234 for ( i = 0; i < Vec_IntSize(vDivValues); i++ )
235 Vec_IntAddToEntry( vDivValues, i, 0xC );
270 int status, i, iVar, nFinal, * pFinal, pLits[2], nIter = 0;
272 assert( Vec_IntSize(vDivVars) == Vec_IntSize(vDivValues) );
273 pLits[0] = Abc_Var2Lit( PivotVar, 0 );
274 pLits[1] = Abc_Var2Lit( FreeVar, 0 );
275 Vec_IntClear( vSop );
289 Vec_IntClear( vTemp );
290 Vec_IntPush( vTemp, Abc_LitNot(pLits[0]) );
293 Vec_IntPush( vTemp, sat_solver_var_literal(pSat, iVar) );
295 status =
sat_solver_solve( pSat, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + Vec_IntSize(vTemp), nBTLimit, 0, 0, 0 );
302 nFinal = sat_solver_final( pSat, &pFinal );
303 Vec_IntClear( vTemp );
304 Vec_IntPush( vTemp, Abc_LitNot(pLits[1]) );
305 for ( i = 0; i < nFinal; i++ )
307 if ( pFinal[i] == pLits[0] )
309 Vec_IntPush( vTemp, pFinal[i] );
310 iVar = Vec_IntFind( vDivVars, Abc_Lit2Var(pFinal[i]) );
assert( iVar >= 0 );
312 Vec_IntPush( vSop, Abc_Var2Lit( iVar, !Abc_LitIsCompl(pFinal[i]) ) );
315 Vec_IntPush( vSop, -1 );
316 status =
sat_solver_addclause( pSat, Vec_IntArray(vTemp), Vec_IntArray(vTemp) + Vec_IntSize(vTemp) );
370 int PivotVar = Vec_IntEntry(vObj2Var, Pivot);
371 int FreeVar = Vec_IntSize(vWinObjs) + Vec_IntSize(vTfo) + Vec_IntSize(vRoots);
372 int Status =
Sbd_ManSolve2( pSat, PivotVar, FreeVar, vDivVars, vDivValues, vTemp, vSop );
373 printf(
"Pivot = %4d. Divs = %4d. ", Pivot, Vec_IntSize(vDivVars) );
375 printf(
"UNSAT.\n" );
378 int nVars, pInds[64];
381 printf(
"SAT with %d vars and %d cubes.\n", nVars, Vec_IntCountEntry(vSop, -1) );
384 Vec_IntFree( vTemp );
415 assert( Vec_IntSize(vInds) == nCareMints[0] + nCareMints[1] );
418 int fOffSet = (int)(i < nCareMints[0]);
419 int status, k, iLit = Abc_Var2Lit( PivotVar, fOffSet );
420 sat_solver_random_polarity( pSat );
426 for ( k = 0; k <= PivotVar; k++ )
427 if ( Abc_TtGetBit(pVarSims[k], Ind) != sat_solver_var_value(pSat, k) )
428 Abc_TtXorBit(pVarSims[k], Ind);
436 int n, i, k, status, iLit, iVar;
437 word * pPats[2] = {pOnset, pOffset};
438 assert( Vec_IntSize(vDivVars) < 64 );
439 for ( n = 0; n < 2; n++ )
440 for ( i = 0; i < nConsts; i++ )
442 sat_solver_random_polarity( pSat );
443 iLit = Abc_Var2Lit( PivotVar, n );
449 pPats[n][i] = ((
word)!n) << Vec_IntSize(vDivVars);
451 if ( sat_solver_var_value(pSat, iVar) )
452 Abc_TtXorBit(&pPats[n][i], k);