Tidy up code to generate default branch of case

This commit is contained in:
Nick Gasson 2008-07-03 20:04:47 +01:00
parent 1736cd9bc8
commit 19cbab78b2
3 changed files with 17 additions and 13 deletions

View File

@ -461,30 +461,27 @@ static int draw_case(vhdl_procedural *proc, stmt_container *container,
int nbranches = ivl_stmt_case_count(stmt); int nbranches = ivl_stmt_case_count(stmt);
for (int i = 0; i < nbranches; i++) { for (int i = 0; i < nbranches; i++) {
vhdl_expr *when; stmt_container *container;
ivl_expr_t net = ivl_stmt_case_expr(stmt, i); ivl_expr_t net = ivl_stmt_case_expr(stmt, i);
if (net) { if (net) {
when = translate_expr(net)->cast(test->get_type()); vhdl_expr *when = translate_expr(net)->cast(test->get_type());
if (NULL == when) if (NULL == when)
return 1; return 1;
vhdl_case_branch *branch = new vhdl_case_branch(when);
vhdlcase->add_branch(branch);
container = branch->get_container();
} }
else { else {
when = new vhdl_var_ref("others", NULL); container = vhdlcase->get_others_container();
have_others = true; have_others = true;
} }
vhdl_case_branch *branch = new vhdl_case_branch(when); draw_stmt(proc, container, ivl_stmt_case_stmt(stmt, i));
vhdlcase->add_branch(branch);
draw_stmt(proc, branch->get_container(), ivl_stmt_case_stmt(stmt, i));
} }
if (!have_others) { if (!have_others)
vhdl_case_branch *others = vhdlcase->get_others_container()->add_stmt(new vhdl_null_stmt());
new vhdl_case_branch(new vhdl_var_ref("others", NULL));
others->get_container()->add_stmt(new vhdl_null_stmt());
vhdlcase->add_branch(others);
}
return 0; return 0;
} }

View File

@ -734,6 +734,11 @@ void vhdl_case_stmt::emit(std::ostream &of, int level) const
case_branch_list_t::const_iterator it; case_branch_list_t::const_iterator it;
for (it = branches_.begin(); it != branches_.end(); ++it) for (it = branches_.begin(); it != branches_.end(); ++it)
(*it)->emit(of, level); (*it)->emit(of, level);
if (!others_.empty()) {
of << "when others =>";
others_.emit(of, indent(level));
}
of << "end case;"; of << "end case;";
} }

View File

@ -367,9 +367,11 @@ public:
void add_branch(vhdl_case_branch *b) { branches_.push_back(b); } void add_branch(vhdl_case_branch *b) { branches_.push_back(b); }
void emit(std::ostream &of, int level) const; void emit(std::ostream &of, int level) const;
stmt_container *get_others_container() { return &others_; }
private: private:
vhdl_expr *test_; vhdl_expr *test_;
case_branch_list_t branches_; case_branch_list_t branches_;
stmt_container others_;
}; };