fix vhdl instance type

This commit is contained in:
light-ly 2024-12-21 16:02:11 +08:00
parent b09921473f
commit 173388df1b

View File

@ -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<Token>) -
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<Token>) -
parsed_instance
}
fn parse_instance_name(name: &vhdl_lang::ast::token_range::WithTokenSpan<Name>) -> 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<Token>) -> Vec<(String, String, String, String, String, Range)> {
let mut interface_list = Vec::new();
list.items.iter().for_each(|interface| {