12 const RegisterPath& registerPathName,
size_t numberOfElements,
size_t elementsOffset,
13 const boost::shared_ptr<DeviceBackend>& _backend)
15 _ioDevice(boost::dynamic_pointer_cast<NumericAddressedBackend>(_backend)) {
17 _registerInfo = _ioDevice->_registerMap.getBackendRegister(registerPathName);
18 assert(!_registerInfo.channels.empty());
21 for(
size_t i = 0; i < _registerInfo.getNumberOfChannels(); ++i) {
22 if(_registerInfo.channels[i].bitOffset % 8 != 0) {
23 throw ChimeraTK::logic_error(
"NumericAddressedBackendMuxedRegisterAccessor: elements must be byte aligned.");
25 _converterLoopHelpers.emplace_back(
26 RawConverter::ConverterLoopHelper::makeConverterLoopHelper<UserType>(_registerInfo, i, *
this));
29 if(_registerInfo.elementPitchBits % 8 != 0) {
30 throw ChimeraTK::logic_error(
"NumericAddressedBackendMuxedRegisterAccessor: blocks must be byte aligned.");
34 if(numberOfElements == 0) {
35 numberOfElements = _registerInfo.nElements;
39 if(numberOfElements + elementsOffset > _registerInfo.nElements) {
42 ") of the register '" + registerPathName +
"'!");
44 throw ChimeraTK::logic_error(
"Requested number of elements exceeds the size of the register! Requested end: " +
50 _registerInfo.nElements = numberOfElements;
51 assert(_registerInfo.elementPitchBits % 8 == 0);
52 _registerInfo.address += elementsOffset * _registerInfo.elementPitchBits / 8;
56 for(
size_t i = 0; i < _converterLoopHelpers.size(); ++i) {
62 static_cast<size_t>(_registerInfo.elementPitchBits) / 8 * _registerInfo.nElements /
sizeof(int32_t) + 1);
69 auto* ioBuffer =
reinterpret_cast<uint8_t*
>(&_ioBuffer[0]);
70 for(
auto& c : _registerInfo.channels) {
71 assert(c.bitOffset % 8 == 0);
72 _startIterators.emplace_back(ioBuffer + c.bitOffset / 8, _registerInfo.elementPitchBits / 8);
73 _endIterators.push_back(_startIterators.back() + _registerInfo.nElements);