mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 17:15:33 +00:00
Added ScriptPass helper class for script-like passes
This commit is contained in:
parent
6cafd08ac1
commit
2553319081
5 changed files with 255 additions and 251 deletions
|
@ -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)
|
||||
|
|
|
@ -31,6 +31,7 @@ struct Pass
|
|||
virtual ~Pass();
|
||||
|
||||
virtual void help();
|
||||
virtual void clear_flags();
|
||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) = 0;
|
||||
|
||||
int call_counter;
|
||||
|
@ -63,6 +64,22 @@ struct Pass
|
|||
static void done_register();
|
||||
};
|
||||
|
||||
struct ScriptPass : Pass
|
||||
{
|
||||
bool block_active, help_mode;
|
||||
RTLIL::Design *active_design;
|
||||
std::string active_run_from, active_run_to;
|
||||
|
||||
ScriptPass(std::string name, std::string short_help = "** document me **") : Pass(name, short_help) { }
|
||||
|
||||
virtual void script() = 0;
|
||||
|
||||
bool check_label(std::string label, std::string info = std::string());
|
||||
void run(std::string command, std::string info = std::string());
|
||||
void run_script(RTLIL::Design *design, std::string run_from = std::string(), std::string run_to = std::string());
|
||||
void help_script();
|
||||
};
|
||||
|
||||
struct Frontend : Pass
|
||||
{
|
||||
// for reading of here documents
|
||||
|
|
|
@ -1100,8 +1100,8 @@ struct HistoryPass : public Pass {
|
|||
} HistoryPass;
|
||||
#endif
|
||||
|
||||
struct ScriptPass : public Pass {
|
||||
ScriptPass() : Pass("script", "execute commands from script file") { }
|
||||
struct ScriptCmdPass : public Pass {
|
||||
ScriptCmdPass() : Pass("script", "execute commands from script file") { }
|
||||
virtual void help() {
|
||||
log("\n");
|
||||
log(" script <filename> [<from_label>:<to_label>]\n");
|
||||
|
@ -1127,7 +1127,7 @@ struct ScriptPass : public Pass {
|
|||
else
|
||||
extra_args(args, 2, design, false);
|
||||
}
|
||||
} ScriptPass;
|
||||
} ScriptCmdPass;
|
||||
|
||||
YOSYS_NAMESPACE_END
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue