diff --git a/Event/DAQEvent/include/Event/ODIN.h b/Event/DAQEvent/include/Event/ODIN.h index d5bbd3f4f0ddbaeacb761b8444d036125378114a..e95104d3dfe0c81a97297a139eabb6acd510a2ae 100644 --- a/Event/DAQEvent/include/Event/ODIN.h +++ b/Event/DAQEvent/include/Event/ODIN.h @@ -18,6 +18,13 @@ namespace LHCb { #include <cstdint> #include <cstring> +// define macros to target host and device build for accelerators +#if defined( __CUDACC__ ) || defined( __HIP__ ) +# define ACCEL_TARGET_SPEC __host__ __device__ +#else +# define ACCEL_TARGET_SPEC +#endif + namespace LHCb { #ifndef ODIN_WITHOUT_GAUDI @@ -33,7 +40,7 @@ namespace LHCb { namespace ODINImplementation::details { /// Helper to extract COUNT bits starting from OFFSET in a buffer. template <unsigned int COUNT, unsigned int OFFSET> - auto get_bits( LHCb::span<const std::uint32_t> data ) { + ACCEL_TARGET_SPEC auto get_bits( LHCb::span<const std::uint32_t> data ) { static_assert( COUNT != 0 && COUNT <= 64, "invalid COUNT parameter" ); if constexpr ( COUNT == 1 ) { return ( data[OFFSET / 32] & ( 1 << OFFSET % 32 ) ) ? true : false; @@ -60,7 +67,7 @@ namespace LHCb { } /// Helper to set COUNT bits starting from OFFSET in a buffer using the passed value. template <unsigned int COUNT, unsigned int OFFSET, typename VALUE> - void set_bits( LHCb::span<std::uint32_t> data, VALUE value ) { + ACCEL_TARGET_SPEC void set_bits( LHCb::span<std::uint32_t> data, VALUE value ) { static_assert( COUNT != 0 && COUNT <= 64, "invalid COUNT parameter" ); if constexpr ( COUNT == 1 ) { if ( value ) { @@ -144,8 +151,9 @@ namespace LHCb { std::array<std::uint32_t, BANK_SIZE / sizeof( std::uint32_t )> data{0}; - ODIN() = default; - ODIN( LHCb::span<const std::uint32_t> buffer ) { + // Note that this cannot be `= default` to support accelerator builds + ACCEL_TARGET_SPEC ODIN() {} + ACCEL_TARGET_SPEC ODIN( LHCb::span<const std::uint32_t> buffer ) { assert( buffer.size() == data.size() ); std::memcpy( data.data(), buffer.data(), sizeof( data ) ); } @@ -199,84 +207,98 @@ namespace LHCb { EventNumberOffset = 8 * 32 }; - auto runNumber() const { return details::get_bits<RunNumberSize, RunNumberOffset>( data ); } + ACCEL_TARGET_SPEC auto runNumber() const { return details::get_bits<RunNumberSize, RunNumberOffset>( data ); } void setRunNumber( std::uint32_t value ) { details::set_bits<RunNumberSize, RunNumberOffset>( data, value ); } - auto eventType() const { return details::get_bits<EventTypeSize, EventTypeOffset>( data ); } + ACCEL_TARGET_SPEC auto eventType() const { return details::get_bits<EventTypeSize, EventTypeOffset>( data ); } void setEventType( std::uint16_t value ) { details::set_bits<EventTypeSize, EventTypeOffset>( data, value ); } void setEventType( EventTypes value ) { setEventType( static_cast<std::uint16_t>( value ) ); } - auto calibrationStep() const { return details::get_bits<CalibrationStepSize, CalibrationStepOffset>( data ); } + ACCEL_TARGET_SPEC auto calibrationStep() const { + return details::get_bits<CalibrationStepSize, CalibrationStepOffset>( data ); + } void setCalibrationStep( std::uint16_t value ) { details::set_bits<CalibrationStepSize, CalibrationStepOffset>( data, value ); } - auto gpsTime() const { return details::get_bits<GpsTimeSize, GpsTimeOffset>( data ); } + ACCEL_TARGET_SPEC auto gpsTime() const { return details::get_bits<GpsTimeSize, GpsTimeOffset>( data ); } void setGpsTime( std::uint64_t value ) { details::set_bits<GpsTimeSize, GpsTimeOffset>( data, value ); } - auto triggerConfigurationKey() const { + ACCEL_TARGET_SPEC auto triggerConfigurationKey() const { return details::get_bits<TriggerConfigurationKeySize, TriggerConfigurationKeyOffset>( data ); } void setTriggerConfigurationKey( std::uint32_t value ) { details::set_bits<TriggerConfigurationKeySize, TriggerConfigurationKeyOffset>( data, value ); } - auto partitionID() const { return details::get_bits<PartitionIDSize, PartitionIDOffset>( data ); } + ACCEL_TARGET_SPEC auto partitionID() const { + return details::get_bits<PartitionIDSize, PartitionIDOffset>( data ); + } void setPartitionID( std::uint32_t value ) { details::set_bits<PartitionIDSize, PartitionIDOffset>( data, value ); } - auto bunchId() const { return details::get_bits<BunchIdSize, BunchIdOffset>( data ); } - void setBunchId( std::uint16_t value ) { details::set_bits<BunchIdSize, BunchIdOffset>( data, value ); } - BXTypes bunchCrossingType() const { + ACCEL_TARGET_SPEC auto bunchId() const { return details::get_bits<BunchIdSize, BunchIdOffset>( data ); } + void setBunchId( std::uint16_t value ) { details::set_bits<BunchIdSize, BunchIdOffset>( data, value ); } + ACCEL_TARGET_SPEC BXTypes bunchCrossingType() const { return static_cast<BXTypes>( details::get_bits<BunchCrossingTypeSize, BunchCrossingTypeOffset>( data ) ); } void setBunchCrossingType( BXTypes value ) { details::set_bits<BunchCrossingTypeSize, BunchCrossingTypeOffset>( data, static_cast<std::uint8_t>( value ) ); } - auto nonZeroSuppressionMode() const { + ACCEL_TARGET_SPEC auto nonZeroSuppressionMode() const { return details::get_bits<NonZeroSuppressionModeSize, NonZeroSuppressionModeOffset>( data ); } void setNonZeroSuppressionMode( bool value ) { details::set_bits<NonZeroSuppressionModeSize, NonZeroSuppressionModeOffset>( data, value ); } - auto timeAlignmentEventCentral() const { + ACCEL_TARGET_SPEC auto timeAlignmentEventCentral() const { return details::get_bits<TimeAlignmentEventCentralSize, TimeAlignmentEventCentralOffset>( data ); } void setTimeAlignmentEventCentral( bool value ) { details::set_bits<TimeAlignmentEventCentralSize, TimeAlignmentEventCentralOffset>( data, value ); } - auto timeAlignmentEventWindow() const { + ACCEL_TARGET_SPEC auto timeAlignmentEventWindow() const { return details::get_bits<TimeAlignmentEventWindowSize, TimeAlignmentEventWindowOffset>( data ); } void setTimeAlignmentEventWindow( std::uint8_t value ) { details::set_bits<TimeAlignmentEventWindowSize, TimeAlignmentEventWindowOffset>( data, value ); } - auto stepRunEnable() const { return details::get_bits<StepRunEnableSize, StepRunEnableOffset>( data ); } + ACCEL_TARGET_SPEC auto stepRunEnable() const { + return details::get_bits<StepRunEnableSize, StepRunEnableOffset>( data ); + } void setStepRunEnable( bool value ) { details::set_bits<StepRunEnableSize, StepRunEnableOffset>( data, value ); } - auto triggerType() const { return details::get_bits<TriggerTypeSize, TriggerTypeOffset>( data ); } + ACCEL_TARGET_SPEC auto triggerType() const { + return details::get_bits<TriggerTypeSize, TriggerTypeOffset>( data ); + } void setTriggerType( std::uint8_t value ) { details::set_bits<TriggerTypeSize, TriggerTypeOffset>( data, value ); } void setTriggerType( TriggerTypes value ) { setTriggerType( static_cast<std::uint8_t>( value ) ); } - auto timeAlignmentEventFirst() const { + ACCEL_TARGET_SPEC auto timeAlignmentEventFirst() const { return details::get_bits<TimeAlignmentEventFirstSize, TimeAlignmentEventFirstOffset>( data ); } void setTimeAlignmentEventFirst( bool value ) { details::set_bits<TimeAlignmentEventFirstSize, TimeAlignmentEventFirstOffset>( data, value ); } - auto calibrationType() const { return details::get_bits<CalibrationTypeSize, CalibrationTypeOffset>( data ); } + ACCEL_TARGET_SPEC auto calibrationType() const { + return details::get_bits<CalibrationTypeSize, CalibrationTypeOffset>( data ); + } void setCalibrationType( std::uint8_t value ) { details::set_bits<CalibrationTypeSize, CalibrationTypeOffset>( data, value ); } void setCalibrationType( CalibrationTypes value ) { setCalibrationType( static_cast<std::uint8_t>( value ) ); } - auto orbitNumber() const { return details::get_bits<OrbitNumberSize, OrbitNumberOffset>( data ); } + ACCEL_TARGET_SPEC auto orbitNumber() const { + return details::get_bits<OrbitNumberSize, OrbitNumberOffset>( data ); + } void setOrbitNumber( std::uint32_t value ) { details::set_bits<OrbitNumberSize, OrbitNumberOffset>( data, value ); } - auto eventNumber() const { return details::get_bits<EventNumberSize, EventNumberOffset>( data ); } + ACCEL_TARGET_SPEC auto eventNumber() const { + return details::get_bits<EventNumberSize, EventNumberOffset>( data ); + } void setEventNumber( std::uint64_t value ) { details::set_bits<EventNumberSize, EventNumberOffset>( data, value ); }