Parser support for complex delay expressions

This commit is contained in:
Clifford Wolf 2015-02-20 10:21:36 +01:00
parent 78b991d760
commit dc1a0f06fc
2 changed files with 21 additions and 8 deletions

View File

@ -61,7 +61,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
log("AST simplify[%d] depth %d at %s:%d,\n", stage, recursion_counter, filename.c_str(), linenum); log("AST simplify[%d] depth %d at %s:%d,\n", stage, recursion_counter, filename.c_str(), linenum);
log("const_fold=%d, at_zero=%d, in_lvalue=%d, stage=%d, width_hint=%d, sign_hint=%d, in_param=%d\n", log("const_fold=%d, at_zero=%d, in_lvalue=%d, stage=%d, width_hint=%d, sign_hint=%d, in_param=%d\n",
int(const_fold), int(at_zero), int(in_lvalue), int(stage), int(width_hint), int(sign_hint), int(in_param)); int(const_fold), int(at_zero), int(in_lvalue), int(stage), int(width_hint), int(sign_hint), int(in_param));
dumpAst(NULL, "> "); // dumpAst(NULL, "> ");
#endif #endif
if (stage == 0) if (stage == 0)

View File

@ -310,10 +310,17 @@ module_arg:
do_not_require_port_stubs = true; do_not_require_port_stubs = true;
}; };
non_opt_delay:
'#' '(' expr ')' { delete $3; } |
'#' '(' expr ':' expr ':' expr ')' { delete $3; delete $5; delete $7; };
delay:
non_opt_delay | /* empty */;
wire_type: wire_type:
{ {
astbuf3 = new AstNode(AST_WIRE); astbuf3 = new AstNode(AST_WIRE);
} wire_type_token_list { } wire_type_token_list delay {
$$ = astbuf3; $$ = astbuf3;
}; };
@ -742,7 +749,7 @@ wire_name:
}; };
assign_stmt: assign_stmt:
TOK_ASSIGN assign_expr_list ';'; TOK_ASSIGN delay assign_expr_list ';';
assign_expr_list: assign_expr_list:
assign_expr | assign_expr_list ',' assign_expr; assign_expr | assign_expr_list ',' assign_expr;
@ -762,7 +769,7 @@ cell_stmt:
} cell_parameter_list_opt cell_list ';' { } cell_parameter_list_opt cell_list ';' {
delete astbuf1; delete astbuf1;
} | } |
attr tok_prim_wrapper { attr tok_prim_wrapper delay {
astbuf1 = new AstNode(AST_PRIMITIVE); astbuf1 = new AstNode(AST_PRIMITIVE);
astbuf1->str = *$2; astbuf1->str = *$2;
append_attr(astbuf1, $1); append_attr(astbuf1, $1);
@ -935,18 +942,19 @@ assert_property:
}; };
simple_behavioral_stmt: simple_behavioral_stmt:
lvalue '=' expr { lvalue '=' delay expr {
AstNode *node = new AstNode(AST_ASSIGN_EQ, $1, $3); AstNode *node = new AstNode(AST_ASSIGN_EQ, $1, $4);
ast_stack.back()->children.push_back(node); ast_stack.back()->children.push_back(node);
} | } |
lvalue OP_LE expr { lvalue OP_LE delay expr {
AstNode *node = new AstNode(AST_ASSIGN_LE, $1, $3); AstNode *node = new AstNode(AST_ASSIGN_LE, $1, $4);
ast_stack.back()->children.push_back(node); ast_stack.back()->children.push_back(node);
}; };
// this production creates the obligatory if-else shift/reduce conflict // this production creates the obligatory if-else shift/reduce conflict
behavioral_stmt: behavioral_stmt:
defattr | assert | wire_decl | defattr | assert | wire_decl |
non_opt_delay behavioral_stmt |
simple_behavioral_stmt ';' | ';' | simple_behavioral_stmt ';' | ';' |
hierarchical_id attr { hierarchical_id attr {
AstNode *node = new AstNode(AST_TCALL); AstNode *node = new AstNode(AST_TCALL);
@ -1327,6 +1335,11 @@ basic_expr:
'(' expr ')' { '(' expr ')' {
$$ = $2; $$ = $2;
} | } |
'(' expr ':' expr ':' expr ')' {
delete $2;
$$ = $4;
delete $6;
} |
'{' concat_list '}' { '{' concat_list '}' {
$$ = $2; $$ = $2;
} | } |