}
f << stringf("%s" "module %s\n", indent.c_str(), module->name.c_str());
+
+ 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());
+ }
}
if (print_body)
if (flag_lib) {
std::vector<AstNode*> new_children;
for (auto child : ast->children) {
- if (child->type == AST_WIRE && (child->is_input || child->is_output))
+ if (child->type == AST_WIRE && (child->is_input || child->is_output)) {
new_children.push_back(child);
- else
+ } 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 {
delete child;
+ }
}
ast->children.swap(new_children);
ast->attributes["\\blackbox"] = AstNode::mkconst_int(1, false);
/* empty */;
module_stmt:
- attr_stmt | wire_stmt | memory_stmt | cell_stmt | proc_stmt | conn_stmt;
+ param_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);
+ free($2);
+ };
attr_stmt:
TOK_ATTRIBUTE TOK_ID constant EOL {
} else if (mod->wire(conn.first) == nullptr || mod->wire(conn.first)->port_id == 0)
log_error("Module `%s' referenced in module `%s' in cell `%s' does not have a port named '%s'.\n",
log_id(cell->type), log_id(module), log_id(cell), log_id(conn.first));
+ for (auto ¶m : cell->parameters)
+ if (mod->avail_parameters.count(param.first) == 0)
+ log_error("Module `%s' referenced in module `%s' in cell `%s' does not have a parameter named '%s'.\n",
+ log_id(cell->type), log_id(module), log_id(cell), log_id(param.first));
}
if (cell->parameters.size() == 0)