diff --git a/fpga/include/villas/fpga/ips/rtds2gpu/register_types.hpp b/fpga/include/villas/fpga/ips/rtds2gpu/register_types.hpp index 01cd68817..ce7328417 100644 --- a/fpga/include/villas/fpga/ips/rtds2gpu/register_types.hpp +++ b/fpga/include/villas/fpga/ips/rtds2gpu/register_types.hpp @@ -3,6 +3,7 @@ #include #include +#include union axilite_reg_status_t { uint32_t value; @@ -26,16 +27,31 @@ union reg_doorbell_t { count : 6, is_valid : 1; }; + + constexpr reg_doorbell_t() : value(0) {} }; template struct Rtds2GpuMemoryBuffer { - static constexpr size_t valueCount = N; - static constexpr size_t dataOffset = offsetof(Rtds2GpuMemoryBuffer, data); - static constexpr size_t doorbellOffset = offsetof(Rtds2GpuMemoryBuffer, doorbell); + // this type is only for memory interpretation, it makes no sense to create + // an instance so it's forbidden + Rtds2GpuMemoryBuffer() = delete; + + // T can be a more complex type that wraps multiple values + static constexpr size_t rawValueCount = N * (sizeof(T) / 4); + + // As of C++14, offsetof() is not working for non-standard layout types (i.e. + // composed of non-POD members). This might work in C++17 though. + // More info: https://gist.github.com/graphitemaster/494f21190bb2c63c5516 + //static constexpr size_t doorbellOffset = offsetof(Rtds2GpuMemoryBuffer, doorbell); + //static constexpr size_t dataOffset = offsetof(Rtds2GpuMemoryBuffer, data); + + // HACK: This might break horribly, let's just hope C++17 will be there soon + static constexpr size_t dataOffset = 0; + static constexpr size_t doorbellOffset = N * sizeof(Rtds2GpuMemoryBuffer::data); T data[N]; reg_doorbell_t doorbell; -} __attribute__((packed)); +}; #endif // REGISTER_TYPES_H