Skip to content

Commit

Permalink
kernel: call hierarchy for abstract modules automatically.
Browse files Browse the repository at this point in the history
Whenever there are abstract modules in the netlist and the pass does not
declare that it supports them, call `hierarchy -auto-top` or `hierarchy`
(depending on whether there is a module marked `top`) to instantiate
them first. This makes several CLI workflows much more usable, including
one as basic as:

    $ yosys file.v -o file.il
  • Loading branch information
whitequark committed Dec 22, 2023
1 parent 1c8e58a commit 9cd4b4e
Show file tree
Hide file tree
Showing 13 changed files with 40 additions and 18 deletions.
17 changes: 17 additions & 0 deletions kernel/register.cc
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,22 @@ Pass::~Pass()

Pass::pre_post_exec_state_t Pass::pre_execute()
{
if (!abstract_modules_ok) {
bool has_top = false;
bool has_abstract = false;
for (auto mod : yosys_design->modules()) {
if (mod->get_bool_attribute(ID::top))
has_top = true;
if (mod->name.begins_with("$abstract"))
has_abstract = true;
}
if (has_abstract) {
std::string command = has_top ? "hierarchy" : "hierarchy -auto-top";
log_warning("Pass `%s` does not accept abstract modules; running `%s` first!\n", pass_name.c_str(), command.c_str());
run_pass(command);
}
}

pre_post_exec_state_t state;
call_counter++;
state.begin_ns = PerformanceTimer::query();
Expand Down Expand Up @@ -443,6 +459,7 @@ 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)
{
abstract_modules_ok = true;
}

void Frontend::run_register()
Expand Down
7 changes: 6 additions & 1 deletion kernel/register.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ struct Pass
int call_counter;
int64_t runtime_ns;
bool experimental_flag = false;
bool abstract_modules_ok = false;

void experimental() {
experimental_flag = true;
Expand Down Expand Up @@ -78,7 +79,11 @@ struct ScriptPass : Pass
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) { }
ScriptPass(std::string name, std::string short_help = "** document me **") : Pass(name, short_help) {
// Either the script pass will include an explicit `hierarchy` invocation or one of the passes called inside will
// trigger the check for abstract modules.
abstract_modules_ok = true;
}

virtual void script() = 0;

Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/blackbox.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct BlackboxPass : public Pass {
BlackboxPass() : Pass("blackbox", "convert modules into blackbox modules") { }
BlackboxPass() : Pass("blackbox", "convert modules into blackbox modules") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/design.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ std::map<std::string, RTLIL::Design*> saved_designs;
std::vector<RTLIL::Design*> pushed_designs;

struct DesignPass : public Pass {
DesignPass() : Pass("design", "save, restore and reset current design") { }
DesignPass() : Pass("design", "save, restore and reset current design") { abstract_modules_ok = true; }
~DesignPass() override {
for (auto &it : saved_designs)
delete it.second;
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/exec.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct ExecPass : public Pass {
ExecPass() : Pass("exec", "execute commands in the operating system shell") { }
ExecPass() : Pass("exec", "execute commands in the operating system shell") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/logcmd.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct LogPass : public Pass {
LogPass() : Pass("log", "print text and log files") { }
LogPass() : Pass("log", "print text and log files") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
10 changes: 5 additions & 5 deletions passes/cmds/logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct LoggerPass : public Pass {
LoggerPass() : Pass("logger", "set logger properties") { }
LoggerPass() : Pass("logger", "set logger properties") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down Expand Up @@ -99,7 +99,7 @@ struct LoggerPass : public Pass {
}
if (args[argidx] == "-warn" && argidx+1 < args.size()) {
std::string pattern = args[++argidx];
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
try {
log("Added regex '%s' for warnings to warn list.\n", pattern.c_str());
log_warn_regexes.push_back(YS_REGEX_COMPILE(pattern));
Expand All @@ -111,7 +111,7 @@ struct LoggerPass : public Pass {
}
if (args[argidx] == "-nowarn" && argidx+1 < args.size()) {
std::string pattern = args[++argidx];
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
try {
log("Added regex '%s' for warnings to nowarn list.\n", pattern.c_str());
log_nowarn_regexes.push_back(YS_REGEX_COMPILE(pattern));
Expand All @@ -123,7 +123,7 @@ struct LoggerPass : public Pass {
}
if (args[argidx] == "-werror" && argidx+1 < args.size()) {
std::string pattern = args[++argidx];
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
try {
log("Added regex '%s' for warnings to werror list.\n", pattern.c_str());
log_werror_regexes.push_back(YS_REGEX_COMPILE(pattern));
Expand Down Expand Up @@ -156,7 +156,7 @@ struct LoggerPass : public Pass {
if (type=="error" && log_expect_error.size()>0)
log_cmd_error("Only single error message can be expected !\n");
std::string pattern = args[++argidx];
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
if (pattern.front() == '\"' && pattern.back() == '\"') pattern = pattern.substr(1, pattern.size() - 2);
int count = atoi(args[++argidx].c_str());
if (count<=0)
log_cmd_error("Number of expected messages must be higher then 0 !\n");
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/plugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ void load_plugin(std::string, std::vector<std::string>)
#endif

struct PluginPass : public Pass {
PluginPass() : Pass("plugin", "load and list loaded plugins") { }
PluginPass() : Pass("plugin", "load and list loaded plugins") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/scratchpad.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct ScratchpadPass : public Pass {
ScratchpadPass() : Pass("scratchpad", "get/set values in the scratchpad") { }
ScratchpadPass() : Pass("scratchpad", "get/set values in the scratchpad") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
6 changes: 3 additions & 3 deletions passes/cmds/setattr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ struct SetattrPass : public Pass {
} SetattrPass;

struct WbflipPass : public Pass {
WbflipPass() : Pass("wbflip", "flip the whitebox attribute") { }
WbflipPass() : Pass("wbflip", "flip the whitebox attribute") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down Expand Up @@ -166,7 +166,7 @@ struct WbflipPass : public Pass {
} WbflipPass;

struct SetparamPass : public Pass {
SetparamPass() : Pass("setparam", "set/unset parameters on objects") { }
SetparamPass() : Pass("setparam", "set/unset parameters on objects") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down Expand Up @@ -218,7 +218,7 @@ struct SetparamPass : public Pass {
} SetparamPass;

struct ChparamPass : public Pass {
ChparamPass() : Pass("chparam", "re-evaluate modules with new parameters") { }
ChparamPass() : Pass("chparam", "re-evaluate modules with new parameters") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/tee.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct TeePass : public Pass {
TeePass() : Pass("tee", "redirect command output to file") { }
TeePass() : Pass("tee", "redirect command output to file") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/cmds/trace.cc
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ struct TraceMonitor : public RTLIL::Monitor
};

struct TracePass : public Pass {
TracePass() : Pass("trace", "redirect command output to file") { }
TracePass() : Pass("trace", "redirect command output to file") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down
2 changes: 1 addition & 1 deletion passes/hierarchy/hierarchy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ RTLIL::Wire *find_implicit_port_wire(Module *module, Cell *cell, const std::stri
}

struct HierarchyPass : public Pass {
HierarchyPass() : Pass("hierarchy", "check, expand and clean up design hierarchy") { }
HierarchyPass() : Pass("hierarchy", "check, expand and clean up design hierarchy") { abstract_modules_ok = true; }
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
Expand Down

0 comments on commit 9cd4b4e

Please sign in to comment.