aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiodrag Milanović <mmicko@gmail.com>2022-05-27 16:51:16 +0200
committerGitHub <noreply@github.com>2022-05-27 16:51:16 +0200
commit197c9e04e8778f99f82b1b6bddc9eba3fbf85104 (patch)
treede4c512aa6585c989dcd8a551f969bab0483dfee
parentbf78041e8977effbce3a0928bfa22632222e8bbd (diff)
parent08275a1569af7d925ff28ff0288d9779057d27a9 (diff)
downloadyosys-197c9e04e8778f99f82b1b6bddc9eba3fbf85104.tar.gz
yosys-197c9e04e8778f99f82b1b6bddc9eba3fbf85104.tar.bz2
yosys-197c9e04e8778f99f82b1b6bddc9eba3fbf85104.zip
Merge pull request #3333 from mohamed/feature/tmpdir
Observe $TMPDIR variable when creating tmp files
-rw-r--r--kernel/fstdata.cc2
-rw-r--r--kernel/yosys.cc64
-rw-r--r--kernel/yosys.h5
-rw-r--r--passes/sat/qbfsat.cc2
-rw-r--r--passes/techmap/abc.cc2
-rw-r--r--passes/techmap/abc9.cc2
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);