diff options
author | Clifford Wolf <clifford@clifford.at> | 2013-03-03 10:05:37 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2013-03-03 10:05:37 +0100 |
commit | 4fcb9a7b9907cd0242ce6f9c4a3855ba20ca9017 (patch) | |
tree | 3b15a9e704ca03e5bb0aceb306f4fe1c12dd61e5 /kernel | |
parent | 5bed90ae3a83c6ff456607e1b5541308ce9bcab9 (diff) | |
download | yosys-4fcb9a7b9907cd0242ce6f9c4a3855ba20ca9017.tar.gz yosys-4fcb9a7b9907cd0242ce6f9c4a3855ba20ca9017.tar.bz2 yosys-4fcb9a7b9907cd0242ce6f9c4a3855ba20ca9017.zip |
Implemented general handler for selection arguments
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/driver.cc | 3 | ||||
-rw-r--r-- | kernel/register.cc | 12 | ||||
-rw-r--r-- | kernel/register.h | 2 | ||||
-rw-r--r-- | kernel/select.cc | 16 |
4 files changed, 29 insertions, 4 deletions
diff --git a/kernel/driver.cc b/kernel/driver.cc index ce648d0ad..8a5cb8223 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -213,7 +213,8 @@ struct ShellPass : public Pass { log("Press Ctrl-D to leave the interactive shell.\n"); log("\n"); } - virtual void execute(std::vector<std::string>, RTLIL::Design *design) { + virtual void execute(std::vector<std::string> args, RTLIL::Design *design) { + extra_args(args, 1, design, false); shell(design); } } ShellPass; diff --git a/kernel/register.cc b/kernel/register.cc index 7b670ccea..0b0fb9f9c 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -107,7 +107,10 @@ void Pass::cmd_error(const std::vector<std::string> &args, size_t argidx, std::s msg.c_str(), command_text.c_str(), error_pos, ""); } -void Pass::extra_args(std::vector<std::string> args, size_t argidx, RTLIL::Design *) +// implemented in kernel/select.cc +extern void handle_extra_select_args(Pass *pass, std::vector<std::string> args, size_t argidx, RTLIL::Design *design); + +void Pass::extra_args(std::vector<std::string> args, size_t argidx, RTLIL::Design *design, bool select) { for (; argidx < args.size(); argidx++) { @@ -115,7 +118,12 @@ void Pass::extra_args(std::vector<std::string> args, size_t argidx, RTLIL::Desig if (arg.substr(0, 1) == "-") cmd_error(args, argidx, "Unkown option or option in arguments."); - cmd_error(args, argidx, "Extra argument."); + + if (!select) + cmd_error(args, argidx, "Extra argument."); + + handle_extra_select_args(this, args, argidx, design); + break; } cmd_log_args(args); } diff --git a/kernel/register.h b/kernel/register.h index bfc1b4fce..a817d8c64 100644 --- a/kernel/register.h +++ b/kernel/register.h @@ -37,7 +37,7 @@ struct Pass void cmd_log_args(const std::vector<std::string> &args); void cmd_error(const std::vector<std::string> &args, size_t argidx, std::string msg); - void extra_args(std::vector<std::string> args, size_t argidx, RTLIL::Design *design); + void extra_args(std::vector<std::string> args, size_t argidx, RTLIL::Design *design, bool select = true); static void call(RTLIL::Design *design, std::string command); static void call(RTLIL::Design *design, std::vector<std::string> args); diff --git a/kernel/select.cc b/kernel/select.cc index f43cc8495..f75737ad8 100644 --- a/kernel/select.cc +++ b/kernel/select.cc @@ -394,6 +394,22 @@ static void select_stmt(RTLIL::Design *design, std::string arg) select_filter_active_mod(design, work_stack.back()); } +// used in kernel/register.cc +void handle_extra_select_args(Pass *pass, std::vector<std::string> args, size_t argidx, RTLIL::Design *design) +{ + work_stack.clear(); + for (; argidx < args.size(); argidx++) { + if (args[argidx].substr(0, 1) == "-") + pass->cmd_error(args, argidx, "Unexpected option in selection arguments."); + select_stmt(design, args[argidx]); + } + while (work_stack.size() > 1) { + select_op_union(design, work_stack.front(), work_stack.back()); + work_stack.pop_back(); + } + design->selection_stack.push_back(work_stack.back()); +} + struct SelectPass : public Pass { SelectPass() : Pass("select", "modify and view the list of selected objects") { } virtual void help() |