3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-06 14:13:23 +00:00

Reapply "Merge upstream"

This reverts commit e73d51dbf0.
This commit is contained in:
Akash Levy 2025-01-23 13:40:32 -08:00
parent 2ae7490adf
commit bd439fc524
15 changed files with 110 additions and 49 deletions

View file

@ -8,7 +8,7 @@ runs:
shell: bash shell: bash
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install gperf build-essential bison flex libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev libnsl-dev libbz2-dev libdwarf-dev libelf-dev elfutils libdw-dev sudo apt-get install gperf build-essential bison flex libreadline-dev gawk tcl-dev libffi-dev git graphviz xdot pkg-config python3 libboost-system-dev libboost-python-dev libboost-filesystem-dev zlib1g-dev libbz2-dev libnsl-dev libdwarf-dev libelf-dev elfutils libdw-dev
- name: Install macOS Dependencies - name: Install macOS Dependencies
if: runner.os == 'macOS' if: runner.os == 'macOS'

View file

@ -30,18 +30,15 @@ jobs:
- ubuntu-latest - ubuntu-latest
compiler: compiler:
# oldest supported # oldest supported
- 'clang-14' - 'clang-10'
- 'gcc-10' - 'gcc-10'
# newest, make sure to update maximum standard step to match # newest, make sure to update maximum standard step to match
- 'clang-18' - 'clang-19'
- 'gcc-13' - 'gcc-13'
include: include:
# macOS # macOS
- os: macos-13 - os: macos-13
compiler: 'clang' compiler: 'clang'
# oldest clang not available on ubuntu-latest
- os: ubuntu-20.04
compiler: 'clang-10'
fail-fast: false fail-fast: false
steps: steps:
- name: Checkout Yosys - name: Checkout Yosys
@ -72,7 +69,7 @@ jobs:
# maximum standard, only on newest compilers # maximum standard, only on newest compilers
- name: Build C++20 - name: Build C++20
if: ${{ matrix.compiler == 'clang-18' || matrix.compiler == 'gcc-13' }} if: ${{ matrix.compiler == 'clang-19' || matrix.compiler == 'gcc-13' }}
shell: bash shell: bash
run: | run: |
make config-$CC_SHORT make config-$CC_SHORT

View file

@ -1,6 +1,6 @@
ISC License ISC License
Copyright (C) 2012 - 2020 Claire Xenia Wolf <claire@yosyshq.com> Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com>
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above

View file

@ -171,7 +171,7 @@ ifeq ($(OS), Haiku)
CXXFLAGS += -D_DEFAULT_SOURCE CXXFLAGS += -D_DEFAULT_SOURCE
endif endif
YOSYS_VER := 0.48+77 YOSYS_VER := 0.48+98
# Note: We arrange for .gitcommit to contain the (short) commit hash in # Note: We arrange for .gitcommit to contain the (short) commit hash in
# tarballs generated with git-archive(1) using .gitattributes. The git repo # tarballs generated with git-archive(1) using .gitattributes. The git repo

View file

@ -11,6 +11,29 @@ yosys_ver = "0.48"
# select HTML theme # select HTML theme
html_theme = 'furo-ys' html_theme = 'furo-ys'
html_css_files = ['custom.css'] html_css_files = ['custom.css']
html_theme_options: dict[str] = {
"source_repository": "https://github.com/YosysHQ/yosys/",
"source_branch": "main",
"source_directory": "docs/source/",
}
# try to fix the readthedocs detection
html_context: dict[str] = {
"READTHEDOCS": True,
"display_github": True,
"github_user": "YosysHQ",
"github_repo": "yosys",
"slug": "yosys",
}
# override source_branch if not main
git_slug = os.getenv("READTHEDOCS_VERSION_NAME")
if git_slug not in [None, "latest", "stable"]:
html_theme_options["source_branch"] = git_slug
# edit only works on branches, not tags
if os.getenv("READTHEDOCS_VERSION_TYPE", "branch") != "branch":
html_theme_options["top_of_page_buttons"] = ["view"]
# These folders are copied to the documentation's HTML output # These folders are copied to the documentation's HTML output
html_static_path = ['_static', "_images"] html_static_path = ['_static', "_images"]

