Added generic RTLIL::SigSpec::parse_sel() with support for selection variables
authorClifford Wolf <clifford@clifford.at>
Thu, 6 Feb 2014 18:22:46 +0000 (19:22 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 6 Feb 2014 18:22:46 +0000 (19:22 +0100)
kernel/rtlil.cc
kernel/rtlil.h
passes/cmds/connect.cc
passes/sat/eval.cc
passes/sat/sat.cc

index 2ab3320bdf04fd17e543659c6bf25dd6e1eebdc6..95d62503ccab5d37b04a0b68bb522436a63fa62b 100644 (file)
@@ -1649,6 +1649,24 @@ bool RTLIL::SigSpec::parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::stri
        return true;
 }
 
+bool RTLIL::SigSpec::parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str)
+{
+       if (str.empty() || str[0] != '@')
+               return parse(sig, module, str);
+
+       str = RTLIL::escape_id(str.substr(1));
+       if (design->selection_vars.count(str) == 0)
+               return false;
+
+       sig = RTLIL::SigSpec();
+       RTLIL::Selection &sel = design->selection_vars.at(str);
+       for (auto &it : module->wires)
+               if (sel.selected_member(module->name, it.first))
+                       sig.append(it.second);
+
+       return true;
+}
+
 bool RTLIL::SigSpec::parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str)
 {
        if (str == "0") {
index df0e94dcc1702ca5042dd5dfb3cfa2d6295c169f..caadf1981b1e6bf66e9a687adda04a18e33f1533 100644 (file)
@@ -411,6 +411,7 @@ struct RTLIL::SigSpec {
        std::vector<RTLIL::SigBit> to_sigbit_vector() const;
        RTLIL::SigBit to_single_sigbit() const;
        static bool parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str);
+       static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str);
        static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str);
 };
 
index 7a54e8dc64ec3da2643a109ebcfa61f604d8328f..7da2b9517c590fc2e404528ebb13b218c2c2f5fd 100644 (file)
@@ -137,7 +137,7 @@ struct ConnectPass : public Pass {
                                log_cmd_error("Cant use -set together with -unset and/or -port.\n");
 
                        RTLIL::SigSpec sig_lhs, sig_rhs;
-                       if (!RTLIL::SigSpec::parse(sig_lhs, module, set_lhs))
+                       if (!RTLIL::SigSpec::parse_sel(sig_lhs, design, module, set_lhs))
                                log_cmd_error("Failed to parse set lhs expression `%s'.\n", set_lhs.c_str());
                        if (!RTLIL::SigSpec::parse_rhs(sig_lhs, sig_rhs, module, set_rhs))
                                log_cmd_error("Failed to parse set rhs expression `%s'.\n", set_rhs.c_str());
@@ -157,7 +157,7 @@ struct ConnectPass : public Pass {
                                log_cmd_error("Cant use -unset together with -port and/or -nounset.\n");
 
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, unset_expr))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, unset_expr))
                                log_cmd_error("Failed to parse unset expression `%s'.\n", unset_expr.c_str());
 
                        sigmap.apply(sig);
@@ -173,7 +173,7 @@ struct ConnectPass : public Pass {
                                log_cmd_error("Can't find cell %s.\n", port_cell.c_str());
 
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, port_expr))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, port_expr))
                                log_cmd_error("Failed to parse port expression `%s'.\n", port_expr.c_str());
 
                        module->cells.at(RTLIL::escape_id(port_cell))->connections[RTLIL::escape_id(port_port)] = sigmap(sig);
index 5d36b474cdf918147336faf262b6d0fa2368b611..5c38cc2cf79f1059a3d6c9d8d594e8aca166cabb 100644 (file)
@@ -464,7 +464,7 @@ struct EvalPass : public Pass {
 
                for (auto &it : sets) {
                        RTLIL::SigSpec lhs, rhs;
-                       if (!RTLIL::SigSpec::parse(lhs, module, it.first))
+                       if (!RTLIL::SigSpec::parse_sel(lhs, design, module, it.first))
                                log_cmd_error("Failed to parse lhs set expression `%s'.\n", it.first.c_str());
                        if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, it.second))
                                log_cmd_error("Failed to parse rhs set expression `%s'.\n", it.second.c_str());
