Run generate schemes after defparams.
We must run generate schemes after running defparams because the defparams may define the results of the generate schemes. So put the generate schemes for a module scope into elaborator work items.
This commit is contained in:
parent
e3d9cc30a8
commit
d761a2273c
|
|
@ -181,6 +181,38 @@ static void elaborate_scope_funcs(Design*des, NetScope*scope,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class generate_schemes_work_item_t : public elaborator_work_item_t {
|
||||||
|
public:
|
||||||
|
generate_schemes_work_item_t(Design*des, NetScope*scope, Module*mod)
|
||||||
|
: elaborator_work_item_t(des), scope_(scope), mod_(mod)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void elaborate_runrun()
|
||||||
|
{
|
||||||
|
if (debug_scopes)
|
||||||
|
cerr << mod_->get_fileline() << ": debug: "
|
||||||
|
<< "Processing generate schemes for "
|
||||||
|
<< scope_path(scope_) << endl;
|
||||||
|
|
||||||
|
// Generate schemes can create new scopes in the form of
|
||||||
|
// generated code. Scan the generate schemes, and *generate*
|
||||||
|
// new scopes, which is slightly different from simple
|
||||||
|
// elaboration.
|
||||||
|
typedef list<PGenerate*>::const_iterator generate_it_t;
|
||||||
|
for (generate_it_t cur = mod_->generate_schemes.begin()
|
||||||
|
; cur != mod_->generate_schemes.end() ; cur ++ ) {
|
||||||
|
(*cur) -> generate_scope(des, scope_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The scope_ is the scope that contains the generate scheme
|
||||||
|
// we are to work on. the mod_ is the Module definition for
|
||||||
|
// that scope, and contains the parsed generate schemes.
|
||||||
|
NetScope*scope_;
|
||||||
|
Module*mod_;
|
||||||
|
};
|
||||||
|
|
||||||
bool Module::elaborate_scope(Design*des, NetScope*scope,
|
bool Module::elaborate_scope(Design*des, NetScope*scope,
|
||||||
const replace_t&replacements)
|
const replace_t&replacements)
|
||||||
{
|
{
|
||||||
|
|
@ -307,17 +339,15 @@ bool Module::elaborate_scope(Design*des, NetScope*scope,
|
||||||
|
|
||||||
delete[]attr;
|
delete[]attr;
|
||||||
|
|
||||||
// Generate schemes can create new scopes in the form of
|
// Generate schemes need to have their scopes elaborated, but
|
||||||
// generated code. Scan the generate schemes, and *generate*
|
// we cannot do that until defparams are run, so push it off
|
||||||
// new scopes, which is slightly different from simple
|
// into an elaborate work item.
|
||||||
// elaboration.
|
if (debug_scopes)
|
||||||
|
cerr << get_fileline() << ": debug: "
|
||||||
typedef list<PGenerate*>::const_iterator generate_it_t;
|
<< "Schedule generates within " << scope_path(scope)
|
||||||
for (generate_it_t cur = generate_schemes.begin()
|
<< " for elaboration after defparams." << endl;
|
||||||
; cur != generate_schemes.end() ; cur ++ ) {
|
|
||||||
(*cur) -> generate_scope(des, scope);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
des->elaboration_work_list.push_back(new generate_schemes_work_item_t(des, scope, this));
|
||||||
|
|
||||||
// Tasks introduce new scopes, so scan the tasks in this
|
// Tasks introduce new scopes, so scan the tasks in this
|
||||||
// module. Create a scope for the task and pass that to the
|
// module. Create a scope for the task and pass that to the
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue