/* * nextpnr -- Next Generation Place and Route * * Copyright (C) 2021 Lofty delay + other.delay; return ret; } }; struct BelId { BelId() = default; BelId(CycloneV::pos_t _pos, uint16_t _z) : pos{_pos}, z{_z} {} // pos_t is used for X/Y, nextpnr-cyclonev uses its own Z coordinate system. CycloneV::pos_t pos = 0; uint16_t z = 0; bool operator==(const BelId &other) const { return pos == other.pos && z == other.z; } bool operator!=(const BelId &other) const { return pos != other.pos || z != other.z; } bool operator<(const BelId &other) const { return pos < other.pos || (pos == other.pos && z < other.z); } }; struct WireId { int32_t index = -1; bool operator==(const WireId &other) const { return index == other.index; } bool operator!=(const WireId &other) const { return index != other.index; } bool operator<(const WireId &other) const { return index < other.index; } }; struct PipId { int32_t index = -1; bool operator==(const PipId &other) const { return index == other.index; } bool operator!=(const PipId &other) const { return index != other.index; } bool operator<(const PipId &other) const { return index < other.index; } }; struct GroupId { enum : int8_t { TYPE_NONE } type = TYPE_NONE; int8_t x = 0, y = 0; bool operator==(const GroupId &other) const { return (type == other.type) && (x == other.x) && (y == other.y); } bool operator!=(const GroupId &other) const { return (type != other.type) || (x != other.x) || (y == other.y); } }; struct DecalId { enum : int8_t { TYPE_NONE, } type = TYPE_NONE; int32_t index = -1; bool active = false; bool operator==(const DecalId &other) const { return (type == other.type) && (index == other.index); } bool operator!=(const DecalId &other) const { return (type != other.type) || (index != other.index); } }; struct ArchNetInfo { }; struct ArchCellInfo { }; NEXTPNR_NAMESPACE_END namespace std { template <> struct hash { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX BelId &bel) const noexcept { return hash()((static_cast(bel.pos) << 16) | bel.z); } }; template <> struct hash { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX WireId &wire) const noexcept { return hash()(wire.index); } }; template <> struct hash { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX PipId &pip) const noexcept { return hash()(pip.index); } }; template <> struct hash { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX GroupId &group) const noexcept { std::size_t seed = 0; boost::hash_combine(seed, hash()(group.type)); boost::hash_combine(seed, hash()(group.x)); boost::hash_combine(seed, hash()(group.y)); return seed; } }; template <> struct hash { std::size_t operator()(const NEXTPNR_NAMESPACE_PREFIX DecalId &decal) const noexcept { std::size_t seed = 0; boost::hash_combine(seed, hash()(decal.type)); boost::hash_combine(seed, hash()(decal.index)); return seed; } }; } // namespace std