@@ -486,7 +486,7 @@ struct EvalPass : public Pass {
                {
                        for (auto &it : shows) {
                                RTLIL::SigSpec signal, value, undef;
-                               if (!RTLIL::SigSpec::parse(signal, module, it))
+                               if (!RTLIL::SigSpec::parse_sel(signal, design, module, it))
                                        log_cmd_error("Failed to parse show expression `%s'.\n", it.c_str());
                                signal.optimize();
                                value = signal;
@@ -513,14 +513,14 @@ struct EvalPass : public Pass {
 
                        for (auto &it : shows) {
                                RTLIL::SigSpec sig;
-                               if (!RTLIL::SigSpec::parse(sig, module, it))
+                               if (!RTLIL::SigSpec::parse_sel(sig, design, module, it))
                                        log_cmd_error("Failed to parse show expression `%s'.\n", it.c_str());
                                signal.append(sig);
                        }
 
                        for (auto &it : tables) {
                                RTLIL::SigSpec sig;
-                               if (!RTLIL::SigSpec::parse(sig, module, it))
+                               if (!RTLIL::SigSpec::parse_sel(sig, design, module, it))
                                        log_cmd_error("Failed to parse table expression `%s'.\n", it.c_str());
                                tabsigs.append(sig);
                        }
index 3785465397215b982cefcc68dfd59187193db25e..c082715909493be7c918b2d9367335cfdc916f72 100644 (file)
@@ -111,7 +111,7 @@ struct SatHelper
                {
                        RTLIL::SigSpec lhs, rhs;
 
-                       if (!RTLIL::SigSpec::parse(lhs, module, s.first))
+                       if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
                                log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
                        if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
                                log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
@@ -180,7 +180,7 @@ struct SatHelper
                {
                        RTLIL::SigSpec lhs, rhs;
 
-                       if (!RTLIL::SigSpec::parse(lhs, module, s.first))
+                       if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
                                log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
                        if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
                                log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
@@ -201,7 +201,7 @@ struct SatHelper
                {
                        RTLIL::SigSpec lhs, rhs;
 
-                       if (!RTLIL::SigSpec::parse(lhs, module, s.first))
+                       if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
                                log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.first.c_str());
                        if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
                                log_cmd_error("Failed to parse rhs set expression `%s'.\n", s.second.c_str());
@@ -222,7 +222,7 @@ struct SatHelper
                {
                        RTLIL::SigSpec lhs;
 
-                       if (!RTLIL::SigSpec::parse(lhs, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s))
                                log_cmd_error("Failed to parse lhs set expression `%s'.\n", s.c_str());
                        show_signal_pool.add(sigmap(lhs));
 
@@ -241,28 +241,28 @@ struct SatHelper
 
                for (auto &s : sets_def) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[0].insert(sig);
                }
 
                for (auto &s : sets_any_undef) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[1].insert(sig);
                }
 
                for (auto &s : sets_all_undef) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[2].insert(sig);
                }
 
                for (auto &s : sets_def_at[timestep]) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[0].insert(sig);
                        sets_def_undef[1].erase(sig);
@@ -271,7 +271,7 @@ struct SatHelper
 
                for (auto &s : sets_any_undef_at[timestep]) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[0].erase(sig);
                        sets_def_undef[1].insert(sig);
@@ -280,7 +280,7 @@ struct SatHelper
 
                for (auto &s : sets_all_undef_at[timestep]) {
                        RTLIL::SigSpec sig;
-                       if (!RTLIL::SigSpec::parse(sig, module, s))
+                       if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                log_cmd_error("Failed to parse set-def expression `%s'.\n", s.c_str());
                        sets_def_undef[0].erase(sig);
                        sets_def_undef[1].erase(sig);
@@ -329,7 +329,7 @@ struct SatHelper
                        {
                                RTLIL::SigSpec lhs, rhs;
 
-                               if (!RTLIL::SigSpec::parse(lhs, module, s.first))
+                               if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
                                        log_cmd_error("Failed to parse lhs proof expression `%s'.\n", s.first.c_str());
                                if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
                                        log_cmd_error("Failed to parse rhs proof expression `%s'.\n", s.second.c_str());
@@ -357,7 +357,7 @@ struct SatHelper
                        {
                                RTLIL::SigSpec lhs, rhs;
 
-                               if (!RTLIL::SigSpec::parse(lhs, module, s.first))
+                               if (!RTLIL::SigSpec::parse_sel(lhs, design, module, s.first))
                                        log_cmd_error("Failed to parse lhs proof-x expression `%s'.\n", s.first.c_str());
                                if (!RTLIL::SigSpec::parse_rhs(lhs, rhs, module, s.second))
                                        log_cmd_error("Failed to parse rhs proof-x expression `%s'.\n", s.second.c_str());
@@ -509,7 +509,7 @@ struct SatHelper
                {
                        for (auto &s : shows) {
                                RTLIL::SigSpec sig;
-                               if (!RTLIL::SigSpec::parse(sig, module, s))
+                               if (!RTLIL::SigSpec::parse_sel(sig, design, module, s))
                                        log_cmd_error("Failed to parse show expression `%s'.\n", s.c_str());
                                log("Import show expression: %s\n", log_signal(sig));
                                modelSig.append(sig);
@@ -733,10 +733,6 @@ struct SatPass : public Pass {
                log("        show the model for the specified signal. if no -show option is\n");
                log("        passed then a set of signals to be shown is automatically selected.\n");
                log("\n");
-               log("    -show @<sel_name>\n");
-               log("        add all wires from the specified selection (see help select) to\n");
-               log("        the list of signals to be shown.\n");
-               log("\n");
                log("    -show-inputs, -show-outputs\n");
                log("        add all module input (output) ports to the list of shown signals\n");
                log("\n");
@@ -1026,19 +1022,6 @@ struct SatPass : public Pass {
                                        sets_def.push_back(it.second->name);
                }
 
-               for (auto &str : shows) {
-                       if (str.empty() || str[0] != '@')
-                               continue;
-                       str = RTLIL::escape_id(str.substr(1));
-                       if (design->selection_vars.count(str) == 0)
-                               log_cmd_error("Selection %s is not defined!\n", RTLIL::id2cstr(str));
-                       RTLIL::Selection &sel = design->selection_vars.at(str);
-                       str.clear();
-                       for (auto &it : module->wires)
-                               if (sel.selected_member(module->name, it.first))
-                                       str += (str.empty() ? "" : ",") + it.first;
-               }
-
                if (show_inputs) {
                        for (auto &it : module->wires)
                                if (it.second->port_input)