Support ability for "script -select" to take commands from wires
authorEddie Hung <eddie@fpgeh.com>
Fri, 28 Jun 2019 20:36:33 +0000 (13:36 -0700)
committerEddie Hung <eddie@fpgeh.com>
Fri, 28 Jun 2019 20:36:33 +0000 (13:36 -0700)
kernel/yosys.cc

index 94d6d675f968ff24a2e205e24c39096a955a14ae..7d4948881c3287d1779f589d4b11b0e5fa6a5e7e 100644 (file)
@@ -1254,24 +1254,55 @@ struct HistoryPass : public Pass {
 #endif
 
 struct ScriptCmdPass : public Pass {
-       ScriptCmdPass() : Pass("script", "execute commands from script file") { }
+       ScriptCmdPass() : Pass("script", "execute commands from file or wire") { }
        void help() YS_OVERRIDE {
+               //   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
                log("\n");
                log("    script <filename> [<from_label>:<to_label>]\n");
+               log("    script -select [selection]\n");
                log("\n");
-               log("This command executes the yosys commands in the specified file.\n");
+               log("This command executes the yosys commands in the specified file (default\n");
+               log("behaviour), or commands embedded in the constant text value connected to the\n");
+               log("selected wires.\n");
                log("\n");
-               log("The 2nd argument can be used to only execute the section of the\n");
-               log("file between the specified labels. An empty from label is synonymous\n");
-               log("for the beginning of the file and an empty to label is synonymous\n");
-               log("for the end of the file.\n");
+               log("In the default (file) case, the 2nd argument can be used to only execute the\n");
+               log("section of the file between the specified labels. An empty from label is\n");
+               log("synonymous with the beginning of the file and an empty to label is synonymous\n");
+               log("with the end of the file.\n");
                log("\n");
                log("If only one label is specified (without ':') then only the block\n");
                log("marked with that label (until the next label) is executed.\n");
                log("\n");
        }
-       void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE {
-               if (args.size() < 2)
+       void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
+       {
+               bool select_mode = false;
+
+               size_t argidx;
+               for (argidx = 1; argidx < args.size(); argidx++) {
+                       if (args[argidx] == "-select") {
+                               select_mode = true;
+                               continue;
+                       }
+                       break;
+               }
+               if (select_mode) {
+                       extra_args(args, argidx, design);
+
+                       for (auto mod : design->selected_modules())
+                               for (auto &c : mod->connections()) {
+                                       if (!c.first.is_wire())
+                                               continue;
+                                       auto w = c.first.as_wire();
+                                       if (!mod->selected(w))
+                                               continue;
+                                       if (!c.second.is_fully_const())
+                                               log_error("RHS of selected wire %s.%s is not constant.\n", log_id(mod), log_id(w));
+                                       auto v = c.second.as_const();
+                                       Pass::call(design, v.decode_string());
+                               }
+               }
+               else if (args.size() < 2)
                        log_cmd_error("Missing script file.\n");
                else if (args.size() == 2)
                        run_frontend(args[1], "script", design);