diff options
author | Eddie Hung <eddie@fpgeh.com> | 2019-09-04 12:37:42 -0700 |
---|---|---|
committer | Eddie Hung <eddie@fpgeh.com> | 2019-09-04 12:37:42 -0700 |
commit | 3732d421c569a600535734fe63b862b6bc852b82 (patch) | |
tree | f5311ab477565470c955f574cf8fb8204ea46245 /passes | |
parent | e67e4a5ed66df59f5f924e6bb3891f87fc93f070 (diff) | |
parent | 8c1a98249457b790895aee76115ddd40ec891555 (diff) | |
download | yosys-3732d421c569a600535734fe63b862b6bc852b82.tar.gz yosys-3732d421c569a600535734fe63b862b6bc852b82.tar.bz2 yosys-3732d421c569a600535734fe63b862b6bc852b82.zip |
Merge remote-tracking branch 'origin/master' into xc7dsp
Diffstat (limited to 'passes')
-rw-r--r-- | passes/cmds/select.cc | 4 | ||||
-rw-r--r-- | passes/hierarchy/hierarchy.cc | 24 |
2 files changed, 26 insertions, 2 deletions
diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc index 59d10a1b8..0f1f05ccb 100644 --- a/passes/cmds/select.cc +++ b/passes/cmds/select.cc @@ -664,7 +664,7 @@ static void select_stmt(RTLIL::Design *design, std::string arg) } else if (arg == "%D") { if (work_stack.size() < 2) - log_cmd_error("Must have at least two elements on the stack for operator %%d.\n"); + log_cmd_error("Must have at least two elements on the stack for operator %%D.\n"); select_op_diff(design, work_stack[work_stack.size()-1], work_stack[work_stack.size()-2]); work_stack[work_stack.size()-2] = work_stack[work_stack.size()-1]; work_stack.pop_back(); @@ -693,7 +693,7 @@ static void select_stmt(RTLIL::Design *design, std::string arg) } else if (arg == "%C") { if (work_stack.size() < 1) - log_cmd_error("Must have at least one element on the stack for operator %%M.\n"); + log_cmd_error("Must have at least one element on the stack for operator %%C.\n"); select_op_module_to_cells(design, work_stack[work_stack.size()-1]); } else if (arg == "%c") { diff --git a/passes/hierarchy/hierarchy.cc b/passes/hierarchy/hierarchy.cc index fd95b94b2..d8a628448 100644 --- a/passes/hierarchy/hierarchy.cc +++ b/passes/hierarchy/hierarchy.cc @@ -808,6 +808,30 @@ struct HierarchyPass : public Pass { if (mod_it.second->get_bool_attribute("\\top")) top_mod = mod_it.second; + if (top_mod != nullptr && top_mod->name.begins_with("$abstract")) { + IdString top_name = top_mod->name.substr(strlen("$abstract")); + + dict<RTLIL::IdString, RTLIL::Const> top_parameters; + for (auto ¶ : parameters) { + SigSpec sig_value; + if (!RTLIL::SigSpec::parse(sig_value, NULL, para.second)) + log_cmd_error("Can't decode value '%s'!\n", para.second.c_str()); + top_parameters[RTLIL::escape_id(para.first)] = sig_value.as_const(); + } + + top_mod = design->module(top_mod->derive(design, top_parameters)); + + if (top_mod != nullptr && top_mod->name != top_name) { + Module *m = top_mod->clone(); + m->name = top_name; + Module *old_mod = design->module(top_name); + if (old_mod) + design->remove(old_mod); + design->add(m); + top_mod = m; + } + } + if (top_mod == nullptr && auto_top_mode) { log_header(design, "Finding top of design hierarchy..\n"); dict<Module*, int> db; |