mirror of
https://github.com/YosysHQ/yosys
synced 2025-07-24 05:08:56 +00:00
Merge remote-tracking branch 'origin/master' into feature/python_bindings
This commit is contained in:
commit
03d1606b42
428 changed files with 23388 additions and 2479 deletions
|
@ -33,7 +33,7 @@
|
|||
# include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
# include <io.h>
|
||||
#elif defined(__APPLE__)
|
||||
|
@ -41,13 +41,15 @@
|
|||
# include <unistd.h>
|
||||
# include <dirent.h>
|
||||
# include <sys/stat.h>
|
||||
# include <glob.h>
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# include <dirent.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/wait.h>
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_WIN32) && defined(YOSYS_ENABLE_GLOB)
|
||||
# include <glob.h>
|
||||
#endif
|
||||
|
||||
|
@ -176,7 +178,7 @@ std::string vstringf(const char *fmt, va_list ap)
|
|||
std::string string;
|
||||
char *str = NULL;
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(_WIN32 )|| defined(__CYGWIN__)
|
||||
int sz = 64, rc;
|
||||
while (1) {
|
||||
va_list apc;
|
||||
|
@ -226,12 +228,18 @@ std::string next_token(std::string &text, const char *sep, bool long_strings)
|
|||
|
||||
if (long_strings && pos_begin != text.size() && text[pos_begin] == '"') {
|
||||
string sep_string = sep;
|
||||
for (size_t i = pos_begin+1; i < text.size(); i++)
|
||||
for (size_t i = pos_begin+1; i < text.size(); i++) {
|
||||
if (text[i] == '"' && (i+1 == text.size() || sep_string.find(text[i+1]) != std::string::npos)) {
|
||||
std::string token = text.substr(pos_begin, i-pos_begin+1);
|
||||
text = text.substr(i+1);
|
||||
return token;
|
||||
}
|
||||
if (i+1 < text.size() && text[i] == '"' && text[i+1] == ';' && (i+2 == text.size() || sep_string.find(text[i+2]) != std::string::npos)) {
|
||||
std::string token = text.substr(pos_begin, i-pos_begin+1);
|
||||
text = text.substr(i+2);
|
||||
return token + ";";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t pos_end = text.find_first_of(sep, pos_begin);
|
||||
|
@ -602,7 +610,7 @@ std::vector<std::string> glob_filename(const std::string &filename_pattern)
|
|||
{
|
||||
std::vector<std::string> results;
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(_WIN32) || !defined(YOSYS_ENABLE_GLOB)
|
||||
results.push_back(filename_pattern);
|
||||
#else
|
||||
glob_t globbuf;
|
||||
|
@ -674,9 +682,10 @@ extern Tcl_Interp *yosys_get_tcl_interp()
|
|||
|
||||
struct TclPass : public Pass {
|
||||
TclPass() : Pass("tcl", "execute a TCL script file") { }
|
||||
virtual void help() {
|
||||
void help() YS_OVERRIDE {
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
log("\n");
|
||||
log(" tcl <filename>\n");
|
||||
log(" tcl <filename> [args]\n");
|
||||
log("\n");
|
||||
log("This command executes the tcl commands in the specified file.\n");
|
||||
log("Use 'yosys cmd' to run the yosys command 'cmd' from tcl.\n");
|
||||
|
@ -686,14 +695,24 @@ struct TclPass : public Pass {
|
|||
log("'proc' and 'rename' are wrapped to tcl commands 'procs' and 'renames'\n");
|
||||
log("in order to avoid a name collision with the built in commands.\n");
|
||||
log("\n");
|
||||
log("If any arguments are specified, these arguments are provided to the script via\n");
|
||||
log("the standard $argc and $argv variables.\n");
|
||||
log("\n");
|
||||
}
|
||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) {
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *) YS_OVERRIDE {
|
||||
if (args.size() < 2)
|
||||
log_cmd_error("Missing script file.\n");
|
||||
if (args.size() > 2)
|
||||
extra_args(args, 1, design, false);
|
||||
if (Tcl_EvalFile(yosys_get_tcl_interp(), args[1].c_str()) != TCL_OK)
|
||||
log_cmd_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(yosys_get_tcl_interp()));
|
||||
|
||||
std::vector<Tcl_Obj*> script_args;
|
||||
for (auto it = args.begin() + 2; it != args.end(); ++it)
|
||||
script_args.push_back(Tcl_NewStringObj((*it).c_str(), (*it).size()));
|
||||
|
||||
Tcl_Interp *interp = yosys_get_tcl_interp();
|
||||
Tcl_ObjSetVar2(interp, Tcl_NewStringObj("argc", 4), NULL, Tcl_NewIntObj(script_args.size()), 0);
|
||||
Tcl_ObjSetVar2(interp, Tcl_NewStringObj("argv", 4), NULL, Tcl_NewListObj(script_args.size(), script_args.data()), 0);
|
||||
Tcl_ObjSetVar2(interp, Tcl_NewStringObj("argv0", 5), NULL, Tcl_NewStringObj(args[1].c_str(), args[1].size()), 0);
|
||||
if (Tcl_EvalFile(interp, args[1].c_str()) != TCL_OK)
|
||||
log_cmd_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(interp));
|
||||
}
|
||||
} TclPass;
|
||||
#endif
|
||||
|
@ -771,7 +790,7 @@ std::string proc_self_dirname()
|
|||
return "/";
|
||||
}
|
||||
#else
|
||||
#error Dont know how to determine process executable base path!
|
||||
#error "Don't know how to determine process executable base path!"
|
||||
#endif
|
||||
|
||||
#ifdef EMSCRIPTEN
|
||||
|
@ -837,7 +856,7 @@ static void handle_label(std::string &command, bool &from_to_active, const std::
|
|||
while (pos < GetSize(command) && command[pos] != ' ' && command[pos] != '\t' && command[pos] != '\r' && command[pos] != '\n')
|
||||
label += command[pos++];
|
||||
|
||||
if (label.back() == ':' && GetSize(label) > 1)
|
||||
if (GetSize(label) > 1 && label.back() == ':')
|
||||
{
|
||||
label = label.substr(0, GetSize(label)-1);
|
||||
command = command.substr(pos);
|
||||
|
@ -859,17 +878,19 @@ void run_frontend(std::string filename, std::string command, std::string *backen
|
|||
command = "verilog";
|
||||
else if (filename.size() > 2 && filename.substr(filename.size()-3) == ".sv")
|
||||
command = "verilog -sv";
|
||||
else if (filename.size() > 2 && filename.substr(filename.size()-4) == ".vhd")
|
||||
else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".vhd")
|
||||
command = "vhdl";
|
||||
else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".blif")
|
||||
command = "blif";
|
||||
else if (filename.size() > 5 && filename.substr(filename.size()-6) == ".eblif")
|
||||
command = "blif";
|
||||
else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".json")
|
||||
command = "json";
|
||||
else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".il")
|
||||
command = "ilang";
|
||||
else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".ys")
|
||||
command = "script";
|
||||
else if (filename.size() > 2 && filename.substr(filename.size()-4) == ".tcl")
|
||||
else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".tcl")
|
||||
command = "tcl";
|
||||
else if (filename == "-")
|
||||
command = "script";
|
||||
|
@ -1149,7 +1170,7 @@ void shell(RTLIL::Design *design)
|
|||
|
||||
struct ShellPass : public Pass {
|
||||
ShellPass() : Pass("shell", "enter interactive command mode") { }
|
||||
virtual void help() {
|
||||
void help() YS_OVERRIDE {
|
||||
log("\n");
|
||||
log(" shell\n");
|
||||
log("\n");
|
||||
|
@ -1181,7 +1202,7 @@ struct ShellPass : public Pass {
|
|||
log("Press Ctrl-D or type 'exit' to leave the interactive shell.\n");
|
||||
log("\n");
|
||||
}
|
||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) {
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE {
|
||||
extra_args(args, 1, design, false);
|
||||
shell(design);
|
||||
}
|
||||
|
@ -1190,7 +1211,7 @@ struct ShellPass : public Pass {
|
|||
#if defined(YOSYS_ENABLE_READLINE) || defined(YOSYS_ENABLE_EDITLINE)
|
||||
struct HistoryPass : public Pass {
|
||||
HistoryPass() : Pass("history", "show last interactive commands") { }
|
||||
virtual void help() {
|
||||
void help() YS_OVERRIDE {
|
||||
log("\n");
|
||||
log(" history\n");
|
||||
log("\n");
|
||||
|
@ -1199,7 +1220,7 @@ struct HistoryPass : public Pass {
|
|||
log("from executed scripts.\n");
|
||||
log("\n");
|
||||
}
|
||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) {
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE {
|
||||
extra_args(args, 1, design, false);
|
||||
#ifdef YOSYS_ENABLE_READLINE
|
||||
for(HIST_ENTRY **list = history_list(); *list != NULL; list++)
|
||||
|
@ -1214,7 +1235,7 @@ struct HistoryPass : public Pass {
|
|||
|
||||
struct ScriptCmdPass : public Pass {
|
||||
ScriptCmdPass() : Pass("script", "execute commands from script file") { }
|
||||
virtual void help() {
|
||||
void help() YS_OVERRIDE {
|
||||
log("\n");
|
||||
log(" script <filename> [<from_label>:<to_label>]\n");
|
||||
log("\n");
|
||||
|
@ -1229,7 +1250,7 @@ struct ScriptCmdPass : public Pass {
|
|||
log("marked with that label (until the next label) is executed.\n");
|
||||
log("\n");
|
||||
}
|
||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) {
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE {
|
||||
if (args.size() < 2)
|
||||
log_cmd_error("Missing script file.\n");
|
||||
else if (args.size() == 2)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue