aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/relptr.h39
-rw-r--r--ecp5/arch.h38
-rw-r--r--ice40/arch.h43
-rw-r--r--nexus/arch.h40
4 files changed, 42 insertions, 118 deletions
diff --git a/common/relptr.h b/common/relptr.h
new file mode 100644
index 00000000..f8f1d429
--- /dev/null
+++ b/common/relptr.h
@@ -0,0 +1,39 @@
+// This is intended to be included inside arch.h only.
+
+template <typename T> struct RelPtr
+{
+ int32_t offset;
+
+ const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
+
+ const T &operator[](size_t index) const { return get()[index]; }
+
+ const T &operator*() const { return *(get()); }
+
+ const T *operator->() const { return get(); }
+
+ RelPtr(const RelPtr &) = delete;
+ RelPtr &operator=(const RelPtr &) = delete;
+};
+
+NPNR_PACKED_STRUCT(template <typename T> struct RelSlice {
+ int32_t offset;
+ uint32_t length;
+
+ const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
+
+ const T &operator[](size_t index) const
+ {
+ NPNR_ASSERT(index < length);
+ return get()[index];
+ }
+
+ const T *begin() const { return get(); }
+ const T *end() const { return get() + length; }
+
+ const size_t size() const { return length; }
+
+ const T &operator*() const { return *(get()); }
+
+ const T *operator->() const { return get(); }
+});
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 458ff935..58373157 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -29,43 +29,7 @@ NEXTPNR_NAMESPACE_BEGIN
/**** Everything in this section must be kept in sync with chipdb.py ****/
-template <typename T> struct RelPtr
-{
- int32_t offset;
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const { return get()[index]; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-
- RelPtr(const RelPtr &) = delete;
- RelPtr &operator=(const RelPtr &) = delete;
-};
-
-NPNR_PACKED_STRUCT(template <typename T> struct RelSlice {
- int32_t offset;
- uint32_t length;
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const
- {
- NPNR_ASSERT(index < length);
- return get()[index];
- }
-
- const T *begin() const { return get(); }
- const T *end() const { return get() + length; }
-
- const size_t size() const { return length; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-});
+#include "relptr.h"
NPNR_PACKED_STRUCT(struct BelWirePOD {
LocationPOD rel_wire_loc;
diff --git a/ice40/arch.h b/ice40/arch.h
index c9632f3e..1de39c33 100644
--- a/ice40/arch.h
+++ b/ice40/arch.h
@@ -25,48 +25,7 @@ NEXTPNR_NAMESPACE_BEGIN
/**** Everything in this section must be kept in sync with chipdb.py ****/
-template <typename T> struct RelPtr
-{
- int32_t offset;
-
- // void set(const T *ptr) {
- // offset = reinterpret_cast<const char*>(ptr) -
- // reinterpret_cast<const char*>(this);
- // }
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const { return get()[index]; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-
- RelPtr(const RelPtr &) = delete;
- RelPtr &operator=(const RelPtr &) = delete;
-};
-
-NPNR_PACKED_STRUCT(template <typename T> struct RelSlice {
- int32_t offset;
- uint32_t length;
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const
- {
- NPNR_ASSERT(index < length);
- return get()[index];
- }
-
- const T *begin() const { return get(); }
- const T *end() const { return get() + length; }
-
- const size_t size() const { return length; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-});
+#include "relptr.h"
NPNR_PACKED_STRUCT(struct BelWirePOD {
int32_t port;
diff --git a/nexus/arch.h b/nexus/arch.h
index 00934797..e9984ee6 100644
--- a/nexus/arch.h
+++ b/nexus/arch.h
@@ -28,45 +28,7 @@
NEXTPNR_NAMESPACE_BEGIN
-template <typename T> struct RelPtr
-{
- int32_t offset;
-
- // void set(const T *ptr) {
- // offset = reinterpret_cast<const char*>(ptr) -
- // reinterpret_cast<const char*>(this);
- // }
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const { return get()[index]; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-};
-
-NPNR_PACKED_STRUCT(template <typename T> struct RelSlice {
- int32_t offset;
- uint32_t length;
-
- const T *get() const { return reinterpret_cast<const T *>(reinterpret_cast<const char *>(this) + offset); }
-
- const T &operator[](size_t index) const
- {
- NPNR_ASSERT(index < length);
- return get()[index];
- }
-
- const T *begin() const { return get(); }
- const T *end() const { return get() + length; }
-
- const size_t size() const { return length; }
-
- const T &operator*() const { return *(get()); }
-
- const T *operator->() const { return get(); }
-});
+#include "relptr.h"
/*
Fully deduplicated database