Add "mutate -none -mode", "mutate -mode none"
authorClifford Wolf <clifford@clifford.at>
Sat, 23 Mar 2019 19:20:32 +0000 (20:20 +0100)
committerClifford Wolf <clifford@clifford.at>
Sat, 23 Mar 2019 19:20:32 +0000 (20:20 +0100)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
passes/sat/mutate.cc

index 7025a7acae1a8b4da9d148d26adede6bcd5daa9b..c50678c519ed8e259b93dc5ac7c6664b3674d92e 100644 (file)
@@ -46,6 +46,8 @@ struct mutate_opts_t {
        IdString ctrl_name;
        int ctrl_width = -1, ctrl_value = -1;
 
+       bool none = false;
+
        int pick_cover_prcnt = 80;
 
        int weight_cover = 500;
@@ -526,7 +528,7 @@ void mutate_list(Design *design, const mutate_opts_t &opts, const string &filena
 
        log("Raw database size: %d\n", GetSize(database));
        if (N != 0) {
-               database_reduce(database, opts, N, rng);
+               database_reduce(database, opts, opts.none ? N-1 : N, rng);
                log("Reduced database size: %d\n", GetSize(database));
        }
 
@@ -550,6 +552,17 @@ void mutate_list(Design *design, const mutate_opts_t &opts, const string &filena
 
        int ctrl_value = opts.ctrl_value;
 
+       if (opts.none) {
+               string str = "mutate";
+               if (!opts.ctrl_name.empty())
+                       str += stringf(" -ctrl %s %d %d", log_id(opts.ctrl_name), opts.ctrl_width, ctrl_value++);
+               str += " -mode none";
+               if (filename.empty())
+                       log("%s\n", str.c_str());
+               else
+                       fout << str << std::endl;
+       }
+
        for (auto &entry : database) {
                string str = "mutate";
                if (!opts.ctrl_name.empty())
@@ -730,6 +743,9 @@ struct MutatePass : public Pass {
                log("    -seed N\n");
                log("        RNG seed for selecting mutations\n");
                log("\n");
+               log("    -none\n");
+               log("        Include a \"none\" mutation in the output\n");
+               log("\n");
                log("    -ctrl name width value\n");
                log("        Add -ctrl options to the output. Use 'value' for first mutation, then\n");
                log("        simply count up from there.\n");
@@ -802,6 +818,10 @@ struct MutatePass : public Pass {
                                opts.seed = atoi(args[++argidx].c_str());
                                continue;
                        }
+                       if (args[argidx] == "-none") {
+                               opts.none = true;
+                               continue;
+                       }
                        if (args[argidx] == "-mode" && argidx+1 < args.size()) {
                                opts.mode = args[++argidx];
                                continue;
@@ -905,6 +925,15 @@ struct MutatePass : public Pass {
                        return;
                }
 
+               if (opts.mode == "none") {
+                       if (!opts.ctrl_name.empty()) {
+                               Module *topmod = opts.module.empty() ? design->top_module() : design->module(opts.module);
+                               if (topmod)
+                                       mutate_ctrl_sig(topmod, opts.ctrl_name, opts.ctrl_width);
+                       }
+                       return;
+               }
+
                if (opts.mode == "inv") {
                        mutate_inv(design, opts);
                        return;