vhdlpp: Subprogram parameters are taken into account when distinguishing between function calls and vector elements.

This commit is contained in:
Maciej Suminski 2014-09-30 11:24:43 +02:00
parent 9e856810b9
commit 9951521212
3 changed files with 28 additions and 2 deletions

View File

@ -83,6 +83,7 @@ extern int yylex(union YYSTYPE*yylvalp,YYLTYPE*yyllocp,yyscan_t yyscanner);
*/
static ActiveScope*active_scope = new ActiveScope;
static stack<ActiveScope*> scope_stack;
static Subprogram*active_sub = NULL;
/*
* When a scope boundary starts, call the push_scope function to push
@ -106,6 +107,13 @@ static void pop_scope(void)
scope_stack.pop();
}
static bool is_subprogram_param(perm_string name)
{
if(!active_sub)
return false;
return (active_sub->find_param(name) != NULL);
}
void preload_global_types(void)
{
@ -1543,7 +1551,7 @@ name /* IEEE 1076-2008 P8.1 */
| IDENTIFIER '(' expression_list ')'
{ perm_string name = lex_strings.make($1);
delete[]$1;
if (active_scope->is_vector_name(name)) {
if (active_scope->is_vector_name(name) || is_subprogram_param(name)) {
ExpName*tmp = new ExpName(name, $3);
$$ = tmp;
} else {
@ -2166,6 +2174,7 @@ signal_assignment_statement
subprogram_body /* IEEE 1076-2008 P4.3 */
: subprogram_specification K_is
{ active_sub = $1; }
subprogram_declarative_part
K_begin subprogram_statement_part K_end
subprogram_kind_opt identifier_opt ';'
@ -2178,8 +2187,9 @@ subprogram_body /* IEEE 1076-2008 P4.3 */
errormsg(@1, "Subprogram specification for %s doesn't match specification in package header.\n", prog->name().str());
}
prog->transfer_from(*active_scope);
prog->set_program_body($5);
prog->set_program_body($6);
active_scope->bind_name(prog->name(), prog);
active_sub = NULL;
}
| subprogram_specification K_is

View File

@ -80,6 +80,20 @@ bool Subprogram::compare_specification(Subprogram*that) const
return true;
}
InterfacePort*Subprogram::find_param(perm_string nam)
{
if(!ports_)
return NULL;
for (std::list<InterfacePort*>::const_iterator it = ports_->begin()
; it != ports_->end(); ++it) {
if((*it)->name == nam)
return *it;
}
return NULL;
}
void Subprogram::fix_return_type(void)
{
if(!statements_)

View File

@ -48,6 +48,8 @@ class Subprogram : public LineInfo, public ScopeBase {
// matches this subprogram and that subprogram.
bool compare_specification(Subprogram*that) const;
InterfacePort*find_param(perm_string nam);
int emit(ostream&out, Entity*ent, Architecture*arc);
// Emit a definition as it would show up in a package.