mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #5669 from YosysHQ/release/v0.62
Release version 0.62
This commit is contained in:
commit
776b4d06a6
23
CHANGELOG
23
CHANGELOG
|
|
@ -2,9 +2,30 @@
|
||||||
List of major changes and improvements between releases
|
List of major changes and improvements between releases
|
||||||
=======================================================
|
=======================================================
|
||||||
|
|
||||||
Yosys 0.61 .. Yosys 0.62-dev
|
Yosys 0.62 .. Yosys 0.63-dev
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
Yosys 0.61 .. Yosys 0.62
|
||||||
|
--------------------------
|
||||||
|
* Various
|
||||||
|
- verific: Added "-sv2017" flag option to support System
|
||||||
|
Verilog 2017.
|
||||||
|
- verific: Added VHDL related flags to "-f" and "-F" and
|
||||||
|
support reading VHDL file from file lists.
|
||||||
|
- Updated cell libs with proper module declaration where
|
||||||
|
non standard (...) style was used.
|
||||||
|
|
||||||
|
* New commands and options
|
||||||
|
- Added "-word" option to "lut2mux" pass to enable emitting
|
||||||
|
word level cells.
|
||||||
|
- Added experimental "opt_balance_tree" pass to convert
|
||||||
|
cascaded cells into tree of cells to improve timing.
|
||||||
|
- Added "-gatesi" option to "write_blif" pass to init gates
|
||||||
|
under gates_mode in BLIF format.
|
||||||
|
- Added "-on" and "-off" options to "debug" pass for
|
||||||
|
persistent debug logging.
|
||||||
|
- Added "linux_perf" pass to control performance recording.
|
||||||
|
|
||||||
Yosys 0.60 .. Yosys 0.61
|
Yosys 0.60 .. Yosys 0.61
|
||||||
--------------------------
|
--------------------------
|
||||||
* Various
|
* Various
|
||||||
|
|
|
||||||
4
Makefile
4
Makefile
|
|
@ -161,7 +161,7 @@ ifeq ($(OS), Haiku)
|
||||||
CXXFLAGS += -D_DEFAULT_SOURCE
|
CXXFLAGS += -D_DEFAULT_SOURCE
|
||||||
endif
|
endif
|
||||||
|
|
||||||
YOSYS_VER := 0.61+129
|
YOSYS_VER := 0.62+0
|
||||||
YOSYS_MAJOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f1)
|
YOSYS_MAJOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f1)
|
||||||
YOSYS_MINOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f2 | cut -d'+' -f1)
|
YOSYS_MINOR := $(shell echo $(YOSYS_VER) | cut -d'.' -f2 | cut -d'+' -f1)
|
||||||
YOSYS_COMMIT := $(shell echo $(YOSYS_VER) | cut -d'+' -f2)
|
YOSYS_COMMIT := $(shell echo $(YOSYS_VER) | cut -d'+' -f2)
|
||||||
|
|
@ -186,7 +186,7 @@ endif
|
||||||
OBJS = kernel/version_$(GIT_REV).o
|
OBJS = kernel/version_$(GIT_REV).o
|
||||||
|
|
||||||
bumpversion:
|
bumpversion:
|
||||||
sed -i "/^YOSYS_VER := / s/+[0-9][0-9]*$$/+`git log --oneline 5ae48ee.. | wc -l`/;" Makefile
|
sed -i "/^YOSYS_VER := / s/+[0-9][0-9]*$$/+`git log --oneline 7326bb7.. | wc -l`/;" Makefile
|
||||||
|
|
||||||
ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 ABC_USE_NAMESPACE=abc VERBOSE=$(Q)
|
ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 ABC_USE_NAMESPACE=abc VERBOSE=$(Q)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import os
|
||||||
project = 'YosysHQ Yosys'
|
project = 'YosysHQ Yosys'
|
||||||
author = 'YosysHQ GmbH'
|
author = 'YosysHQ GmbH'
|
||||||
copyright ='2026 YosysHQ GmbH'
|
copyright ='2026 YosysHQ GmbH'
|
||||||
yosys_ver = "0.61"
|
yosys_ver = "0.62"
|
||||||
|
|
||||||
# select HTML theme
|
# select HTML theme
|
||||||
html_theme = 'furo-ys'
|
html_theme = 'furo-ys'
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,14 @@ struct AbcConfig
|
||||||
bool markgroups = false;
|
bool markgroups = false;
|
||||||
pool<std::string> enabled_gates;
|
pool<std::string> enabled_gates;
|
||||||
bool cmos_cost = false;
|
bool cmos_cost = false;
|
||||||
|
|
||||||
|
bool is_yosys_abc() const {
|
||||||
|
#ifdef ABCEXTERNAL
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return exe_file == yosys_abc_executable;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AbcSigVal {
|
struct AbcSigVal {
|
||||||
|
|
@ -155,7 +163,12 @@ struct AbcSigVal {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(__linux__) && !defined(YOSYS_DISABLE_SPAWN)
|
// REUSE_YOSYS_ABC_PROCESSES only works when ABC is built with ENABLE_READLINE.
|
||||||
|
#if defined(__linux__) && !defined(YOSYS_DISABLE_SPAWN) && defined(YOSYS_ENABLE_READLINE)
|
||||||
|
#define REUSE_YOSYS_ABC_PROCESSES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REUSE_YOSYS_ABC_PROCESSES
|
||||||
struct AbcProcess
|
struct AbcProcess
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
@ -1063,8 +1076,9 @@ void AbcModuleState::prepare_module(RTLIL::Design *design, RTLIL::Module *module
|
||||||
abc_script += stringf("; dress \"%s/input.blif\"", run_abc.tempdir_name);
|
abc_script += stringf("; dress \"%s/input.blif\"", run_abc.tempdir_name);
|
||||||
abc_script += stringf("; write_blif %s/output.blif", run_abc.tempdir_name);
|
abc_script += stringf("; write_blif %s/output.blif", run_abc.tempdir_name);
|
||||||
abc_script = add_echos_to_abc_cmd(abc_script);
|
abc_script = add_echos_to_abc_cmd(abc_script);
|
||||||
#if defined(__linux__) && !defined(YOSYS_DISABLE_SPAWN)
|
#if defined(REUSE_YOSYS_ABC_PROCESSES)
|
||||||
abc_script += "; echo; echo \"YOSYS_ABC_DONE\"\n";
|
if (config.is_yosys_abc())
|
||||||
|
abc_script += "; echo; echo \"YOSYS_ABC_DONE\"\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (size_t i = 0; i+1 < abc_script.size(); i++)
|
for (size_t i = 0; i+1 < abc_script.size(); i++)
|
||||||
|
|
@ -1127,6 +1141,7 @@ void AbcModuleState::prepare_module(RTLIL::Design *design, RTLIL::Module *module
|
||||||
handle_loops(assign_map, module);
|
handle_loops(assign_map, module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(REUSE_YOSYS_ABC_PROCESSES)
|
||||||
static bool is_abc_prompt(const std::string &line, std::string &rest) {
|
static bool is_abc_prompt(const std::string &line, std::string &rest) {
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
@ -1197,8 +1212,13 @@ bool read_until_abc_done(abc_output_filter &filt, int fd, DeferredLogs &logs) {
|
||||||
line.append(start, end - start);
|
line.append(start, end - start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(REUSE_YOSYS_ABC_PROCESSES)
|
||||||
void RunAbcState::run(ConcurrentStack<AbcProcess> &process_pool)
|
void RunAbcState::run(ConcurrentStack<AbcProcess> &process_pool)
|
||||||
|
#else
|
||||||
|
void RunAbcState::run(ConcurrentStack<AbcProcess> &)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
std::string buffer = stringf("%s/input.blif", tempdir_name);
|
std::string buffer = stringf("%s/input.blif", tempdir_name);
|
||||||
FILE *f = fopen(buffer.c_str(), "wt");
|
FILE *f = fopen(buffer.c_str(), "wt");
|
||||||
|
|
@ -1323,9 +1343,13 @@ void RunAbcState::run(ConcurrentStack<AbcProcess> &process_pool)
|
||||||
|
|
||||||
logs.log("Extracted %d gates and %d wires to a netlist network with %d inputs and %d outputs.\n",
|
logs.log("Extracted %d gates and %d wires to a netlist network with %d inputs and %d outputs.\n",
|
||||||
count_gates, GetSize(signal_list), count_input, count_output);
|
count_gates, GetSize(signal_list), count_input, count_output);
|
||||||
if (count_output > 0)
|
if (count_output == 0) {
|
||||||
{
|
log("Don't call ABC as there is nothing to map.\n");
|
||||||
std::string tmp_script_name = stringf("%s/abc.script", tempdir_name);
|
return;
|
||||||
|
}
|
||||||
|
int ret;
|
||||||
|
std::string tmp_script_name = stringf("%s/abc.script", tempdir_name);
|
||||||
|
do {
|
||||||
logs.log("Running ABC script: %s\n", replace_tempdir(tmp_script_name, tempdir_name, config.show_tempdir));
|
logs.log("Running ABC script: %s\n", replace_tempdir(tmp_script_name, tempdir_name, config.show_tempdir));
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
@ -1356,7 +1380,7 @@ void RunAbcState::run(ConcurrentStack<AbcProcess> &process_pool)
|
||||||
abc_argv[2] = strdup("-f");
|
abc_argv[2] = strdup("-f");
|
||||||
abc_argv[3] = strdup(tmp_script_name.c_str());
|
abc_argv[3] = strdup(tmp_script_name.c_str());
|
||||||
abc_argv[4] = 0;
|
abc_argv[4] = 0;
|
||||||
int ret = abc::Abc_RealMain(4, abc_argv);
|
ret = abc::Abc_RealMain(4, abc_argv);
|
||||||
free(abc_argv[0]);
|
free(abc_argv[0]);
|
||||||
free(abc_argv[1]);
|
free(abc_argv[1]);
|
||||||
free(abc_argv[2]);
|
free(abc_argv[2]);
|
||||||
|
|
@ -1371,39 +1395,42 @@ void RunAbcState::run(ConcurrentStack<AbcProcess> &process_pool)
|
||||||
for (std::string line; std::getline(temp_stdouterr_r, line); )
|
for (std::string line; std::getline(temp_stdouterr_r, line); )
|
||||||
filt.next_line(line + "\n");
|
filt.next_line(line + "\n");
|
||||||
temp_stdouterr_r.close();
|
temp_stdouterr_r.close();
|
||||||
#elif defined(__linux__) && !defined(YOSYS_DISABLE_SPAWN)
|
break;
|
||||||
AbcProcess process;
|
|
||||||
if (std::optional<AbcProcess> process_opt = process_pool.try_pop_back()) {
|
|
||||||
process = std::move(process_opt.value());
|
|
||||||
} else if (std::optional<AbcProcess> process_opt = spawn_abc(config.exe_file.c_str(), logs)) {
|
|
||||||
process = std::move(process_opt.value());
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::string cmd = stringf(
|
|
||||||
"empty\n"
|
|
||||||
"source %s\n", tmp_script_name);
|
|
||||||
int ret = write(process.to_child_pipe, cmd.c_str(), cmd.size());
|
|
||||||
if (ret != static_cast<int>(cmd.size())) {
|
|
||||||
logs.log_error("write failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ret = read_until_abc_done(filt, process.from_child_pipe, logs) ? 0 : 1;
|
|
||||||
if (ret == 0) {
|
|
||||||
process_pool.push_back(std::move(process));
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
std::string cmd = stringf("\"%s\" -s -f %s/abc.script 2>&1", config.exe_file.c_str(), tempdir_name.c_str());
|
#if defined(REUSE_YOSYS_ABC_PROCESSES)
|
||||||
int ret = run_command(cmd, std::bind(&abc_output_filter::next_line, filt, std::placeholders::_1));
|
if (config.is_yosys_abc()) {
|
||||||
#endif
|
AbcProcess process;
|
||||||
if (ret != 0) {
|
if (std::optional<AbcProcess> process_opt = process_pool.try_pop_back()) {
|
||||||
logs.log_error("ABC: execution of script \"%s\" failed: return code %d (errno=%d).\n", tmp_script_name, ret, errno);
|
process = std::move(process_opt.value());
|
||||||
return;
|
} else if (std::optional<AbcProcess> process_opt = spawn_abc(config.exe_file.c_str(), logs)) {
|
||||||
|
process = std::move(process_opt.value());
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string cmd = stringf(
|
||||||
|
"empty\n"
|
||||||
|
"source %s\n", tmp_script_name);
|
||||||
|
ret = write(process.to_child_pipe, cmd.c_str(), cmd.size());
|
||||||
|
if (ret != static_cast<int>(cmd.size())) {
|
||||||
|
logs.log_error("write failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ret = read_until_abc_done(filt, process.from_child_pipe, logs) ? 0 : 1;
|
||||||
|
if (ret == 0) {
|
||||||
|
process_pool.push_back(std::move(process));
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
did_run = true;
|
#endif
|
||||||
|
std::string cmd = stringf("\"%s\" -s -f %s 2>&1", config.exe_file, tmp_script_name);
|
||||||
|
ret = run_command(cmd, std::bind(&abc_output_filter::next_line, filt, std::placeholders::_1));
|
||||||
|
#endif
|
||||||
|
} while (false);
|
||||||
|
if (ret != 0) {
|
||||||
|
logs.log_error("ABC: execution of script \"%s\" failed: return code %d (errno=%d).\n", tmp_script_name, ret, errno);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log("Don't call ABC as there is nothing to map.\n");
|
did_run = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit_global_input_files(const AbcConfig &config)
|
void emit_global_input_files(const AbcConfig &config)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue