From 0ca856d4e8b6856e1bc9eeac1f2e2c9dcff11be3 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Tue, 31 Mar 2015 10:46:24 +0200 Subject: [PATCH] bugfix #942: VHDL function bodies in arch declaration not supported --- vhdlpp/parse.y | 2 +- vhdlpp/scope.cc | 38 ++++++++++++++++++++++---------------- vhdlpp/scope.h | 8 +++++--- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/vhdlpp/parse.y b/vhdlpp/parse.y index 3276dc6d9..146f984ac 100644 --- a/vhdlpp/parse.y +++ b/vhdlpp/parse.y @@ -2297,7 +2297,7 @@ subprogram_body /* IEEE 1076-2008 P4.3 */ } else if (tmp) { errormsg(@1, "Subprogram specification for %s doesn't match specification in package header.\n", prog->name().str()); } - prog->transfer_from(*active_scope); + prog->transfer_from(*active_scope, ScopeBase::VARIABLES); prog->set_program_body($4); active_scope->bind_name(prog->name(), prog); active_sub = NULL; diff --git a/vhdlpp/scope.cc b/vhdlpp/scope.cc index 49f8775f7..0682a45d0 100644 --- a/vhdlpp/scope.cc +++ b/vhdlpp/scope.cc @@ -241,25 +241,31 @@ void ScopeBase::do_use_from(const ScopeBase*that) use_enums_ = that->use_enums_; } -void ScopeBase::transfer_from(ScopeBase&ref) +void ScopeBase::transfer_from(ScopeBase&ref, transfer_type_t what) { - std::copy(ref.new_signals_.begin(), ref.new_signals_.end(), - insert_iterator >( - new_signals_, new_signals_.end()) - ); - ref.new_signals_.clear(); + if(what & SIGNALS) { + std::copy(ref.new_signals_.begin(), ref.new_signals_.end(), + insert_iterator >( + new_signals_, new_signals_.end()) + ); + ref.new_signals_.clear(); + } - std::copy(ref.new_variables_.begin(), ref.new_variables_.end(), - insert_iterator >( - new_variables_, new_variables_.end()) - ); - ref.new_variables_.clear(); + if(what & VARIABLES) { + std::copy(ref.new_variables_.begin(), ref.new_variables_.end(), + insert_iterator >( + new_variables_, new_variables_.end()) + ); + ref.new_variables_.clear(); + } - std::copy(ref.new_components_.begin(), ref.new_components_.end(), - insert_iterator >( - new_components_, new_components_.end()) - ); - ref.new_components_.clear(); + if(what & COMPONENTS) { + std::copy(ref.new_components_.begin(), ref.new_components_.end(), + insert_iterator >( + new_components_, new_components_.end()) + ); + ref.new_components_.clear(); + } } void ActiveScope::set_package_header(Package*pkg) diff --git a/vhdlpp/scope.h b/vhdlpp/scope.h index 918121158..69e859fb9 100644 --- a/vhdlpp/scope.h +++ b/vhdlpp/scope.h @@ -59,9 +59,11 @@ class ScopeBase { virtual const InterfacePort* find_param(perm_string by_name) const; Subprogram* find_subprogram(perm_string by_name) const; bool is_enum_name(perm_string name) const; - // Moves all signals, variables and components from another scope to - // this one. After the transfer new_* maps are emptied in the another scope. - void transfer_from(ScopeBase&ref); + + // Moves signals, variables and components from another scope to + // this one. After the transfer new_* maps are cleared in the source scope. + enum transfer_type_t { SIGNALS = 1, VARIABLES = 2, COMPONENTS = 4, ALL = 0xffff }; + void transfer_from(ScopeBase&ref, transfer_type_t what = ALL); inline void bind_subprogram(perm_string name, Subprogram*obj) { map::iterator it;