From 15481a952070312015a665a7c51b9b529a1346b5 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Tue, 17 Jun 2008 21:45:37 -0700 Subject: [PATCH] Elaborate block scopes burried in generate schemes. Named begin/end blocks burried within generate schemes need to be elaborated. Handle this by remembering to elaborate_scope on the statements within the generate scheme. In the process, clean up/regularize some of the member names and methods. --- Module.cc | 2 +- PGenerate.cc | 5 ----- PGenerate.h | 6 +++--- PScope.cc | 9 +++++++-- PScope.h | 1 + Statement.cc | 2 +- elab_scope.cc | 16 +++++++++++----- elab_sig.cc | 8 ++++---- elaborate.cc | 10 +++++----- pform.cc | 6 +++--- pform_dump.cc | 4 ++-- 11 files changed, 38 insertions(+), 31 deletions(-) diff --git a/Module.cc b/Module.cc index 961940149..e1a3f8ff2 100644 --- a/Module.cc +++ b/Module.cc @@ -26,7 +26,7 @@ /* n is a permallocated string. */ Module::Module(perm_string n) -: PScope(n, 0) +: PScope(n) { library_flag = false; default_nettype = NetNet::NONE; diff --git a/PGenerate.cc b/PGenerate.cc index 03fcfb286..97b7f9142 100644 --- a/PGenerate.cc +++ b/PGenerate.cc @@ -46,8 +46,3 @@ void PGenerate::add_gate(PGate*gate) { gates.push_back(gate); } - -void PGenerate::add_behavior(PProcess*proc) -{ - behaviors.push_back(proc); -} diff --git a/PGenerate.h b/PGenerate.h index 842e0c49a..505f842fa 100644 --- a/PGenerate.h +++ b/PGenerate.h @@ -52,7 +52,7 @@ class PWire; class PGenerate : public LineInfo { public: - PGenerate(unsigned id_number); + explicit PGenerate(unsigned id_number); ~PGenerate(); // Generate schemes have an ID number, for when the scope is @@ -78,9 +78,9 @@ class PGenerate : public LineInfo { void add_gate(PGate*); list behaviors; - void add_behavior(PProcess*behave); - list generates; + // Generate schemes can contain further generate schemes. + list generate_schemes; PGenerate*parent; // This method is called by the elaboration of a module to diff --git a/PScope.cc b/PScope.cc index addd4ea4f..c7f1a4517 100644 --- a/PScope.cc +++ b/PScope.cc @@ -19,8 +19,13 @@ # include "PScope.h" -PScope::PScope(perm_string n, PScope*p) - : name_(n), parent_(p) +PScope::PScope(perm_string n, PScope*parent) +: name_(n), parent_(parent) +{ +} + +PScope::PScope(perm_string n) +: name_(n), parent_(0) { } diff --git a/PScope.h b/PScope.h index b82079974..67129f52a 100644 --- a/PScope.h +++ b/PScope.h @@ -50,6 +50,7 @@ class PScope { // modules. Scopes for tasks and functions point to their // containing module. PScope(perm_string name, PScope*parent); + PScope(perm_string name); virtual ~PScope(); perm_string pscope_name() const { return name_; } diff --git a/Statement.cc b/Statement.cc index 1ab66ec35..02680d322 100644 --- a/Statement.cc +++ b/Statement.cc @@ -92,7 +92,7 @@ PBlock::PBlock(perm_string n, PScope*parent, BL_TYPE t) } PBlock::PBlock(BL_TYPE t) -: PScope(perm_string(),0), bl_type_(t) +: PScope(perm_string()), bl_type_(t) { } diff --git a/elab_scope.cc b/elab_scope.cc index 5887fd147..c2665add2 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -548,8 +548,8 @@ bool PGenerate::generate_scope_case_(Design*des, NetScope*container) PGenerate*default_item = 0; typedef list::const_iterator generator_it_t; - generator_it_t cur = generates.begin(); - while (cur != generates.end()) { + generator_it_t cur = generate_schemes.begin(); + while (cur != generate_schemes.end()) { PGenerate*item = *cur; assert( item->scheme_type == PGenerate::GS_CASE_ITEM ); @@ -578,7 +578,7 @@ bool PGenerate::generate_scope_case_(Design*des, NetScope*container) delete case_value_co; case_value_co = 0; - PGenerate*item = (cur == generates.end())? default_item : *cur; + PGenerate*item = (cur == generate_schemes.end())? default_item : *cur; if (item == 0) { cerr << get_fileline() << ": debug: " << "No generate items found" << endl; @@ -605,8 +605,8 @@ void PGenerate::elaborate_subscope_(Design*des, NetScope*scope) // from simple elaboration. typedef list::const_iterator generate_it_t; - for (generate_it_t cur = generates.begin() - ; cur != generates.end() ; cur ++ ) { + for (generate_it_t cur = generate_schemes.begin() + ; cur != generate_schemes.end() ; cur ++ ) { (*cur) -> generate_scope(des, scope); } @@ -618,6 +618,12 @@ void PGenerate::elaborate_subscope_(Design*des, NetScope*scope) (*cur) ->elaborate_scope(des, scope); } + typedef list::const_iterator proc_it_t; + for (proc_it_t cur = behaviors.begin() + ; cur != behaviors.end() ; cur ++ ) { + (*cur) -> statement() -> elaborate_scope(des, scope); + } + // Save the scope that we created, for future use. scope_list_.push_back(scope); } diff --git a/elab_sig.cc b/elab_sig.cc index 371f1759a..294f6882a 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -415,8 +415,8 @@ bool PGenerate::elaborate_sig(Design*des, NetScope*container) const << scope_path(container) << "." << endl; typedef list::const_iterator generate_it_t; - for (generate_it_t cur = generates.begin() - ; cur != generates.end() ; cur ++) { + for (generate_it_t cur = generate_schemes.begin() + ; cur != generate_schemes.end() ; cur ++) { PGenerate*item = *cur; if (! item->scope_list_.empty()) { flag &= item->elaborate_sig(des, container); @@ -462,8 +462,8 @@ bool PGenerate::elaborate_sig_(Design*des, NetScope*scope) const } typedef list::const_iterator generate_it_t; - for (generate_it_t cur = generates.begin() - ; cur != generates.end() ; cur ++ ) { + for (generate_it_t cur = generate_schemes.begin() + ; cur != generate_schemes.end() ; cur ++ ) { (*cur) -> elaborate_sig(des, scope); } diff --git a/elaborate.cc b/elaborate.cc index 3ab777c01..97cf5b137 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -1952,7 +1952,7 @@ NetProc* PBlock::elaborate(Design*des, NetScope*scope) const if (nscope == 0) { cerr << get_fileline() << ": internal error: " "unable to find block scope " << scope_path(scope) - << "<" << pscope_name() << ">" << endl; + << "." << pscope_name() << endl; des->errors += 1; return 0; } @@ -3681,8 +3681,8 @@ bool PGenerate::elaborate(Design*des, NetScope*container) const << scope_path(container) << "." << endl; typedef list::const_iterator generate_it_t; - for (generate_it_t cur = generates.begin() - ; cur != generates.end() ; cur ++) { + for (generate_it_t cur = generate_schemes.begin() + ; cur != generate_schemes.end() ; cur ++) { PGenerate*item = *cur; if (! item->scope_list_.empty()) { flag &= item->elaborate(des, container); @@ -3733,8 +3733,8 @@ bool PGenerate::elaborate_(Design*des, NetScope*scope) const (*cur)->elaborate(des, scope); typedef list::const_iterator generate_it_t; - for (generate_it_t cur = generates.begin() - ; cur != generates.end() ; cur ++ ) { + for (generate_it_t cur = generate_schemes.begin() + ; cur != generate_schemes.end() ; cur ++ ) { (*cur)->elaborate(des, scope); } diff --git a/pform.cc b/pform.cc index abdca446e..61e5e57ae 100644 --- a/pform.cc +++ b/pform.cc @@ -508,7 +508,7 @@ void pform_endgenerate() if (pform_cur_generate != 0) { assert(cur->scheme_type == PGenerate::GS_CASE_ITEM || pform_cur_generate->scheme_type != PGenerate::GS_CASE); - pform_cur_generate->generates.push_back(cur); + pform_cur_generate->generate_schemes.push_back(cur); } else { assert(cur->scheme_type != PGenerate::GS_CASE_ITEM); pform_cur_module->generate_schemes.push_back(cur); @@ -1251,7 +1251,7 @@ void pform_make_reginit(const struct vlltype&li, FILE_NAME(top, li); if (pform_cur_generate) - pform_cur_generate->add_behavior(top); + pform_cur_generate->behaviors.push_back(top); else lexical_scope->behaviors.push_back(top); } @@ -1905,7 +1905,7 @@ PProcess* pform_make_behavior(PProcess::Type type, Statement*st, } if (pform_cur_generate) - pform_cur_generate->add_behavior(pp); + pform_cur_generate->behaviors.push_back(pp); else pform_cur_module->behaviors.push_back(pp); diff --git a/pform_dump.cc b/pform_dump.cc index c3e709ad4..11397e96c 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -937,8 +937,8 @@ void PGenerate::dump(ostream&out, unsigned indent) const (*idx)->dump(out, indent+2); } - for (list::const_iterator idx = generates.begin() - ; idx != generates.end() ; idx++) { + for (list::const_iterator idx = generate_schemes.begin() + ; idx != generate_schemes.end() ; idx++) { (*idx)->dump(out, indent+2); }