cyclonev: Add some range types

Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
gatecat 2021-05-01 14:06:13 +01:00
parent c3cb9aa3f6
commit af0bffbae9

View File

@ -71,6 +71,61 @@ struct WireInfo
uint64_t flags; 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 struct ArchRanges : BaseArchRanges
{ {
using ArchArgsT = ArchArgs; using ArchArgsT = ArchArgs;
@ -79,9 +134,9 @@ struct ArchRanges : BaseArchRanges
using TileBelsRangeT = std::vector<BelId>; using TileBelsRangeT = std::vector<BelId>;
using BelPinsRangeT = std::vector<IdString>; using BelPinsRangeT = std::vector<IdString>;
// Wires // Wires
using AllWiresRangeT = const std::unordered_set<WireId> &; using AllWiresRangeT = AllWireRange;
using DownhillPipRangeT = const std::vector<PipId> &; using DownhillPipRangeT = UpDownhillPipRange;
using UphillPipRangeT = const std::vector<PipId> &; using UphillPipRangeT = UpDownhillPipRange;
using WireBelPinRangeT = const std::vector<BelPin> &; using WireBelPinRangeT = const std::vector<BelPin> &;
// Pips // Pips
using AllPipsRangeT = const std::unordered_set<PipId> &; using AllPipsRangeT = const std::unordered_set<PipId> &;
@ -127,7 +182,7 @@ struct Arch : BaseArch<ArchRanges>
IdStringList getWireName(WireId wire) const override { return IdStringList(); } IdStringList getWireName(WireId wire) const override { return IdStringList(); }
DelayQuad getWireDelay(WireId wire) const override { return DelayQuad(0); } DelayQuad getWireDelay(WireId wire) const override { return DelayQuad(0); }
const std::vector<BelPin> &getWireBelPins(WireId wire) const override { return empty_belpin_list; } 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 getPipSrcWire(PipId pip) const override { return WireId(pip.src); };
WireId getPipDstWire(PipId pip) const override { return WireId(pip.dst); }; WireId getPipDstWire(PipId pip) const override { return WireId(pip.dst); };
DelayQuad getPipDelay(PipId pip) const override { return DelayQuad(0); } DelayQuad getPipDelay(PipId pip) const override { return DelayQuad(0); }
const std::vector<PipId> &getPipsDownhill(WireId wire) const override { return empty_pip_list; } UpDownhillPipRange getPipsDownhill(WireId wire) const override
const std::vector<PipId> &getPipsUphill(WireId wire) const override { return empty_pip_list; } {
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::string defaultRouter;
static const std::vector<std::string> availableRouters; static const std::vector<std::string> availableRouters;
std::unordered_map<WireId, WireInfo> wires;
// WIP to link without failure // WIP to link without failure
std::unordered_set<WireId> all_wires;
std::unordered_set<PipId> all_pips; std::unordered_set<PipId> all_pips;
std::vector<PipId> empty_pip_list; std::vector<PipId> empty_pip_list;
std::vector<BelPin> empty_belpin_list; std::vector<BelPin> empty_belpin_list;