Add "verific -cfg" command
authorClaire Xenia Wolf <claire@clairexen.net>
Mon, 1 Nov 2021 09:41:51 +0000 (10:41 +0100)
committerClaire Xenia Wolf <claire@clairexen.net>
Mon, 1 Nov 2021 09:41:51 +0000 (10:41 +0100)
Signed-off-by: Claire Xenia Wolf <claire@clairexen.net>
frontends/verific/verific.cc

index eb9f37678274b775041b8c0aa1d35f59461a19dd..5a75b52af837c5f879827073a189bd00068d213f 100644 (file)
@@ -2498,6 +2498,13 @@ struct VerificPass : public Pass {
                log("  WARNING: Templates only available in commercial build.\n");
                log("\n");
 #endif
+               log("\n");
+               log("\n");
+               log("    verific -cfg [<name> [<value>]]\n");
+               log("\n");
+               log("Get/set Verific runtime flags.\n");
+               log("\n");
+               log("\n");
                log("Use YosysHQ Tabby CAD Suite if you need Yosys+Verific.\n");
                log("https://www.yosyshq.com/\n");
                log("\n");
@@ -2526,7 +2533,10 @@ struct VerificPass : public Pass {
                        Message::SetConsoleOutput(0);
                        Message::RegisterCallBackMsg(msg_func);
 
+                       RuntimeFlags::SetVar("db_preserve_user_instances", 1);
                        RuntimeFlags::SetVar("db_preserve_user_nets", 1);
+                       RuntimeFlags::SetVar("db_preserve_x", 1);
+
                        RuntimeFlags::SetVar("db_allow_external_nets", 1);
                        RuntimeFlags::SetVar("db_infer_wide_operators", 1);
                        RuntimeFlags::SetVar("db_infer_set_reset_registers", 0);
@@ -2542,10 +2552,12 @@ struct VerificPass : public Pass {
                        RuntimeFlags::SetVar("vhdl_ignore_assertion_statements", 0);
 
                        RuntimeFlags::SetVar("vhdl_preserve_assignments", 1);
-                       //RuntimeFlags::SetVar("vhdl_preserve_comments",1);
+                       //RuntimeFlags::SetVar("vhdl_preserve_comments", 1);
+                       RuntimeFlags::SetVar("vhdl_preserve_drivers", 1);
 #endif
                        RuntimeFlags::SetVar("veri_preserve_assignments", 1);
-                       RuntimeFlags::SetVar("veri_preserve_comments",1);
+                       RuntimeFlags::SetVar("veri_preserve_comments", 1);
+                       RuntimeFlags::SetVar("veri_preserve_drivers", 1);
 
                        // Workaround for VIPER #13851
                        RuntimeFlags::SetVar("veri_create_name_for_unnamed_gen_block", 1);
@@ -2556,6 +2568,8 @@ struct VerificPass : public Pass {
                        // https://github.com/YosysHQ/yosys/issues/1055
                        RuntimeFlags::SetVar("veri_elaborate_top_level_modules_having_interface_ports", 1) ;
 
+                       RuntimeFlags::SetVar("verific_produce_verbose_syntax_error_message", 1);
+
 #ifndef DB_PRESERVE_INITIAL_VALUE
 #  warning Verific was built without DB_PRESERVE_INITIAL_VALUE.
 #endif
@@ -3200,6 +3214,65 @@ struct VerificPass : public Pass {
                        goto check_error;
                }
 
+               if (argidx < GetSize(args) && args[argidx] == "-cfg")
+               {
+                       if (argidx+1 == GetSize(args)) {
+                               MapIter mi;
+                               const char *k, *s;
+                               unsigned long v;
+                               pool<std::string> lines;
+                               FOREACH_MAP_ITEM(RuntimeFlags::GetVarMap(), mi, &k, &v) {
+                                       lines.insert(stringf("%s %lu", k, v));
+                               }
+                               FOREACH_MAP_ITEM(RuntimeFlags::GetStringVarMap(), mi, &k, &s) {
+                                       if (s == nullptr)
+                                               lines.insert(stringf("%s NULL", k));
+                                       else
+                                               lines.insert(stringf("%s \"%s\"", k, s));
+                               }
+                               lines.sort();
+                               for (auto &line : lines)
+                                       log("verific -cfg %s\n", line.c_str());
+                               goto check_error;
+                       }
+
+                       if (argidx+2 == GetSize(args)) {
+                               const char *k = args[argidx+1].c_str();
+                               if (RuntimeFlags::HasUnsignedVar(k)) {
+                                       log("verific -cfg %s %lu\n", k, RuntimeFlags::GetVar(k));
+                                       goto check_error;
+                               }
+                               if (RuntimeFlags::HasStringVar(k)) {
+                                       const char *s = RuntimeFlags::GetStringVar(k);
+                                       if (s == nullptr)
+                                               log("verific -cfg %s NULL\n", k);
+                                       else
+                                               log("verific -cfg %s \"%s\"\n", k, s);
+                                       goto check_error;
+                               }
+                               log_cmd_error("Can't find Verific Runtime flag '%s'.\n", k);
+                       }
+
+                       if (argidx+3 == GetSize(args)) {
+                               const auto &k = args[argidx+1], &v = args[argidx+2];
+                               if (v == "NULL") {
+                                       RuntimeFlags::SetStringVar(k.c_str(), nullptr);
+                                       goto check_error;
+                               }
+                               if (v[0] == '"') {
+                                       std::string s = v.substr(1, GetSize(v)-2);
+                                       RuntimeFlags::SetStringVar(k.c_str(), v.c_str());
+                                       goto check_error;
+                               }
+                               char *endptr;
+                               unsigned long n = strtol(v.c_str(), &endptr, 0);
+                               if (*endptr == 0) {
+                                       RuntimeFlags::SetVar(k.c_str(), n);
+                                       goto check_error;
+                               }
+                       }
+               }
+
                cmd_error(args, argidx, "Missing or unsupported mode parameter.\n");
 
        check_error: