aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5/archdefs.h
diff options
context:
space:
mode:
Diffstat (limited to 'ecp5/archdefs.h')
-rw-r--r--ecp5/archdefs.h46
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>