//! Memory device implementation. /** * @file Memory.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. */ #ifndef CPPREG_DEV_MEMORY_H #define CPPREG_DEV_MEMORY_H #include "Traits.h" #include namespace cppreg { //! Register pack base implementation. /** * @tparam base_address Pack base address. * @tparam pack_byte_size Pack size in bytes. */ template
struct RegisterPack { //! Base address. constexpr static const Address pack_base = base_address; //! Pack size in bytes. constexpr static const std::uint32_t size_in_bytes = pack_byte_size; }; //! Memory device. /** * @tparam mem_address Address of the memory device. * @tparam mem_byte_size Memory device size in bytes. */ template
struct MemoryDevice { //! Storage type. using memory_storage = std::array; //! Memory device storage. static memory_storage& _mem_storage; //! Accessor. template static const volatile typename TypeTraits::type& ro_memory() { // Check alignment. static_assert( internals::is_aligned::type>::value>::value, "MemoryDevice:: ro request not aligned"); return *(reinterpret_cast::type*>( &_mem_storage[byte_offset])); } //! Modifier. template static volatile typename TypeTraits::type& rw_memory() { // Check alignment. static_assert( internals::is_aligned::type>::value>::value, "MemoryDevice:: rw request not aligned"); return *( reinterpret_cast::type*>( &_mem_storage[byte_offset])); } }; //! Static reference definition. template
typename MemoryDevice::memory_storage& MemoryDevice::_mem_storage = *(reinterpret_cast::memory_storage*>(a)); //! Register memory device for register pack. /** * * @tparam pack_address Register pack address. * @tparam n_bytes Register pack size in bytes. */ template struct RegisterMemoryDevice { using mem_device = MemoryDevice; }; } // namespace cppreg #endif // CPPREG_DEV_MEMORY_H