vhdlpp: Aggregate expression are elaborated if

they are used for Signal/Variable initalization.
This commit is contained in:
Maciej Suminski 2014-08-20 14:18:16 +02:00
parent c92dea77fc
commit 72ff9ac00b
3 changed files with 38 additions and 8 deletions

View File

@ -41,6 +41,24 @@ int Architecture::elaborate(Entity*entity)
cur->second->val->elaborate_expr(entity, this, cur->second->typ);
}
// Elaborate initializer expressions for signals & variables
for (map<perm_string,Signal*>::iterator cur = old_signals_.begin()
; cur != old_signals_.end() ; ++cur) {
cur->second->elaborate_init_expr(entity, this);
}
for (map<perm_string,Signal*>::iterator cur = new_signals_.begin()
; cur != new_signals_.end() ; ++cur) {
cur->second->elaborate_init_expr(entity, this);
}
for (map<perm_string,Variable*>::iterator cur = old_variables_.begin()
; cur != old_variables_.end() ; ++cur) {
cur->second->elaborate_init_expr(entity, this);
}
for (map<perm_string,Variable*>::iterator cur = new_variables_.begin()
; cur != new_variables_.end() ; ++cur) {
cur->second->elaborate_init_expr(entity, this);
}
for (list<Architecture::Statement*>::iterator cur = statements_.begin()
; cur != statements_.end() ; ++cur) {

View File

@ -27,8 +27,15 @@ using namespace std;
SigVarBase::SigVarBase(perm_string nam, const VType*typ, Expression*exp)
: name_(nam), type_(typ), init_expr_(exp), refcnt_sequ_(0)
{
if(init_expr_)
}
SigVarBase::~SigVarBase()
{
}
void SigVarBase::elaborate_init_expr(Entity*ent, Architecture*arc)
{
if(init_expr_) {
// convert the initializing string to bitstring if applicable
const ExpString*string = dynamic_cast<const ExpString*>(init_expr_);
if(string) {
@ -41,11 +48,13 @@ SigVarBase::SigVarBase(perm_string nam, const VType*typ, Expression*exp)
delete init_expr_;
init_expr_ = bitstring;
}
else {
ExpAggregate*aggr = dynamic_cast<ExpAggregate*>(init_expr_);
if(aggr) {
aggr->elaborate_expr(ent, arc, peek_type());
}
}
}
SigVarBase::~SigVarBase()
{
}
void SigVarBase::type_elaborate_(VType::decl_t&decl)

View File

@ -41,6 +41,9 @@ class SigVarBase : public LineInfo {
void dump(ostream&out, int indent = 0) const;
// Elaborates initializer expressions if needed.
void elaborate_init_expr(Entity*ent, Architecture*arc);
protected:
perm_string peek_name_() const { return name_; }
unsigned peek_refcnt_sequ_() const { return refcnt_sequ_; }