Merge pull request #1162 from whitequark/rtlil-case-attrs

Allow attributes on individual switch cases in RTLIL
This commit is contained in:
Clifford Wolf 2019-07-09 16:56:29 +02:00 committed by GitHub
commit ef07a313b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 5 deletions

View File

@ -204,6 +204,11 @@ void ILANG_BACKEND::dump_proc_switch(std::ostream &f, std::string indent, const
for (auto it = sw->cases.begin(); it != sw->cases.end(); ++it) for (auto it = sw->cases.begin(); it != sw->cases.end(); ++it)
{ {
for (auto ait = (*it)->attributes.begin(); ait != (*it)->attributes.end(); ++ait) {
f << stringf("%s attribute %s ", indent.c_str(), ait->first.c_str());
dump_const(f, ait->second);
f << stringf("\n");
}
f << stringf("%s case ", indent.c_str()); f << stringf("%s case ", indent.c_str());
for (size_t i = 0; i < (*it)->compare.size(); i++) { for (size_t i = 0; i < (*it)->compare.size(); i++) {
if (i > 0) if (i > 0)

View File

@ -282,14 +282,14 @@ proc_stmt:
} case_body sync_list TOK_END EOL; } case_body sync_list TOK_END EOL;
switch_stmt: switch_stmt:
attr_list TOK_SWITCH sigspec EOL { TOK_SWITCH sigspec EOL {
RTLIL::SwitchRule *rule = new RTLIL::SwitchRule; RTLIL::SwitchRule *rule = new RTLIL::SwitchRule;
rule->signal = *$3; rule->signal = *$2;
rule->attributes = attrbuf; rule->attributes = attrbuf;
switch_stack.back()->push_back(rule); switch_stack.back()->push_back(rule);
attrbuf.clear(); attrbuf.clear();
delete $3; delete $2;
} switch_body TOK_END EOL; } attr_list switch_body TOK_END EOL;
attr_list: attr_list:
/* empty */ | /* empty */ |
@ -298,9 +298,11 @@ attr_list:
switch_body: switch_body:
switch_body TOK_CASE { switch_body TOK_CASE {
RTLIL::CaseRule *rule = new RTLIL::CaseRule; RTLIL::CaseRule *rule = new RTLIL::CaseRule;
rule->attributes = attrbuf;
switch_stack.back()->back()->cases.push_back(rule); switch_stack.back()->back()->cases.push_back(rule);
switch_stack.push_back(&rule->switches); switch_stack.push_back(&rule->switches);
case_stack.push_back(rule); case_stack.push_back(rule);
attrbuf.clear();
} compare_list EOL case_body { } compare_list EOL case_body {
switch_stack.pop_back(); switch_stack.pop_back();
case_stack.pop_back(); case_stack.pop_back();
@ -319,12 +321,15 @@ compare_list:
/* empty */; /* empty */;
case_body: case_body:
case_body attr_stmt |
case_body switch_stmt | case_body switch_stmt |
case_body assign_stmt | case_body assign_stmt |
/* empty */; /* empty */;
assign_stmt: assign_stmt:
TOK_ASSIGN sigspec sigspec EOL { 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)); case_stack.back()->actions.push_back(RTLIL::SigSig(*$2, *$3));
delete $2; delete $2;
delete $3; delete $3;

View File

@ -1327,7 +1327,7 @@ public:
#endif #endif
}; };
struct RTLIL::CaseRule struct RTLIL::CaseRule : public RTLIL::AttrObject
{ {
std::vector<RTLIL::SigSpec> compare; std::vector<RTLIL::SigSpec> compare;
std::vector<RTLIL::SigSig> actions; std::vector<RTLIL::SigSig> actions;