diff --git a/src/cst/module_declaration.rs b/src/cst/module_declaration.rs index 4bccc21..869a6d0 100644 --- a/src/cst/module_declaration.rs +++ b/src/cst/module_declaration.rs @@ -32,6 +32,7 @@ impl<'a> ModuleDeclaration { SymbolDeclaration::declare_wire(json, context); SymbolDeclaration::declare_wire1(json, context); SymbolDeclaration::declare_param(json, context); + SymbolDeclaration::declare_localparam(json, context); Self::gen_entity_data(json, context); Self::gen_port_names(context); diff --git a/src/cst/symbol_declaration.rs b/src/cst/symbol_declaration.rs index 231cbc2..9f9d163 100644 --- a/src/cst/symbol_declaration.rs +++ b/src/cst/symbol_declaration.rs @@ -429,6 +429,11 @@ impl<'a> SymbolDeclaration { } pub fn declare_param(json: &'a JsonValue, context: &mut ModuleContext<'a>) { + Self::declare_param_2001(json, context); + Self::declare_param_2005(json, context); + } + + fn declare_param_2005(json: &'a JsonValue, context: &mut ModuleContext<'a>) { let base_path = [ Tag::MODULE_DECLARATION, Tag::MODULE_ITEM_LIST, @@ -483,4 +488,119 @@ impl<'a> SymbolDeclaration { context.symbol.insert(name, symbol); } } + + fn declare_param_2001(json: &'a JsonValue, context: &mut ModuleContext<'a>) { + let base_path = [ + Tag::MODULE_DECLARATION, + Tag::MODULE_HEADER, + Tag::FORMAL_PARAMETER_LIST_DECLARATION, + Tag::PAREN_GROUP, + Tag::FORMAL_PARAMETER_LIST, + Tag::PARAM_DECLARATION, + ]; + + let name_paths = [ + vec![ + Tag::PARAM_DECLARATION, + Tag::PARAM_TYPE, + Tag::UNQUALIFIED_ID, + Tag::SYMBOL_IDENTIFIER, + ], + vec![ + Tag::PARAM_DECLARATION, + Tag::PARAM_TYPE, + Tag::SYMBOL_IDENTIFIER, + ], + ]; + + let num_path = [ + Tag::PARAM_DECLARATION, + Tag::TRAILING_ASSIGN, + Tag::EXPRESSION, + Tag::NUMBER, + ]; + + let json_params: Vec<&JsonValue> = Tools::match_tags(vec![json], base_path.to_vec()) + .iter() + .filter(|&x| x["children"][0]["tag"] == Tag::PARAMETER) + .map(|&x| x) + .collect(); + + for json in json_params { + let json_name = { + let json_names: Vec<_> = name_paths + .iter() + .flat_map(|x| Tools::match_tags(vec![json], x.to_vec())) + .collect(); + assert_eq!(json_names.len(), 1, "{}", json); + json_names[0] + }; + + let json_num = Tools::match_tags(vec![json], num_path.to_vec()); + assert_eq!(json_num.len(), 1); + let v = Number::parse(json_num[0]); + + let name = json_name["text"].to_string(); + let symbol = SymbolInfo::new(SymbolKind::Param, v, json_name); + trace!("found {} {}", SymbolKind::Param, name); + + context.symbol.insert(name, symbol); + } + } + + pub fn declare_localparam(json: &'a JsonValue, context: &mut ModuleContext<'a>) { + let base_path = [ + Tag::MODULE_DECLARATION, + Tag::MODULE_ITEM_LIST, + Tag::PARAM_DECLARATION, + ]; + + let name_paths = [ + vec![ + Tag::PARAM_DECLARATION, + Tag::PARAM_TYPE, + Tag::UNQUALIFIED_ID, + Tag::SYMBOL_IDENTIFIER, + ], + vec![ + Tag::PARAM_DECLARATION, + Tag::PARAM_TYPE, + Tag::SYMBOL_IDENTIFIER, + ], + ]; + + let num_path = [ + Tag::PARAM_DECLARATION, + Tag::TRAILING_ASSIGN, + Tag::EXPRESSION, + Tag::NUMBER, + ]; + + let json_params: Vec<&JsonValue> = Tools::match_tags(vec![json], base_path.to_vec()) + .iter() + .filter(|&x| x["children"][0]["tag"] == Tag::LOCALPARAM) + .map(|&x| x) + .collect(); + + for json in json_params { + let json_name = { + let json_names: Vec<_> = name_paths + .iter() + .flat_map(|x| Tools::match_tags(vec![json], x.to_vec())) + .collect(); + assert_eq!(json_names.len(), 1, "{}", json); + json_names[0] + }; + + let json_num = Tools::match_tags(vec![json], num_path.to_vec()); + assert_eq!(json_num.len(), 1); + let v = Number::parse(json_num[0]); + + let name = json_name["text"].to_string(); + let symbol = SymbolInfo::new(SymbolKind::Param, v, json_name); + trace!("found {} {}", SymbolKind::Param, name); + + context.symbol.insert(name, symbol); + } + } } diff --git a/src/cst/tags.rs b/src/cst/tags.rs index 2af7294..58ecaf1 100644 --- a/src/cst/tags.rs +++ b/src/cst/tags.rs @@ -43,8 +43,8 @@ impl Tag { pub const PARAM_DECLARATION: &'static str = "kParamDeclaration"; pub const PARAM_TYPE: &'static str = "kParamType"; pub const TRAILING_ASSIGN: &'static str = "kTrailingAssign"; - pub const FORMAL_PARAMETER_DECLARATION: &'static str = "kFormalParameterListDeclaration"; - pub const FORMAL_PARAMETER: &'static str = "kFormalParameterList"; + pub const FORMAL_PARAMETER_LIST_DECLARATION: &'static str = "kFormalParameterListDeclaration"; + pub const FORMAL_PARAMETER_LIST: &'static str = "kFormalParameterList"; pub const DATA_TYPE_IMPLICIT_ID_DIMENSIONS: &'static str = "kDataTypeImplicitIdDimensions"; pub const DATA_TYPE: &'static str = "kDataType"; @@ -114,6 +114,7 @@ impl Tag { pub const REG: &'static str = "reg"; pub const WIRE: &'static str = "wire"; pub const PARAMETER: &'static str = "parameter"; + pub const LOCALPARAM: &'static str = "localparam"; pub const ADD: &'static str = "+"; pub const SUB: &'static str = "-";