mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-20 23:56:38 +00:00
Revert "Merge upstream"
This reverts commitc58a50f880
, reversing changes made toa1c3c98773
.
This commit is contained in:
parent
c58a50f880
commit
e73d51dbf0
2
.github/actions/setup-build-env/action.yml
vendored
2
.github/actions/setup-build-env/action.yml
vendored
|
@ -8,7 +8,7 @@ runs:
|
|||
shell: bash
|
||||
run: |
|
||||
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 libbz2-dev libnsl-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 libnsl-dev libbz2-dev libdwarf-dev libelf-dev elfutils libdw-dev
|
||||
|
||||
- name: Install macOS Dependencies
|
||||
if: runner.os == 'macOS'
|
||||
|
|
9
.github/workflows/test-compile.yml
vendored
9
.github/workflows/test-compile.yml
vendored
|
@ -30,15 +30,18 @@ jobs:
|
|||
- ubuntu-latest
|
||||
compiler:
|
||||
# oldest supported
|
||||
- 'clang-10'
|
||||
- 'clang-14'
|
||||
- 'gcc-10'
|
||||
# newest, make sure to update maximum standard step to match
|
||||
- 'clang-19'
|
||||
- 'clang-18'
|
||||
- 'gcc-13'
|
||||
include:
|
||||
# macOS
|
||||
- os: macos-13
|
||||
compiler: 'clang'
|
||||
# oldest clang not available on ubuntu-latest
|
||||
- os: ubuntu-20.04
|
||||
compiler: 'clang-10'
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout Yosys
|
||||
|
@ -69,7 +72,7 @@ jobs:
|
|||
|
||||
# maximum standard, only on newest compilers
|
||||
- name: Build C++20
|
||||
if: ${{ matrix.compiler == 'clang-19' || matrix.compiler == 'gcc-13' }}
|
||||
if: ${{ matrix.compiler == 'clang-18' || matrix.compiler == 'gcc-13' }}
|
||||
shell: bash
|
||||
run: |
|
||||
make config-$CC_SHORT
|
||||
|
|
2
COPYING
2
COPYING
|
@ -1,6 +1,6 @@
|
|||
ISC License
|
||||
|
||||
Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com>
|
||||
Copyright (C) 2012 - 2020 Claire Xenia Wolf <claire@yosyshq.com>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
|
|
2
Makefile
2
Makefile
|
@ -171,7 +171,7 @@ ifeq ($(OS), Haiku)
|
|||
CXXFLAGS += -D_DEFAULT_SOURCE
|
||||
endif
|
||||
|
||||
YOSYS_VER := 0.48+98
|
||||
YOSYS_VER := 0.48+77
|
||||
|
||||
# Note: We arrange for .gitcommit to contain the (short) commit hash in
|
||||
# tarballs generated with git-archive(1) using .gitattributes. The git repo
|
||||
|
|
|
@ -11,29 +11,6 @@ yosys_ver = "0.48"
|
|||
# select HTML theme
|
||||
html_theme = 'furo-ys'
|
||||
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
|
||||
html_static_path = ['_static', "_images"]
|
||||
|
|
|
@ -97,8 +97,8 @@ Making a type hashable
|
|||
|
||||
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
|
||||
``run_hash<T>(const T& obj)``, corresponding to ``hash_ops<T>::hash(obj)``,
|
||||
the default implementation of which uses ``hash_ops<T>::hash_into(Hasher(), obj)``.
|
||||
``run_hash<T>(const T& obj)``, corresponding to ``hash_top_ops<T>::hash(obj)``,
|
||||
the default implementation of which is ``hash_ops<T>::hash_into(Hasher(), obj)``.
|
||||
``Hasher`` is the class actually implementing the hash function, hiding its
|
||||
initialized internal state, and passing it out on ``hash_t yield()`` with
|
||||
perhaps some finalization steps.
|
||||
|
@ -121,14 +121,8 @@ 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
|
||||
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
|
||||
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``.
|
||||
h;``. If you do have a strong reason to do so, look at how
|
||||
``hash_top_ops<RTLIL::SigBit>`` is implemented in ``kernel/rtlil.h``.
|
||||
|
||||
Porting plugins from the legacy interface
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -154,11 +148,6 @@ based on the existance and value of `YS_HASHING_VERSION`.
|
|||
h.eat(b);
|
||||
return h;
|
||||
}
|
||||
Hasher T::hash() const {
|
||||
Hasher h;
|
||||
h.eat(*this);
|
||||
return h;
|
||||
}
|
||||
#else
|
||||
#error "Unsupported hashing interface"
|
||||
#endif
|
||||
|
|
|
@ -1535,8 +1535,7 @@ void VerificImporter::import_netlist(RTLIL::Design *design, Netlist *nl, std::ma
|
|||
log("Importing module %s.\n", RTLIL::id2cstr(module->name));
|
||||
}
|
||||
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());
|
||||
#ifdef VERIFIC_VHDL_SUPPORT
|
||||
if (nl->IsFromVhdl()) {
|
||||
|
|
|
@ -61,9 +61,19 @@ namespace legacy {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Hash a type with an accumulator in a record or array context
|
||||
*/
|
||||
template<typename T>
|
||||
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) {
|
||||
if (sizeof(a) == 4) {
|
||||
a ^= a << 13;
|
||||
|
@ -137,14 +147,15 @@ private:
|
|||
|
||||
using Hasher = HasherDJB32;
|
||||
|
||||
// Boilerplate compressor for trivially implementing
|
||||
// top-level hash method with hash_into
|
||||
#define HASH_TOP_LOOP_FST [[nodiscard]] static inline Hasher hash
|
||||
#define HASH_TOP_LOOP_SND { \
|
||||
Hasher h; \
|
||||
h = hash_into(a, h); \
|
||||
return h; \
|
||||
}
|
||||
template<typename T>
|
||||
struct hash_top_ops {
|
||||
static inline bool cmp(const T &a, const T &b) {
|
||||
return hash_ops<T>::cmp(a, b);
|
||||
}
|
||||
static inline Hasher hash(const T &a) {
|
||||
return hash_ops<T>::hash_into(a, Hasher());
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct hash_ops {
|
||||
|
@ -172,7 +183,6 @@ struct hash_ops {
|
|||
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>> {
|
||||
|
@ -184,7 +194,6 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
|
|||
h = hash_ops<Q>::hash_into(a.second, 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...>> {
|
||||
|
@ -202,7 +211,6 @@ template<typename... T> struct hash_ops<std::tuple<T...>> {
|
|||
h = element_ops_t::hash_into(std::get<I>(a), h);
|
||||
return h;
|
||||
}
|
||||
HASH_TOP_LOOP_FST (std::tuple<T...> a) HASH_TOP_LOOP_SND
|
||||
};
|
||||
|
||||
template<typename T> struct hash_ops<std::vector<T>> {
|
||||
|
@ -215,7 +223,6 @@ template<typename T> struct hash_ops<std::vector<T>> {
|
|||
h.eat(k);
|
||||
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>> {
|
||||
|
@ -227,7 +234,6 @@ template<typename T, size_t N> struct hash_ops<std::array<T, N>> {
|
|||
h = hash_ops<T>::hash_into(k, h);
|
||||
return h;
|
||||
}
|
||||
HASH_TOP_LOOP_FST (std::array<T, N> a) HASH_TOP_LOOP_SND
|
||||
};
|
||||
|
||||
struct hash_cstr_ops {
|
||||
|
@ -239,7 +245,6 @@ struct hash_cstr_ops {
|
|||
h.hash32(*(a++));
|
||||
return h;
|
||||
}
|
||||
HASH_TOP_LOOP_FST (const char *a) HASH_TOP_LOOP_SND
|
||||
};
|
||||
|
||||
template <> struct hash_ops<char*> : hash_cstr_ops {};
|
||||
|
@ -251,7 +256,6 @@ struct hash_ptr_ops {
|
|||
[[nodiscard]] static inline Hasher hash_into(const void *a, Hasher 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 {
|
||||
|
@ -266,8 +270,6 @@ struct hash_obj_ops {
|
|||
h.eat(0);
|
||||
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
|
||||
|
@ -278,7 +280,7 @@ struct hash_obj_ops {
|
|||
template<typename T>
|
||||
[[nodiscard]]
|
||||
Hasher::hash_t run_hash(const T& obj) {
|
||||
return hash_ops<T>::hash(obj).yield();
|
||||
return hash_top_ops<T>::hash(obj).yield();
|
||||
}
|
||||
|
||||
/** Refer to docs/source/yosys_internals/hashing.rst */
|
||||
|
@ -350,10 +352,10 @@ inline unsigned int hashtable_size(unsigned int min_size)
|
|||
throw std::length_error("hash table exceeded maximum size.");
|
||||
}
|
||||
|
||||
template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
|
||||
template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
|
||||
template<typename K, typename OPS = hash_ops<K>> class pool;
|
||||
template<typename K, typename OPS = hash_ops<K>> class mfp;
|
||||
template<typename K, typename T, typename OPS = hash_top_ops<K>> class dict;
|
||||
template<typename K, int offset = 0, typename OPS = hash_top_ops<K>> class idict;
|
||||
template<typename K, typename OPS = hash_top_ops<K>> class pool;
|
||||
template<typename K, typename OPS = hash_top_ops<K>> class mfp;
|
||||
|
||||
template<typename K, typename T, typename OPS>
|
||||
class dict {
|
||||
|
|
|
@ -1221,7 +1221,7 @@ struct LicensePass : public Pass {
|
|||
log(" | |\n");
|
||||
log(" | yosys -- Yosys Open SYnthesis Suite |\n");
|
||||
log(" | |\n");
|
||||
log(" | Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com> |\n");
|
||||
log(" | Copyright (C) 2012 - 2024 Claire Xenia Wolf <claire@yosyshq.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");
|
||||
|
|
|
@ -398,16 +398,13 @@ struct RTLIL::IdString
|
|||
|
||||
namespace hashlib {
|
||||
template <>
|
||||
struct hash_ops<RTLIL::IdString> {
|
||||
struct hash_top_ops<RTLIL::IdString> {
|
||||
static inline bool cmp(const RTLIL::IdString &a, const RTLIL::IdString &b) {
|
||||
return a == b;
|
||||
}
|
||||
[[nodiscard]] static inline Hasher hash(const RTLIL::IdString id) {
|
||||
static inline Hasher hash(const RTLIL::IdString id) {
|
||||
return id.hash_top();
|
||||
}
|
||||
[[nodiscard]] static inline Hasher hash_into(const RTLIL::IdString id, Hasher h) {
|
||||
return id.hash_into(h);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -929,16 +926,13 @@ struct RTLIL::SigBit
|
|||
|
||||
namespace hashlib {
|
||||
template <>
|
||||
struct hash_ops<RTLIL::SigBit> {
|
||||
struct hash_top_ops<RTLIL::SigBit> {
|
||||
static inline bool cmp(const RTLIL::SigBit &a, const RTLIL::SigBit &b) {
|
||||
return a == b;
|
||||
}
|
||||
[[nodiscard]] static inline Hasher hash(const RTLIL::SigBit sb) {
|
||||
static inline Hasher hash(const RTLIL::SigBit sb) {
|
||||
return sb.hash_top();
|
||||
}
|
||||
[[nodiscard]] static inline Hasher hash_into(const RTLIL::SigBit sb, Hasher h) {
|
||||
return sb.hash_into(h);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -337,14 +337,12 @@ template<typename O>
|
|||
std::vector<IdString> parse_hdlname(const O* object)
|
||||
{
|
||||
std::vector<IdString> path;
|
||||
if (!object->name.isPublic())
|
||||
return path;
|
||||
for (auto const &item : object->get_hdlname_attribute())
|
||||
path.push_back("\\" + item);
|
||||
if (path.empty() && object->name.isPublic())
|
||||
if (path.empty())
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -353,22 +351,17 @@ std::pair<std::vector<IdString>, IdString> parse_scopename(const O* object)
|
|||
{
|
||||
std::vector<IdString> path;
|
||||
IdString trailing = object->name;
|
||||
if (object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract")) {
|
||||
if (object->name.isPublic()) {
|
||||
for (auto const &item : object->get_hdlname_attribute())
|
||||
path.push_back("\\" + item);
|
||||
if (!path.empty()) {
|
||||
trailing = path.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 {
|
||||
for (auto const &item : split_tokens(object->get_string_attribute(ID(scopename)), " "))
|
||||
path.push_back("\\" + item);
|
||||
|
||||
}
|
||||
return {path, trailing};
|
||||
}
|
||||
|
|
|
@ -144,7 +144,7 @@ void yosys_banner()
|
|||
log("\n");
|
||||
log(" /----------------------------------------------------------------------------\\\n");
|
||||
log(" | yosys -- Yosys Open SYnthesis Suite |\n");
|
||||
log(" | Copyright (C) 2012 - 2025 Claire Xenia Wolf <claire@yosyshq.com> |\n");
|
||||
log(" | Copyright (C) 2012 - 2024 Claire Xenia Wolf <claire@yosyshq.com> |\n");
|
||||
log(" | Distributed under an ISC-like license, type \"license\" to see terms |\n");
|
||||
log(" \\----------------------------------------------------------------------------/\n");
|
||||
log(" %s\n", yosys_version_str);
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
|
||||
namespace json11 {
|
||||
|
|
|
@ -377,13 +377,6 @@ static void extract_fsm(RTLIL::Wire *wire)
|
|||
fsm_cell->setPort(ID::CTRL_OUT, ctrl_out);
|
||||
fsm_cell->parameters[ID::NAME] = RTLIL::Const(wire->name.str());
|
||||
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);
|
||||
|
||||
// rename original state wire
|
||||
|
@ -392,13 +385,6 @@ static void extract_fsm(RTLIL::Wire *wire)
|
|||
wire->attributes.erase(ID::fsm_encoding);
|
||||
wire->name = stringf("$fsm$oldstate%s", wire->name.c_str());
|
||||
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
|
||||
|
||||
|
|
|
@ -360,9 +360,6 @@ struct FlattenPass : public Pass {
|
|||
|
||||
FlattenWorker worker;
|
||||
|
||||
if (design->scratchpad.count("flatten.separator"))
|
||||
worker.separator = design->scratchpad_get_string("flatten.separator");
|
||||
|
||||
size_t argidx;
|
||||
for (argidx = 1; argidx < args.size(); argidx++) {
|
||||
if (args[argidx] == "-wb") {
|
||||
|
|
Loading…
Reference in a new issue