Partly support parameter in Verilog-2001
This commit is contained in:
parent
d256091c7b
commit
0030a144ef
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 = "-";
|
||||
|
|
Loading…
Reference in New Issue