Merge pull request #1852 from boqwxp/cleanup_synth_ice40
[yosys.git] / kernel / yosys.cc
index a4cc53f1ad8878e48cac6dca813ad0ee59f317e5..6d64e2e90133729159aae0200969b5a6d5263972 100644 (file)
@@ -129,7 +129,7 @@ void yosys_banner()
        log(" |                                                                            |\n");
        log(" |  yosys -- Yosys Open SYnthesis Suite                                       |\n");
        log(" |                                                                            |\n");
-       log(" |  Copyright (C) 2012 - 2018  Clifford Wolf <clifford@clifford.at>           |\n");
+       log(" |  Copyright (C) 2012 - 2020  Claire Wolf <claire@symbioticeda.com>          |\n");
        log(" |                                                                            |\n");
        log(" |  Permission to use, copy, modify, and/or distribute this software for any  |\n");
        log(" |  purpose with or without fee is hereby granted, provided that the above    |\n");
@@ -341,7 +341,11 @@ int run_command(const std::string &command, std::function<void(const std::string
        if (!process_line)
                return system(command.c_str());
 
+#ifdef EMSCRIPTEN
+       FILE *f = nullptr;
+#else
        FILE *f = popen(command.c_str(), "r");
+#endif
        if (f == nullptr)
                return -1;
 
@@ -510,10 +514,13 @@ void yosys_setup()
        if(already_setup)
                return;
        already_setup = true;
-       // if there are already IdString objects then we have a global initialization order bug
-       IdString empty_id;
-       log_assert(empty_id.index_ == 0);
-       IdString::get_reference(empty_id.index_);
+
+       RTLIL::ID::A = "\\A";
+       RTLIL::ID::B = "\\B";
+       RTLIL::ID::Y = "\\Y";
+       RTLIL::ID::keep = "\\keep";
+       RTLIL::ID::whitebox = "\\whitebox";
+       RTLIL::ID::blackbox = "\\blackbox";
 
        #ifdef WITH_PYTHON
                PyImport_AppendInittab((char*)"libyosys", INIT_MODULE);
@@ -541,6 +548,8 @@ void yosys_shutdown()
        already_shutdown = true;
        log_pop();
 
+       Pass::done_register();
+
        delete yosys_design;
        yosys_design = NULL;
 
@@ -550,7 +559,6 @@ void yosys_shutdown()
        log_errfile = NULL;
        log_files.clear();
 
-       Pass::done_register();
        yosys_celltypes.clear();
 
 #ifdef YOSYS_ENABLE_TCL
@@ -575,9 +583,6 @@ void yosys_shutdown()
 #ifdef WITH_PYTHON
        Py_Finalize();
 #endif
-
-       IdString empty_id;
-       IdString::put_reference(empty_id.index_);
 }
 
 RTLIL::IdString new_id(std::string file, int line, std::string func)
@@ -647,12 +652,12 @@ std::vector<std::string> glob_filename(const std::string &filename_pattern)
 
 void rewrite_filename(std::string &filename)
 {
-       if (filename.substr(0, 1) == "\"" && filename.substr(GetSize(filename)-1) == "\"")
+       if (filename.compare(0, 1, "\"") == 0 && filename.compare(GetSize(filename)-1, std::string::npos, "\"") == 0)
                filename = filename.substr(1, GetSize(filename)-2);
-       if (filename.substr(0, 2) == "+/")
+       if (filename.compare(0, 2, "+/") == 0)
                filename = proc_share_dirname() + filename.substr(2);
 #ifndef _WIN32
-       if (filename.substr(0, 2) == "~/")
+       if (filename.compare(0, 2, "~/") == 0)
                filename = filename.replace(0, 1, getenv("HOME"));
 #endif
 }
@@ -895,25 +900,25 @@ void run_frontend(std::string filename, std::string command, std::string *backen
 
        if (command == "auto") {
                std::string filename_trim = filename;
-               if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".gz")
+               if (filename_trim.size() > 3 && filename_trim.compare(filename_trim.size()-3, std::string::npos, ".gz") == 0)
                        filename_trim.erase(filename_trim.size()-3);
-               if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-2) == ".v")
+               if (filename_trim.size() > 2 && filename_trim.compare(filename_trim.size()-2, std::string::npos, ".v") == 0)
                        command = "verilog";
-               else if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-3) == ".sv")
+               else if (filename_trim.size() > 2 && filename_trim.compare(filename_trim.size()-3, std::string::npos, ".sv") == 0)
                        command = "verilog -sv";
-               else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".vhd")
+               else if (filename_trim.size() > 3 && filename_trim.compare(filename_trim.size()-4, std::string::npos, ".vhd") == 0)
                        command = "vhdl";
-               else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".blif")
+               else if (filename_trim.size() > 4 && filename_trim.compare(filename_trim.size()-5, std::string::npos, ".blif") == 0)
                        command = "blif";
-               else if (filename_trim.size() > 5 && filename_trim.substr(filename_trim.size()-6) == ".eblif")
+               else if (filename_trim.size() > 5 && filename_trim.compare(filename_trim.size()-6, std::string::npos, ".eblif") == 0)
                        command = "blif";
