diff options
-rw-r--r-- | kernel/fstdata.cc | 2 | ||||
-rw-r--r-- | kernel/yosys.cc | 64 | ||||
-rw-r--r-- | kernel/yosys.h | 5 | ||||
-rw-r--r-- | passes/sat/qbfsat.cc | 2 | ||||
-rw-r--r-- | passes/techmap/abc.cc | 2 | ||||
-rw-r--r-- | passes/techmap/abc9.cc | 2 |
6 files changed, 47 insertions, 30 deletions
diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index fea8ee3c3..b2e574b02 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -33,7 +33,7 @@ FstData::FstData(std::string filename) : ctx(nullptr) std::string filename_trim = file_base_name(filename); if (filename_trim.size() > 4 && filename_trim.compare(filename_trim.size()-4, std::string::npos, ".vcd") == 0) { filename_trim.erase(filename_trim.size()-4); - tmp_file = stringf("/tmp/converted_%s.fst", filename_trim.c_str()); + tmp_file = stringf("%s/converted_%s.fst", get_base_tmpdir().c_str(), filename_trim.c_str()); std::string cmd = stringf("vcd2fst %s %s", filename.c_str(), tmp_file.c_str()); log("Exec: %s\n", cmd.c_str()); if (run_command(cmd) != 0) diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 4e1a3ca7e..64d2b4def 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -376,35 +376,54 @@ int run_command(const std::string &command, std::function<void(const std::string } #endif -std::string make_temp_file(std::string template_str) +std::string get_base_tmpdir() { -#if defined(__wasm) - size_t pos = template_str.rfind("XXXXXX"); - log_assert(pos != std::string::npos); - static size_t index = 0; - template_str.replace(pos, 6, stringf("%06zu", index++)); -#elif defined(_WIN32) - if (template_str.rfind("/tmp/", 0) == 0) { + static std::string tmpdir; + + if (!tmpdir.empty()) { + return tmpdir; + } + +#if defined(_WIN32) # ifdef __MINGW32__ - char longpath[MAX_PATH + 1]; - char shortpath[MAX_PATH + 1]; + char longpath[MAX_PATH + 1]; + char shortpath[MAX_PATH + 1]; # else - WCHAR longpath[MAX_PATH + 1]; - TCHAR shortpath[MAX_PATH + 1]; + WCHAR longpath[MAX_PATH + 1]; + TCHAR shortpath[MAX_PATH + 1]; # endif - if (!GetTempPath(MAX_PATH+1, longpath)) - log_error("GetTempPath() failed.\n"); - if (!GetShortPathName(longpath, shortpath, MAX_PATH + 1)) - log_error("GetShortPathName() failed.\n"); - std::string path; - for (int i = 0; shortpath[i]; i++) - path += char(shortpath[i]); - template_str = stringf("%s\\%s", path.c_str(), template_str.c_str() + 5); + if (!GetTempPath(MAX_PATH+1, longpath)) + log_error("GetTempPath() failed.\n"); + if (!GetShortPathName(longpath, shortpath, MAX_PATH + 1)) + log_error("GetShortPathName() failed.\n"); + for (int i = 0; shortpath[i]; i++) + tmpdir += char(shortpath[i]); +#else + char * var = std::getenv("TMPDIR"); + if (var && strlen(var)!=0) { + tmpdir.assign(var); + // We return the directory name without the trailing '/' + while (!tmpdir.empty() && (tmpdir.back() == '/')) { + tmpdir.pop_back(); + } + } else { + tmpdir.assign("/tmp"); } +#endif + return tmpdir; +} +std::string make_temp_file(std::string template_str) +{ size_t pos = template_str.rfind("XXXXXX"); log_assert(pos != std::string::npos); - +#if defined(__wasm) + static size_t index = 0; + template_str.replace(pos, 6, stringf("%06zu", index++)); +#elif defined(_WIN32) +#ifndef YOSYS_WIN32_UNIX_DIR + std::replace(template_str.begin(), template_str.end(), '/', '\\'); +#endif while (1) { for (int i = 0; i < 6; i++) { static std::string y = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -416,9 +435,6 @@ std::string make_temp_file(std::string template_str) break; } #else - size_t pos = template_str.rfind("XXXXXX"); - log_assert(pos != std::string::npos); - int suffixlen = GetSize(template_str) - pos - 6; char *p = strdup(template_str.c_str()); diff --git a/kernel/yosys.h b/kernel/yosys.h index 93e7ff23e..448f896d4 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -278,8 +278,9 @@ bool patmatch(const char *pattern, const char *string); #if !defined(YOSYS_DISABLE_SPAWN) int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>()); #endif -std::string make_temp_file(std::string template_str = "/tmp/yosys_XXXXXX"); -std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX"); +std::string get_base_tmpdir(); +std::string make_temp_file(std::string template_str = get_base_tmpdir() + "/yosys_XXXXXX"); +std::string make_temp_dir(std::string template_str = get_base_tmpdir() + "/yosys_XXXXXX"); bool check_file_exists(std::string filename, bool is_exec = false); bool is_absolute_path(std::string filename); void remove_directory(std::string dirname); diff --git a/passes/sat/qbfsat.cc b/passes/sat/qbfsat.cc index 6db7d4b64..864d6f05d 100644 --- a/passes/sat/qbfsat.cc +++ b/passes/sat/qbfsat.cc @@ -251,7 +251,7 @@ QbfSolutionType call_qbf_solver(RTLIL::Module *mod, const QbfSolveOptions &opt, QbfSolutionType qbf_solve(RTLIL::Module *mod, const QbfSolveOptions &opt) { QbfSolutionType ret, best_soln; - const std::string tempdir_name = make_temp_dir("/tmp/yosys-qbfsat-XXXXXX"); + const std::string tempdir_name = make_temp_dir(get_base_tmpdir() + "/yosys-qbfsat-XXXXXX"); RTLIL::Module *module = mod; RTLIL::Design *design = module->design; std::string module_name = module->name.str(); diff --git a/passes/techmap/abc.cc b/passes/techmap/abc.cc index ff98a6e36..61ee99ee7 100644 --- a/passes/techmap/abc.cc +++ b/passes/techmap/abc.cc @@ -780,7 +780,7 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin if (dff_mode && clk_sig.empty()) log_cmd_error("Clock domain %s not found.\n", clk_str.c_str()); - std::string tempdir_name = "/tmp/" + proc_program_prefix()+ "yosys-abc-XXXXXX"; + std::string tempdir_name = get_base_tmpdir() + "/" + proc_program_prefix()+ "yosys-abc-XXXXXX"; if (!cleanup) tempdir_name[0] = tempdir_name[4] = '_'; tempdir_name = make_temp_dir(tempdir_name); diff --git a/passes/techmap/abc9.cc b/passes/techmap/abc9.cc index fe0802d70..79c994b11 100644 --- a/passes/techmap/abc9.cc +++ b/passes/techmap/abc9.cc @@ -404,7 +404,7 @@ struct Abc9Pass : public ScriptPass if (!active_design->selected_whole_module(mod)) log_error("Can't handle partially selected module %s!\n", log_id(mod)); - std::string tempdir_name = "/tmp/" + proc_program_prefix() + "yosys-abc-XXXXXX"; + std::string tempdir_name = get_base_tmpdir() + "/" + proc_program_prefix() + "yosys-abc-XXXXXX"; if (!cleanup) tempdir_name[0] = tempdir_name[4] = '_'; tempdir_name = make_temp_dir(tempdir_name); |