mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #2001 from whitequark/wasi
Add WASI platform support
This commit is contained in:
commit
bbde241942
48
Makefile
48
Makefile
|
@ -4,6 +4,7 @@ CONFIG := clang
|
||||||
# CONFIG := gcc-4.8
|
# CONFIG := gcc-4.8
|
||||||
# CONFIG := afl-gcc
|
# CONFIG := afl-gcc
|
||||||
# CONFIG := emcc
|
# CONFIG := emcc
|
||||||
|
# CONFIG := wasi
|
||||||
# CONFIG := mxe
|
# CONFIG := mxe
|
||||||
# CONFIG := msys2
|
# CONFIG := msys2
|
||||||
# CONFIG := msys2-64
|
# CONFIG := msys2-64
|
||||||
|
@ -32,7 +33,9 @@ ENABLE_NDEBUG := 0
|
||||||
LINK_CURSES := 0
|
LINK_CURSES := 0
|
||||||
LINK_TERMCAP := 0
|
LINK_TERMCAP := 0
|
||||||
LINK_ABC := 0
|
LINK_ABC := 0
|
||||||
# Needed for environments that don't have proper thread support (i.e. emscripten)
|
# Needed for environments that can't run executables (i.e. emscripten, wasm)
|
||||||
|
DISABLE_SPAWN := 0
|
||||||
|
# Needed for environments that don't have proper thread support (i.e. emscripten, wasm--for now)
|
||||||
DISABLE_ABC_THREADS := 0
|
DISABLE_ABC_THREADS := 0
|
||||||
|
|
||||||
# clang sanitizers
|
# clang sanitizers
|
||||||
|
@ -253,6 +256,8 @@ LDFLAGS += $(EMCCFLAGS)
|
||||||
LDLIBS =
|
LDLIBS =
|
||||||
EXE = .js
|
EXE = .js
|
||||||
|
|
||||||
|
DISABLE_SPAWN := 1
|
||||||
|
|
||||||
TARGETS := $(filter-out $(PROGRAM_PREFIX)yosys-config,$(TARGETS))
|
TARGETS := $(filter-out $(PROGRAM_PREFIX)yosys-config,$(TARGETS))
|
||||||
EXTRA_TARGETS += yosysjs-$(YOSYS_VER).zip
|
EXTRA_TARGETS += yosysjs-$(YOSYS_VER).zip
|
||||||
|
|
||||||
|
@ -274,6 +279,35 @@ yosysjs-$(YOSYS_VER).zip: yosys.js yosys.wasm viz.js misc/yosysjs/*
|
||||||
yosys.html: misc/yosys.html
|
yosys.html: misc/yosys.html
|
||||||
$(P) cp misc/yosys.html yosys.html
|
$(P) cp misc/yosys.html yosys.html
|
||||||
|
|
||||||
|
else ifeq ($(CONFIG),wasi)
|
||||||
|
ifeq ($(WASI_SDK),)
|
||||||
|
CXX = clang++
|
||||||
|
LD = clang++
|
||||||
|
AR = llvm-ar
|
||||||
|
RANLIB = llvm-ranlib
|
||||||
|
WASIFLAGS := -target wasm32-wasi --sysroot $(WASI_SYSROOT) $(WASIFLAGS)
|
||||||
|
else
|
||||||
|
CXX = $(WASI_SDK)/bin/clang++
|
||||||
|
LD = $(WASI_SDK)/bin/clang++
|
||||||
|
AR = $(WASI_SDK)/bin/ar
|
||||||
|
RANLIB = $(WASI_SDK)/bin/ranlib
|
||||||
|
WASIFLAGS := --sysroot $(WASI_SDK)/share/wasi-sysroot $(WASIFLAGS)
|
||||||
|
endif
|
||||||
|
CXXFLAGS := $(WASIFLAGS) -std=c++11 -Os $(filter-out -fPIC,$(CXXFLAGS))
|
||||||
|
LDFLAGS := $(WASIFLAGS) -Wl,-z,stack-size=1048576 $(filter-out -rdynamic,$(LDFLAGS))
|
||||||
|
LDLIBS := $(filter-out -lrt,$(LDLIBS))
|
||||||
|
ABCMKARGS += AR="$(AR)" RANLIB="$(RANLIB)"
|
||||||
|
ABCMKARGS += ARCHFLAGS="$(WASIFLAGS) -DABC_USE_STDINT_H -DABC_NO_DYNAMIC_LINKING"
|
||||||
|
ABCMKARGS += OPTFLAGS="-Os"
|
||||||
|
EXE = .wasm
|
||||||
|
|
||||||
|
DISABLE_SPAWN := 1
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_ABC),1)
|
||||||
|
LINK_ABC := 1
|
||||||
|
DISABLE_ABC_THREADS := 1
|
||||||
|
endif
|
||||||
|
|
||||||
else ifeq ($(CONFIG),mxe)
|
else ifeq ($(CONFIG),mxe)
|
||||||
PKG_CONFIG = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-pkg-config
|
PKG_CONFIG = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-pkg-config
|
||||||
CXX = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-g++
|
CXX = /usr/local/src/mxe/usr/bin/i686-w64-mingw32.static-g++
|
||||||
|
@ -396,6 +430,10 @@ ifeq ($(DISABLE_ABC_THREADS),1)
|
||||||
ABCMKARGS += "ABC_USE_NO_PTHREADS=1"
|
ABCMKARGS += "ABC_USE_NO_PTHREADS=1"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(DISABLE_SPAWN),1)
|
||||||
|
CXXFLAGS += -DYOSYS_DISABLE_SPAWN
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(ENABLE_PLUGINS),1)
|
ifeq ($(ENABLE_PLUGINS),1)
|
||||||
CXXFLAGS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --cflags libffi) -DYOSYS_ENABLE_PLUGINS
|
CXXFLAGS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --cflags libffi) -DYOSYS_ENABLE_PLUGINS
|
||||||
LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --libs libffi || echo -lffi)
|
LDLIBS += $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) --silence-errors --libs libffi || echo -lffi)
|
||||||
|
@ -911,6 +949,14 @@ config-emcc: clean
|
||||||
echo 'ENABLE_READLINE := 0' >> Makefile.conf
|
echo 'ENABLE_READLINE := 0' >> Makefile.conf
|
||||||
echo 'ENABLE_ZLIB := 0' >> Makefile.conf
|
echo 'ENABLE_ZLIB := 0' >> Makefile.conf
|
||||||
|
|
||||||
|
config-wasi: clean
|
||||||
|
echo 'CONFIG := wasi' > Makefile.conf
|
||||||
|
echo 'ENABLE_TCL := 0' >> Makefile.conf
|
||||||
|
echo 'ENABLE_ABC := 0' >> Makefile.conf
|
||||||
|
echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
|
||||||
|
echo 'ENABLE_READLINE := 0' >> Makefile.conf
|
||||||
|
echo 'ENABLE_ZLIB := 0' >> Makefile.conf
|
||||||
|
|
||||||
config-mxe: clean
|
config-mxe: clean
|
||||||
echo 'CONFIG := mxe' > Makefile.conf
|
echo 'CONFIG := mxe' > Makefile.conf
|
||||||
echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
|
echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
ifneq ($(CONFIG),emcc)
|
ifeq ($(DISABLE_SPAWN),0)
|
||||||
OBJS += frontends/rpc/rpc_frontend.o
|
OBJS += frontends/rpc/rpc_frontend.o
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -155,6 +155,19 @@ int yosys_history_offset = 0;
|
||||||
std::string yosys_history_file;
|
std::string yosys_history_file;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__wasm)
|
||||||
|
extern "C" {
|
||||||
|
// FIXME: WASI does not currently support exceptions.
|
||||||
|
void* __cxa_allocate_exception(size_t thrown_size) throw() {
|
||||||
|
return malloc(thrown_size);
|
||||||
|
}
|
||||||
|
bool __cxa_uncaught_exception() throw();
|
||||||
|
void __cxa_throw(void* thrown_exception, struct std::type_info * tinfo, void (*dest)(void*)) {
|
||||||
|
std::terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void yosys_atexit()
|
void yosys_atexit()
|
||||||
{
|
{
|
||||||
#if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE)
|
#if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE)
|
||||||
|
@ -587,7 +600,9 @@ int main(int argc, char **argv)
|
||||||
ru_buffer.ru_utime.tv_usec += ru_buffer_children.ru_utime.tv_usec;
|
ru_buffer.ru_utime.tv_usec += ru_buffer_children.ru_utime.tv_usec;
|
||||||
ru_buffer.ru_stime.tv_sec += ru_buffer_children.ru_stime.tv_sec;
|
ru_buffer.ru_stime.tv_sec += ru_buffer_children.ru_stime.tv_sec;
|
||||||
ru_buffer.ru_stime.tv_usec += ru_buffer_children.ru_stime.tv_usec;
|
ru_buffer.ru_stime.tv_usec += ru_buffer_children.ru_stime.tv_usec;
|
||||||
|
#if defined(__linux__) || defined(__FreeBSD__)
|
||||||
ru_buffer.ru_maxrss = std::max(ru_buffer.ru_maxrss, ru_buffer_children.ru_maxrss);
|
ru_buffer.ru_maxrss = std::max(ru_buffer.ru_maxrss, ru_buffer_children.ru_maxrss);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#if defined(__linux__) || defined(__FreeBSD__)
|
#if defined(__linux__) || defined(__FreeBSD__)
|
||||||
meminfo = stringf(", MEM: %.2f MB peak",
|
meminfo = stringf(", MEM: %.2f MB peak",
|
||||||
|
|
|
@ -238,6 +238,7 @@ void Pass::call(RTLIL::Design *design, std::string command)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (tok[0] == '!') {
|
if (tok[0] == '!') {
|
||||||
|
#if !defined(YOSYS_DISABLE_SPAWN)
|
||||||
cmd_buf = command.substr(command.find('!') + 1);
|
cmd_buf = command.substr(command.find('!') + 1);
|
||||||
while (!cmd_buf.empty() && (cmd_buf.back() == ' ' || cmd_buf.back() == '\t' ||
|
while (!cmd_buf.empty() && (cmd_buf.back() == ' ' || cmd_buf.back() == '\t' ||
|
||||||
cmd_buf.back() == '\r' || cmd_buf.back() == '\n'))
|
cmd_buf.back() == '\r' || cmd_buf.back() == '\n'))
|
||||||
|
@ -247,6 +248,9 @@ void Pass::call(RTLIL::Design *design, std::string command)
|
||||||
if (retCode != 0)
|
if (retCode != 0)
|
||||||
log_cmd_error("Shell command returned error code %d.\n", retCode);
|
log_cmd_error("Shell command returned error code %d.\n", retCode);
|
||||||
return;
|
return;
|
||||||
|
#else
|
||||||
|
log_cmd_error("Shell is not available.\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!tok.empty()) {
|
while (!tok.empty()) {
|
||||||
|
|
|
@ -45,8 +45,10 @@
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# include <dirent.h>
|
# include <dirent.h>
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# include <sys/wait.h>
|
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
|
# if !defined(YOSYS_DISABLE_SPAWN)
|
||||||
|
# include <sys/wait.h>
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_WIN32) && defined(YOSYS_ENABLE_GLOB)
|
#if !defined(_WIN32) && defined(YOSYS_ENABLE_GLOB)
|
||||||
|
@ -336,16 +338,13 @@ bool patmatch(const char *pattern, const char *string)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(YOSYS_DISABLE_SPAWN)
|
||||||
int run_command(const std::string &command, std::function<void(const std::string&)> process_line)
|
int run_command(const std::string &command, std::function<void(const std::string&)> process_line)
|
||||||
{
|
{
|
||||||
if (!process_line)
|
if (!process_line)
|
||||||
return system(command.c_str());
|
return system(command.c_str());
|
||||||
|
|
||||||
#ifdef EMSCRIPTEN
|
|
||||||
FILE *f = nullptr;
|
|
||||||
#else
|
|
||||||
FILE *f = popen(command.c_str(), "r");
|
FILE *f = popen(command.c_str(), "r");
|
||||||
#endif
|
|
||||||
if (f == nullptr)
|
if (f == nullptr)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -368,10 +367,16 @@ int run_command(const std::string &command, std::function<void(const std::string
|
||||||
return WEXITSTATUS(ret);
|
return WEXITSTATUS(ret);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
std::string make_temp_file(std::string template_str)
|
std::string make_temp_file(std::string template_str)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#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) {
|
if (template_str.rfind("/tmp/", 0) == 0) {
|
||||||
# ifdef __MINGW32__
|
# ifdef __MINGW32__
|
||||||
char longpath[MAX_PATH + 1];
|
char longpath[MAX_PATH + 1];
|
||||||
|
@ -420,10 +425,14 @@ std::string make_temp_file(std::string template_str)
|
||||||
|
|
||||||
std::string make_temp_dir(std::string template_str)
|
std::string make_temp_dir(std::string template_str)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32)
|
||||||
template_str = make_temp_file(template_str);
|
template_str = make_temp_file(template_str);
|
||||||
mkdir(template_str.c_str());
|
mkdir(template_str.c_str());
|
||||||
return template_str;
|
return template_str;
|
||||||
|
#elif defined(__wasm)
|
||||||
|
template_str = make_temp_file(template_str);
|
||||||
|
mkdir(template_str.c_str(), 0777);
|
||||||
|
return template_str;
|
||||||
#else
|
#else
|
||||||
# ifndef NDEBUG
|
# ifndef NDEBUG
|
||||||
size_t pos = template_str.rfind("XXXXXX");
|
size_t pos = template_str.rfind("XXXXXX");
|
||||||
|
@ -806,7 +815,7 @@ std::string proc_self_dirname()
|
||||||
path += char(shortpath[i]);
|
path += char(shortpath[i]);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
#elif defined(EMSCRIPTEN)
|
#elif defined(EMSCRIPTEN) || defined(__wasm)
|
||||||
std::string proc_self_dirname()
|
std::string proc_self_dirname()
|
||||||
{
|
{
|
||||||
return "/";
|
return "/";
|
||||||
|
@ -815,7 +824,7 @@ std::string proc_self_dirname()
|
||||||
#error "Don't know how to determine process executable base path!"
|
#error "Don't know how to determine process executable base path!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EMSCRIPTEN
|
#if defined(EMSCRIPTEN) || defined(__wasm)
|
||||||
std::string proc_share_dirname()
|
std::string proc_share_dirname()
|
||||||
{
|
{
|
||||||
return "/share/";
|
return "/share/";
|
||||||
|
|
|
@ -264,7 +264,9 @@ int readsome(std::istream &f, char *s, int n);
|
||||||
std::string next_token(std::string &text, const char *sep = " \t\r\n", bool long_strings = false);
|
std::string next_token(std::string &text, const char *sep = " \t\r\n", bool long_strings = false);
|
||||||
std::vector<std::string> split_tokens(const std::string &text, const char *sep = " \t\r\n");
|
std::vector<std::string> split_tokens(const std::string &text, const char *sep = " \t\r\n");
|
||||||
bool patmatch(const char *pattern, const char *string);
|
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&)>());
|
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_file(std::string template_str = "/tmp/yosys_XXXXXX");
|
||||||
std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX");
|
std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX");
|
||||||
bool check_file_exists(std::string filename, bool is_exec = false);
|
bool check_file_exists(std::string filename, bool is_exec = false);
|
||||||
|
|
|
@ -29,11 +29,12 @@
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <csignal>
|
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if !defined(_WIN32) && !defined(__wasm)
|
||||||
|
# include <csignal>
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
|
# define HAS_ALARM
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../minisat/Solver.h"
|
#include "../minisat/Solver.h"
|
||||||
|
@ -84,7 +85,7 @@ bool ezMiniSAT::eliminated(int idx)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if defined(HAS_ALARM)
|
||||||
ezMiniSAT *ezMiniSAT::alarmHandlerThis = NULL;
|
ezMiniSAT *ezMiniSAT::alarmHandlerThis = NULL;
|
||||||
clock_t ezMiniSAT::alarmHandlerTimeout = 0;
|
clock_t ezMiniSAT::alarmHandlerTimeout = 0;
|
||||||
|
|
||||||
|
@ -183,7 +184,7 @@ contradiction:
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if defined(HAS_ALARM)
|
||||||
struct sigaction sig_action;
|
struct sigaction sig_action;
|
||||||
struct sigaction old_sig_action;
|
struct sigaction old_sig_action;
|
||||||
int old_alarm_timeout = 0;
|
int old_alarm_timeout = 0;
|
||||||
|
@ -202,7 +203,7 @@ contradiction:
|
||||||
|
|
||||||
bool foundSolution = minisatSolver->solve(assumps);
|
bool foundSolution = minisatSolver->solve(assumps);
|
||||||
|
|
||||||
#ifndef _WIN32
|
#if defined(HAS_ALARM)
|
||||||
if (solverTimeout > 0) {
|
if (solverTimeout > 0) {
|
||||||
if (alarmHandlerTimeout == 0)
|
if (alarmHandlerTimeout == 0)
|
||||||
solverTimoutStatus = true;
|
solverTimoutStatus = true;
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
--- System.cc
|
||||||
|
+++ System.cc
|
||||||
|
@@ -101,7 +101,7 @@ double Minisat::memUsedPeak(bool) { return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
-#if !defined(_MSC_VER) && !defined(__MINGW32__)
|
||||||
|
+#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__wasm)
|
||||||
|
void Minisat::limitMemory(uint64_t max_mem_mb)
|
||||||
|
{
|
||||||
|
// FIXME: OpenBSD does not support RLIMIT_AS. Not sure how well RLIMIT_DATA works instead.
|
||||||
|
@@ -133,7 +133,7 @@ void Minisat::limitMemory(uint64_t /*max_mem_mb*/)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
-#if !defined(_MSC_VER) && !defined(__MINGW32__)
|
||||||
|
+#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__wasm)
|
||||||
|
void Minisat::limitTime(uint32_t max_cpu_time)
|
||||||
|
{
|
||||||
|
if (max_cpu_time != 0){
|
||||||
|
@@ -156,9 +156,13 @@ void Minisat::limitTime(uint32_t /*max_cpu_time*/)
|
||||||
|
|
||||||
|
void Minisat::sigTerm(void handler(int))
|
||||||
|
{
|
||||||
|
+#if defined(__wasm)
|
||||||
|
+ (void)handler;
|
||||||
|
+#else
|
||||||
|
signal(SIGINT, handler);
|
||||||
|
signal(SIGTERM,handler);
|
||||||
|
#ifdef SIGXCPU
|
||||||
|
signal(SIGXCPU,handler);
|
||||||
|
#endif
|
||||||
|
+#endif
|
||||||
|
}
|
|
@ -16,4 +16,4 @@ patch -p0 < 00_PATCH_mkLit_default_arg.patch
|
||||||
patch -p0 < 00_PATCH_remove_zlib.patch
|
patch -p0 < 00_PATCH_remove_zlib.patch
|
||||||
patch -p0 < 00_PATCH_no_fpu_control.patch
|
patch -p0 < 00_PATCH_no_fpu_control.patch
|
||||||
patch -p0 < 00_PATCH_typofixes.patch
|
patch -p0 < 00_PATCH_typofixes.patch
|
||||||
|
patch -p0 < 00_PATCH_wasm.patch
|
||||||
|
|
|
@ -101,7 +101,7 @@ double Minisat::memUsedPeak(bool) { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_MSC_VER) && !defined(__MINGW32__)
|
#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__wasm)
|
||||||
void Minisat::limitMemory(uint64_t max_mem_mb)
|
void Minisat::limitMemory(uint64_t max_mem_mb)
|
||||||
{
|
{
|
||||||
// FIXME: OpenBSD does not support RLIMIT_AS. Not sure how well RLIMIT_DATA works instead.
|
// FIXME: OpenBSD does not support RLIMIT_AS. Not sure how well RLIMIT_DATA works instead.
|
||||||
|
@ -133,7 +133,7 @@ void Minisat::limitMemory(uint64_t /*max_mem_mb*/)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_MSC_VER) && !defined(__MINGW32__)
|
#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__wasm)
|
||||||
void Minisat::limitTime(uint32_t max_cpu_time)
|
void Minisat::limitTime(uint32_t max_cpu_time)
|
||||||
{
|
{
|
||||||
if (max_cpu_time != 0){
|
if (max_cpu_time != 0){
|
||||||
|
@ -156,9 +156,13 @@ void Minisat::limitTime(uint32_t /*max_cpu_time*/)
|
||||||
|
|
||||||
void Minisat::sigTerm(void handler(int))
|
void Minisat::sigTerm(void handler(int))
|
||||||
{
|
{
|
||||||
|
#if defined(__wasm)
|
||||||
|
(void)handler;
|
||||||
|
#else
|
||||||
signal(SIGINT, handler);
|
signal(SIGINT, handler);
|
||||||
signal(SIGTERM,handler);
|
signal(SIGTERM,handler);
|
||||||
#ifdef SIGXCPU
|
#ifdef SIGXCPU
|
||||||
signal(SIGXCPU,handler);
|
signal(SIGXCPU,handler);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
|
||||||
|
ifeq ($(DISABLE_SPAWN),0)
|
||||||
OBJS += passes/cmds/exec.o
|
OBJS += passes/cmds/exec.o
|
||||||
|
endif
|
||||||
OBJS += passes/cmds/add.o
|
OBJS += passes/cmds/add.o
|
||||||
OBJS += passes/cmds/delete.o
|
OBJS += passes/cmds/delete.o
|
||||||
OBJS += passes/cmds/design.o
|
OBJS += passes/cmds/design.o
|
||||||
|
@ -32,6 +34,8 @@ OBJS += passes/cmds/chformal.o
|
||||||
OBJS += passes/cmds/chtype.o
|
OBJS += passes/cmds/chtype.o
|
||||||
OBJS += passes/cmds/blackbox.o
|
OBJS += passes/cmds/blackbox.o
|
||||||
OBJS += passes/cmds/ltp.o
|
OBJS += passes/cmds/ltp.o
|
||||||
|
ifeq ($(DISABLE_SPAWN),0)
|
||||||
OBJS += passes/cmds/bugpoint.o
|
OBJS += passes/cmds/bugpoint.o
|
||||||
|
endif
|
||||||
OBJS += passes/cmds/scratchpad.o
|
OBJS += passes/cmds/scratchpad.o
|
||||||
OBJS += passes/cmds/logger.o
|
OBJS += passes/cmds/logger.o
|
||||||
|
|
|
@ -101,8 +101,8 @@ struct CoverPass : public Pass {
|
||||||
const std::string &filename = args[++argidx];
|
const std::string &filename = args[++argidx];
|
||||||
FILE *f = nullptr;
|
FILE *f = nullptr;
|
||||||
if (args[argidx-1] == "-d") {
|
if (args[argidx-1] == "-d") {
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32) || defined(__wasm)
|
||||||
log_cmd_error("The 'cover -d' option is not supported on win32.\n");
|
log_cmd_error("The 'cover -d' option is not supported on this platform.\n");
|
||||||
#else
|
#else
|
||||||
char filename_buffer[4096];
|
char filename_buffer[4096];
|
||||||
snprintf(filename_buffer, 4096, "%s/yosys_cover_%d_XXXXXX.txt", filename.c_str(), getpid());
|
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>> color_selections;
|
||||||
std::vector<std::pair<std::string, RTLIL::Selection>> label_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 format = "dot";
|
||||||
std::string prefix = "show";
|
std::string prefix = "show";
|
||||||
#else
|
#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());
|
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
|
#undef DOT_CMD
|
||||||
log("Exec: %s\n", cmd.c_str());
|
log("Exec: %s\n", cmd.c_str());
|
||||||
|
#if !defined(YOSYS_DISABLE_SPAWN)
|
||||||
if (run_command(cmd) != 0)
|
if (run_command(cmd) != 0)
|
||||||
log_cmd_error("Shell command failed!\n");
|
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()) {
|
if (!viewer_exe.empty()) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// system()/cmd.exe does not understand single quotes nor
|
// system()/cmd.exe does not understand single quotes nor
|
||||||
|
@ -876,6 +881,7 @@ struct ShowPass : public Pass {
|
||||||
if (run_command(cmd) != 0)
|
if (run_command(cmd) != 0)
|
||||||
log_cmd_error("Shell command failed!\n");
|
log_cmd_error("Shell command failed!\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (flag_pause) {
|
if (flag_pause) {
|
||||||
#ifdef YOSYS_ENABLE_READLINE
|
#ifdef YOSYS_ENABLE_READLINE
|
||||||
|
|
|
@ -13,5 +13,6 @@ OBJS += passes/sat/fmcombine.o
|
||||||
OBJS += passes/sat/mutate.o
|
OBJS += passes/sat/mutate.o
|
||||||
OBJS += passes/sat/cutpoint.o
|
OBJS += passes/sat/cutpoint.o
|
||||||
OBJS += passes/sat/fminit.o
|
OBJS += passes/sat/fminit.o
|
||||||
|
ifeq ($(DISABLE_SPAWN),0)
|
||||||
OBJS += passes/sat/qbfsat.o
|
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
|
passes/techmap/techmap.o: passes/techmap/techmap.inc
|
||||||
|
|
||||||
ifneq ($(CONFIG),emcc)
|
ifeq ($(DISABLE_SPAWN),0)
|
||||||
TARGETS += $(PROGRAM_PREFIX)yosys-filterlib$(EXE)
|
TARGETS += $(PROGRAM_PREFIX)yosys-filterlib$(EXE)
|
||||||
EXTRA_OBJS += passes/techmap/filterlib.o
|
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] == ' ')
|
if (abc_script[i] == ';' && abc_script[i+1] == ' ')
|
||||||
abc_script[i+1] = '\n';
|
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());
|
fprintf(f, "%s\n", abc_script.c_str());
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
|
@ -807,7 +810,7 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin
|
||||||
|
|
||||||
handle_loops();
|
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");
|
f = fopen(buffer.c_str(), "wt");
|
||||||
if (f == nullptr)
|
if (f == nullptr)
|
||||||
log_error("Opening %s for writing failed: %s\n", buffer.c_str(), strerror(errno));
|
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;
|
size_t argidx, g_argidx;
|
||||||
bool g_arg_from_cmd = false;
|
bool g_arg_from_cmd = false;
|
||||||
|
#if defined(__wasm)
|
||||||
|
const char *pwd = ".";
|
||||||
|
#else
|
||||||
char pwd [PATH_MAX];
|
char pwd [PATH_MAX];
|
||||||
if (!getcwd(pwd, sizeof(pwd))) {
|
if (!getcwd(pwd, sizeof(pwd))) {
|
||||||
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
||||||
log_abort();
|
log_abort();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||||
std::string arg = args[argidx];
|
std::string arg = args[argidx];
|
||||||
if (arg == "-exe" && argidx+1 < args.size()) {
|
if (arg == "-exe" && argidx+1 < args.size()) {
|
||||||
|
|
|
@ -420,11 +420,15 @@ struct Abc9ExePass : public Pass {
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t argidx;
|
size_t argidx;
|
||||||
|
#if defined(__wasm)
|
||||||
|
const char *pwd = ".";
|
||||||
|
#else
|
||||||
char pwd [PATH_MAX];
|
char pwd [PATH_MAX];
|
||||||
if (!getcwd(pwd, sizeof(pwd))) {
|
if (!getcwd(pwd, sizeof(pwd))) {
|
||||||
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
log_cmd_error("getcwd failed: %s\n", strerror(errno));
|
||||||
log_abort();
|
log_abort();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||||
std::string arg = args[argidx];
|
std::string arg = args[argidx];
|
||||||
if (arg == "-exe" && argidx+1 < args.size()) {
|
if (arg == "-exe" && argidx+1 < args.size()) {
|
||||||
|
|
Loading…
Reference in New Issue