Example #1
0
void
genProofModel(SatSolver& s)
{
   // Allocate and record variables; No Var ID for POs
   for (size_t i = 0, n = gates.size(); i < n; ++i) {
      Var v = s.newVar();
      gates[i]->setVar(v);
   }

   // Hard code the model construction here...
   // [2] AIG 4 1 2 ==> [2] = [0] & [1]
   s.addAigCNF(gates[2]->getVar(), gates[0]->getVar(), false,
               gates[1]->getVar(), false);
   // [4] AIG 5 1 3 ==> [4] = [0] & [3]
   s.addAigCNF(gates[4]->getVar(), gates[0]->getVar(), false,
               gates[3]->getVar(), false);
   // [5] AIG 6 !4 !5 ==> [5] = ![2] & ![4]
   s.addAigCNF(gates[5]->getVar(), gates[2]->getVar(), true,
               gates[4]->getVar(), true);
   // [7] AIG 7 !2 !3 ==> [7] = ![1] & ![3]
   s.addAigCNF(gates[7]->getVar(), gates[1]->getVar(), true,
               gates[3]->getVar(), true);
   // [8] AIG 8 !7 1 ==> [8] = ![7] & [0]
   s.addAigCNF(gates[8]->getVar(), gates[7]->getVar(), true,
               gates[0]->getVar(), false);
}
Example #2
0
int main()
{
   initCircuit();

   SatSolver solver;
   solver.initialize();

   //
   genProofModel(solver);

   bool result;
   // k = Solve(Gate(5) ^ !Gate(8))
   Var newV = solver.newVar();
   solver.addXorCNF(newV, gates[5]->getVar(), false, gates[8]->getVar(), true);
   solver.assumeRelease();  // Clear assumptions
   solver.assumeProperty(newV, true);  // k = 1
   result = solver.assumpSolve();
   reportResult(solver, result);

   cout << endl << endl << "======================" << endl;

   // k = Solve(Gate(3) & !Gate(7))
   newV = solver.newVar();
   solver.addAigCNF(newV, gates[3]->getVar(), false, gates[7]->getVar(), true);
   solver.assumeRelease();  // Clear assumptions
   solver.assumeProperty(newV, true);  // k = 1
   result = solver.assumpSolve();
   reportResult(solver, result);
}