From 8cac72192f8fafb7fde5459aa3519f863532e9b9 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Thu, 9 Oct 2014 10:37:33 +0200 Subject: [PATCH] vhdlpp: Fix array typedefs in packages. --- vhdlpp/vtype.h | 3 ++- vhdlpp/vtype_stream.cc | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/vhdlpp/vtype.h b/vhdlpp/vtype.h index 2ccb999fb..580cf92b9 100644 --- a/vhdlpp/vtype.h +++ b/vhdlpp/vtype.h @@ -195,6 +195,7 @@ class VTypeArray : public VType { int elaborate(Entity*ent, Architecture*arc) const; void write_to_stream(std::ostream&fd) const; + void write_type_to_stream(std::ostream&fd) const; void show(std::ostream&) const; inline size_t dimensions() const { return ranges_.size(); }; @@ -312,7 +313,7 @@ class VTypeDef : public VType { inline const VType* peek_definition(void) const { return type_; } void write_to_stream(std::ostream&fd) const; - void write_type_to_stream(ostream&fd) const; + void write_type_to_stream(std::ostream&fd) const; int emit_typedef(std::ostream&out, typedef_context_t&ctx) const; int emit_def(std::ostream&out, perm_string name) const; diff --git a/vhdlpp/vtype_stream.cc b/vhdlpp/vtype_stream.cc index 1392a6c50..b66428626 100644 --- a/vhdlpp/vtype_stream.cc +++ b/vhdlpp/vtype_stream.cc @@ -90,9 +90,40 @@ void VTypeArray::write_range_to_stream_(std::ostream&fd) const fd << ") "; } +void VTypeArray::write_type_to_stream(ostream&fd) const +{ + // Special case: std_logic_vector + if (etype_ == &primitive_STDLOGIC) { + fd << "std_logic_vector"; + if (! ranges_.empty() && ! ranges_[0].is_box()) { + write_range_to_stream_(fd); + } + return; + } + + fd << "array "; + + if (! ranges_.empty()) { + assert(ranges_.size() < 2); + if (ranges_[0].is_box()) { + fd << "(INTEGER range <>) "; + } else { + write_range_to_stream_(fd); + } + } + + fd << "of "; + + if(const VTypeDef*tdef = dynamic_cast(etype_)) { + tdef->write_to_stream(fd); + } else { + etype_->write_to_stream(fd); + } +} + void VTypeDef::write_type_to_stream(ostream&fd) const { - type_->write_to_stream(fd); + type_->write_type_to_stream(fd); } void VTypeDef::write_to_stream(ostream&fd) const