CONFIG := clang
# CONFIG := gcc
# CONFIG := gcc-4.6
+# CONFIG := emcc
# features (the more the better)
ENABLE_TCL := 1
ENABLE_QT4 := 1
ENABLE_ABC := 1
+ENABLE_PLUGINS := 1
+ENABLE_READLINE := 1
ENABLE_VERIFIC := 0
# other configuration flags
CXXFLAGS = -Wall -Wextra -ggdb -I"$(shell pwd)" -MD -DYOSYS_SRC='"$(shell pwd)"' -D_YOSYS_ -fPIC -I${DESTDIR}/include
LDFLAGS = -L${DESTDIR}/lib
-LDLIBS = -lstdc++ -lreadline -lm -lffi -ldl
+LDLIBS = -lstdc++ -lm
QMAKE = qmake-qt4
SED = sed
CXXFLAGS += -std=gnu++0x -Os
endif
+ifeq ($(CONFIG),emcc)
+CXX = emcc
+CXXFLAGS += -std=c++11 -Os -Wno-warn-absolute-paths
+CXXFLAGS := $(filter-out -ggdb,$(CXXFLAGS))
+endif
+
+ifeq ($(ENABLE_READLINE),1)
+CXXFLAGS += -DYOSYS_ENABLE_READLINE
+LDLIBS += -lreadline
+endif
+
+ifeq ($(ENABLE_PLUGINS),1)
+CXXFLAGS += -DYOSYS_ENABLE_PLUGINS
+LDLIBS += -lffi -ldl
+endif
+
ifeq ($(ENABLE_TCL),1)
TCL_VERSION ?= tcl8.5
TCL_INCLUDE ?= /usr/include/$(TCL_VERSION)
config-gcc-4.6: clean
echo 'CONFIG := gcc-4.6' > Makefile.conf
+config-emcc: clean
+ echo 'CONFIG := emcc' > Makefile.conf
+ echo 'ENABLE_TCL := 0' >> Makefile.conf
+ echo 'ENABLE_QT4 := 0' >> Makefile.conf
+ echo 'ENABLE_ABC := 0' >> Makefile.conf
+ echo 'ENABLE_PLUGINS := 0' >> Makefile.conf
+ echo 'ENABLE_READLINE := 0' >> Makefile.conf
+
config-gprof: clean
echo 'CONFIG := gcc' > Makefile.conf
echo 'ENABLE_GPROF := 1' >> Makefile.conf
{
double v = round(realvalue);
RTLIL::Const result;
+#ifdef EMSCRIPTEN
+ if (!isfinite(v)) {
+#else
if (!std::isfinite(v)) {
+#endif
result.bits = std::vector<RTLIL::State>(width, RTLIL::State::Sx);
} else {
bool is_negative = v < 0;
*
*/
+#include "ast.h"
+
+#ifdef YOSYS_ENABLE_PLUGINS
+
#include <dlfcn.h>
#include <ffi.h>
-#include "ast.h"
typedef void (*ffi_fptr) ();
return newNode;
}
+#else /* YOSYS_ENABLE_PLUGINS */
+
+AST::AstNode *AST::dpi_call(const std::string&, const std::string &fname, const std::vector<std::string>&, const std::vector<AstNode*>&)
+{
+ log_error("Can't call DPI function `%s': this version of yosys is built without plugin support\n", fname.c_str());
+}
+
+#endif /* YOSYS_ENABLE_PLUGINS */
+
for (auto type : std::vector<RTLIL::IdString>({"$mux", "$pmux"}))
setup_type(type, {"\\A", "\\B", "\\S"}, {"\\Y"}, true);
- setup_type("$assert", {"\\A", "\\EN"}, {}, true);
+ setup_type("$assert", {"\\A", "\\EN"}, std::set<RTLIL::IdString>(), true);
}
void setup_internals_mem()
setup_type("$dlatchsr", {"\\EN", "\\SET", "\\CLR", "\\D"}, {"\\Q"});
setup_type("$memrd", {"\\CLK", "\\ADDR"}, {"\\DATA"});
- setup_type("$memwr", {"\\CLK", "\\EN", "\\ADDR", "\\DATA"}, {});
+ setup_type("$memwr", {"\\CLK", "\\EN", "\\ADDR", "\\DATA"}, std::set<RTLIL::IdString>());
setup_type("$mem", {"\\RD_CLK", "\\RD_ADDR", "\\WR_CLK", "\\WR_EN", "\\WR_ADDR", "\\WR_DATA"}, {"\\RD_DATA"});
setup_type("$fsm", {"\\CLK", "\\ARST", "\\CTRL_IN"}, {"\\CTRL_OUT"});
#include <string.h>
#include <errno.h>
-#if !(_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L)
+#if !(_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L || defined(EMSCRIPTEN))
typedef struct memstream {
off_t pos;
#include "kernel/yosys.h"
#include "libs/sha1/sha1.h"
-#include <readline/readline.h>
-#include <readline/history.h>
+#ifdef YOSYS_ENABLE_READLINE
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
#include <stdio.h>
#include <string.h>
bool print_stats = true;
bool call_abort = false;
+#ifdef YOSYS_ENABLE_READLINE
int history_offset = 0;
std::string history_file;
if (getenv("HOME") != NULL) {
read_history(history_file.c_str());
history_offset = where_history();
}
+#endif
int opt;
while ((opt = getopt(argc, argv, "AQTVSm:f:Hh:b:o:p:l:qv:ts:c:")) != -1)
if (call_abort)
abort();
+#ifdef YOSYS_ENABLE_READLINE
if (!history_file.empty()) {
if (history_offset > 0) {
history_truncate_file(history_file.c_str(), 100);
HIST_ENTRY **hist_list = history_list();
if (hist_list != NULL)
free(hist_list);
+#endif
yosys_shutdown();
size = 0;
}
+RTLIL::Cell::Cell() : module(nullptr)
+{
+}
+
bool RTLIL::Cell::hasPort(RTLIL::IdString portname) const
{
return connections_.count(portname) != 0;
// the global id string cache
struct char_ptr_cmp {
- bool operator()(const char *a, const char *b) {
+ bool operator()(const char *a, const char *b) const {
for (int i = 0; a[i] || b[i]; i++)
if (a[i] != b[i])
return a[i] < b[i];
protected:
// use module->addCell() and module->remove() to create or destroy cells
friend struct RTLIL::Module;
- Cell() : module(nullptr) { };
- ~Cell() { };
+ Cell();
public:
// do not simply copy cells
#include "kernel/yosys.h"
-#include <readline/readline.h>
-#include <readline/history.h>
+#ifdef YOSYS_ENABLE_READLINE
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
#include <dlfcn.h>
#include <unistd.h>
#include <limits.h>
+#include <errno.h>
YOSYS_NAMESPACE_BEGIN
buflen--;
return std::string(path, buflen);
}
+#elif defined(EMSCRIPTEN)
+std::string proc_self_dirname ()
+{
+ return "/";
+}
#else
#error Dont know how to determine process executable base path!
#endif
Backend::backend_call(design, NULL, filename, command);
}
+#ifdef YOSYS_ENABLE_READLINE
static char *readline_cmd_generator(const char *text, int state)
{
static std::map<std::string, Pass*>::iterator it;
return rl_completion_matches(text, readline_obj_generator);
return NULL;
}
+#endif
void shell(RTLIL::Design *design)
{
recursion_counter++;
log_cmd_error_throw = true;
+#ifdef YOSYS_ENABLE_READLINE
rl_readline_name = "yosys";
rl_attempted_completion_function = readline_completion;
rl_basic_word_break_characters = " \t\n";
+#endif
char *command = NULL;
+#ifdef YOSYS_ENABLE_READLINE
while ((command = readline(create_prompt(design, recursion_counter))) != NULL)
+#else
+ char command_buffer[4096];
+ while ((command = fgets(command_buffer, 4096, stdin)) != NULL)
+#endif
{
if (command[strspn(command, " \t\r\n")] == 0)
continue;
+#ifdef YOSYS_ENABLE_READLINE
add_history(command);
+#endif
char *p = command + strspn(command, " \t\r\n");
if (!strncmp(p, "exit", 4)) {
}
} ShellPass;
+#ifdef YOSYS_ENABLE_READLINE
struct HistoryPass : public Pass {
HistoryPass() : Pass("history", "show last interactive commands") { }
virtual void help() {
log("%s\n", (*list)->line);
}
} HistoryPass;
+#endif
struct ScriptPass : public Pass {
ScriptPass() : Pass("script", "execute commands from script file") { }
*/
#include "kernel/yosys.h"
-#include <dlfcn.h>
+
+#ifdef YOSYS_ENABLE_PLUGINS
+# include <dlfcn.h>
+#endif
YOSYS_NAMESPACE_BEGIN
void load_plugin(std::string filename, std::vector<std::string> aliases)
{
+#ifdef YOSYS_ENABLE_PLUGINS
if (filename.find('/') == std::string::npos)
filename = "./" + filename;
for (auto &alias : aliases)
loaded_plugin_aliases[alias] = filename;
+#else
+ log_error("This version of yosys is built without plugin support.\n");
+#endif
}
struct PluginPass : public Pass {
#include "kernel/log.h"
#include <string.h>
#include <dirent.h>
-#include <readline/readline.h>
+
+#ifdef YOSYS_ENABLE_READLINE
+# include <readline/readline.h>
+#endif
using RTLIL::id2cstr;
}
if (flag_pause) {
+ #ifdef YOSYS_ENABLE_READLINE
char *input = NULL;
while ((input = readline("Press ENTER to continue (or type 'shell' to open a shell)> ")) != NULL) {
if (input[strspn(input, " \t\r\n")] == 0)
break;
}
}
+ #else
+ log_cmd_error("This version of yosys is built without readline support => 'show -pause' is not available.\n");
+ #endif
}
log_pop();