diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-03-31 11:16:34 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-03-31 11:16:34 +0200 |
commit | 25533190818b0fe207be9a4626a9a273a08ae219 (patch) | |
tree | 67922d2eb15bb54b19fc30a6462d7d140dda528f /kernel/register.cc | |
parent | 6cafd08ac1090f405168187632fab4308129c599 (diff) | |
download | yosys-25533190818b0fe207be9a4626a9a273a08ae219.tar.gz yosys-25533190818b0fe207be9a4626a9a273a08ae219.tar.bz2 yosys-25533190818b0fe207be9a4626a9a273a08ae219.zip |
Added ScriptPass helper class for script-like passes
Diffstat (limited to 'kernel/register.cc')
-rw-r--r-- | kernel/register.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/kernel/register.cc b/kernel/register.cc index 49a67324d..ebe3055ac 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -80,6 +80,7 @@ Pass::pre_post_exec_state_t Pass::pre_execute() state.begin_ns = PerformanceTimer::query(); state.parent_pass = current_pass; current_pass = this; + clear_flags(); return state; } @@ -99,6 +100,10 @@ void Pass::help() log("\n"); } +void Pass::clear_flags() +{ +} + void Pass::cmd_log_args(const std::vector<std::string> &args) { if (args.size() <= 1) @@ -282,6 +287,60 @@ void Pass::call_on_module(RTLIL::Design *design, RTLIL::Module *module, std::vec design->selected_active_module = backup_selected_active_module; } +bool ScriptPass::check_label(std::string label, std::string info) +{ + if (active_design == nullptr) { + log("\n"); + if (info.empty()) + log(" %s:\n", label.c_str()); + else + log(" %s: %s\n", label.c_str(), info.c_str()); + return true; + } else { + if (!active_run_from.empty() && active_run_from == active_run_to) { + block_active = (label == active_run_from); + } else { + if (label == active_run_from) + block_active = true; + if (label == active_run_to) + block_active = false; + } + return block_active; + } +} + +void ScriptPass::run(std::string command, std::string info) +{ + if (active_design == nullptr) { + if (info.empty()) + log(" %s\n", command.c_str()); + else + log(" %s %s\n", command.c_str(), info.c_str()); + } else + Pass::call(active_design, command); +} + +void ScriptPass::run_script(RTLIL::Design *design, std::string run_from, std::string run_to) +{ + help_mode = false; + active_design = design; + block_active = run_from.empty(); + active_run_from = run_from; + active_run_to = run_to; + script(); +} + +void ScriptPass::help_script() +{ + clear_flags(); + help_mode = true; + active_design = nullptr; + block_active = true; + active_run_from.clear(); + active_run_to.clear(); + script(); +} + Frontend::Frontend(std::string name, std::string short_help) : Pass(name.rfind("=", 0) == 0 ? name.substr(1) : "read_" + name, short_help), frontend_name(name.rfind("=", 0) == 0 ? name.substr(1) : name) |