diff options
Diffstat (limited to 'ecp5/archdefs.h')
-rw-r--r-- | ecp5/archdefs.h | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/ecp5/archdefs.h b/ecp5/archdefs.h index 0af48753..f913e445 100644 --- a/ecp5/archdefs.h +++ b/ecp5/archdefs.h @@ -60,13 +60,21 @@ enum PortPin : int32_t PIN_MAXIDX }; -NPNR_PACKED_STRUCT(struct Location { +NPNR_PACKED_STRUCT(struct LocationPOD { int16_t x, y; }); + +struct Location +{ int16_t x = -1, y = -1; + Location() : x(-1), y(-1){}; + Location(int16_t x, int16_t y) : x(x), y(y){}; + Location(const LocationPOD &pod) : x(pod.x), y(pod.y){}; + Location(const Location &loc) : x(loc.x), y(loc.y){}; + bool operator==(const Location &other) const { return x == other.x && y == other.y; } bool operator!=(const Location &other) const { return x != other.x || y == other.y; } -}); +}; -Location operator+(const Location &a, const Location &b) { return Location{a.x + b.x, a.y + b.y};} +Location operator+(const Location &a, const Location &b) { return Location(a.x + b.x, a.y + b.y); } struct BelId { @@ -91,29 +99,51 @@ struct PipId Location location; int32_t index = -1; - bool operator==(const WireId &other) const { return index == other.index && location == other.location; } - bool operator!=(const WireId &other) const { return index != other.index || location != other.location; } + bool operator==(const PipId &other) const { return index == other.index && location == other.location; } + bool operator!=(const PipId &other) const { return index != other.index || location != other.location; } }; NEXTPNR_NAMESPACE_END namespace std { +template <> struct hash<NEXTPNR_NAMESPACE_PREFIX Location> +{ + std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX Location &loc) const noexcept + { + std::size_t seed = std::hash<int>()(loc.x); + seed ^= std::hash<int>()(loc.y) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; + } +}; + template <> struct hash<NEXTPNR_NAMESPACE_PREFIX BelId> { - std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX BelId &bel) const noexcept { return hash<int>()(bel.index); } + std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX BelId &bel) const noexcept + { + std::size_t seed = std::hash<NEXTPNR_NAMESPACE_PREFIX Location>()(bel.location); + seed ^= std::hash<int>()(bel.index) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; + } }; template <> struct hash<NEXTPNR_NAMESPACE_PREFIX WireId> { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX WireId &wire) const noexcept { - return hash<int>()(wire.index); + std::size_t seed = std::hash<NEXTPNR_NAMESPACE_PREFIX Location>()(wire.location); + seed ^= std::hash<int>()(wire.index) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; } }; template <> struct hash<NEXTPNR_NAMESPACE_PREFIX PipId> { - std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX PipId &pip) const noexcept { return hash<int>()(pip.index); } + std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX PipId &pip) const noexcept + { + std::size_t seed = std::hash<NEXTPNR_NAMESPACE_PREFIX Location>()(pip.location); + seed ^= std::hash<int>()(pip.index) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + return seed; + } }; template <> struct hash<NEXTPNR_NAMESPACE_PREFIX BelType> : hash<int> |