Add support for optimizing exists-forall problems.
[yosys.git] / backends / smt2 / smt2.cc
index ddd680782a1ca7de4f7fbc9264d5a709fb304e57..3e08ce37be55bef7b3cff66589a712242e8b7e99 100644 (file)
@@ -536,6 +536,14 @@ struct Smt2Worker
                                if (cell->attributes.count("\\reg"))
                                        infostr += " " + cell->attributes.at("\\reg").decode_string();
                                decls.push_back(stringf("; yosys-smt2-%s %s#%d %d %s\n", cell->type.c_str() + 1, get_id(module), idcounter, GetSize(cell->getPort("\\Y")), infostr.c_str()));
+                               if (cell->getPort("\\Y").is_wire() && cell->getPort("\\Y").as_wire()->get_bool_attribute("\\maximize")){
+                                       decls.push_back(stringf("; yosys-smt2-maximize %s#%d\n", get_id(module), idcounter));
+                                       log("Wire %s is maximized\n", cell->getPort("\\Y").as_wire()->name.str().c_str());
+                               }
+                               else if (cell->getPort("\\Y").is_wire() && cell->getPort("\\Y").as_wire()->get_bool_attribute("\\minimize")){
+                                       decls.push_back(stringf("; yosys-smt2-minimize %s#%d\n", get_id(module), idcounter));
+                                       log("Wire %s is minimized\n", cell->getPort("\\Y").as_wire()->name.str().c_str());
+                               }
                                makebits(stringf("%s#%d", get_id(module), idcounter), GetSize(cell->getPort("\\Y")), log_signal(cell->getPort("\\Y")));
                                if (cell->type == "$anyseq")
                                        ex_input_eq.push_back(stringf("  (= (|%s#%d| state) (|%s#%d| other_state))", get_id(module), idcounter, get_id(module), idcounter));
@@ -601,7 +609,7 @@ struct Smt2Worker
                        if (cell->type == "$logic_and") return export_reduce(cell, "(and (or A) (or B))", false);
                        if (cell->type == "$logic_or") return export_reduce(cell, "(or A B)", false);
 
-                       if (cell->type == "$mux" || cell->type == "$pmux")
+                       if (cell->type.in("$mux", "$pmux"))
                        {
                                int width = GetSize(cell->getPort("\\Y"));
                                std::string processed_expr = get_bv(cell->getPort("\\A"));
@@ -1476,7 +1484,7 @@ struct Smt2Backend : public Backend {
                                int indent = 0;
                                while (indent < GetSize(line) && (line[indent] == ' ' || line[indent] == '\t'))
                                        indent++;
-                               if (line.substr(indent, 2) == "%%")
+                               if (line.compare(indent, 2, "%%") == 0)
                                        break;
                                *f << line << std::endl;
                        }