Expose abc and data paths as globals
authorMiodrag Milanovic <mmicko@gmail.com>
Fri, 6 Nov 2020 13:17:15 +0000 (14:17 +0100)
committerMiodrag Milanovic <mmicko@gmail.com>
Fri, 6 Nov 2020 13:17:15 +0000 (14:17 +0100)
kernel/yosys.cc
kernel/yosys.h
passes/techmap/abc.cc
passes/techmap/abc9_exe.cc

index 7a2ef49134b43f512e2282bacfcfb61d1e9079d2..dcaf364e929a23b10770d70bed03a65d101be287 100644 (file)
@@ -89,6 +89,12 @@ bool memhasher_active = false;
 uint32_t memhasher_rng = 123456;
 std::vector<void*> memhasher_store;
 
+std::string yosys_share_dirname;
+std::string yosys_abc_executable;
+
+void init_share_dirname();
+void init_abc_executable_name();
+
 void memhasher_on()
 {
 #if defined(__linux__) || defined(__FreeBSD__)
@@ -523,6 +529,8 @@ void yosys_setup()
        if(already_setup)
                return;
        already_setup = true;
+       init_share_dirname();
+       init_abc_executable_name();
 
 #define X(_id) RTLIL::ID::_id = "\\" # _id;
 #include "kernel/constids.inc"
@@ -825,38 +833,74 @@ std::string proc_self_dirname()
 #endif
 
 #if defined(EMSCRIPTEN) || defined(__wasm)
-std::string proc_share_dirname()
+void init_share_dirname()
 {
-       return "/share/";
+       yosys_share_dirname = "/share/";
 }
 #else
-std::string proc_share_dirname()
+void init_share_dirname()
 {
        std::string proc_self_path = proc_self_dirname();
 #  if defined(_WIN32) && !defined(YOSYS_WIN32_UNIX_DIR)
        std::string proc_share_path = proc_self_path + "share\\";
-       if (check_file_exists(proc_share_path, true))
-               return proc_share_path;
+       if (check_file_exists(proc_share_path, true)) {
+               yosys_share_dirname = proc_share_path;
+               return;
+       }
        proc_share_path = proc_self_path + "..\\share\\";
-       if (check_file_exists(proc_share_path, true))
-               return proc_share_path;
+       if (check_file_exists(proc_share_path, true)) {
+               yosys_share_dirname = proc_share_path;
+               return;
+       }
 #  else
        std::string proc_share_path = proc_self_path + "share/";
-       if (check_file_exists(proc_share_path, true))
-               return proc_share_path;
+       if (check_file_exists(proc_share_path, true)) {
+               yosys_share_dirname = proc_share_path;
+               return;
+       }
        proc_share_path = proc_self_path + "../share/" + proc_program_prefix()+ "yosys/";
-       if (check_file_exists(proc_share_path, true))
-               return proc_share_path;
+       if (check_file_exists(proc_share_path, true)) {
+               yosys_share_dirname = proc_share_path;
+               return;
+       }
 #    ifdef YOSYS_DATDIR
        proc_share_path = YOSYS_DATDIR "/";
-       if (check_file_exists(proc_share_path, true))
-               return proc_share_path;
+       if (check_file_exists(proc_share_path, true)) {
+               yosys_share_dirname = proc_share_path;
+               return;
+       }
 #    endif
 #  endif
-       log_error("proc_share_dirname: unable to determine share/ directory!\n");
 }
 #endif
 
+void init_abc_executable_name()
+{
+#ifdef ABCEXTERNAL
+       std::string exe_file;
+       if (std::getenv("ABC")) {
+               yosys_abc_executable = std::getenv("ABC");
+       } else {
+               yosys_abc_executable = ABCEXTERNAL;
+       }
+#else
+       yosys_abc_executable = proc_self_dirname() + proc_program_prefix()+ "yosys-abc";
+#endif
+#ifdef _WIN32
+#ifndef ABCEXTERNAL
+       if (!check_file_exists(yosys_abc_executable + ".exe") && check_file_exists(proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc.exe"))
+               yosys_abc_executable = proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc";
+#endif
+#endif
+}
+
+std::string proc_share_dirname()
+{
+       if (yosys_share_dirname.empty())
+               log_error("init_share_dirname: unable to determine share/ directory!\n");
+       return yosys_share_dirname;
+}
+
 std::string proc_program_prefix()
 {
        std::string program_prefix;
index f1646d6bc53c75d3bbedacebef8afbea9459fc37..ab6eb5f8c4c24f9d68dd5decda7746d53bd9efa9 100644 (file)
@@ -366,6 +366,9 @@ extern std::map<std::string, void*> loaded_python_plugins;
 extern std::map<std::string, std::string> loaded_plugin_aliases;
 void load_plugin(std::string filename, std::vector<std::string> aliases);
 
+extern std::string yosys_share_dirname;
+extern std::string yosys_abc_executable;
+
 YOSYS_NAMESPACE_END
 
 #endif
index 66ac6828fcd237a0e99b13c43cba70986549e5c3..192e39372f642766cabe5c635a0d7f256881eee5 100644 (file)
@@ -1470,16 +1470,7 @@ struct AbcPass : public Pass {
                pi_map.clear();
                po_map.clear();
 
-#ifdef ABCEXTERNAL
-               std::string exe_file;
-               if (std::getenv("ABC")) {
-                       exe_file = std::getenv("ABC");
-               } else {
-                       exe_file = ABCEXTERNAL;
-               }
-#else
-               std::string exe_file = proc_self_dirname() + proc_program_prefix() + "yosys-abc";
-#endif
+               std::string exe_file = yosys_abc_executable;
                std::string script_file, liberty_file, constr_file, clk_str;
                std::string delay_target, sop_inputs, sop_products, lutin_shared = "-S 1";
                bool fast_mode = false, dff_mode = false, keepff = false, cleanup = true;
@@ -1494,13 +1485,6 @@ struct AbcPass : public Pass {
                enabled_gates.clear();
                cmos_cost = false;
 
-#ifdef _WIN32
-#ifndef ABCEXTERNAL
-               if (!check_file_exists(exe_file + ".exe") && check_file_exists(proc_self_dirname() + "..\\" + proc_program_prefix()+ "yosys-abc.exe"))
-                       exe_file = proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc";
-#endif
-#endif
-
                // get arguments from scratchpad first, then override by command arguments
                std::string lut_arg, luts_arg, g_arg;
                exe_file = design->scratchpad_get_string("abc.exe", exe_file /* inherit default value if not set */);
index 7355840aa97d0eb1fdfccdf02488f3075f170260..b916b049d07f77874817c6908ae6f541f3229efa 100644 (file)
@@ -379,11 +379,7 @@ struct Abc9ExePass : public Pass {
        {
                log_header(design, "Executing ABC9_EXE pass (technology mapping using ABC9).\n");
 
-#ifdef ABCEXTERNAL
-               std::string exe_file = ABCEXTERNAL;
-#else
-               std::string exe_file = proc_self_dirname() + proc_program_prefix()+ "yosys-abc";
-#endif
+               std::string exe_file = yosys_abc_executable;
                std::string script_file, clk_str, box_file, lut_file;
                std::string delay_target, lutin_shared = "-S 1", wire_delay;
                std::string tempdir_name;
@@ -396,13 +392,6 @@ struct Abc9ExePass : public Pass {
                show_tempdir = true;
 #endif
 
-#ifdef _WIN32
-#ifndef ABCEXTERNAL
-               if (!check_file_exists(exe_file + ".exe") && check_file_exists(proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc.exe"))
-                       exe_file = proc_self_dirname() + "..\\" + proc_program_prefix() + "yosys-abc";
-#endif
-#endif
-
                std::string lut_arg, luts_arg;
                exe_file = design->scratchpad_get_string("abc9.exe", exe_file /* inherit default value if not set */);
                script_file = design->scratchpad_get_string("abc9.script", script_file);