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

Merge pull request #2145 from whitequark/cxxrtl-splitnets

cxxrtl: handle multipart signals
This commit is contained in:
whitequark 2020-06-13 04:23:22 +00:00 committed by GitHub
commit dc6961f3d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 156 additions and 67 deletions

View file

@ -771,76 +771,119 @@ struct debug_item : ::cxxrtl_object {
debug_item(const ::cxxrtl_object &object) : cxxrtl_object(object) {}
template<size_t Bits>
debug_item(value<Bits> &item) {
debug_item(value<Bits> &item, size_t lsb_offset = 0) {
static_assert(sizeof(item) == value<Bits>::chunks * sizeof(chunk_t),
"value<Bits> is not compatible with C layout");
type = VALUE;
width = Bits;
depth = 1;
curr = item.data;
next = item.data;
type = VALUE;
width = Bits;
lsb_at = lsb_offset;
depth = 1;
zero_at = 0;
curr = item.data;
next = item.data;
}
template<size_t Bits>
debug_item(const value<Bits> &item) {
debug_item(const value<Bits> &item, size_t lsb_offset = 0) {
static_assert(sizeof(item) == value<Bits>::chunks * sizeof(chunk_t),
"value<Bits> is not compatible with C layout");
type = VALUE;
width = Bits;
depth = 1;
curr = const_cast<chunk_t*>(item.data);
next = nullptr;
type = VALUE;
width = Bits;
lsb_at = lsb_offset;
depth = 1;
zero_at = 0;
curr = const_cast<chunk_t*>(item.data);
next = nullptr;
}
template<size_t Bits>
debug_item(wire<Bits> &item) {
debug_item(wire<Bits> &item, size_t lsb_offset = 0) {
static_assert(sizeof(item.curr) == value<Bits>::chunks * sizeof(chunk_t) &&
sizeof(item.next) == value<Bits>::chunks * sizeof(chunk_t),
"wire<Bits> is not compatible with C layout");
type = WIRE;
width = Bits;
depth = 1;
curr = item.curr.data;
next = item.next.data;
type = WIRE;
width = Bits;
lsb_at = lsb_offset;
depth = 1;
zero_at = 0;
curr = item.curr.data;
next = item.next.data;
}
template<size_t Width>
debug_item(memory<Width> &item) {
debug_item(memory<Width> &item, size_t zero_offset = 0) {
static_assert(sizeof(item.data[0]) == value<Width>::chunks * sizeof(chunk_t),
"memory<Width> is not compatible with C layout");
type = MEMORY;
width = Width;
depth = item.data.size();
curr = item.data.empty() ? nullptr : item.data[0].data;
next = nullptr;
type = MEMORY;
width = Width;
lsb_at = 0;
depth = item.data.size();
zero_at = zero_offset;
curr = item.data.empty() ? nullptr : item.data[0].data;
next = nullptr;
}
template<size_t Bits>
debug_item(debug_alias, const value<Bits> &item) {
debug_item(debug_alias, const value<Bits> &item, size_t lsb_offset = 0) {
static_assert(sizeof(item) == value<Bits>::chunks * sizeof(chunk_t),
"value<Bits> is not compatible with C layout");
type = ALIAS;
width = Bits;
depth = 1;
curr = const_cast<chunk_t*>(item.data);
next = nullptr;
type = ALIAS;
width = Bits;
lsb_at = lsb_offset;
depth = 1;
zero_at = 0;
curr = const_cast<chunk_t*>(item.data);
next = nullptr;
}
template<size_t Bits>
debug_item(debug_alias, const wire<Bits> &item) {
debug_item(debug_alias, const wire<Bits> &item, size_t lsb_offset = 0) {
static_assert(sizeof(item.curr) == value<Bits>::chunks * sizeof(chunk_t) &&
sizeof(item.next) == value<Bits>::chunks * sizeof(chunk_t),
"wire<Bits> is not compatible with C layout");
type = ALIAS;
width = Bits;
depth = 1;
curr = const_cast<chunk_t*>(item.curr.data);
next = nullptr;
type = ALIAS;
width = Bits;
lsb_at = lsb_offset;
depth = 1;
zero_at = 0;
curr = const_cast<chunk_t*>(item.curr.data);
next = nullptr;
}
};
static_assert(std::is_standard_layout<debug_item>::value, "debug_item is not compatible with C layout");
typedef std::map<std::string, debug_item> debug_items;
struct debug_items {
std::map<std::string, std::vector<debug_item>> table;
void add(const std::string &name, debug_item &&item) {
std::vector<debug_item> &parts = table[name];
parts.emplace_back(item);
std::sort(parts.begin(), parts.end(),
[](const debug_item &a, const debug_item &b) {
return a.lsb_at < b.lsb_at;
});
}
size_t count(const std::string &name) const {
if (table.count(name) == 0)
return 0;
return table.at(name).size();
}
const std::vector<debug_item> &parts_at(const std::string &name) const {
return table.at(name);
}
const debug_item &at(const std::string &name) const {
const std::vector<debug_item> &parts = table.at(name);
assert(parts.size() == 1);
return parts.at(0);
}
const debug_item &operator [](const std::string &name) const {
return at(name);
}
};
struct module {
module() {}