mirror of
https://github.com/YosysHQ/yosys
synced 2026-06-26 18:48:51 +00:00
commit
560d2492f3
27 changed files with 574 additions and 337 deletions
4
.github/workflows/test-compile.yml
vendored
4
.github/workflows/test-compile.yml
vendored
|
|
@ -64,11 +64,11 @@ jobs:
|
|||
$CXX --version
|
||||
|
||||
# minimum standard
|
||||
- name: Build C++11
|
||||
- name: Build C++17
|
||||
shell: bash
|
||||
run: |
|
||||
make config-$CC_SHORT
|
||||
make -j$procs CXXSTD=c++11 compile-only
|
||||
make -j$procs CXXSTD=c++17 compile-only
|
||||
|
||||
# maximum standard, only on newest compilers
|
||||
- name: Build C++20
|
||||
|
|
|
|||
1
.github/workflows/test-verific.yml
vendored
1
.github/workflows/test-verific.yml
vendored
|
|
@ -39,6 +39,7 @@ jobs:
|
|||
echo "ENABLE_VERIFIC := 1" >> Makefile.conf
|
||||
echo "ENABLE_VERIFIC_EDIF := 1" >> Makefile.conf
|
||||
echo "ENABLE_VERIFIC_LIBERTY := 1" >> Makefile.conf
|
||||
echo "ENABLE_VERIFIC_YOSYSHQ_EXTENSIONS := 1" >> Makefile.conf
|
||||
echo "ENABLE_CCACHE := 1" >> Makefile.conf
|
||||
make -j${{ env.procs }}
|
||||
|
||||
|
|
|
|||
14
CHANGELOG
14
CHANGELOG
|
|
@ -2,9 +2,21 @@
|
|||
List of major changes and improvements between releases
|
||||
=======================================================
|
||||
|
||||
Yosys 0.42 .. Yosys 0.43-dev
|
||||
Yosys 0.43 .. Yosys 0.44-dev
|
||||
--------------------------
|
||||
|
||||
Yosys 0.42 .. Yosys 0.43
|
||||
--------------------------
|
||||
* Various
|
||||
- C++ compiler with C++17 support is required.
|
||||
- Support for IO liberty files for verification.
|
||||
- Limit padding from shiftadd for "peepopt" pass.
|
||||
|
||||
* Verific support
|
||||
- Support building Yosys with various Verific library
|
||||
configurations. Can be built now without YosysHQ
|
||||
specific patch and extension library.
|
||||
|
||||
Yosys 0.41 .. Yosys 0.42
|
||||
--------------------------
|
||||
* New commands and options
|
||||
|
|
|
|||
42
Makefile
42
Makefile
|
|
@ -17,10 +17,12 @@ ENABLE_READLINE := 1
|
|||
ENABLE_EDITLINE := 0
|
||||
ENABLE_GHDL := 0
|
||||
ENABLE_VERIFIC := 0
|
||||
ENABLE_VERIFIC_SYSTEMVERILOG := 1
|
||||
ENABLE_VERIFIC_VHDL := 1
|
||||
ENABLE_VERIFIC_HIER_TREE := 1
|
||||
ENABLE_VERIFIC_YOSYSHQ_EXTENSIONS := 0
|
||||
ENABLE_VERIFIC_EDIF := 0
|
||||
ENABLE_VERIFIC_LIBERTY := 0
|
||||
DISABLE_VERIFIC_EXTENSIONS := 0
|
||||
DISABLE_VERIFIC_VHDL := 0
|
||||
ENABLE_COVER := 1
|
||||
ENABLE_LIBYOSYS := 0
|
||||
ENABLE_ZLIB := 1
|
||||
|
|
@ -90,7 +92,7 @@ all: top-all
|
|||
YOSYS_SRC := $(dir $(firstword $(MAKEFILE_LIST)))
|
||||
VPATH := $(YOSYS_SRC)
|
||||
|
||||
CXXSTD ?= c++11
|
||||
CXXSTD ?= c++17
|
||||
CXXFLAGS := $(CXXFLAGS) -Wall -Wextra -ggdb -I. -I"$(YOSYS_SRC)" -MD -MP -D_YOSYS_ -fPIC -I$(PREFIX)/include
|
||||
LIBS := $(LIBS) -lstdc++ -lm
|
||||
PLUGIN_LINKFLAGS :=
|
||||
|
|
@ -141,7 +143,7 @@ LIBS += -lrt
|
|||
endif
|
||||
endif
|
||||
|
||||
YOSYS_VER := 0.42+0
|
||||
YOSYS_VER := 0.43+0
|
||||
|
||||
# Note: We arrange for .gitcommit to contain the (short) commit hash in
|
||||
# tarballs generated with git-archive(1) using .gitattributes. The git repo
|
||||
|
|
@ -157,7 +159,7 @@ endif
|
|||
OBJS = kernel/version_$(GIT_REV).o
|
||||
|
||||
bumpversion:
|
||||
sed -i "/^YOSYS_VER := / s/+[0-9][0-9]*$$/+`git log --oneline 9b6afcf.. | wc -l`/;" Makefile
|
||||
sed -i "/^YOSYS_VER := / s/+[0-9][0-9]*$$/+`git log --oneline ead4718.. | wc -l`/;" Makefile
|
||||
|
||||
ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1 ABC_USE_NAMESPACE=abc VERBOSE=$(Q)
|
||||
|
||||
|
|
@ -471,8 +473,24 @@ endif
|
|||
LIBS_VERIFIC =
|
||||
ifeq ($(ENABLE_VERIFIC),1)
|
||||
VERIFIC_DIR ?= /usr/local/src/verific_lib
|
||||
VERIFIC_COMPONENTS ?= verilog database util containers hier_tree
|
||||
ifneq ($(DISABLE_VERIFIC_VHDL),1)
|
||||
VERIFIC_COMPONENTS ?= database util containers
|
||||
ifeq ($(ENABLE_VERIFIC_HIER_TREE),1)
|
||||
VERIFIC_COMPONENTS += hier_tree
|
||||
CXXFLAGS += -DVERIFIC_HIER_TREE_SUPPORT
|
||||
else
|
||||
ifneq ($(wildcard $(VERIFIC_DIR)/hier_tree),)
|
||||
VERIFIC_COMPONENTS += hier_tree
|
||||
endif
|
||||
endif
|
||||
ifeq ($(ENABLE_VERIFIC_SYSTEMVERILOG),1)
|
||||
VERIFIC_COMPONENTS += verilog
|
||||
CXXFLAGS += -DVERIFIC_SYSTEMVERILOG_SUPPORT
|
||||
else
|
||||
ifneq ($(wildcard $(VERIFIC_DIR)/verilog),)
|
||||
VERIFIC_COMPONENTS += verilog
|
||||
endif
|
||||
endif
|
||||
ifeq ($(ENABLE_VERIFIC_VHDL),1)
|
||||
VERIFIC_COMPONENTS += vhdl
|
||||
CXXFLAGS += -DVERIFIC_VHDL_SUPPORT
|
||||
else
|
||||
|
|
@ -488,9 +506,13 @@ ifeq ($(ENABLE_VERIFIC_LIBERTY),1)
|
|||
VERIFIC_COMPONENTS += synlib
|
||||
CXXFLAGS += -DVERIFIC_LIBERTY_SUPPORT
|
||||
endif
|
||||
ifneq ($(DISABLE_VERIFIC_EXTENSIONS),1)
|
||||
ifeq ($(ENABLE_VERIFIC_YOSYSHQ_EXTENSIONS),1)
|
||||
VERIFIC_COMPONENTS += extensions
|
||||
CXXFLAGS += -DYOSYSHQ_VERIFIC_EXTENSIONS
|
||||
else
|
||||
ifneq ($(wildcard $(VERIFIC_DIR)/extensions),)
|
||||
VERIFIC_COMPONENTS += extensions
|
||||
endif
|
||||
endif
|
||||
CXXFLAGS += $(patsubst %,-I$(VERIFIC_DIR)/%,$(VERIFIC_COMPONENTS)) -DYOSYS_ENABLE_VERIFIC
|
||||
ifeq ($(OS), Darwin)
|
||||
|
|
@ -736,7 +758,7 @@ CXXFLAGS_NOVERIFIC = $(CXXFLAGS)
|
|||
LIBS_NOVERIFIC = $(LIBS)
|
||||
endif
|
||||
|
||||
$(PROGRAM_PREFIX)yosys-config: misc/yosys-config.in
|
||||
$(PROGRAM_PREFIX)yosys-config: misc/yosys-config.in $(YOSYS_SRC)/Makefile
|
||||
$(P) $(SED) -e 's#@CXXFLAGS@#$(subst -Ilibs/dlfcn-win32,,$(subst -I. -I"$(YOSYS_SRC)",-I"$(DATDIR)/include",$(strip $(CXXFLAGS_NOVERIFIC))))#;' \
|
||||
-e 's#@CXX@#$(strip $(CXX))#;' -e 's#@LINKFLAGS@#$(strip $(LINKFLAGS) $(PLUGIN_LINKFLAGS))#;' -e 's#@LIBS@#$(strip $(LIBS_NOVERIFIC) $(PLUGIN_LIBS))#;' \
|
||||
-e 's#@BINDIR@#$(strip $(BINDIR))#;' -e 's#@DATDIR@#$(strip $(DATDIR))#;' < $< > $(PROGRAM_PREFIX)yosys-config
|
||||
|
|
@ -1015,7 +1037,7 @@ qtcreator:
|
|||
vcxsrc: $(GENFILES) $(EXTRA_TARGETS)
|
||||
rm -rf yosys-win32-vcxsrc-$(YOSYS_VER){,.zip}
|
||||
set -e; for f in `ls $(filter %.cc %.cpp,$(GENFILES)) $(addsuffix .cc,$(basename $(OBJS))) $(addsuffix .cpp,$(basename $(OBJS))) 2> /dev/null`; do \
|
||||
echo "Analyse: $$f" >&2; cpp -std=c++11 -MM -I. -D_YOSYS_ $$f; done | sed 's,.*:,,; s,//*,/,g; s,/[^/]*/\.\./,/,g; y, \\,\n\n,;' | grep '^[^/]' | sort -u | grep -v kernel/version_ > srcfiles.txt
|
||||
echo "Analyse: $$f" >&2; cpp -std=c++17 -MM -I. -D_YOSYS_ $$f; done | sed 's,.*:,,; s,//*,/,g; s,/[^/]*/\.\./,/,g; y, \\,\n\n,;' | grep '^[^/]' | sort -u | grep -v kernel/version_ > srcfiles.txt
|
||||
bash misc/create_vcxsrc.sh yosys-win32-vcxsrc $(YOSYS_VER) $(GIT_REV)
|
||||
echo "namespace Yosys { extern const char *yosys_version_str; const char *yosys_version_str=\"Yosys (Version Information Unavailable)\"; }" > kernel/version.cc
|
||||
zip yosys-win32-vcxsrc-$(YOSYS_VER)/genfiles.zip $(GENFILES) kernel/version.cc
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ Many Linux distributions also provide Yosys binaries, some more up to date than
|
|||
Building from Source
|
||||
====================
|
||||
|
||||
You need a C++ compiler with C++11 support (up-to-date CLANG or GCC is
|
||||
You need a C++ compiler with C++17 support (up-to-date CLANG or GCC is
|
||||
recommended) and some standard tools such as GNU Flex, GNU Bison, and GNU Make.
|
||||
TCL, readline and libffi are optional (see ``ENABLE_*`` settings in Makefile).
|
||||
Xdot (graphviz) is used by the ``show`` command in yosys to display schematics.
|
||||
|
|
|
|||
|
|
@ -1138,7 +1138,7 @@ struct CxxrtlWorker {
|
|||
f << indent << "// cell " << cell->name.str() << " syncs\n";
|
||||
for (auto conn : cell->connections())
|
||||
if (cell->output(conn.first))
|
||||
if (is_cxxrtl_sync_port(cell, conn.first)) {
|
||||
if (is_cxxrtl_sync_port(cell, conn.first) && !conn.second.empty()) {
|
||||
f << indent;
|
||||
dump_sigspec_lhs(conn.second, for_debug);
|
||||
f << " = " << mangle(cell) << access << mangle_wire_name(conn.first) << ".curr;\n";
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ cxxrtl_handle cxxrtl_create_at(cxxrtl_toplevel design, const char *top_path_) {
|
|||
|
||||
cxxrtl_handle handle = new _cxxrtl_handle;
|
||||
handle->module = std::move(design->module);
|
||||
handle->module->debug_info(handle->objects, top_path);
|
||||
handle->module->debug_info(&handle->objects, nullptr, top_path);
|
||||
delete design;
|
||||
return handle;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1582,7 +1582,7 @@ struct module {
|
|||
|
||||
// Compatibility method.
|
||||
#if __has_attribute(deprecated)
|
||||
__attribute__((deprecated("Use `debug_info(path, &items, /*scopes=*/nullptr);` instead. (`path` could be \"top \".)")))
|
||||
__attribute__((deprecated("Use `debug_info(&items, /*scopes=*/nullptr, path);` instead.")))
|
||||
#endif
|
||||
void debug_info(debug_items &items, std::string path) {
|
||||
debug_info(&items, /*scopes=*/nullptr, path);
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import os
|
|||
project = 'YosysHQ Yosys'
|
||||
author = 'YosysHQ GmbH'
|
||||
copyright ='2024 YosysHQ GmbH'
|
||||
yosys_ver = "0.42"
|
||||
yosys_ver = "0.43"
|
||||
|
||||
# select HTML theme
|
||||
html_theme = 'furo'
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ not regularly tested:
|
|||
Build prerequisites
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A C++ compiler with C++11 support is required as well as some standard tools
|
||||
A C++ compiler with C++17 support is required as well as some standard tools
|
||||
such as GNU Flex, GNU Bison, Make and Python. Some additional tools: readline,
|
||||
libffi, Tcl and zlib; are optional but enabled by default (see
|
||||
:makevar:`ENABLE_*` settings in Makefile). Graphviz and Xdot are used by the
|
||||
|
|
|
|||
|
|
@ -8,10 +8,40 @@ file format and how you can make your own synthesis scripts.
|
|||
Yosys script files typically use the :file:`.ys` extension and contain a set of
|
||||
commands for Yosys to run sequentially. These commands are the same ones we
|
||||
were using on the previous page like :cmd:ref:`read_verilog` and
|
||||
:cmd:ref:`hierarchy`. As with the interactive shell, each command consists of
|
||||
the command name, and an optional whitespace separated list of arguments.
|
||||
Commands are terminated with the newline character, or by a semicolon (;). Empty
|
||||
lines, and lines starting with the hash sign (#), are ignored.
|
||||
:cmd:ref:`hierarchy`.
|
||||
|
||||
Script parsing
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
As with the interactive shell, each command consists of the command name, and an
|
||||
optional whitespace separated list of arguments. Commands are terminated with
|
||||
the newline character, and anything after a hash sign ``#`` is a comment (i.e.
|
||||
it is ignored).
|
||||
|
||||
It is also possible to terminate commands with a semicolon ``;``. This is
|
||||
particularly useful in conjunction with the ``-p <command>`` command line
|
||||
option, where ``<command>`` can be a string with multiple commands separated by
|
||||
semicolon. In-line comments can also be made with the colon ``:``, where the end
|
||||
of the comment is a semicolon ``;`` or a new line.
|
||||
|
||||
.. code-block::
|
||||
:caption: Using the ``-p`` option
|
||||
|
||||
$ yosys -p "read_verilog fifo.v; :this is a comment; prep"
|
||||
|
||||
.. warning::
|
||||
|
||||
The space after the semicolon is required for correct parsing. ``log a;log
|
||||
b;`` for example will display ``a;log b`` instead of ``a`` and ``b`` as might
|
||||
be expected.
|
||||
|
||||
Another special character that can be used in Yosys scripts is the bang ``!``.
|
||||
Anything after the bang will be executed as a shell command. This can only be
|
||||
terminated with a new line. Any semicolons, hashes, or other special characters
|
||||
will be passed to the shell. If an error code is returned from the shell it
|
||||
will be raised by Yosys. :cmd:ref:`exec` provides a much more flexible way of
|
||||
executing commands, allowing the output to be logged and more control over when
|
||||
to generate errors.
|
||||
|
||||
The synthesis starter script
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ wide range of real-world designs, including the `OpenRISC 1200 CPU`_, the
|
|||
|
||||
.. _k68 CPU: http://opencores.org/projects/k68
|
||||
|
||||
Yosys is written in C++, targeting C++11 at minimum. This chapter describes some
|
||||
Yosys is written in C++, targeting C++17 at minimum. This chapter describes some
|
||||
of the fundamental Yosys data structures. For the sake of simplicity the C++
|
||||
type names used in the Yosys implementation are used in this chapter, even
|
||||
though the chapter only explains the conceptual idea behind it and can be used
|
||||
|
|
|
|||
|
|
@ -17,12 +17,7 @@
|
|||
*
|
||||
* ---
|
||||
*
|
||||
* This is the AST frontend library.
|
||||
*
|
||||
* The AST frontend library is not a frontend on it's own but provides a
|
||||
* generic abstract syntax tree (AST) abstraction for HDL code and can be
|
||||
* used by HDL frontends. See "ast.h" for an overview of the API and the
|
||||
* Verilog frontend for an usage example.
|
||||
* This is support code for the Verilog frontend at frontends/verilog
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -214,6 +214,18 @@ static RTLIL::SigSpec parse_func_expr(RTLIL::Module *module, const char *expr)
|
|||
return stack.back().sig;
|
||||
}
|
||||
|
||||
static RTLIL::SigSpec create_tristate(RTLIL::Module *module, RTLIL::SigSpec func, const char *three_state_expr)
|
||||
{
|
||||
RTLIL::SigSpec three_state = parse_func_expr(module, three_state_expr);
|
||||
|
||||
RTLIL::Cell *cell = module->addCell(NEW_ID, ID($tribuf));
|
||||
cell->setParam(ID::WIDTH, GetSize(func));
|
||||
cell->setPort(ID::A, func);
|
||||
cell->setPort(ID::EN, create_inv_cell(module, three_state));
|
||||
cell->setPort(ID::Y, module->addWire(NEW_ID));
|
||||
return cell->getPort(ID::Y);
|
||||
}
|
||||
|
||||
static void create_ff(RTLIL::Module *module, LibertyAst *node)
|
||||
{
|
||||
RTLIL::SigSpec iq_sig(module->addWire(RTLIL::escape_id(node->args.at(0))));
|
||||
|
|
@ -695,18 +707,24 @@ struct LibertyFrontend : public Frontend {
|
|||
LibertyAst *func = node->find("function");
|
||||
if (func == NULL)
|
||||
{
|
||||
if (!flag_ignore_miss_func)
|
||||
{
|
||||
log_error("Missing function on output %s of cell %s.\n", log_id(wire->name), log_id(module->name));
|
||||
} else {
|
||||
log("Ignoring cell %s with missing function on output %s.\n", log_id(module->name), log_id(wire->name));
|
||||
delete module;
|
||||
goto skip_cell;
|
||||
if (dir->value != "inout") { // allow inout with missing function, can be used for power pins
|
||||
if (!flag_ignore_miss_func)
|
||||
{
|
||||
log_error("Missing function on output %s of cell %s.\n", log_id(wire->name), log_id(module->name));
|
||||
} else {
|
||||
log("Ignoring cell %s with missing function on output %s.\n", log_id(module->name), log_id(wire->name));
|
||||
delete module;
|
||||
goto skip_cell;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
RTLIL::SigSpec out_sig = parse_func_expr(module, func->value.c_str());
|
||||
LibertyAst *three_state = node->find("three_state");
|
||||
if (three_state) {
|
||||
out_sig = create_tristate(module, out_sig, three_state->value.c_str());
|
||||
}
|
||||
module->connect(RTLIL::SigSig(wire, out_sig));
|
||||
}
|
||||
|
||||
RTLIL::SigSpec out_sig = parse_func_expr(module, func->value.c_str());
|
||||
module->connect(RTLIL::SigSig(wire, out_sig));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ EXTRA_TARGETS += share/verific
|
|||
share/verific:
|
||||
$(P) rm -rf share/verific.new
|
||||
$(Q) mkdir -p share/verific.new
|
||||
ifneq ($(DISABLE_VERIFIC_VHDL),1)
|
||||
ifeq ($(ENABLE_VERIFIC_VHDL),1)
|
||||
$(Q) cp -r $(VERIFIC_DIR)/vhdl_packages/vdbs_1987/. share/verific.new/vhdl_vdbs_1987
|
||||
$(Q) cp -r $(VERIFIC_DIR)/vhdl_packages/vdbs_1993/. share/verific.new/vhdl_vdbs_1993
|
||||
$(Q) cp -r $(VERIFIC_DIR)/vhdl_packages/vdbs_2008/. share/verific.new/vhdl_vdbs_2008
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -80,6 +80,7 @@ USING_YOSYS_NAMESPACE
|
|||
using namespace Verific;
|
||||
#endif
|
||||
|
||||
#ifdef VERIFIC_SYSTEMVERILOG_SUPPORT
|
||||
PRIVATE_NAMESPACE_BEGIN
|
||||
|
||||
// Non-deterministic FSM
|
||||
|
|
@ -1878,5 +1879,8 @@ bool verific_is_sva_net(VerificImporter *importer, Verific::Net *net)
|
|||
worker.importer = importer;
|
||||
return worker.net_to_ast_driver(net) != nullptr;
|
||||
}
|
||||
|
||||
#else
|
||||
YOSYS_NAMESPACE_BEGIN
|
||||
pool<int> verific_sva_prims = {};
|
||||
#endif
|
||||
YOSYS_NAMESPACE_END
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ Formatting of code
|
|||
C++ Language
|
||||
-------------
|
||||
|
||||
Yosys is written in C++11.
|
||||
Yosys is written in C++17.
|
||||
|
||||
In general Yosys uses "int" instead of "size_t". To avoid compiler
|
||||
warnings for implicit type casts, always use "GetSize(foobar)" instead
|
||||
|
|
|
|||
|
|
@ -2517,7 +2517,6 @@ DEF_METHOD(Or, max(sig_a.size(), sig_b.size()), ID($or))
|
|||
DEF_METHOD(Xor, max(sig_a.size(), sig_b.size()), ID($xor))
|
||||
DEF_METHOD(Xnor, max(sig_a.size(), sig_b.size()), ID($xnor))
|
||||
DEF_METHOD(Shift, sig_a.size(), ID($shift))
|
||||
DEF_METHOD(Shiftx, sig_a.size(), ID($shiftx))
|
||||
DEF_METHOD(Lt, 1, ID($lt))
|
||||
DEF_METHOD(Le, 1, ID($le))
|
||||
DEF_METHOD(Eq, 1, ID($eq))
|
||||
|
|
@ -2562,6 +2561,28 @@ DEF_METHOD(Sshl, sig_a.size(), ID($sshl))
|
|||
DEF_METHOD(Sshr, sig_a.size(), ID($sshr))
|
||||
#undef DEF_METHOD
|
||||
|
||||
#define DEF_METHOD(_func, _y_size, _type) \
|
||||
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_y, bool is_signed, const std::string &src) { \
|
||||
RTLIL::Cell *cell = addCell(name, _type); \
|
||||
cell->parameters[ID::A_SIGNED] = false; \
|
||||
cell->parameters[ID::B_SIGNED] = is_signed; \
|
||||
cell->parameters[ID::A_WIDTH] = sig_a.size(); \
|
||||
cell->parameters[ID::B_WIDTH] = sig_b.size(); \
|
||||
cell->parameters[ID::Y_WIDTH] = sig_y.size(); \
|
||||
cell->setPort(ID::A, sig_a); \
|
||||
cell->setPort(ID::B, sig_b); \
|
||||
cell->setPort(ID::Y, sig_y); \
|
||||
cell->set_src_attribute(src); \
|
||||
return cell; \
|
||||
} \
|
||||
RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, bool is_signed, const std::string &src) { \
|
||||
RTLIL::SigSpec sig_y = addWire(NEW_ID, _y_size); \
|
||||
add ## _func(name, sig_a, sig_b, sig_y, is_signed, src); \
|
||||
return sig_y; \
|
||||
}
|
||||
DEF_METHOD(Shiftx, sig_a.size(), ID($shiftx))
|
||||
#undef DEF_METHOD
|
||||
|
||||
#define DEF_METHOD(_func, _type, _pmux) \
|
||||
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_b, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_y, const std::string &src) { \
|
||||
RTLIL::Cell *cell = addCell(name, _type); \
|
||||
|
|
|
|||
|
|
@ -142,12 +142,8 @@ extern Tcl_Obj *Tcl_ObjSetVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, Tcl_Obj *p
|
|||
|
||||
#if __cplusplus >= 201703L
|
||||
# define YS_FALLTHROUGH [[fallthrough]];
|
||||
#elif defined(__clang__)
|
||||
# define YS_FALLTHROUGH [[clang::fallthrough]];
|
||||
#elif defined(__GNUC__)
|
||||
# define YS_FALLTHROUGH [[gnu::fallthrough]];
|
||||
#else
|
||||
# define YS_FALLTHROUGH
|
||||
# error "C++17 or later compatible compiler is required"
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ popd
|
|||
tail -n +$((n+1)) "$vcxsrc"/YosysVS/YosysVS.vcxproj
|
||||
} > "$vcxsrc"/YosysVS/YosysVS.vcxproj.new
|
||||
|
||||
sed -i 's,</AdditionalIncludeDirectories>,</AdditionalIncludeDirectories>\n <LanguageStandard>stdcpp17</LanguageStandard>\n <AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>,g' "$vcxsrc"/YosysVS/YosysVS.vcxproj.new
|
||||
mv "$vcxsrc"/YosysVS/YosysVS.vcxproj.new "$vcxsrc"/YosysVS/YosysVS.vcxproj
|
||||
|
||||
mkdir -p "$vcxsrc"/yosys
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@ struct OptLutInsPass : public Pass {
|
|||
module->remove(cell);
|
||||
}
|
||||
}
|
||||
} XilinxDffOptPass;
|
||||
} OptLutInsPass;
|
||||
|
||||
PRIVATE_NAMESPACE_END
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@ PRIVATE_NAMESPACE_BEGIN
|
|||
|
||||
bool did_something;
|
||||
|
||||
// scratchpad configurations for pmgen
|
||||
int shiftadd_max_ratio;
|
||||
|
||||
#include "passes/pmgen/peepopt_pm.h"
|
||||
|
||||
struct PeepoptPass : public Pass {
|
||||
|
|
@ -50,6 +53,9 @@ struct PeepoptPass : public Pass {
|
|||
log("\n");
|
||||
log(" * shiftadd - Replace A>>(B+D) with (A'>>D)>>(B) where D is constant and\n");
|
||||
log(" A' is derived from A by padding or cutting inaccessible bits.\n");
|
||||
log(" Scratchpad: 'peepopt.shiftadd.max_data_multiple' (default: 2)\n");
|
||||
log(" limits the amount of padding to a multiple of the data, \n");
|
||||
log(" to avoid high resource usage from large temporary MUX trees.\n");
|
||||
log("\n");
|
||||
}
|
||||
void execute(std::vector<std::string> args, RTLIL::Design *design) override
|
||||
|
|
@ -63,6 +69,11 @@ struct PeepoptPass : public Pass {
|
|||
}
|
||||
extra_args(args, argidx, design);
|
||||
|
||||
// limit the padding from shiftadd to a multiple of the input data
|
||||
// during techmap it creates (#data + #padding) * log(shift) $_MUX_ cells
|
||||
// 2x implies there is a constant shift larger than the input-data which should be extremely rare
|
||||
shiftadd_max_ratio = design->scratchpad_get_int("peepopt.shiftadd.max_data_multiple", 2);
|
||||
|
||||
for (auto module : design->selected_modules())
|
||||
{
|
||||
did_something = true;
|
||||
|
|
|
|||
|
|
@ -91,11 +91,21 @@ code
|
|||
// it should only differ if previous passes create invalid data
|
||||
log_assert(!(offset>0 && var_signed));
|
||||
|
||||
SigSpec old_a = port(shift, \A); // data
|
||||
std::string location = shift->get_src_attribute();
|
||||
|
||||
if(shiftadd_max_ratio>0 && offset<0 && -offset*shiftadd_max_ratio > old_a.size()) {
|
||||
log_warning("at %s: candiate for shiftadd optimization (shifting '%s' by '%s - %d' bits) "
|
||||
"was ignored to avoid high resource usage, see help peepopt\n",
|
||||
location.c_str(), log_signal(old_a), log_signal(var_signal), -offset);
|
||||
reject;
|
||||
}
|
||||
|
||||
did_something = true;
|
||||
log("shiftadd pattern in %s: shift=%s, add/sub=%s, offset: %d\n", \
|
||||
log_id(module), log_id(shift), log_id(add), offset);
|
||||
|
||||
SigSpec old_a = port(shift, \A), new_a;
|
||||
SigSpec new_a;
|
||||
if(offset<0) {
|
||||
// data >> (...-c) transformed to {data, c'X} >> (...)
|
||||
SigSpec padding( (shift->type.in($shiftx) ? State::Sx : State::S0), -offset );
|
||||
|
|
@ -107,14 +117,13 @@ code
|
|||
new_a.append(old_a.extract_end(offset));
|
||||
} else {
|
||||
// warn user in case data is empty (no bits left)
|
||||
std::string location = shift->get_src_attribute();
|
||||
if (location.empty())
|
||||
location = shift->name.str();
|
||||
if(shift->type.in($shiftx))
|
||||
log_warning("at %s: result of indexed part-selection is always constant (selecting from '%s' with index '%s + %d')\n", \
|
||||
location.c_str(), log_signal(old_a), log_signal(var_signal), offset);
|
||||
else
|
||||
log_warning("at %s: result of shift operation is always constant (shifting '%s' by '%s + %d'-bits)\n", \
|
||||
log_warning("at %s: result of shift operation is always constant (shifting '%s' by '%s + %d' bits)\n", \
|
||||
location.c_str(), log_signal(old_a), log_signal(var_signal), offset);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,3 +11,7 @@ run_subtest () {
|
|||
|
||||
run_subtest value
|
||||
run_subtest value_fuzz
|
||||
|
||||
# Compile-only test.
|
||||
../../yosys -p "read_verilog test_unconnected_output.v; proc; clean; write_cxxrtl cxxrtl-test-unconnected_output.cc"
|
||||
${CC:-gcc} -std=c++11 -c -o cxxrtl-test-unconnected_output -I../../backends/cxxrtl/runtime cxxrtl-test-unconnected_output.cc
|
||||
|
|
|
|||
24
tests/cxxrtl/test_unconnected_output.v
Normal file
24
tests/cxxrtl/test_unconnected_output.v
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
(* cxxrtl_blackbox *)
|
||||
module blackbox(...);
|
||||
(* cxxrtl_edge = "p" *)
|
||||
input clk;
|
||||
|
||||
(* cxxrtl_sync *)
|
||||
output [7:0] out1;
|
||||
|
||||
(* cxxrtl_sync *)
|
||||
output [7:0] out2;
|
||||
endmodule
|
||||
|
||||
module unconnected_output(
|
||||
input clk,
|
||||
in,
|
||||
output out
|
||||
);
|
||||
blackbox bb (
|
||||
.clock (clock),
|
||||
.in (in),
|
||||
.out1 (out),
|
||||
.out2 (/* unconnected */),
|
||||
);
|
||||
endmodule
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
#include <cinttypes>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
|
|
@ -62,17 +63,17 @@ void test_binary_operation_for_bitsize(Operation &op)
|
|||
for (size_t i = 0; i * chunk_bits < Bits; i++) {
|
||||
if ((chunk_type)(iresult >> (i * chunk_bits)) != vresult.data[i]) {
|
||||
std::printf("Test failure:\n");
|
||||
std::printf("Bits: %i\n", Bits);
|
||||
std::printf("a: %016lx\n", ia);
|
||||
std::printf("b: %016lx\n", ib);
|
||||
std::printf("iresult: %016lx\n", iresult);
|
||||
std::printf("vresult: %016lx\n", vresult.template get<uint64_t>());
|
||||
std::printf("Bits: %zu\n", Bits);
|
||||
std::printf("a: %016" PRIx64 "\n", ia);
|
||||
std::printf("b: %016" PRIx64 "\n", ib);
|
||||
std::printf("iresult: %016" PRIx64 "\n", iresult);
|
||||
std::printf("vresult: %016" PRIx64 "\n", vresult.template get<uint64_t>());
|
||||
|
||||
std::terminate();
|
||||
}
|
||||
}
|
||||
}
|
||||
std::printf("Test passed @ Bits = %i.\n", Bits);
|
||||
std::printf("Test passed @ Bits = %zu.\n", Bits);
|
||||
}
|
||||
|
||||
template<typename Operation>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue