From 06a344efcb4a8c56f230715481ce07e715a7a4b3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcelina=20Ko=C5=9Bcielnicka?= Date: Thu, 16 Apr 2020 15:51:03 +0200 Subject: [PATCH] ilang, ast: Store parameter order and default value information. Fixes #1819, #1820. --- backends/ilang/ilang_backend.cc | 12 ++++++++++-- frontends/ast/ast.cc | 2 -- frontends/ast/genrtlil.cc | 5 ++++- frontends/ilang/ilang_parser.y | 11 +++++++++-- kernel/rtlil.cc | 3 ++- kernel/rtlil.h | 3 ++- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/backends/ilang/ilang_backend.cc b/backends/ilang/ilang_backend.cc index 5445fad90..6e3882d2d 100644 --- a/backends/ilang/ilang_backend.cc +++ b/backends/ilang/ilang_backend.cc @@ -290,8 +290,16 @@ void ILANG_BACKEND::dump_module(std::ostream &f, std::string indent, RTLIL::Modu if (!module->avail_parameters.empty()) { if (only_selected) f << stringf("\n"); - for (auto &p : module->avail_parameters) - f << stringf("%s" " parameter %s\n", indent.c_str(), p.c_str()); + for (const auto &p : module->avail_parameters) { + const auto &it = module->parameter_default_values.find(p); + if (it == module->parameter_default_values.end()) { + f << stringf("%s" " parameter %s\n", indent.c_str(), p.c_str()); + } else { + f << stringf("%s" " parameter %s ", indent.c_str(), p.c_str()); + dump_const(f, it->second); + f << stringf("\n"); + } + } } } diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 9ddd538b5..733556621 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -1074,8 +1074,6 @@ static AstModule* process_module(AstNode *ast, bool defer, AstNode *original_ast if (child->type == AST_WIRE && (child->is_input || child->is_output)) { new_children.push_back(child); } else if (child->type == AST_PARAMETER) { - child->delete_children(); - child->children.push_back(AstNode::mkconst_int(0, false, 0)); new_children.push_back(child); } else if (child->type == AST_CELL && child->children.size() > 0 && child->children[0]->type == AST_CELLTYPE && (child->children[0]->str == "$specify2" || child->children[0]->str == "$specify3" || child->children[0]->str == "$specrule")) { diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index ff3f5b84c..d35335747 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -1015,7 +1015,10 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) // remember the parameter, needed for example in techmap case AST_PARAMETER: - current_module->avail_parameters.insert(str); + current_module->avail_parameters(str); + if (GetSize(children) >= 1 && children[0]->type == AST_CONSTANT) { + current_module->parameter_default_values[str] = children[0]->asParaConst(); + } /* fall through */ case AST_LOCALPARAM: if (flag_pwires) diff --git a/frontends/ilang/ilang_parser.y b/frontends/ilang/ilang_parser.y index 0522fa72a..8e21fb176 100644 --- a/frontends/ilang/ilang_parser.y +++ b/frontends/ilang/ilang_parser.y @@ -143,11 +143,18 @@ module_body: /* empty */; module_stmt: - param_stmt | attr_stmt | wire_stmt | memory_stmt | cell_stmt | proc_stmt | conn_stmt; + param_stmt | param_defval_stmt | attr_stmt | wire_stmt | memory_stmt | cell_stmt | proc_stmt | conn_stmt; param_stmt: TOK_PARAMETER TOK_ID EOL { - current_module->avail_parameters.insert($2); + current_module->avail_parameters($2); + free($2); + }; + +param_defval_stmt: + TOK_PARAMETER TOK_ID constant EOL { + current_module->avail_parameters($2); + current_module->parameter_default_values[$2] = *$3; free($2); }; diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 8af941c85..0e9347267 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -1389,7 +1389,7 @@ void RTLIL::Module::sort() { wires_.sort(sort_by_id_str()); cells_.sort(sort_by_id_str()); - avail_parameters.sort(sort_by_id_str()); + parameter_default_values.sort(sort_by_id_str()); memories.sort(sort_by_id_str()); processes.sort(sort_by_id_str()); for (auto &it : cells_) @@ -1508,6 +1508,7 @@ void RTLIL::Module::cloneInto(RTLIL::Module *new_mod) const log_assert(new_mod->refcount_cells_ == 0); new_mod->avail_parameters = avail_parameters; + new_mod->parameter_default_values = parameter_default_values; for (auto &conn : connections_) new_mod->connect(conn); diff --git a/kernel/rtlil.h b/kernel/rtlil.h index f3b1c9ae7..11c45bbec 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -1091,7 +1091,8 @@ public: std::vector connections_; RTLIL::IdString name; - pool avail_parameters; + idict avail_parameters; + dict parameter_default_values; dict memories; dict processes; -- 2.30.2