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,27 +27,36 @@ 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_);
const ExpString*string = dynamic_cast<const ExpString*>(init_expr_);
if(string) {
const std::vector<char>& val = string->get_value();
char buf[val.size() + 1];
std::copy(val.begin(), val.end(), buf);
buf[val.size()] = 0;
ExpBitstring *bitstring = new ExpBitstring(buf);
ExpBitstring*bitstring = new ExpBitstring(buf);
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)
{
decl.type = type_;

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_; }