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);