View file

@ -97,8 +97,8 @@ Making a type hashable
Let's first take a look at the external interface on a simplified level. Let's first take a look at the external interface on a simplified level.
Generally, to get the hash for ``T obj``, you would call the utility function Generally, to get the hash for ``T obj``, you would call the utility function
``run_hash<T>(const T& obj)``, corresponding to ``hash_top_ops<T>::hash(obj)``, ``run_hash<T>(const T& obj)``, corresponding to ``hash_ops<T>::hash(obj)``,
the default implementation of which is ``hash_ops<T>::hash_into(Hasher(), obj)``. the default implementation of which uses ``hash_ops<T>::hash_into(Hasher(), obj)``.
``Hasher`` is the class actually implementing the hash function, hiding its ``Hasher`` is the class actually implementing the hash function, hiding its
initialized internal state, and passing it out on ``hash_t yield()`` with initialized internal state, and passing it out on ``hash_t yield()`` with
perhaps some finalization steps. perhaps some finalization steps.
@ -121,8 +121,14 @@ size containers like ``std::vector<U>`` the size of the container is hashed
first. That is also how implementing hashing for a custom record data type first. That is also how implementing hashing for a custom record data type
should be - unless there is strong reason to do otherwise, call ``h.eat(m)`` on should be - unless there is strong reason to do otherwise, call ``h.eat(m)`` on
the ``Hasher h`` you have received for each member in sequence and ``return the ``Hasher h`` you have received for each member in sequence and ``return
h;``. If you do have a strong reason to do so, look at how h;``.
``hash_top_ops<RTLIL::SigBit>`` is implemented in ``kernel/rtlil.h``.
The ``hash_ops<T>::hash(obj)`` method is not indended to be called when
context of implementing the hashing for a record or other compound type.
When writing it, you should connect it to ``hash_ops<T>::hash_into(Hasher h)``
as shown below. If you have a strong reason to do so, and you have
to create a special implementation for top-level hashing, look at how
``hash_ops<RTLIL::SigBit>::hash(...)`` is implemented in ``kernel/rtlil.h``.
Porting plugins from the legacy interface Porting plugins from the legacy interface
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -148,6 +154,11 @@ based on the existance and value of `YS_HASHING_VERSION`.
h.eat(b); h.eat(b);
return h; return h;
} }
Hasher T::hash() const {
Hasher h;
h.eat(*this);
return h;
}
#else #else
#error "Unsupported hashing interface" #error "Unsupported hashing interface"
#endif #endif

View file

@ -1535,6 +1535,7 @@ void VerificImporter::import_netlist(RTLIL::Design *design, Netlist *nl, std::ma
log("Importing module %s.\n", RTLIL::id2cstr(module->name)); log("Importing module %s.\n", RTLIL::id2cstr(module->name));
} }
import_attributes(module->attributes, nl, nl); import_attributes(module->attributes, nl, nl);
if (module->name.isPublic())
module->set_string_attribute(ID::hdlname, nl->CellBaseName()); module->set_string_attribute(ID::hdlname, nl->CellBaseName());
module->set_string_attribute(ID(library), nl->Owner()->Owner()->Name()); module->set_string_attribute(ID(library), nl->Owner()->Owner()->Name());
#ifdef VERIFIC_VHDL_SUPPORT #ifdef VERIFIC_VHDL_SUPPORT

View file

