aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-02-08 18:56:06 +0100
committerClifford Wolf <clifford@clifford.at>2015-02-08 18:56:06 +0100
commit09ee65a050ffc8fe1a208140cce32a6a5f15c4ab (patch)
treea56b68832dfb8d6684a50ecec31b99770df5547f
parent0fcc8c14674aecf6cf327740e6081bf722d806f6 (diff)
downloadyosys-09ee65a050ffc8fe1a208140cce32a6a5f15c4ab.tar.gz
yosys-09ee65a050ffc8fe1a208140cce32a6a5f15c4ab.tar.bz2
yosys-09ee65a050ffc8fe1a208140cce32a6a5f15c4ab.zip
Added eval_select_args() and eval_select_op()
-rw-r--r--kernel/register.h2
-rw-r--r--passes/cmds/select.cc31
2 files changed, 29 insertions, 4 deletions
diff --git a/kernel/register.h b/kernel/register.h
index 5214dd9a3..9b247172e 100644
--- a/kernel/register.h
+++ b/kernel/register.h
@@ -100,6 +100,8 @@ struct Backend : Pass
// implemented in passes/cmds/select.cc
extern void handle_extra_select_args(Pass *pass, std::vector<std::string> args, size_t argidx, size_t args_size, RTLIL::Design *design);
+extern RTLIL::Selection eval_select_args(const vector<string> &args, RTLIL::Design *design);
+extern void eval_select_op(vector<RTLIL::Selection> &work, string &op, RTLIL::Design *design);
extern std::map<std::string, Pass*> pass_register;
extern std::map<std::string, Frontend*> frontend_register;
diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc
index 187db2a8b..f8cfa9ced 100644
--- a/passes/cmds/select.cc
+++ b/passes/cmds/select.cc
@@ -801,7 +801,7 @@ PRIVATE_NAMESPACE_END
YOSYS_NAMESPACE_BEGIN
// used in kernel/register.cc and maybe other locations, extern decl. in register.h
-void handle_extra_select_args(Pass *pass, std::vector<std::string> args, size_t argidx, size_t args_size, RTLIL::Design *design)
+void handle_extra_select_args(Pass *pass, vector<string> args, size_t argidx, size_t args_size, RTLIL::Design *design)
{
work_stack.clear();
for (; argidx < args_size; argidx++) {
@@ -817,10 +817,33 @@ void handle_extra_select_args(Pass *pass, std::vector<std::string> args, size_t
select_op_union(design, work_stack.front(), work_stack.back());
work_stack.pop_back();
}
- if (work_stack.size() > 0)
- design->selection_stack.push_back(work_stack.back());
- else
+ if (work_stack.empty())
design->selection_stack.push_back(RTLIL::Selection(false));
+ else
+ design->selection_stack.push_back(work_stack.back());
+}
+
+// extern decl. in register.h
+RTLIL::Selection eval_select_args(const vector<string> &args, RTLIL::Design *design)
+{
+ work_stack.clear();
+ for (auto &arg : args)
+ select_stmt(design, arg);
+ while (work_stack.size() > 1) {
+ select_op_union(design, work_stack.front(), work_stack.back());
+ work_stack.pop_back();
+ }
+ if (work_stack.empty())
+ return RTLIL::Selection(false);
+ return work_stack.back();
+}
+
+// extern decl. in register.h
+void eval_select_op(vector<RTLIL::Selection> &work, string &op, RTLIL::Design *design)
+{
+ work_stack.swap(work);
+ select_stmt(design, op);
+ work_stack.swap(work);
}
YOSYS_NAMESPACE_END