diff options
author | Clifford Wolf <clifford@clifford.at> | 2019-07-09 16:56:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-09 16:56:29 +0200 |
commit | ef07a313b4122b9ceb233ed7dd4733db97272577 (patch) | |
tree | ef7570bb5a462e44cc40da51894917db7ff4a76a /frontends | |
parent | a429aedc0ff21b95ded89320144d2063234a3d7e (diff) | |
parent | 93bc5affd3fc635dafec3a37bf4c5b94c252036f (diff) | |
download | yosys-ef07a313b4122b9ceb233ed7dd4733db97272577.tar.gz yosys-ef07a313b4122b9ceb233ed7dd4733db97272577.tar.bz2 yosys-ef07a313b4122b9ceb233ed7dd4733db97272577.zip |
Merge pull request #1162 from whitequark/rtlil-case-attrs
Allow attributes on individual switch cases in RTLIL
Diffstat (limited to 'frontends')
-rw-r--r-- | frontends/ilang/ilang_parser.y | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/frontends/ilang/ilang_parser.y b/frontends/ilang/ilang_parser.y index 44c99906a..b4b9693da 100644 --- a/frontends/ilang/ilang_parser.y +++ b/frontends/ilang/ilang_parser.y @@ -282,14 +282,14 @@ proc_stmt: } case_body sync_list TOK_END EOL; switch_stmt: - attr_list TOK_SWITCH sigspec EOL { + TOK_SWITCH sigspec EOL { RTLIL::SwitchRule *rule = new RTLIL::SwitchRule; - rule->signal = *$3; + rule->signal = *$2; rule->attributes = attrbuf; switch_stack.back()->push_back(rule); attrbuf.clear(); - delete $3; - } switch_body TOK_END EOL; + delete $2; + } attr_list switch_body TOK_END EOL; attr_list: /* empty */ | @@ -298,9 +298,11 @@ attr_list: switch_body: switch_body TOK_CASE { RTLIL::CaseRule *rule = new RTLIL::CaseRule; + rule->attributes = attrbuf; switch_stack.back()->back()->cases.push_back(rule); switch_stack.push_back(&rule->switches); case_stack.push_back(rule); + attrbuf.clear(); } compare_list EOL case_body { switch_stack.pop_back(); case_stack.pop_back(); @@ -319,12 +321,15 @@ compare_list: /* empty */; case_body: + case_body attr_stmt | case_body switch_stmt | case_body assign_stmt | /* empty */; assign_stmt: TOK_ASSIGN sigspec sigspec EOL { + if (attrbuf.size() != 0) + rtlil_frontend_ilang_yyerror("dangling attribute"); case_stack.back()->actions.push_back(RTLIL::SigSig(*$2, *$3)); delete $2; delete $3; |