diff options
author | gatecat <gatecat@ds0.me> | 2021-05-01 14:06:13 +0100 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2021-05-15 14:54:33 +0100 |
commit | af0bffbae905d92942492e0fdf42a4b02686b224 (patch) | |
tree | 6301f7baa46acb1e0fe18f0ba0015f35d35da16f /cyclonev | |
parent | c3cb9aa3f6fb4039716132a23e29259496e43611 (diff) | |
download | nextpnr-af0bffbae905d92942492e0fdf42a4b02686b224.tar.gz nextpnr-af0bffbae905d92942492e0fdf42a4b02686b224.tar.bz2 nextpnr-af0bffbae905d92942492e0fdf42a4b02686b224.zip |
cyclonev: Add some range types
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'cyclonev')
-rw-r--r-- | cyclonev/arch.h | 76 |
1 files changed, 69 insertions, 7 deletions
diff --git a/cyclonev/arch.h b/cyclonev/arch.h index c23c8cd3..4e6443c4 100644 --- a/cyclonev/arch.h +++ b/cyclonev/arch.h @@ -71,6 +71,61 @@ struct WireInfo uint64_t flags; }; +// This transforms a WireIds, and adds the mising half of the pair to create a PipId +using WireVecIterator = std::vector<WireId>::const_iterator; +struct UpDownhillPipIterator +{ + WireVecIterator base; + WireId other_wire; + bool is_uphill; + + UpDownhillPipIterator(WireVecIterator base, WireId other_wire, bool is_uphill) + : base(base), other_wire(other_wire), is_uphill(is_uphill){}; + + bool operator!=(const UpDownhillPipIterator &other) { return base != other.base; } + UpDownhillPipIterator operator++() + { + ++base; + return *this; + } + UpDownhillPipIterator operator++(int) + { + UpDownhillPipIterator prior(*this); + ++(*this); + return prior; + } + PipId operator*() { return is_uphill ? PipId(base->node, other_wire.node) : PipId(other_wire.node, base->node); } +}; + +struct UpDownhillPipRange +{ + UpDownhillPipIterator b, e; + + UpDownhillPipRange(const std::vector<WireId> &v, WireId other_wire, bool is_uphill) + : b(v.cbegin(), other_wire, is_uphill), e(v.cend(), other_wire, is_uphill){}; + + UpDownhillPipIterator begin() const { return b; } + UpDownhillPipIterator end() const { return e; } +}; + +// This transforms a map to a range of keys, used as the wire iterator +template <typename T> struct key_range +{ + key_range(const T &t) : b(t.cbegin()), e(t.cend()){}; + typename T::const_iterator b, e; + + struct xformed_iterator : public T::const_iterator + { + explicit xformed_iterator(typename T::const_iterator base) : T::const_iterator(base){}; + typename T::key_type operator*() { return this->T::const_iterator::operator*().first; } + }; + + xformed_iterator begin() const { return xformed_iterator(b); } + xformed_iterator end() const { return xformed_iterator(e); } +}; + +using AllWireRange = key_range<std::unordered_map<WireId, WireInfo>>; + struct ArchRanges : BaseArchRanges { using ArchArgsT = ArchArgs; @@ -79,9 +134,9 @@ struct ArchRanges : BaseArchRanges using TileBelsRangeT = std::vector<BelId>; using BelPinsRangeT = std::vector<IdString>; // Wires - using AllWiresRangeT = const std::unordered_set<WireId> &; - using DownhillPipRangeT = const std::vector<PipId> &; - using UphillPipRangeT = const std::vector<PipId> &; + using AllWiresRangeT = AllWireRange; + using DownhillPipRangeT = UpDownhillPipRange; + using UphillPipRangeT = UpDownhillPipRange; using WireBelPinRangeT = const std::vector<BelPin> &; // Pips using AllPipsRangeT = const std::unordered_set<PipId> &; @@ -127,7 +182,7 @@ struct Arch : BaseArch<ArchRanges> IdStringList getWireName(WireId wire) const override { return IdStringList(); } DelayQuad getWireDelay(WireId wire) const override { return DelayQuad(0); } const std::vector<BelPin> &getWireBelPins(WireId wire) const override { return empty_belpin_list; } - const std::unordered_set<WireId> &getWires() const override { return all_wires; } + AllWireRange getWires() const override { return AllWireRange(wires); } // ------------------------------------------------- @@ -138,8 +193,14 @@ struct Arch : BaseArch<ArchRanges> WireId getPipSrcWire(PipId pip) const override { return WireId(pip.src); }; WireId getPipDstWire(PipId pip) const override { return WireId(pip.dst); }; DelayQuad getPipDelay(PipId pip) const override { return DelayQuad(0); } - const std::vector<PipId> &getPipsDownhill(WireId wire) const override { return empty_pip_list; } - const std::vector<PipId> &getPipsUphill(WireId wire) const override { return empty_pip_list; } + UpDownhillPipRange getPipsDownhill(WireId wire) const override + { + return UpDownhillPipRange(wires.at(wire).wires_downhill, wire, false); + } + UpDownhillPipRange getPipsUphill(WireId wire) const override + { + return UpDownhillPipRange(wires.at(wire).wires_uphill, wire, true); + } // ------------------------------------------------- @@ -166,8 +227,9 @@ struct Arch : BaseArch<ArchRanges> static const std::string defaultRouter; static const std::vector<std::string> availableRouters; + std::unordered_map<WireId, WireInfo> wires; + // WIP to link without failure - std::unordered_set<WireId> all_wires; std::unordered_set<PipId> all_pips; std::vector<PipId> empty_pip_list; std::vector<BelPin> empty_belpin_list; |