-               else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".json")
+               else if (filename_trim.size() > 4 && filename_trim.compare(filename_trim.size()-5, std::string::npos, ".json") == 0)
                        command = "json";
-               else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".il")
+               else if (filename_trim.size() > 3 && filename_trim.compare(filename_trim.size()-3, std::string::npos, ".il") == 0)
                        command = "ilang";
-               else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".ys")
+               else if (filename_trim.size() > 3 && filename_trim.compare(filename_trim.size()-3, std::string::npos, ".ys") == 0)
                        command = "script";
-               else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".tcl")
+               else if (filename_trim.size() > 3 && filename_trim.compare(filename_trim.size()-4, std::string::npos, ".tcl") == 0)
                        command = "tcl";
                else if (filename == "-")
                        command = "script";
@@ -1028,17 +1033,17 @@ void run_backend(std::string filename, std::string command, RTLIL::Design *desig
                design = yosys_design;
 
        if (command == "auto") {
-               if (filename.size() > 2 && filename.substr(filename.size()-2) == ".v")
+               if (filename.size() > 2 && filename.compare(filename.size()-2, std::string::npos, ".v") == 0)
                        command = "verilog";
-               else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".il")
+               else if (filename.size() > 3 && filename.compare(filename.size()-3, std::string::npos, ".il") == 0)
                        command = "ilang";
-               else if (filename.size() > 4 && filename.substr(filename.size()-4) == ".aig")
+               else if (filename.size() > 4 && filename.compare(filename.size()-4, std::string::npos, ".aig") == 0)
                        command = "aiger";
-               else if (filename.size() > 5 && filename.substr(filename.size()-5) == ".blif")
+               else if (filename.size() > 5 && filename.compare(filename.size()-5, std::string::npos, ".blif") == 0)
                        command = "blif";
-               else if (filename.size() > 5 && filename.substr(filename.size()-5) == ".edif")
+               else if (filename.size() > 5 && filename.compare(filename.size()-5, std::string::npos, ".edif") == 0)
                        command = "edif";
-               else if (filename.size() > 5 && filename.substr(filename.size()-5) == ".json")
+               else if (filename.size() > 5 && filename.compare(filename.size()-5, std::string::npos, ".json") == 0)
                        command = "json";
                else if (filename == "-")
                        command = "ilang";
@@ -1072,7 +1077,7 @@ static char *readline_cmd_generator(const char *text, int state)
        }
 
        for (; it != pass_register.end(); it++) {
-               if (it->first.substr(0, len) == text)
+               if (it->first.compare(0, len, text) == 0)
                        return strdup((it++)->first.c_str());
        }
        return NULL;
@@ -1093,30 +1098,29 @@ static char *readline_obj_generator(const char *text, int state)
 
                if (design->selected_active_module.empty())
                {
-                       for (auto &it : design->modules_)
-                               if (RTLIL::unescape_id(it.first).substr(0, len) == text)
-                                       obj_names.push_back(strdup(RTLIL::id2cstr(it.first)));
+                       for (auto mod : design->modules())
+                               if (RTLIL::unescape_id(mod->name).compare(0, len, text) == 0)
+                                       obj_names.push_back(strdup(log_id(mod->name)));
                }
-               else
-               if (design->modules_.count(design->selected_active_module) > 0)
+               else if (design->module(design->selected_active_module) != nullptr)
                {
-                       RTLIL::Module *module = design->modules_.at(design->selected_active_module);
+                       RTLIL::Module *module = design->module(design->selected_active_module);
 
-                       for (auto &it : module->wires_)
-                               if (RTLIL::unescape_id(it.first).substr(0, len) == text)
-                                       obj_names.push_back(strdup(RTLIL::id2cstr(it.first)));
+                       for (auto w : module->wires())
+                               if (RTLIL::unescape_id(w->name).compare(0, len, text) == 0)
+                                       obj_names.push_back(strdup(log_id(w->name)));
 
                        for (auto &it : module->memories)
-                               if (RTLIL::unescape_id(it.first).substr(0, len) == text)
-                                       obj_names.push_back(strdup(RTLIL::id2cstr(it.first)));
+                               if (RTLIL::unescape_id(it.first).compare(0, len, text) == 0)
+                                       obj_names.push_back(strdup(log_id(it.first)));
 
-                       for (auto &it : module->cells_)
-                               if (RTLIL::unescape_id(it.first).substr(0, len) == text)
-                                       obj_names.push_back(strdup(RTLIL::id2cstr(it.first)));
+                       for (auto cell : module->cells())
+                               if (RTLIL::unescape_id(cell->name).compare(0, len, text) == 0)
+                                       obj_names.push_back(strdup(log_id(cell->name)));
 
                        for (auto &it : module->processes)
-                               if (RTLIL::unescape_id(it.first).substr(0, len) == text)
-                                       obj_names.push_back(strdup(RTLIL::id2cstr(it.first)));
+                               if (RTLIL::unescape_id(it.first).compare(0, len, text) == 0)
+                                       obj_names.push_back(strdup(log_id(it.first)));
                }
 
                std::sort(obj_names.begin(), obj_names.end());