aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2020-02-18 08:41:48 -0800
committerEddie Hung <eddie@fpgeh.com>2020-02-27 10:17:29 -0800
commit9dcf204dece518a48192a90ea962a9d630283e11 (patch)
tree0903d1fda546051d2c2e8ac7f8af41334ca5d7a4
parent7c3b4b80ea62c53e3f4bd6d91dcf02ef09c40da7 (diff)
downloadyosys-9dcf204dece518a48192a90ea962a9d630283e11.tar.gz
yosys-9dcf204dece518a48192a90ea962a9d630283e11.tar.bz2
yosys-9dcf204dece518a48192a90ea962a9d630283e11.zip
TimingInfo: index by (port_name,offset)
-rw-r--r--kernel/timinginfo.h28
-rw-r--r--passes/techmap/abc9_ops.cc7
2 files changed, 23 insertions, 12 deletions
diff --git a/kernel/timinginfo.h b/kernel/timinginfo.h
index e2af4d51a..8d0904175 100644
--- a/kernel/timinginfo.h
+++ b/kernel/timinginfo.h
@@ -25,17 +25,27 @@
YOSYS_NAMESPACE_BEGIN
-typedef std::pair<RTLIL::SigBit,RTLIL::SigBit> BitBit;
-
-struct ModuleTiming
-{
- RTLIL::IdString type;
- dict<BitBit, int> comb;
- dict<RTLIL::SigBit, int> arrival, required;
-};
-
struct TimingInfo
{
+ struct NameBit
+ {
+ RTLIL::IdString name;
+ int offset;
+ NameBit() {}
+ NameBit(const RTLIL::SigBit &b) : name(b.wire->name), offset(b.offset) {}
+ bool operator==(const NameBit& nb) const { return nb.name == name && nb.offset == offset; }
+ bool operator!=(const NameBit& nb) const { return !operator==(nb); }
+ unsigned int hash() const { return mkhash_add(name.hash(), offset); }
+ };
+ typedef std::pair<NameBit,NameBit> BitBit;
+
+ struct ModuleTiming
+ {
+ RTLIL::IdString type;
+ dict<BitBit, int> comb;
+ dict<NameBit, int> arrival, required;
+ };
+
dict<RTLIL::IdString, ModuleTiming> data;
TimingInfo()
diff --git a/passes/techmap/abc9_ops.cc b/passes/techmap/abc9_ops.cc
index f7097fadb..e5de2bcc4 100644
--- a/passes/techmap/abc9_ops.cc
+++ b/passes/techmap/abc9_ops.cc
@@ -473,11 +473,11 @@ void prep_lut(RTLIL::Design *design, int maxlut)
auto &t = timing.setup_module(module);
- SigBit o;
+ TimingInfo::NameBit o;
std::vector<int> specify;
for (const auto &i : t.comb) {
auto &d = i.first.second;
- if (o == SigBit())
+ if (o == TimingInfo::NameBit())
o = d;
else if (o != d)
log_error("(* abc9_lut *) module '%s' with has more than one output.\n", log_id(module));
@@ -581,7 +581,8 @@ void prep_box(RTLIL::Design *design, bool dff_mode)
first = false;
else
ss << " ";
- auto it = t.find(wire);
+ log_assert(GetSize(wire) == 1);
+ auto it = t.find(SigBit(wire,0));
if (it == t.end())
// Assume that no setup time means zero
ss << 0;