mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 09:05:32 +00:00
Add WASI platform support.
This includes the following significant changes: * Patching ezsat and minisat to disable resource limiting code on WASM/WASI, since the POSIX functions they use are unavailable. * Adding a new definition, YOSYS_DISABLE_SPAWN, present if platform does not support spawning subprocesses (i.e. Emscripten or WASI). This definition hides the definition of `run_command()`. * Adding a new Makefile flag, DISABLE_SPAWN, present in the same condition. This flag disables all passes that require spawning subprocesses for their function.
This commit is contained in:
parent
bc380b0b56
commit
b43c282e4e
17 changed files with 167 additions and 30 deletions
|
@ -1,5 +1,7 @@
|
|||
|
||||
ifeq ($(DISABLE_SPAWN),0)
|
||||
OBJS += passes/cmds/exec.o
|
||||
endif
|
||||
OBJS += passes/cmds/add.o
|
||||
OBJS += passes/cmds/delete.o
|
||||
OBJS += passes/cmds/design.o
|
||||
|
@ -32,6 +34,8 @@ OBJS += passes/cmds/chformal.o
|
|||
OBJS += passes/cmds/chtype.o
|
||||
OBJS += passes/cmds/blackbox.o
|
||||
OBJS += passes/cmds/ltp.o
|
||||
ifeq ($(DISABLE_SPAWN),0)
|
||||
OBJS += passes/cmds/bugpoint.o
|
||||
endif
|
||||
OBJS += passes/cmds/scratchpad.o
|
||||
OBJS += passes/cmds/logger.o
|
||||
|
|
|
@ -101,8 +101,8 @@ struct CoverPass : public Pass {
|
|||
const std::string &filename = args[++argidx];
|
||||
FILE *f = nullptr;
|
||||
if (args[argidx-1] == "-d") {
|
||||
#ifdef _WIN32
|
||||
log_cmd_error("The 'cover -d' option is not supported on win32.\n");
|
||||
#if defined(_WIN32) || defined(__wasm)
|
||||
log_cmd_error("The 'cover -d' option is not supported on this platform.\n");
|
||||
#else
|
||||
char filename_buffer[4096];
|
||||
snprintf(filename_buffer, 4096, "%s/yosys_cover_%d_XXXXXX.txt", filename.c_str(), getpid());
|
||||
|
|
|
@ -682,7 +682,7 @@ struct ShowPass : public Pass {
|
|||
std::vector<std::pair<std::string, RTLIL::Selection>> color_selections;
|
||||
std::vector<std::pair<std::string, RTLIL::Selection>> label_selections;
|
||||
|
||||
#if defined(EMSCRIPTEN) || defined(_WIN32)
|
||||
#if defined(_WIN32) || defined(YOSYS_DISABLE_SPAWN)
|
||||
std::string format = "dot";
|
||||
std::string prefix = "show";
|
||||
#else
|
||||
|
@ -849,10 +849,15 @@ struct ShowPass : public Pass {
|
|||
std::string cmd = stringf(DOT_CMD, format.c_str(), dot_file.c_str(), out_file.c_str(), out_file.c_str(), out_file.c_str());
|
||||
#undef DOT_CMD
|
||||
log("Exec: %s\n", cmd.c_str());
|
||||
if (run_command(cmd) != 0)
|
||||
log_cmd_error("Shell command failed!\n");
|
||||
#if !defined(YOSYS_DISABLE_SPAWN)
|
||||
if (run_command(cmd) != 0)
|
||||
log_cmd_error("Shell command failed!\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(YOSYS_DISABLE_SPAWN)
|
||||
log_assert(viewer_exe.empty() && !format.empty());
|
||||
#else
|
||||
if (!viewer_exe.empty()) {
|
||||
#ifdef _WIN32
|
||||
// system()/cmd.exe does not understand single quotes nor
|
||||
|
@ -876,6 +881,7 @@ struct ShowPass : public Pass {
|
|||
if (run_command(cmd) != 0)
|
||||
log_cmd_error("Shell command failed!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (flag_pause) {
|
||||
#ifdef YOSYS_ENABLE_READLINE
|
||||
|
|
|
@ -13,5 +13,6 @@ OBJS += passes/sat/fmcombine.o
|
|||
OBJS += passes/sat/mutate.o
|
||||
OBJS += passes/sat/cutpoint.o
|
||||
OBJS += passes/sat/fminit.o
|
||||
ifeq ($(DISABLE_SPAWN),0)
|
||||
OBJS += passes/sat/qbfsat.o
|
||||
|
||||
endif
|
||||
|
|
|
@ -57,7 +57,7 @@ passes/techmap/techmap.inc: techlibs/common/techmap.v
|
|||
|
||||
passes/techmap/techmap.o: passes/techmap/techmap.inc
|
||||
|
||||
ifneq ($(CONFIG),emcc)
|
||||
ifeq ($(DISABLE_SPAWN),0)
|
||||
TARGETS += $(PROGRAM_PREFIX)yosys-filterlib$(EXE)
|
||||
EXTRA_OBJS += passes/techmap/filterlib.o
|
||||
|
||||
|
|
|
@ -771,7 +771,10 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin
|
|||
if (abc_script[i] == ';' && abc_script[i+1] == ' ')
|
||||
abc_script[i+1] = '\n';
|
||||
|
||||
FILE *f = fopen(stringf("%s/abc.script", tempdir_name.c_str()).c_str(), "wt");
|
||||
std::string buffer = stringf("%s/abc.script", tempdir_name.c_str());
|
||||
FILE *f = fopen(buffer.c_str(), "wt");
|
||||
if (f == nullptr)
|
||||
log_error("Opening %s for writing failed: %s\n", buffer.c_str(), strerror(errno));
|
||||
fprintf(f, "%s\n", abc_script.c_str());
|
||||
fclose(f);
|
||||
|
||||
|
@ -807,7 +810,7 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin
|
|||
|
||||
handle_loops();
|
||||
|
||||
std::string buffer = stringf("%s/input.blif", tempdir_name.c_str());
|
||||
buffer = stringf("%s/input.blif", tempdir_name.c_str());
|
||||
f = fopen(buffer.c_str(), "wt");
|
||||
if (f == nullptr)
|
||||
log_error("Opening %s for writing failed: %s\n", buffer.c_str(), strerror(errno));
|
||||
|
@ -1541,11 +1544,15 @@ struct AbcPass : public Pass {
|
|||
|
||||
size_t argidx, g_argidx;
|
||||
bool g_arg_from_cmd = false;
|
||||
#if defined(__wasm)
|
||||
const char *pwd = ".";
|
||||
#else
|
||||
char pwd [PATH_MAX];
|
||||
if (!getcwd(pwd, sizeof(pwd))) {
|
||||
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
||||
log_abort();
|
||||
}
|
||||
#endif
|
||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||
std::string arg = args[argidx];
|
||||
if (arg == "-exe" && argidx+1 < args.size()) {
|
||||
|
|
|
@ -420,11 +420,15 @@ struct Abc9ExePass : public Pass {
|
|||
}
|
||||
|
||||
size_t argidx;
|
||||
#if defined(__wasm)
|
||||
const char *pwd = ".";
|
||||
#else
|
||||
char pwd [PATH_MAX];
|
||||
if (!getcwd(pwd, sizeof(pwd))) {
|
||||
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
||||
log_abort();
|
||||
}
|
||||
#endif
|
||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||
std::string arg = args[argidx];
|
||||
if (arg == "-exe" && argidx+1 < args.size()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue