vhdlpp: Elaboration of ExpFunc parameters fallbacks to the types given in the Subprogram header.
This commit is contained in:
parent
9951521212
commit
194a950f8d
|
|
@ -23,6 +23,7 @@
|
||||||
# include "architec.h"
|
# include "architec.h"
|
||||||
# include "entity.h"
|
# include "entity.h"
|
||||||
# include "vsignal.h"
|
# include "vsignal.h"
|
||||||
|
# include "subprogram.h"
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
# include <typeinfo>
|
# include <typeinfo>
|
||||||
# include "parse_types.h"
|
# include "parse_types.h"
|
||||||
|
|
@ -715,6 +716,8 @@ int ExpFunc::elaborate_expr(Entity*ent, Architecture*arc, const VType*)
|
||||||
|
|
||||||
for (size_t idx = 0 ; idx < argv_.size() ; idx += 1) {
|
for (size_t idx = 0 ; idx < argv_.size() ; idx += 1) {
|
||||||
const VType*tmp = argv_[idx]->probe_type(ent, arc);
|
const VType*tmp = argv_[idx]->probe_type(ent, arc);
|
||||||
|
if(!tmp && prog)
|
||||||
|
tmp = prog->peek_param_type(idx);
|
||||||
errors += argv_[idx]->elaborate_expr(ent, arc, tmp);
|
errors += argv_[idx]->elaborate_expr(ent, arc, tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ bool Subprogram::compare_specification(Subprogram*that) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
InterfacePort*Subprogram::find_param(perm_string nam)
|
const InterfacePort*Subprogram::find_param(perm_string nam) const
|
||||||
{
|
{
|
||||||
if(!ports_)
|
if(!ports_)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -94,6 +94,17 @@ InterfacePort*Subprogram::find_param(perm_string nam)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const VType*Subprogram::peek_param_type(int idx) const
|
||||||
|
{
|
||||||
|
if(!ports_ || idx >= ports_->size())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
std::list<InterfacePort*>::const_iterator p = ports_->begin();
|
||||||
|
std::advance(p, idx);
|
||||||
|
|
||||||
|
return (*p)->type;
|
||||||
|
}
|
||||||
|
|
||||||
void Subprogram::fix_return_type(void)
|
void Subprogram::fix_return_type(void)
|
||||||
{
|
{
|
||||||
if(!statements_)
|
if(!statements_)
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,8 @@ class Subprogram : public LineInfo, public ScopeBase {
|
||||||
// matches this subprogram and that subprogram.
|
// matches this subprogram and that subprogram.
|
||||||
bool compare_specification(Subprogram*that) const;
|
bool compare_specification(Subprogram*that) const;
|
||||||
|
|
||||||
InterfacePort*find_param(perm_string nam);
|
const InterfacePort*find_param(perm_string nam) const;
|
||||||
|
const VType*peek_param_type(int idx) const;
|
||||||
|
|
||||||
int emit(ostream&out, Entity*ent, Architecture*arc);
|
int emit(ostream&out, Entity*ent, Architecture*arc);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue