From 1f152aa838493a71d7258cba2ca67be4db61f0ec Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Thu, 16 Aug 2012 00:07:50 +0100 Subject: [PATCH] Fix for pr3557493. defparam assignments found inside a generate block were being stored in the enclosing module scope. They should be stored in the generate block scope. Also removed the genvar list from the PGenerate class, as this is already declared in the base LexicalScope class. --- PGenerate.h | 9 +++++---- elab_scope.cc | 9 +++++++++ pform.cc | 5 ++++- pform_dump.cc | 10 ++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/PGenerate.h b/PGenerate.h index 29de61ea3..cb66993b8 100644 --- a/PGenerate.h +++ b/PGenerate.h @@ -1,7 +1,7 @@ #ifndef __PGenerate_H #define __PGenerate_H /* - * Copyright (c) 2006-2010 Stephen Williams (steve@icarus.com) + * Copyright (c) 2006-2010,2012 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -80,6 +80,10 @@ class PGenerate : public LineInfo, public LexicalScope { // test value. std::valarray item_test; + // defparam assignments found in this scope. + typedef pair named_expr_t; + listdefparms; + list gates; void add_gate(PGate*); @@ -87,9 +91,6 @@ class PGenerate : public LineInfo, public LexicalScope { map tasks; mapfuncs; - // genvars declared within this scheme. - map genvars; - // Generate schemes can contain further generate schemes. list generate_schemes; // PGenerate*parent; diff --git a/elab_scope.cc b/elab_scope.cc index 23666eb40..52ce23fcf 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -1097,6 +1097,15 @@ void PGenerate::elaborate_subscope_(Design*des, NetScope*scope) // module have been done. collect_scope_localparams_(des, scope, localparams); + // Run through the defparams for this scope and save the result + // in a table for later final override. + + typedef list::const_iterator defparms_iter_t; + for (defparms_iter_t cur = defparms.begin() + ; cur != defparms.end() ; ++ cur ) { + scope->defparams.push_back(make_pair(cur->first, cur->second)); + } + // Scan the generated scope for nested generate schemes, // and *generate* new scopes, which is slightly different // from simple elaboration. diff --git a/pform.cc b/pform.cc index 0bd7ed14d..1f82973d1 100644 --- a/pform.cc +++ b/pform.cc @@ -2586,7 +2586,10 @@ void pform_set_specparam(const struct vlltype&loc, perm_string name, void pform_set_defparam(const pform_name_t&name, PExpr*expr) { assert(expr); - pform_cur_module.front()->defparms.push_back(make_pair(name,expr)); + if (pform_cur_generate) + pform_cur_generate->defparms.push_back(make_pair(name,expr)); + else + pform_cur_module.front()->defparms.push_back(make_pair(name,expr)); } /* diff --git a/pform_dump.cc b/pform_dump.cc index 47325b82a..9887bc53b 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -1052,6 +1052,16 @@ void PGenerate::dump(ostream&out, unsigned indent) const dump_localparams_(out, indent+2); + typedef list::const_iterator parm_hiter_t; + for (parm_hiter_t cur = defparms.begin() + ; cur != defparms.end() ; ++ cur ) { + out << setw(indent+2) << "" << "defparam " << (*cur).first << " = "; + if ((*cur).second) + out << *(*cur).second << ";" << endl; + else + out << "/* ERROR */;" << endl; + } + dump_events_(out, indent+2); dump_wires_(out, indent+2);