Update symbol_declaration.rs

[to-fix]symbol not found (port declaration and port)
This commit is contained in:
Yanting Zhang 2022-08-22 17:03:17 +08:00
parent 3f85ea5c6e
commit a30771fd68
1 changed files with 39 additions and 8 deletions

View File

@ -9,7 +9,9 @@ use std::collections::HashMap;
#[allow(unused_imports)]
use log::{debug, error, info, trace, warn};
pub struct SymbolDeclaration {}
pub struct SymbolDeclaration {
//#[derive(Copy, Clone)]
}
impl<'a> SymbolDeclaration {
pub fn declare_port(json: &'a JsonValue, context: &mut ModuleContext<'a>) {
@ -23,14 +25,14 @@ impl<'a> SymbolDeclaration {
Tag::MODULE_HEADER,
Tag::PAREN_GROUP,
Tag::PORT_DECLARATION_LIST,
Tag::PORT_DECLARATION,
//Tag::PORT_DECLARATION,
];
let json_io_ports_2001 = Tools::match_tags(vec![json], base_path_2001.to_vec());
if json_io_ports_2001.len() == 0 {
let json_io_ports_2005 = Tools::match_tags(vec![json], base_path_2005.to_vec());
let mut json_io_ports_2005 = Tools::match_tags(vec![json], base_path_2005.to_vec());
info!("version: Verilog-2005");
let symbol_list = Self::gen_port_info_2005(json_io_ports_2005);
let symbol_list = Self::gen_port_info_2005(&mut json_io_ports_2005);
for (symbol, info) in symbol_list {
context.symbol.insert(symbol.clone(), info);
}
@ -125,11 +127,19 @@ impl<'a> SymbolDeclaration {
.collect::<Vec<_>>()
}
fn gen_port_info_2005(json_io_ports: Vec<&'a JsonValue>) -> Vec<(String, SymbolInfo<'a>)> {
let name_path = vec![
fn gen_port_info_2005(json_io_ports: &mut Vec<&'a JsonValue>) -> Vec<(String, SymbolInfo<'a>)> {
let name_path = [
vec![
Tag::PORT_DECLARATION,
Tag::UNQUALIFIED_ID,
Tag::SYMBOL_IDENTIFIER,
],
vec![
Tag::PORT,
Tag::PORT_REFERENCE,
Tag::UNQUALIFIED_ID,
Tag::SYMBOL_IDENTIFIER,
],
];
let dim_path = [
@ -143,17 +153,38 @@ impl<'a> SymbolDeclaration {
Tag::DEC_NUMBER,
];
json_io_ports
let io_paths = [
vec![
Tag::PORT_DECLARATION_LIST,
Tag::PORT_DECLARATION,
],
vec![
Tag::PORT_DECLARATION_LIST,
Tag::PORT,
],
];
let json_io_declarations: Vec<_> = io_paths
.iter()
.flat_map(|x|Tools::match_tags(json_io_ports.to_vec(), x.to_vec()))
.collect();
json_io_declarations
.iter()
.flat_map(|json_port| {
let kind = match json_port["children"][0]["tag"].as_str() {
Some(Tag::INPUT) => SymbolKind::Input,
Some(Tag::OUTPUT) => SymbolKind::Output,
Some(Tag::INOUT) => SymbolKind::Inout,
Some(Tag::PORT_REFERENCE) => SymbolKind::Inout,
_ => panic!("unknown error at CST node {}", json_port),
};
let width = Self::gen_var_width(json_port, dim_path.to_vec());
let json_port_names = Tools::match_tags(vec![json_port], name_path.to_vec());
let json_port_names: Vec<_> = name_path
.iter()
.flat_map(|x|Tools::match_tags(vec![json_port], x.to_vec()))
.collect();
assert!(json_port_names.len() > 0);
json_port_names