diff --git a/src/core/vhdl_parser.rs b/src/core/vhdl_parser.rs index a4aced3..94186a2 100644 --- a/src/core/vhdl_parser.rs +++ b/src/core/vhdl_parser.rs @@ -1,4 +1,5 @@ use std::path::PathBuf; +use log::info; use vhdl_lang::ast::{ArchitectureBody, ConcurrentStatement, DesignFile, Designator, EntityDeclaration, InstantiatedUnit, InterfaceDeclaration, InterfaceList, LabeledConcurrentStatement, Mode, ModeIndication, Name}; use vhdl_lang::{kind_str, HasTokenSpan, Token, TokenAccess, TokenSpan, VHDLParser, VHDLStandard}; @@ -27,6 +28,8 @@ pub fn make_fast_from_units( file_type: "common".to_string() }; + info!("arch and entity {arch_and_entity:#?}"); + arch_and_entity.iter().for_each(|((arch, arch_tokens), (entity, entity_tokens))| { let name = entity.ident.tree.item.name_utf8(); let arch_name = arch.ident.tree.item.name_utf8(); @@ -86,17 +89,20 @@ fn parse_instance(statement: &LabeledConcurrentStatement, tokens: &Vec) - match &statement.statement.item { ConcurrentStatement::Instance(instance) => { parsed_instance.inst_type = match &instance.unit { - InstantiatedUnit::Component(name) => { - match &name.item { - Name::Designator(designator) => { - match &designator.item { - Designator::Identifier(symbol) => symbol.name_utf8(), - _ => "unknown".to_string() - } - } - _ => "unknown".to_string() - } + InstantiatedUnit::Component(name) | InstantiatedUnit::Configuration(name) => { + parse_instance_name(name) }, + InstantiatedUnit::Entity(name, arch_name_ref) => { + let name = parse_instance_name(name); + + let arch_name = if let Some(arch_name_ref) = arch_name_ref { + format!("({})", arch_name_ref.item.item.name_utf8()) + } else { + "".to_string() + }; + + name + &arch_name + } _ => "unknown".to_string() }; @@ -161,6 +167,24 @@ fn parse_instance(statement: &LabeledConcurrentStatement, tokens: &Vec) - parsed_instance } +fn parse_instance_name(name: &vhdl_lang::ast::token_range::WithTokenSpan) -> String { + match &name.item { + Name::Designator(designator) => { + match &designator.item { + Designator::Identifier(symbol) => symbol.name_utf8(), + _ => "unknown".to_string() + } + } + Name::Selected(_lib_name, designator_token) => { + match &designator_token.item.item { + Designator::Identifier(symbol) => symbol.name_utf8(), + _ => "unknown".to_string() + } + } + _ => "unknown".to_string() + } +} + fn parse_interface_list(list: &InterfaceList, tokens: &Vec) -> Vec<(String, String, String, String, String, Range)> { let mut interface_list = Vec::new(); list.items.iter().for_each(|interface| {