@ -61,19 +61,9 @@ namespace legacy {
} }
}; };
/**
* Hash a type with an accumulator in a record or array context
*/
template<typename T> template<typename T>
struct hash_ops; struct hash_ops;
/**
* Hash a single instance in isolation.
* Can have explicit specialization, but the default redirects to hash_ops
*/
template<typename T>
struct hash_top_ops;
inline unsigned int mkhash_xorshift(unsigned int a) { inline unsigned int mkhash_xorshift(unsigned int a) {
if (sizeof(a) == 4) { if (sizeof(a) == 4) {
a ^= a << 13; a ^= a << 13;
@ -147,15 +137,14 @@ private:
using Hasher = HasherDJB32; using Hasher = HasherDJB32;
template<typename T> // Boilerplate compressor for trivially implementing
struct hash_top_ops { // top-level hash method with hash_into
static inline bool cmp(const T &a, const T &b) { #define HASH_TOP_LOOP_FST [[nodiscard]] static inline Hasher hash
return hash_ops<T>::cmp(a, b); #define HASH_TOP_LOOP_SND { \
Hasher h; \
h = hash_into(a, h); \
return h; \
} }
static inline Hasher hash(const T &a) {
return hash_ops<T>::hash_into(a, Hasher());
}
};
template<typename T> template<typename T>
struct hash_ops { struct hash_ops {
@ -183,6 +172,7 @@ struct hash_ops {
return a.hash_into(h); return a.hash_into(h);
} }
} }
HASH_TOP_LOOP_FST (const T &a) HASH_TOP_LOOP_SND
}; };
template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> { template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
@ -194,6 +184,7 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
h = hash_ops<Q>::hash_into(a.second, h); h = hash_ops<Q>::hash_into(a.second, h);
return h; return h;
} }
HASH_TOP_LOOP_FST (std::pair<P, Q> a) HASH_TOP_LOOP_SND
}; };
template<typename... T> struct hash_ops<std::tuple<T...>> { template<typename... T> struct hash_ops<std::tuple<T...>> {
@ -211,6 +202,7 @@ template<typename... T> struct hash_ops<std::tuple<T...>> {
h = element_ops_t::hash_into(std::get<I>(a), h); h = element_ops_t::hash_into(std::get<I>(a), h);
return h; return h;
} }
HASH_TOP_LOOP_FST (std::tuple<T...> a) HASH_TOP_LOOP_SND
}; };
template<typename T> struct hash_ops<std::vector<T>> { template<typename T> struct hash_ops<std::vector<T>> {
@ -223,6 +215,7 @@ template<typename T> struct hash_ops<std::vector<T>> {
h.eat(k); h.eat(k);
return h; return h;
} }
HASH_TOP_LOOP_FST (std::vector<T> a) HASH_TOP_LOOP_SND
}; };
template<typename T, size_t N> struct hash_ops<std::array<T, N>> { template<typename T, size_t N> struct hash_ops<std::array<T, N>> {
@ -234,6 +227,7 @@ template<typename T, size_t N> struct hash_ops<std::array<T, N>> {
h = hash_ops<T>::hash_into(k, h); h = hash_ops<T>::hash_into(k, h);
return h; return h;
} }
HASH_TOP_LOOP_FST (std::array<T, N> a) HASH_TOP_LOOP_SND
}; };
struct hash_cstr_ops { struct hash_cstr_ops {
@ -245,6 +239,7 @@ struct hash_cstr_ops {
h.hash32(*(a++)); h.hash32(*(a++));
return h; return h;
} }
HASH_TOP_LOOP_FST (const char *a) HASH_TOP_LOOP_SND
}; };
template <> struct hash_ops<char*> : hash_cstr_ops {}; template <> struct hash_ops<char*> : hash_cstr_ops {};
@ -256,6 +251,7 @@ struct hash_ptr_ops {
[[nodiscard]] static inline Hasher hash_into(const void *a, Hasher h) { [[nodiscard]] static inline Hasher hash_into(const void *a, Hasher h) {
return hash_ops<uintptr_t>::hash_into((uintptr_t)a, h); return hash_ops<uintptr_t>::hash_into((uintptr_t)a, h);
} }
HASH_TOP_LOOP_FST (const void *a) HASH_TOP_LOOP_SND
}; };
struct hash_obj_ops { struct hash_obj_ops {
@ -270,6 +266,8 @@ struct hash_obj_ops {
h.eat(0); h.eat(0);
return h; return h;
} }
template<typename T>
HASH_TOP_LOOP_FST (const T *a) HASH_TOP_LOOP_SND
}; };
/** /**
* If you find yourself using this function, think hard * If you find yourself using this function, think hard
@ -280,7 +278,7 @@ struct hash_obj_ops {
template<typename T> template<typename T>
[[nodiscard]] [[nodiscard]]
Hasher::hash_t run_hash(const T& obj) { Hasher::hash_t run_hash(const T& obj) {
return hash_top_ops<T>::hash(obj).yield(); return hash_ops<T>::hash(obj).yield();
} }
/** Refer to docs/source/yosys_internals/hashing.rst */ /** Refer to docs/source/yosys_internals/hashing.rst */
@ -352,10 +350,10 @@ inline unsigned int hashtable_size(unsigned int min_size)
throw std::length_error("hash table exceeded maximum size."); throw std::length_error("hash table exceeded maximum size.");
} }
template<typename K, typename T, typename OPS = hash_top_ops<K>> class dict; template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
template<typename K, int offset = 0, typename OPS = hash_top_ops<K>> class idict; template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
template<typename K, typename OPS = hash_top_ops<K>> class pool; template<typename K, typename OPS = hash_ops<K>> class pool;
template<typename K, typename OPS = hash_top_ops<K>> class mfp; template<typename K, typename OPS = hash_ops<K>> class mfp;
template<typename K, typename T, typename OPS> template<typename K, typename T, typename OPS>
class dict { class dict {

View file

@ -1221,7 +1221,7 @@ struct LicensePass : public Pass {
log(" | |\n"); log(" | |\n");
log(" | yosys -- Yosys Open SYnthesis Suite |\n"); log(" | yosys -- Yosys Open SYnthesis Suite |\n");
log(" | |\n"); log(" | |\n");
log(" | Copyright (C) 2012 - 2024 Claire Xenia Wolf <claire@yosyshq.com> |\n"); log(" | Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com> |\n");
log(" | |\n"); log(" | |\n");
log(" | Permission to use, copy, modify, and/or distribute this software for any |\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"); log(" | purpose with or without fee is hereby granted, provided that the above |\n");

View file

@ -398,13 +398,16 @@ struct RTLIL::IdString
namespace hashlib { namespace hashlib {
template <> template <>
struct hash_top_ops<RTLIL::IdString> { struct hash_ops<RTLIL::IdString> {
static inline bool cmp(const RTLIL::IdString &a, const RTLIL::IdString &b) { static inline bool cmp(const RTLIL::IdString &a, const RTLIL::IdString &b) {
return a == b; return a == b;
} }
static inline Hasher hash(const RTLIL::IdString id) { [[nodiscard]] static inline Hasher hash(const RTLIL::IdString id) {
return id.hash_top(); return id.hash_top();
} }
[[nodiscard]] static inline Hasher hash_into(const RTLIL::IdString id, Hasher h) {
return id.hash_into(h);
}
}; };
}; };
@ -926,13 +929,16 @@ struct RTLIL::SigBit
namespace hashlib { namespace hashlib {
template <> template <>
struct hash_top_ops<RTLIL::SigBit> { struct hash_ops<RTLIL::SigBit> {
static inline bool cmp(const RTLIL::SigBit &a, const RTLIL::SigBit &b) { static inline bool cmp(const RTLIL::SigBit &a, const RTLIL::SigBit &b) {
return a == b; return a == b;
} }
static inline Hasher hash(const RTLIL::SigBit sb) { [[nodiscard]] static inline Hasher hash(const RTLIL::SigBit sb) {
return sb.hash_top(); return sb.hash_top();
} }
[[nodiscard]] static inline Hasher hash_into(const RTLIL::SigBit sb, Hasher h) {
return sb.hash_into(h);
}
}; };
}; };

View file

@ -337,12 +337,14 @@ template<typename O>
std::vector<IdString> parse_hdlname(const O* object) std::vector<IdString> parse_hdlname(const O* object)
{ {
std::vector<IdString> path; std::vector<IdString> path;
if (!object->name.isPublic())
return path;
for (auto const &item : object->get_hdlname_attribute()) for (auto const &item : object->get_hdlname_attribute())
path.push_back("\\" + item); path.push_back("\\" + item);
if (path.empty()) if (path.empty() && object->name.isPublic())
path.push_back(object->name); path.push_back(object->name);
if (!path.empty() && !(object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract"))) {
path.pop_back();
path.push_back(object->name);
}
return path; return path;
} }
@ -351,17 +353,22 @@ std::pair<std::vector<IdString>, IdString> parse_scopename(const O* object)
{ {
std::vector<IdString> path; std::vector<IdString> path;
IdString trailing = object->name; IdString trailing = object->name;
if (object->name.isPublic()) { if (object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract")) {
for (auto const &item : object->get_hdlname_attribute()) for (auto const &item : object->get_hdlname_attribute())
path.push_back("\\" + item); path.push_back("\\" + item);
if (!path.empty()) { if (!path.empty()) {
trailing = path.back(); trailing = path.back();
path.pop_back(); path.pop_back();
} }
} else if (object->has_attribute(ID::hdlname)) {
for (auto const &item : object->get_hdlname_attribute())
path.push_back("\\" + item);
if (!path.empty()) {
path.pop_back();
}
} else { } else {
for (auto const &item : split_tokens(object->get_string_attribute(ID(scopename)), " ")) for (auto const &item : split_tokens(object->get_string_attribute(ID(scopename)), " "))
path.push_back("\\" + item); path.push_back("\\" + item);
} }
return {path, trailing}; return {path, trailing};
} }

View file

@ -144,7 +144,7 @@ void yosys_banner()
log("\n"); log("\n");
log(" /----------------------------------------------------------------------------\\\n"); log(" /----------------------------------------------------------------------------\\\n");
log(" | yosys -- Yosys Open SYnthesis Suite |\n"); log(" | yosys -- Yosys Open SYnthesis Suite |\n");
log(" | Copyright (C) 2012 - 2024 Claire Xenia Wolf <claire@yosyshq.com> |\n"); log(" | Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com> |\n");
log(" | Distributed under an ISC-like license, type \"license\" to see terms |\n"); log(" | Distributed under an ISC-like license, type \"license\" to see terms |\n");
log(" \\----------------------------------------------------------------------------/\n"); log(" \\----------------------------------------------------------------------------/\n");
log(" %s\n", yosys_version_str); log(" %s\n", yosys_version_str);

View file

@ -24,6 +24,7 @@
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
#include <cstdio> #include <cstdio>
#include <cstdint>
#include <limits> #include <limits>
namespace json11 { namespace json11 {

View file

@ -377,6 +377,13 @@ static void extract_fsm(RTLIL::Wire *wire)
fsm_cell->setPort(ID::CTRL_OUT, ctrl_out); fsm_cell->setPort(ID::CTRL_OUT, ctrl_out);
fsm_cell->parameters[ID::NAME] = RTLIL::Const(wire->name.str()); fsm_cell->parameters[ID::NAME] = RTLIL::Const(wire->name.str());
fsm_cell->attributes = wire->attributes; fsm_cell->attributes = wire->attributes;
if(fsm_cell->attributes.count(ID::hdlname)) {
auto hdlname = fsm_cell->get_hdlname_attribute();
hdlname.pop_back();
fsm_cell->set_hdlname_attribute(hdlname);
fsm_cell->set_string_attribute(ID(scopename), fsm_cell->get_string_attribute(ID::hdlname));
fsm_cell->attributes.erase(ID::hdlname);
}
fsm_data.copy_to_cell(fsm_cell); fsm_data.copy_to_cell(fsm_cell);
// rename original state wire // rename original state wire
@ -385,6 +392,13 @@ static void extract_fsm(RTLIL::Wire *wire)
wire->attributes.erase(ID::fsm_encoding); wire->attributes.erase(ID::fsm_encoding);
wire->name = stringf("$fsm$oldstate%s", wire->name.c_str()); wire->name = stringf("$fsm$oldstate%s", wire->name.c_str());
module->wires_[wire->name] = wire; module->wires_[wire->name] = wire;
if(wire->attributes.count(ID::hdlname)) {
auto hdlname = wire->get_hdlname_attribute();
hdlname.pop_back();
wire->set_hdlname_attribute(hdlname);
wire->set_string_attribute(ID(scopename), wire->get_string_attribute(ID::hdlname));
wire->attributes.erase(ID::hdlname);
}
// unconnect control outputs from old drivers // unconnect control outputs from old drivers

View file

@ -360,6 +360,9 @@ struct FlattenPass : public Pass {
FlattenWorker worker; FlattenWorker worker;
if (design->scratchpad.count("flatten.separator"))
worker.separator = design->scratchpad_get_string("flatten.separator");
size_t argidx; size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) { for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-wb") { if (args[argidx] == "-wb") {