Partly support parameter in Verilog-2001

This commit is contained in:
Guojie Luo 2023-04-18 09:29:32 +00:00
parent d256091c7b
commit 0030a144ef
3 changed files with 124 additions and 2 deletions

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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 = "-";