mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-06 22:23:23 +00:00
Add support for packed multidimensional arrays
* Generalization of dimensions metadata (also simplifies $size et al.) * Parsing and elaboration of multidimensional packed ranges
This commit is contained in:
parent
ac0fb2e301
commit
39fea32c6e
7 changed files with 247 additions and 267 deletions
|
@ -197,9 +197,20 @@ static AstNode *checkRange(AstNode *type_node, AstNode *range_node)
|
|||
range_node = makeRange(type_node->range_left, type_node->range_right, false);
|
||||
}
|
||||
}
|
||||
if (range_node && range_node->children.size() != 2) {
|
||||
frontend_verilog_yyerror("wire/reg/logic packed dimension must be of the form: [<expr>:<expr>], [<expr>+:<expr>], or [<expr>-:<expr>]");
|
||||
|
||||
if (range_node) {
|
||||
bool valid = true;
|
||||
if (range_node->type == AST_RANGE) {
|
||||
valid = range_node->children.size() == 2;
|
||||
} else { // AST_MULTIRANGE
|
||||
for (auto child : range_node->children) {
|
||||
valid = valid && child->children.size() == 2;
|
||||
}
|
||||
}
|
||||
if (!valid)
|
||||
frontend_verilog_yyerror("wire/reg/logic packed dimension must be of the form [<expr>:<expr>]");
|
||||
}
|
||||
|
||||
return range_node;
|
||||
}
|
||||
|
||||
|
@ -672,7 +683,7 @@ module_arg:
|
|||
ast_stack.back()->children.push_back(astbuf2);
|
||||
delete astbuf1; // really only needed if multiple instances of same type.
|
||||
} module_arg_opt_assignment |
|
||||
attr wire_type range TOK_ID {
|
||||
attr wire_type range_or_multirange TOK_ID {
|
||||
AstNode *node = $2;
|
||||
node->str = *$4;
|
||||
SET_AST_NODE_LOC(node, @4, @4);
|
||||
|
@ -1165,7 +1176,7 @@ task_func_args:
|
|||
task_func_port | task_func_args ',' task_func_port;
|
||||
|
||||
task_func_port:
|
||||
attr wire_type range {
|
||||
attr wire_type range_or_multirange {
|
||||
bool prev_was_input = true;
|
||||
bool prev_was_output = false;
|
||||
if (albuf) {
|
||||
|
@ -1928,7 +1939,7 @@ struct_var: TOK_ID { auto *var_node = astbuf2->clone();
|
|||
/////////
|
||||
|
||||
wire_decl:
|
||||
attr wire_type range {
|
||||
attr wire_type range_or_multirange {
|
||||
albuf = $1;
|
||||
astbuf1 = $2;
|
||||
astbuf2 = checkRange(astbuf1, $3);
|
||||
|
@ -2104,7 +2115,7 @@ type_name: TOK_ID // first time seen
|
|||
;
|
||||
|
||||
typedef_decl:
|
||||
TOK_TYPEDEF typedef_base_type range type_name range_or_multirange ';' {
|
||||
TOK_TYPEDEF typedef_base_type range_or_multirange type_name range_or_multirange ';' {
|
||||
astbuf1 = $2;
|
||||
astbuf2 = checkRange(astbuf1, $3);
|
||||
if (astbuf2)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue