From 653edd7a2f857d09bd8cecc48cc9ac76aea33098 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sun, 3 Aug 2014 15:00:38 +0200 Subject: [PATCH] Added query() API to ModIndex --- kernel/modtools.h | 54 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/kernel/modtools.h b/kernel/modtools.h index 09f2ae65e..56bc1882d 100644 --- a/kernel/modtools.h +++ b/kernel/modtools.h @@ -29,11 +29,11 @@ YOSYS_NAMESPACE_BEGIN struct ModIndex : public RTLIL::Monitor { struct PortInfo { - const RTLIL::Cell* cell; - const RTLIL::IdString &port; - const int offset; + RTLIL::Cell* cell; + RTLIL::IdString port; + int offset; - PortInfo(RTLIL::Cell* _c, const RTLIL::IdString &_p, int _o) : cell(_c), port(_p), offset(_o) { } + PortInfo(RTLIL::Cell* _c, RTLIL::IdString _p, int _o) : cell(_c), port(_p), offset(_o) { } bool operator<(const PortInfo &other) const { if (cell != other.cell) @@ -57,13 +57,13 @@ struct ModIndex : public RTLIL::Monitor std::map database; bool auto_reload_module; - void port_add(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &sig) + void port_add(RTLIL::Cell *cell, RTLIL::IdString port, const RTLIL::SigSpec &sig) { for (int i = 0; i < SIZE(sig); i++) database[sigmap(sig[i])].ports.insert(PortInfo(cell, port, i)); } - void port_del(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &sig) + void port_del(RTLIL::Cell *cell, RTLIL::IdString port, const RTLIL::SigSpec &sig) { for (int i = 0; i < SIZE(sig); i++) database[sigmap(sig[i])].ports.erase(PortInfo(cell, port, i)); @@ -122,14 +122,52 @@ struct ModIndex : public RTLIL::Monitor auto_reload_module = true; } - ModIndex(RTLIL::Module *_m) : module(_m) { + ModIndex(RTLIL::Module *_m) : module(_m) + { auto_reload_module = true; module->monitors.insert(this); } - ~ModIndex() { + ~ModIndex() + { module->monitors.erase(this); } + + SigBitInfo *query(RTLIL::SigBit bit) + { + if (auto_reload_module) + reload_module(); + auto it = database.find(sigmap(bit)); + if (it == database.end()) + return nullptr; + else + return &it->second; + } + + bool query_is_input(RTLIL::SigBit bit) + { + const SigBitInfo *info = query(bit); + if (info == nullptr) + return false; + return info->is_input; + } + + bool query_is_output(RTLIL::SigBit bit) + { + const SigBitInfo *info = query(bit); + if (info == nullptr) + return false; + return info->is_output; + } + + std::set &query_ports(RTLIL::SigBit bit) + { + static std::set empty_result_set; + SigBitInfo *info = query(bit); + if (info == nullptr) + return empty_result_set; + return info->ports; + } }; struct ModWalker -- 2.30.2