Added "clean -purge" and ";;;" support
authorClifford Wolf <clifford@clifford.at>
Sun, 11 Aug 2013 11:59:14 +0000 (13:59 +0200)
committerClifford Wolf <clifford@clifford.at>
Sun, 11 Aug 2013 11:59:14 +0000 (13:59 +0200)
kernel/register.cc
passes/opt/opt_clean.cc

index 9f6fe37d3faefc464261b3f0d100af3910a978b8..4575e4091517eb0366acef8cae36d93c578f6b96 100644 (file)
@@ -158,6 +158,8 @@ void Pass::call(RTLIL::Design *design, std::string command)
                        args.clear();
                        if (num_semikolon == 2)
                                call(design, "clean");
+                       if (num_semikolon == 3)
+                               call(design, "clean -purge");
                } else
                        args.push_back(str);
        }
index 17f4168da293dbe6ac63ea53261b0698fd6de117..96c4c7a1806b674c466ea561c3f37ca5e9233833 100644 (file)
@@ -277,6 +277,7 @@ struct OptCleanPass : public Pass {
                                purge_mode = true;
                                continue;
                        }
+                       break;
                }
                extra_args(args, argidx, design);
 
@@ -309,17 +310,31 @@ struct CleanPass : public Pass {
        {
                //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
                log("\n");
-               log("    clean [selection]\n");
+               log("    clean [options] [selection]\n");
                log("\n");
-               log("This is identical to opt_clean, but less verbose.\n");
+               log("This is identical to 'opt_clean', but less verbose.\n");
                log("\n");
                log("When commands are seperated using the ';;' token, this command will be executed\n");
                log("between the commands.\n");
                log("\n");
+               log("When commands are seperated using the ';;;' token, this command will be executed\n");
+               log("in -purge mode between the commands.\n");
+               log("\n");
        }
        virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
        {
-               extra_args(args, 1, design);
+               bool purge_mode = false;
+
+               size_t argidx;
+               for (argidx = 1; argidx < args.size(); argidx++) {
+                       if (args[argidx] == "-purge") {
+                               purge_mode = true;
+                               continue;
+                       }
+                       break;
+               }
+               if (argidx < args.size())
+                       extra_args(args, argidx, design);
 
                ct.setup_internals();
                ct.setup_internals_mem();
@@ -333,7 +348,7 @@ struct CleanPass : public Pass {
                        if (design->selected_whole_module(mod_it.first) && mod_it.second->processes.size() == 0)
                                do {
                                        OPT_DID_SOMETHING = false;
-                                       rmunused_module(mod_it.second, false, false);
+                                       rmunused_module(mod_it.second, purge_mode, false);
                                } while (OPT_DID_SOMETHING);
                }