diff --git a/main.cc b/main.cc index 8b93f1c62..057b70ac2 100644 --- a/main.cc +++ b/main.cc @@ -1126,6 +1126,8 @@ int main(int argc, char*argv[]) rc += pform_parse(source_files[idx]); } + pform_finish(); + if (pf_path) { ofstream out (pf_path); out << "PFORM DUMP NATURES:" << endl; diff --git a/parse_api.h b/parse_api.h index d95420916..da43030e1 100644 --- a/parse_api.h +++ b/parse_api.h @@ -58,6 +58,8 @@ extern void pform_dump(std::ostream&out, const PTaskFunc*tf); */ extern int pform_parse(const char*path); +extern void pform_finish(); + extern std::string vl_file; extern void pform_set_timescale(int units, int prec, const char*file, diff --git a/pform.cc b/pform.cc index e8aac1089..9b19f9dba 100644 --- a/pform.cc +++ b/pform.cc @@ -405,17 +405,22 @@ LexicalScope* pform_peek_scope(void) return lexical_scope; } -void pform_pop_scope() +static void pform_check_possible_imports(LexicalScope *scope) { - LexicalScope*scope = lexical_scope; - assert(scope); - map::const_iterator cur; for (cur = scope->possible_imports.begin(); cur != scope->possible_imports.end(); ++cur) { if (scope->local_symbols.find(cur->first) == scope->local_symbols.end()) scope->explicit_imports[cur->first] = cur->second; } scope->possible_imports.clear(); +} + +void pform_pop_scope() +{ + LexicalScope*scope = lexical_scope; + assert(scope); + + pform_check_possible_imports(scope); lexical_scope = scope->parent_scope(); assert(lexical_scope); @@ -3406,3 +3411,11 @@ int pform_parse(const char*path) destroy_lexor(); return error_count; } + +void pform_finish() +{ + // Wait until all parsing is done and all symbols in the unit scope are + // known before importing possible imports. + for (auto unit : pform_units) + pform_check_possible_imports(unit); +}