diff --git a/vhdlpp/parse.y b/vhdlpp/parse.y index cc278f3ab..09c8e5f78 100644 --- a/vhdlpp/parse.y +++ b/vhdlpp/parse.y @@ -182,6 +182,16 @@ static list* record_elements(list*names, return res; } +static void touchup_interface_for_functions(std::list*ports) +{ + for (list::iterator cur = ports->begin() + ; cur != ports->end() ; ++cur) { + InterfacePort*curp = *cur; + if (curp->mode == PORT_NONE) + curp->mode = PORT_IN; + } +} + %} @@ -1152,6 +1162,7 @@ function_specification /* IEEE 1076-2008 P4.2.1 */ { perm_string type_name = lex_strings.make($7); perm_string name = lex_strings.make($2); const VType*type_mark = active_scope->find_type(type_name); + touchup_interface_for_functions($4); Subprogram*tmp = new Subprogram(name, $4, type_mark); FILE_NAME(tmp,@1); delete[]$2; diff --git a/vhdlpp/subprogram_emit.cc b/vhdlpp/subprogram_emit.cc index e70351a4c..efd586bd0 100644 --- a/vhdlpp/subprogram_emit.cc +++ b/vhdlpp/subprogram_emit.cc @@ -33,11 +33,34 @@ int Subprogram::emit_package(ostream&fd) const fd << "function "; return_type_->emit_def(fd); fd << " " << name_; - fd << ";" << endl; + fd << "("; } else { fd << "task " << name_ << ";" << endl; } + for (list::const_iterator cur = ports_->begin() + ; cur != ports_->end() ; ++cur) { + if (cur != ports_->begin()) + fd << ", "; + InterfacePort*curp = *cur; + switch (curp->mode) { + case PORT_IN: + fd << "input "; + break; + case PORT_OUT: + fd << "output "; + break; + case PORT_NONE: + fd << "inout /* PORT_NONE? */ "; + break; + } + + errors += curp->type->emit_def(fd); + fd << " \\" << curp->name << " "; + } + + fd << ");" << endl; + if (statements_) { for (list::const_iterator cur = statements_->begin() ; cur != statements_->end() ; ++cur) {