summaryrefslogtreecommitdiff
path: root/passes/opt
diff options
context:
space:
mode:
Diffstat (limited to 'passes/opt')
-rw-r--r--passes/opt/opt_clean.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/passes/opt/opt_clean.cc b/passes/opt/opt_clean.cc
index 17f4168d..96c4c7a1 100644
--- a/passes/opt/opt_clean.cc
+++ b/passes/opt/opt_clean.cc
@@ -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);
}