ezSAT::ezSAT()
{
+ statehash = 5381;
+
flag_keep_cnf = false;
flag_non_incremental = false;
{
}
+void ezSAT::addhash(unsigned int h)
+{
+ statehash = ((statehash << 5) + statehash) ^ h;
+}
+
int ezSAT::value(bool val)
{
return val ? CONST_TRUE : CONST_FALSE;
myArgs.reserve(args.size());
bool xorRemovedOddTrues = false;
+ addhash(__LINE__);
+ addhash(op);
+
for (auto arg : args)
{
+ addhash(__LINE__);
+ addhash(arg);
+
if (arg == 0)
continue;
if (op == OpAnd && arg == CONST_TRUE)
expressions.push_back(myExpr);
}
- return xorRemovedOddTrues ? NOT(id) : id;
+ if (xorRemovedOddTrues)
+ id = NOT(id);
+
+ addhash(__LINE__);
+ addhash(id);
+
+ return id;
}
void ezSAT::lookup_literal(int id, std::string &name) const
void ezSAT::assume(int id)
{
+ addhash(__LINE__);
+ addhash(id);
+
if (id < 0)
{
assert(0 < -id && -id <= int(expressions.size()));
void ezSAT::add_clause(const std::vector<int> &args)
{
+ addhash(__LINE__);
+ for (auto arg : args)
+ addhash(arg);
+
cnfClauses.push_back(args);
cnfClausesCount++;
}
int ezSAT::bind(int id, bool auto_freeze)
{
+ addhash(__LINE__);
+ addhash(id);
+ addhash(auto_freeze);
+
if (id >= 0) {
assert(0 < id && id <= int(literals.size()));
cnfLiteralVariables.resize(literals.size());
while (args.size() > 1) {
std::vector<int> newArgs;
for (int i = 0; i < int(args.size()); i += 2)
- if (i+1 == int(args.size()))
+ if (i+1 == int(args.size())) {
newArgs.push_back(args[i]);
- else
- newArgs.push_back(OR(AND(args[i], NOT(args[i+1])), AND(NOT(args[i]), args[i+1])));
+ } else {
+ int sub1 = AND(args[i], NOT(args[i+1]));
+ int sub2 = AND(NOT(args[i]), args[i+1]);
+ newArgs.push_back(OR(sub1, sub2));
+ }
args.swap(newArgs);
}
idx = bind(args.at(0), false);
std::vector<int> invArgs;
for (auto arg : args)
invArgs.push_back(NOT(arg));
- idx = bind(OR(expression(OpAnd, args), expression(OpAnd, invArgs)), false);
+ int sub1 = expression(OpAnd, args);
+ int sub2 = expression(OpAnd, invArgs);
+ idx = bind(OR(sub1, sub2), false);
goto assign_idx;
}
if (op == OpITE) {
- idx = bind(OR(AND(args[0], args[1]), AND(NOT(args[0]), args[2])), false);
+ int sub1 = AND(args[0], args[1]);
+ int sub2 = AND(NOT(args[0]), args[2]);
+ idx = bind(OR(sub1, sub2), false);
goto assign_idx;
}
for (auto it : exclusive_ctrls)
if (satgen.importedSigBit(it.first) && satgen.importedSigBit(it.second)) {
log(" Adding exclusive control bits: %s vs. %s\n", log_signal(it.first), log_signal(it.second));
- ez.assume(ez.NOT(ez.AND(satgen.importSigBit(it.first), satgen.importSigBit(it.second))));
+ int sub1 = satgen.importSigBit(it.first);
+ int sub2 = satgen.importSigBit(it.second);
+ ez.assume(ez.NOT(ez.AND(sub1, sub2)));
}
if (!ez.solve(ez.expression(ez.OpOr, cell_active))) {
std::vector<int> sat_model = satgen.importSigSpec(all_ctrl_signals);
std::vector<bool> sat_model_values;
- ez.assume(ez.AND(ez.expression(ez.OpOr, cell_active), ez.expression(ez.OpOr, other_cell_active)));
+ int sub1 = ez.expression(ez.OpOr, cell_active);
+ int sub2 = ez.expression(ez.OpOr, other_cell_active);
+ ez.assume(ez.AND(sub1, sub2));
log(" Size of SAT problem: %d cells, %d variables, %d clauses\n",
GetSize(sat_cells), ez.numCnfVariables(), ez.numCnfClauses());