3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-12-19 10:43:44 +00:00

proc_mux: optimize source map locality for index density

This commit is contained in:
Emil J. Tywoniak 2025-11-15 01:04:30 +01:00
parent 72356456a1
commit a52bf59cb9

View file

@ -28,28 +28,32 @@
USING_YOSYS_NAMESPACE USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN PRIVATE_NAMESPACE_BEGIN
using SnippetSourceMap = dict<std::pair<int, const RTLIL::CaseRule*>, const Const*>; using SnippetSourceMap = std::vector<dict<const RTLIL::CaseRule*, const Const*>>;
struct SnippetSourceMapBuilder { struct SnippetSourceMapBuilder {
SnippetSourceMap map; SnippetSourceMap map;
void insert(int snippet, const RTLIL::CaseRule* cs, const RTLIL::SyncAction& action) { void insert(int snippet, const RTLIL::CaseRule* cs, const RTLIL::SyncAction& action) {
map.resize(std::max(map.size(), (size_t)snippet + 1));
if (action.src.size()) if (action.src.size())
map[std::make_pair(snippet, cs)] = &action.src; map[snippet][cs] = &action.src;
} }
}; };
struct SnippetSourceMapper { struct SnippetSourceMapper {
const SnippetSourceMap map; const SnippetSourceMap map;
void try_map_into(pool<std::string>& sources, int snippet, const RTLIL::CaseRule* cs) const { void try_map_into(pool<std::string>& sources, int snippet, const RTLIL::CaseRule* cs) const {
auto src_it = map.find(std::make_pair(snippet, cs)); if ((size_t)snippet < map.size()) {
if (src_it != map.end()) { const auto& snippet_map = map[snippet];
auto src_it = snippet_map.find(cs);
if (src_it != snippet_map.end()) {
sources.insert(src_it->second->decode_string()); sources.insert(src_it->second->decode_string());
} else { return;
}
}
auto cs_src = cs->get_src_attribute(); auto cs_src = cs->get_src_attribute();
if (cs_src.size()) { if (cs_src.size()) {
sources.insert(cs_src); sources.insert(cs_src);
} }
} }
}
}; };