From c1081a114e0d014c30f0763f53d5b6591f041fae Mon Sep 17 00:00:00 2001 From: Nicolas Clauvelin Date: Sun, 21 Apr 2019 15:01:05 -0400 Subject: [PATCH 1/2] Code maintenance * Revise and simplify most enable_if statements in the project. * Update code style in all files. * Update copyright year. * Add a dedicated Memory.h header with the memory device implementation. * Update documentation. * CMake cleanup. --- API.md | 39 +- Assembly_Comparison.png | Bin 166242 -> 98596 bytes CMakeLists.txt | 26 +- CODE_OF_CONDUCT.md | 46 -- LICENSE | 2 +- Performance.md | 10 +- QuickStart.md | 9 +- README.md | 20 +- cppreg.h | 6 +- cppreg_Defines.h | 69 ++- cppreg_Includes.h | 4 +- policies/AccessPolicy.h | 542 +++++++++---------- register/Field.h | 368 ++++++------- register/Internals.h | 107 ++-- register/Mask.h | 64 ++- register/Memory.h | 106 ++++ register/MergeWrite.h | 419 +++++++-------- register/Register.h | 204 ++++---- register/RegisterPack.h | 340 ++++++------ register/ShadowValue.h | 50 +- register/Traits.h | 80 +-- single/cppreg-all.h | 1091 ++++++++++++++++++--------------------- 22 files changed, 1698 insertions(+), 1904 deletions(-) delete mode 100644 CODE_OF_CONDUCT.md create mode 100644 register/Memory.h diff --git a/API.md b/API.md index a6e6782..8cf3c7c 100644 --- a/API.md +++ b/API.md @@ -1,5 +1,5 @@ # cppreg: API # -Copyright Sendyne Corp., 2010-2018. All rights reserved ([LICENSE](LICENSE)). +Copyright Sendyne Corp., 2010-2019. All rights reserved ([LICENSE](LICENSE)). ## Introduction ## @@ -17,15 +17,15 @@ The entire implementation is encapsulated in the `cppreg::` namespace. All the c The API was designed such that `cppreg`-based code is safer and more expressive than traditional low-level code while providing the same level of performance. -As explained below, when using `cppreg`, registers and fields are defined as C++ types specializing pre-defined template types. This can be done by explicitly deriving from the specialized template type or by using the `using` keyword (both approaches are strictly equivalent). With the exception of the merged write mechanism discussed below, all methods provided by the `cppreg` types are static methods. +As explained below, when using `cppreg`, registers and fields are defined as C++ types specializing pre-defined template types. This can be done by explicitly deriving from the specialized template type or by using the `using` keyword (both approaches are strictly equivalent). With the exception of the merged write mechanism discussed below, all methods provided by the `cppreg` types are static methods. ## Data types ## `cppreg` introduces type aliases in order to parameterize the set of data types used in the implementation. By default the following types are defined (see [cppreg_Defines.h](cppreg_Defines.h) for more details): -* `Address_t` is the data type used to hold addresses of registers and fields; it is equivalent to `std::uintptr_t`, +* `Address` is the data type used to hold addresses of registers and fields; it is equivalent to `std::uintptr_t`, * register sizes are represented by the enumeration type `RegBitSize`, -* `FieldWidth_t` and `FieldOffset_t` are the data types to represent field sizes and offsets; both are equivalent to `std::uint8_t`. +* `FieldWidth` and `FieldOffset` are the data types to represent field sizes and offsets; both are equivalent to `std::uint8_t`. ### Register size ### The `RegBitSize` enumeration type represents the register sizes supported in `cppreg` and the values are: @@ -46,7 +46,7 @@ In `cppreg`, registers are represented as memory locations that contain fields, Most of the times registers are part of groups related to peripherals or specific functionalities within a MCU. It is therefore recommended to use the register pack implementation rather than the standalone one. This ensures that the assembly generated from `cppreg`-based code will be optimal. In other words, the difference between packed registers and standalone registers is only a matter of performance in the generated assembly: the packed register interface relies on mapping an array on the pack memory region, which provides to the compiler the ability to use offset between the various registers versus reloading their absolute addresses. -Moreover, the same level of functionality is provided by both implementations (`RegisterPack` is simply deriving from `Register` and redefining accessor and modifier methods). That is, a packed register type can be replaced by a standalone register type (and *vice versa*). +Moreover, the same level of functionality is provided by both implementations (`RegisterPack` is simply deriving from `Register`). That is, a packed register type can be replaced by a standalone register type (and *vice versa*). ### Register pack interface ### To define a pack of registers: @@ -73,7 +73,7 @@ The interface is (see [RegisterPack.h](register/RegisterPack.h)): | `reset_value` | register reset value (defaulted to zero) | | `use_shadow_value` | enable shadow value if `true` (see below) | -Note that, the reset value is only useful when a shadow value is used. +Note that, the reset value is only used when shadow value support is enabled. The following example defines a 4 bytes register pack starting at address 0xA4000000 and containing: two 8-bit register and a 16-bit register. The `cppreg` implementation is: @@ -106,7 +106,7 @@ struct SomePeripheral { } ``` -There are a few requirements for when defining packed registers: +There are a few requirements when defining packed registers: * for a register of size N bits, the pack base address has to be aligned on a N bits boundary, * for a register of size N bits, the pack base address plus the offset has to be aligned on a N bits boundary, @@ -126,7 +126,7 @@ The interface for standalone register is (see [Register.h](register/Register.h)) | `reset_value` | register reset value (defaulted to zero) | | `use_shadow_value` | enable shadow value if `true` (see below) | -Note that, the reset value is only useful when a shadow value is used. +Note that, the reset value is only used when shadow value support is enabled. For example, consider a 32-bit register `SomeRegister` mapped at `0x40004242`. The `Register` type is created using: @@ -226,7 +226,7 @@ static std::array some_buffer = {}; // Iterate over the pack and use a lambda. // Note the "auto index" ... this is required because the loop will // use std::integral_constant to pass the index while iterating. -pack_loop::apply([](auto index) { +pack_loop::apply([](auto index) { some_buffer[index] = Channels::elem::read(); Channels::elem::template write(); }); @@ -305,12 +305,12 @@ SomeField::write<0xAB>(); // Template version for constant value write. SomeField::write(0xAB); // Function argument version. ``` -The advantages of using the constant value version are: +The advantages of using the constant value form are: * `cppreg` will most of the time use a faster implementation for the write operation (this is particularly true if the field spans an entire register), * a compile-time error will occur if the value overflow the field. -Note that, even when using the non-constant value version overflow will not occur: only the bits part of the `Field`-type will be written and any data that does not fit the region of the memory assigned to the `Field`-type will not be modified. For example: +Note that, even when using the non-constant value form overflow will not occur: only the bits fitting in the `Field`-type will be written and any data that does not fit the region of the memory assigned to the `Field`-type will not be modified. For example: ```c++ // Register definition with nested fields definitions. @@ -332,7 +332,7 @@ SomeRegister::Frequency::write<0x111>(); ## Shadow value: a workaround for write-only fields ## -Write-only fields are somewhat special as extra-care has to be taken when manipulating them. The main difficulty resides in the fact that write-only field can be read but the value obtained by reading it is fixed (*e.g.*, it always reads as zero). `cppreg` assumes that write-only fields can actually be read from; if such an access on some given architecture would trigger an error (*à la FPGA*) then `cppreg` is not a good choice to deal with write-only fields on this particular architecture. +Write-only fields are somewhat special and extra-care has to be taken when manipulating them. The main difficulty resides in the fact that write-only field can be read but the value obtained by reading it is fixed (*e.g.* it always reads as zero). `cppreg` assumes that write-only fields can actually be read from; if such an access on some architecture would trigger an error (*à la FPGA*) then `cppreg` is not a good choice to deal with write-only fields on this particular architecture. Consider the following situation: @@ -364,7 +364,7 @@ As a workaround, `cppreg` offers a shadow value implementation which mitigates t struct Reg : Register< 0x40004242, // Register address RegBitSize::b32, // Register size - 0x42u // Register reset value + 0x42u, // Register reset value true // Enable shadow value for the register > { @@ -373,7 +373,7 @@ struct Reg : Register< }; ``` -The shadow value implementation for a write-only field works as follow: +The shadow value implementation for a write-only field works as follows: * at static initialization time, the reset value of the register owning the field is used to initialize the shadow value (the shadow value is used for the entire register content), * at each write access to any of the register fields, the shadow value will be updated and written to the entire register memory. @@ -388,9 +388,9 @@ A few safety guidelines: ## MergeWrite: writing to multiple fields at once ## -It is sometimes the case that multiple fields within a register needs to be written at the same time. For example, when setting the clock dividers in a MCU it is often recommended to write all their values to the corresponding register at the same time (to avoid overclocking part of the MCU). +It is sometimes the case that multiple fields within a register needs to be written at the same time. For example, when setting the clock dividers in a MCU it is often recommended to write all their values to the corresponding register at the same time (to avoid mis-clocking part of the MCU). -Consider the following setup (not so artifical; it is inspired by a real flash memory controller peripheral): +Consider the following setup (not so artificial; it is inspired by a real flash memory controller peripheral): ```c++ struct FlashCtrl : Register<0xF0008282, RegBitSize::b8> { @@ -414,14 +414,14 @@ struct FlashCtrl : Register<0xF0008282, RegBitSize::b8> { Now let's assume the following scenario: -1. The previous flash command failed because it attempted to write or erase in a protected section, at that point the content of the `FlashCtrl` register is `1001 XXXX` where `XXXX` is whatver value associated with the command that failed. +1. The previous flash command failed because it attempted to write or erase in a protected section, at that point the content of the `FlashCtrl` register is `1001 XXXX` where `XXXX` is whatever value associated with the command that failed. 2. Before we can perform a new flash command we need to clear the `ProtectionError` by writing 1 to it (otherwise the new command will not be started); so one could think about doing: ```c++ FlashCtrl::ProtectionError::set(); // Write to ProtectionError to clear it. ``` - however this write at `1000 XXXX | 0001 0000 = 1001 XXXX` at the register level and thus start the command that previously failed. + however this write `1000 XXXX | 0001 0000 = 1001 XXXX` at the register level and thus start the command that previously failed. 3. At this point one could try to set the value for the new command but that will fail as well (because `ProtectionError` was not cleared and it is required to be). 4. A possible alternative would be to fully zero out the `FlashCtrl` register but that would somewhat defeat the purpose of `cppreg`. @@ -434,7 +434,7 @@ FlashCtrl::merge_write().with().with(). ... .done()`. @@ -442,4 +442,3 @@ The `merge_write` method is only available in register type (`PackedRegister` or **Warning:** if`done()` is not called at the end of the successive write operations no write at all will be performed. Similarly to regular write operations it is recommended to use the template version (as shown in the example) if possible: this will enable overflow checking and possibly use faster write implementations. If not possible the values to be written are passed as arguments to the various calls. - diff --git a/Assembly_Comparison.png b/Assembly_Comparison.png index 279b3113bd6b71b8b4670f884559514dac122875..dac9328e7d4c3f21650c56217169e311028853f9 100644 GIT binary patch literal 98596 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�sEW1~L!>;S)wXK}N43fbBWo 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�!7{=eG?u&vm(kc0et;V=lo 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 G=l=y0mZrY| literal 166242 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

!| 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 FKL9K>U(x^o diff --git a/CMakeLists.txt b/CMakeLists.txt index aec08ea..72fdf49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,48 +7,50 @@ # -------------------------------------------------------------------------- # -# --- cppreg library files --- +# --- cppreg library --- # Header directories. -set(CPPREG_HEADERS_DIRS +set(cppreg_headers_dirs . policies/ register/) # List of API headers. -set(CPPREG_API_HEADERS +set(cppreg_headers cppreg.h cppreg_Defines.h cppreg_Includes.h policies/AccessPolicy.h register/Field.h + register/Internals.h register/Mask.h - register/Overflow.h + register/Memory.h + register/MergeWrite.h register/Register.h register/RegisterPack.h register/ShadowValue.h register/Traits.h) # Refactor headers directories. -set(BUILD_HEADERS_DIRS "") -foreach(dir IN ITEMS ${CPPREG_HEADERS_DIRS}) - list(APPEND BUILD_HEADERS_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/${dir}") +set(build_cppreg_headers_dirs "") +foreach(dir IN ITEMS ${cppreg_headers_dirs}) + list(APPEND build_cppreg_headers_dirs "${CMAKE_CURRENT_SOURCE_DIR}/${dir}") endforeach() # Header-only library. add_library(cppreg INTERFACE) -target_include_directories(cppreg INTERFACE . register/ policies/) +target_include_directories(cppreg INTERFACE ${cppreg_headers_dirs}) # Include directories interfaces. # This properly setup the API headers for the build and install phase. set_property(TARGET cppreg PROPERTY INTERFACE_INCLUDE_DIRECTORIES - $ + $ $) # --- Install directives --- -install(FILES ${CPPREG_API_HEADERS} DESTINATION include/cppreg) -install(TARGETS cppreg DESTINATION lib EXPORT cppreg-libs) -install(EXPORT cppreg-libs DESTINATION include/cppreg) +install(FILES ${cppreg_headers} DESTINATION include/cppreg) +install(TARGETS cppreg DESTINATION lib EXPORT cppreg-target) +install(EXPORT cppreg-target DESTINATION include/cppreg) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index dc8c621..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at nclauvelin+github@sendyne.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/LICENSE b/LICENSE index ea72536..1716bfc 100644 --- a/LICENSE +++ b/LICENSE @@ -5,7 +5,7 @@ /____/\___/_/ /_/\__,_/\__, /_/ /_/\___/ \___/\____/_/ / .___(_). /____/ /_/ - Copyright 2010-2018 Sendyne Corporation. + Copyright 2010-2019 Sendyne Corporation. All rights reserved. Sendyne Corp., 250 West Broadway, New York, NY 10013, USA. diff --git a/Performance.md b/Performance.md index 95417c4..046424b 100644 --- a/Performance.md +++ b/Performance.md @@ -1,9 +1,9 @@ # Performance analysis -`cppreg` is heavily based on C++ templates and introduces various levels of abstractions compared to a traditional C CMSIS implementation. Because of C++'s *zero overhead* capabilities (see [this](https://www.youtube.com/watch?v=zBkNBP00wJE) for example) and when using at least some level of compiler otpimizations **all** the `cppreg` interface code is optimized away. Understandably most would question the validity of such a claim, so this document shows a classic example showing that a register interface written with `cppreg` is just as fast as the corresponding CMSIS based code written in C (and in this particular case is identical). +`cppreg` is heavily based on C++ templates and introduces various levels of abstractions compared to a traditional C CMSIS implementation. Because of C++'s *zero overhead* capabilities (see [this](https://www.youtube.com/watch?v=zBkNBP00wJE) for example) and when using at least some level of compiler otpimizations *all* the `cppreg` interface code is optimized away. Understandably most would question the validity of such a claim, so this document demonstrates a classic example showing that a register interface written with `cppreg` produced a compiled code identical to a CMSIS-based one. -## Test Setup -For the test example, let's use an imaginary Cortex-M0 based microcontroller with the intention of having the UART send out a small string and then toggle two LEDs (PIN1 and PIN3) after every full string transmission. Why imaginary? Because a real implementation will be longer than most screens. The example is written in C using CMSIS style, and then in C++ using `cppreg`. We then compare the assembly outputs of both using GCC ARM with links to GodBolt so that the examples can be fiddled with. +## Test setup +For the test example, let's use an imaginary Cortex-M0 based micro-controller with the intention of having the UART send out a small string and then toggle two LEDs (PIN1 and PIN3) after every transmission. Why imaginary? Because a real implementation will be longer than most screens. The example is written in C using CMSIS style, and then in C++ using `cppreg`. We then compare the assembly outputs of both using GCC ARM with links to GodBolt so that the examples can be fiddled with. ### Example peripheral @@ -165,9 +165,9 @@ void Demo_CPPReg(void){ ## Assembly results and comparison -[This][godbolt] is how GodBolt compares the CMSIS and `cppreg` versions. Looking at the assembly, it's pretty much identical, with the only difference being when to save registers onto the stack (in this case having no performance penalty). For this example (as well as others which have been tested), there is **no** performance penalty in `cppreg` implementation; here is a comparison of the assembly outputs (obtained with GCC ARM `-mthumb -Os`): +[This][godbolt] is how GodBolt compares the CMSIS and `cppreg` versions. Looking at the assembly, it's pretty much identical, with the only difference being when to save registers onto the stack (in this case having no performance penalty). For this example (as well as others which have been tested), there is *no* performance penalty in the `cppreg` implementation; here is a comparison of the assembly outputs (obtained with GCC ARM `-mthumb -Os`): ![Assembly Comparison](Assembly_Comparison.png) -[godbolt]: https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAViAIzkA2AhgHaioCkATAEK8%2B5AM7oArqVTYQAcgD0csGADUqAA5rS2YMqYEARqRakAngDouABgCCcgFR2r15XeUABAGYEm2ZX//qmtoAtCxMTGZITi7uLGJESGT%2BygByBBiswsoAwqxiAG7YemzKEGyoeYXFbsLYbJgmbNhmGAC2AJTRrm4YaiakBMBIRDnofQNDIzyW9JbB0/QAHMoAynUNTaOkambK1uHKE8NZWrWkhZgWNi5yTnc8AMwE5UxiOMpcD9mowkSEbERPrh7k8Xm9fJ9skQTGpsAB9IhGYjCIEg54VcEfL4eMTlIgEdBsMKomy8UEY96QvStZEk6xOBSqDRaYBwgAi2C8TWEkTRHnqnJyAAUhQAlXAAcTh2RF4qlbNwADEAJIpXArOEACRBOC5vhlYsl0tlRoVKrVGu1NiJrWwwjULCkTKCOi4AHYBNd/GJhM8dNZMJhTsIEVi2cpfpgQCAxM8iGpEQjPp7nP46mJWqpMllRdo%2BMQVgQAF4Qj3RZL%2BfSLcgV8sV5T6egANhr/jrFf0Dx4rb87eS%2BibABZa17e262cn2z6/cpFQQipgAOoETAJUOfcOR6OxgGLJMPFPJaccWfzpiYADyHg8tSI64em7%2B27je8BB/bRGwrTUrE/WKhMJ1CwtrKAAKnSyS/KQYioCM0KwnCrQsMIADWHxlqOFYYGwvzYAAHpoEZECw%2BKoKohK/GByj5GEYgQg%2BRFRiAbAZtgAyoHC1K0l84EPLg0ZIXhECdO%2BmHuhOon0uOILrAQHi9qSNiMqBSJEDyUSko8ckCvJBpynCoGitYyqgZaOqcs8%2BomlKhnGaZWpODadoOk6gQsuhh7%2BJ%2B36/vR2S5sA%2BZEIWJarBB/hQTBIygYBKksNxnl%2BN5P4kX5QJEdBsFgbFqkol8AVBSF0ggFW6XuolFbHjo8H0Y%2BTE7kQr6TphyTYbhBGkERJHpOROEjFuMYvqG%2BjEHCvqhRuyiLGIzWpvWbWfh1XWkb1lEDQ1r4NiYn5jcWtUNqN42%2BHIU0zZJyTibNyTJb5/7pZFWUxbCcXcf5eYFnt0aNk2ZUYXNlW%2BieNVhoxz4As2%2B4Va1FGLYRvzdWRC2g4Nu7DYde0g82Z1QwEMP4XDxErUj61DSM%2BjbfCR0gyNd5Uyd01XW20nnV5X4pX%2BkL3YiUXZc9uWQgVH0ll9Xa/TjfhVcowOTSTAJdpDfa431%2BOdfDRMw8jG1o7TGOTV22OK34C0q8tPXE0%2BKONcNFO7RNDE07bx2nYzY4SRVN2pXdfEZTzT3YC9akC%2B9wWfSVQ5i4byiS9LDGy0QQ4Ky1SvtQTCOrf1Fta2T6N2%2BGQ4G0nRt40tatmxrcebeTO1U5NDt087LOu7Nl2aQ8snyR8im2CdyoAmxRJMOpfI6cKhpSqqoG4KKKTWAAMmZre6pZo/6RPU8z/PDnWsBzmOr4bnaB5jk7/ae/KHG/dhFk5Ufmzt2c4XUuAU5YHkJHoHUbR2Bv4/H9cYCYk%2BLtgeiMVASBsCoBQnCdAhRSAeCYOgAA7soEAyML7ACMEwOEC12BvmyPodA6AmA1hoq8NKDF/4R2Zu7O%2BntIQBiDHaEMIwWCBmDDWAaR1QxhEGGwW0AJwp%2BBAefEMPDgBNEwCgtBfcMFhGwTDXBD9/r9kIcQyOEBWGMOENfHgTZShiL4XUEYwRlD0HaO0MMk1LCR3rLYux9i7ERzEtQ2%2BPk6FfAYcGbhbCmEcMznGeWIw2A1kFiHUKLJHaCJ9llW0rQyAmEQiwNQR9H6S1iXCYwRgEkjBlhbTJLATBKIcX4fIRDuo%2BCfrCF%2BfsA55WyBEo6QJow1R/so2xJQTpHXQB4CANVqk5XioHL4DS9pNJADVToj9inTNsaiRuFZS5kXSfk7JvA9ErJdgswm6QMnaLYkQCANj/AEFEXocR2BMCQk0ew3m/t%2BbDO0JEviX0baNOeSAUhdFWnTN4DwWJ8TElqFQfoZCvhrlMJEcoGkwhQhnIkcoDwSQWQnM/J1GqvyjnFJEhVS68yPYcw8T47R3itHCD8fVAJPBQzBOUKEoqhxHlvOBJhPpO8oVfgBUhNQVyiVkuUDSkZJYxnLNIFkpMujI7/NMICnlpKawCsZaM95KyQZ2EOVM/wWgL7bC0HeVAyE8GspAlKhJXLZU3IVayJlmKUEgBFWKogjg%2BLqraQ48F2ibWTNdcobFdxpKkn9fSR47cFL0iUidawqApDaKFEQ9I5gNJBqePyXUK8jTWGyNkdUKwhQXlnsqbIABNLeSal6bD0umzN2bc35qLSWpyp9XLMkPjfFltCCUASqWygAst25UF4EQ1iNb4UCNYP5IVQjWOcC4rw3mwHeEY3S51vmZf9YRAUUVsVzKwlJ3rjYl22YjDWBCiEiIRAMfIBAwiWI1X4CAE60IbkmjVRJqFIS8X4h8r%2BFi1lrNKEu28liGKWDEL6x%2B%2BK/LDuUAAVRBqUlcUTkjPGKL4RZVEtCsJddMpGvb%2B3ir0a0Gk6A4Q4EvVIb5xSoMDSAvoHwcI5KQiUCc89BBL1hBrNBp1n6Y7hhYuEBMpAbUzP8BYtg6B8JSATLu6ZuqJAlEWdgg176gRQEIwSEj2AyMQl0VC5CKEf1AO9gB%2BdYHvW4vFlLdtkHn5stg5NeDlygGP2Q8vNDH8MOYCw8UnDfaB2Ah02p4jpH0jfxtVRi2NG6MMa%2BMxxErGr3EJg1x5pgEQZ8aYAJoTwmfX8vE3hSTOS/oyfnXJ02HF9W/GU86wLGmtOmccS45xbtXHs2s12kCuG/NDpsyBUdVEH1TrPJea8t5QzGZXcA7mWUN24VIIuAYHMiu2P3andWfUGyqLPXFtjTAb3euSPevTQHwwvofVVz9nzsA/olTpiA43jvKBA/V2xEH/xQbswxBziHjlsBQ2V6i6AVzKEQQt7AXmHGdfw1CojtWQsUYcR/S78P7HhaYpF%2BE0XshMeYRehLHHkvjNS5NdLmXb3ZfrKJvLBXpPFJq8Fp0uSEaKcqzxFTWW71080yFj4OmAB%2BD6f1umyKUCAl2vbC/G9dgjemvXTOe/WczkdXuQne3BwHjnV12Jc5sNDDngeg/B/YyH/mCMw/p6FsniOv7I7saj6M6P6MeEhLF3H7GktjJ4/ysQ/HETs/JzlsTEnsBSdbft/wnOtNwa/psi6jX/qK7bW4jtSueu%2BGN919rI6x26cnaeGdI351jYL0QbPl32xRPXdoTdc3QfZAUQCGn81i6rbLutk9u2XfxevU%2Bsnh3UIPdO3p870ZLtS7/Xd4vD2nsx9ZkntrQEQIffDF9pz3rteocPQDoHIPiBg5tcbv9Ee4dhdT8jB3mPscsZ2/jj3ROGIk992T/3InctB5D0thxR%2BGex0PczvBH7Ddpl70zcucGc%2BcBd0JhcoAxdOYvhlBJcedpdUJZcsUZ8m55lrorM3tT8l8t8NdI519/s9cd9PxADbED8AsQCtMbcXtT9qMiRaMMcncYsccu9EtONb9YQ0tvcMtH8w9n8A8qdg9CsLNkgv99oy8MCmZmsmtNlhEPNoFfsTBG8KxlcvgoN09KkF8s9%2Bs9NBt89l0i9l1vs/BCC3MGVMMfM8MTdod1NzdKc38RCbVZNSASgZtUVt1HNshNC%2BsBt4Di8xkPNgC7DQCrs0D0IZD4849IIpsRgFCSDfBUEFDCQmBlDQ9bcsCVdT9NCoM%2Btx09C89zxZ1RtF0AjV8tdftXNN9iCDcKDTcQjqC/d/ckYrcyEHD8thCVC7F3C2J5td9IQfCaw/DxsxkEjgigtQiSFv1wiE9vU1DsgT9M9lAcjT88ic8UJ9Ciji8jDbxS9o9H4TDz5Kiddqj1d9dd8IA6jbCJi6tX8Oj39RD/Aeia9d868%2BpFEvhBj1iaxxspiyFDjkhowxjxD5daxoiXtMj1DsjfNB0tDqls8ztyjbEzDTigdbxLiYSbCQTI5A97inCydni%2BjPw3j4YBFPjMSx0hiCiQMqS30kSHEgSDdsSpD0CLN5iNCKS4S2U1jETNdkTjiN8049cKhsBjAMTrDD8qCQsUD6xcTqd0jilCTa9688Evi/CaTlB%2Bch96T7FGSLjmSLNZiMi59sCliVilieTtS%2BT6wUShSziSBgBgAfBxS/NJSGjpScShCHibVxCQYFMKt/8VNxjYcpAf0ABWXAdY0E2PSImMuQ2I84naFItIj/VQyEztbQ5Yzk3IhEgo6dLYww0o4wnUpDAUogs4sYq48QmggQuxFoz%2BNou4%2BU1M7oqvWbIk7AAYzkvrQfOk7ID9Efa3R7M6T9MYv3askXGAr4SEfw5dKXKMpo2spchxaM6Q8I%2BYxYzM80zMy03PfM4bQs2c3YqiMvA4ksn7P7XXCs2ozEt0m46UpszohUhxJU14lUopbLL43slCYfL9MhGsDU6Ar%2BcXI8kzRAhcp/WsgE/wPU0gg0yOI0tcySFuJNENTuMNbuZYvTXkVubSVNCtKUbtawFYAAaRLTJDLSsjHjhCItIvrRPhcn3mbVdFTPZOyL033GtPThNm7Q4pGCQhQnhAfQgCRn3OXFXCQFDEQRXASHaObIsxcJKGkokqnyxEVHZxA0XLsRAHZ39KU0%2BL4rZ0gorEO0EtfR/IMtQk4ogDEpkskoOWUoSGUBMTMQMwWLgLMUgNMXZ1BMQqSnTI0MMp1JW06l4qsv4pYDMuECQDkk/EwHMpEo1lsokqkrsprOXIcVEqG2KMLyLNvDkqfJbM1RK1cLKz/wGKCtwFMqEu1O8MqogEcqQDcpnMl02VmJQrJDQruHDVWCQFYSQQADUv4cKk08LBQCK4QVhNRrA2QLxFwBq55oNcByLHhKK00pQpqZq5qFrZ4lr6LbRG0mKXQVC2Kljniax28o5agxo%2BrMAkEK8EyVhbqkEpEBoPAr54RpYyxwT/KTSsizq2zUUHrMoRgnr%2BrEEg5gBq8h1oJOzvZUEBpuZPqiciqhFN8oNniUsuDorwa4RJCcUfrLM/qoSAaobZsokMbAa2IsbfAwa7qIb8oqaKApZYaxkcb6a8bgKe9vVMaQBTh51m5A1Or6g5JQ0GQTpu02JgBsAOyRqyQxrdJrIaKp4JRcBFxRQTJlqrRS0LJy0lbu0Va1aNbJ59rd4m1jrnyibWs7pwNT9zqU9Sbq8abvjI59ycqF1QKS8HbMzebgZTz49vYKhkIshJbSBpaOyEQfIVDNBWNUodLUlAYdAQVrrPdKaybUUabwiFNg79kIAlBeb2akFBz/ytK2weA/kpbfAEjIUxMWEaJvAWBGCEUkhC7kExdkVyby7Vyi5lYD004kZk7kauCMko0MxvdUp4qpyJxe9Rcubpy4CEDD8ZdwiQr/sB7QUERUt5FWgRoJFzKQZESLNQ7w7QdI6fxhIj5Ca1AxBaN0h4618yy0Nj6ZbT6iAo6BKwcCqHiGUiBSsb5qEIjwjn6I637z6cNK6QGfI1kDNwwcAfBPwgGIHX6oGdMxg2ISIyANxEr1tgHkGfxoGQY4H504aj6kHd8z6mA/00GjASBBMHxLiyGdpQHKGbsmwYHlAiGEGWTljGHPqo7qGMG6G2QGGw6X7yHmH2HOGSHI5cHxGfIRGT65H8HWHJGihiHwjCC9c7qmgL6kZf0dM5TCrHiko7ambowqypTv9p7%2BCKxebSBEFEIvwQzP7wjkhXziT3zpzjKuSQJeb08/c06nbCdYR0q7Ft7d6LlzLQnbEaS/cR7UAx7fJJ79ibGlzRimTLGwjuG/K0ziaFiycoNFRom/BB7N6uCmgHGkdNzqkQZZGmGoGvHUmnimbimTLwnLJ4qH0vLFQBIZdWnkhYnvGIB4nEmJ7OayFwLecem7UZcvKoAKnxm6IQLpnF6JVvGMrplpmBdS6oLzzew9mjiUNvaX56DG6otmD8mbGIBtUB5hBowwEIEoEYE2J4F7rGnydAnZsab5VsBKmhybLen%2B85lIyVni8ZSNnikxlR9WnwJ1nhNODOzWHI5pKEhdGNZ9G9FDHvSyds69lSADkBpmNhAd4PyIWvJT9pmHQtAAQ4QO7UV%2Bn/dnidn/coXrdmWLpy6vAFwa70ARgPBSB0BMwEhUM2U6W2Ijj2VRG4QEjflu6KxFLkY4lCgIBQJenBLhI5WcmcmNzbbHbZt0rPmM7gnfAztAEuKg7tEeHRGOzo6b69BUB767FJZSnU7TH07qbjXNkY6aJPxHXltm9VZN916U6t62gInOmjtJpD72xr7b6HXI5V6n7eHdN1Xg2h7fBR9HzsWbGFW6mwdR8ZjCbkg82FGxGEHWGoVEEv6AFvVUERnWhx64rFmwdWhEEzB63G3InM3/7YzyDeHsHKI82CHJopHEHrXQcqHYQaHMH6HwHx3%2BjdFVH4HpHH4h3UGp3BGsG12fpF3CG1GuGLNNGzjtHP705EC/0sX8SbHDWPWLH3SrG/c7GHH0lzdhJXHmn3WXiuHLmPm3Wgn/HvGXXAIGW/B2m96Bs/dNK4XZl3lgTMmawO2knm3NWi3Z9rb/rMz1KDnCCh3GbP2EOw2On973RhctmrTgdiBE0gC02ymM3v1z2DGvSr3plcWzgCWLYiWSX3myXyWljKXjAjFaWWn2XbEmXoOBDWWS7xOFdOWhseW%2BWBWhXwEIxRWmaJXbQpWZWu732/BKW41UATBmksCZXuPhMgOQm/dzOLcmndPAWNi/dQXjDpPycVNEOxmkcGy6I5XkhFK/cBolW99xPcO3p8PSgwPImumSPZw7ORIuLyc1Wwc3Om2C3nORNC3e2/BvW47I5WPc786zGQBW7i6vlmXfkNPpbEzfATlcs674pWAm7EVVZnq27gKxXBNtPuHV6S2LE63HQEmG2kPLsIAntL6MusIA2rXFHSCaO/aevlAkuu2v5RdBcBBUOSmN7gYFvkn/j5l2qhbg0RaO5urMLni5atIU1xqla5RlQVhJ5RQVqHg1qJrrvbup5TbDrnR3JLadXvVPEmFQwIl3UyVI46UMZBVrPbdViBlXpweEWGVRsp7Hs8JLB0rLqfRKZmuQZ3rB5OyzXJsQbaU1PLajxE6tCQZcjoehl6lFUhV3l0VuHJZjc1dfxvBfB6eLNJZW6QY6a3mQvoarqMfwa5kLNE2g2NY/viUyYN6geQZAfeUV6Ju0NzYKVUZ%2BpdYHwbUal7lqerUlVP064lURfFexf1tgZ%2BackGJzfm2s7N8rj7HHHWhnGL7ifbEFW1UtU%2B4dVC8AyuzrDXAFoVNSmgfzF0ubf%2B6NY7fiMX3QjnfUb5WSqSh3fsBtUgg9V9LvgI/MT/eYZA/pfeUQ/sm1urb74SbMPDjbSVpgvCnowqXBO2up07PDjyv4QxikZq/jXPOrss3mPilfPvGq%2BKWa%2BBOaX6/ouZm6S4vikEuoBZ6JnYDSPoxVm9EyPkCUOxvMC8nqm2UinNzO/WncjaneGKHSWZl2/a%2BR/hPvGV/7Or/F/i8QPO%2BROXODny/H7D1jm2VTnGDHcT%2BKjUVbn7m4CSBNAlgSvMGaP7bLC0j36lBr%2BWIYEN7Ec75Un%2BPyd5FU0tzIDawdPQCBi0lSV1pWBuatl0Vd4J9FWzzFVtPwL6Gki%2BuXfFhACphKArEYgB/jJx4CY0GUn7DhrrWIAEglKlHZQCWAFYRhRkHXCzDQIOQ2obmV8aMMxgMQXJIQcvOVLclqTyCaecNfXq8j142piuEPSFuXTYEy9qu0KWFLwguTN1OobXLQhimk6%2BU48HVA7oQCO5dxGQzxIUI6BQhndk0I8Z7pKBu53chQGaMitrQoq60qK%2BkF7n4ICHvdGKn3FtKxXTKRwJezCBsHnzlQ5d/EcsKlCMBchQIq4lMUZGa2iQjAXBbgogT3RTiBtw%2B62RIaGGyFwhB61MFIcGAV690W8R6dbHHECRCCSw9GNgHUIpjXwGItQ3IU8gJpjcfukPPVqilcGQJ0qoPcJKoPSodDMhB0O8L8Q/69ZKedSWHlgK4JW9EelgZHqj02zo8bq4NLHh9XLw6lhE0wwSpgGeJSImWpnWxkzRuFD9gB9QwQKUAdj3Z6YoGdKuD3%2BF2hC8aA71CcNboYD7ETiUEaT1KZfcGIjwiAS%2BReFuC3hOQ0FDzj4BfDRoPw06O0FaYAjnCQIu8CCOmRgjmuEIzAfAI56k90kXKe8OGEkGDwBIHKaVGaieGtlP2rwkAEMNBStNihkCaMFwmeB9DPwwPMnLD1S4bNheBBN/mnCgywjtA5jW8jpnt7R8tMF9S9qUPj6/1SqtIpJAiGjAbIwyfAb4QEUlHTIToWvQZFsNUFjIDeQqMMuvyQqHtZRa2SiPKI3osglREpFUVHycavtCBLvesAqz1FqADRIAI0SaOxFmibOS5S0ZsJUG69ae%2BvHOJ2UdGh9uGYgsgvWCtEw9bR7yYYTXH4BYjVhk%2BX4c1Q17eN%2BRKEQUXtB6Eii7QrTX5DcLYHZDTBFg6rs8zgQIJpKQMZTtkKsGxiKwcrLMRIM94ACQAMguFHIPZGKlkRAo7kW4LqG8i/cuYqntsPUHVx8hQ45/hdjZZk5mxbgi5K2JKH1CDBWQIwbIMkSNd2B1eSweXR2Yjjf8OdWgWOP/5SDJxpyEwV4Ufbziaxi494eiM%2BEQBTRy6ZQOWIf5ribRSYtQS8i3FCpzRjiVAfuJsaHjIEx4sxp7WUDnioUJyYwecmvFIo1O6KB8dYLaqE1Tq2hMwNRLAjA0eYNw3uDgDwgzggxV1GcL/R/CfVyedBC2BxJ8DvpqJFgQzEbxaEVC3RGcJiFwiCRwg1GrQAYdYxY68SxAnEp5FCGUl0YV02g9cumU4R1iRgKQQ4pLFkncSliiNdSfCFklGJIQKQIdOZM4qZ1duFEnSRbCkldR8W5KWsd0JGDrA6JWURrpxEITJJWJlEl%2BIqFxDcBsOronqHriSQ/gTAGopjlqOSBhTygwkMwK9gEa0M32XweGPixUzedjk8kOgcRHxb/hlA6wcFtMn8kIIxgkIXKTkmLH0BvcNYHyXTywKxTUikIFKRFKqpr9m453ebtgh/A%2BhhpAw%2BAeGAWCDhLAPAWeErgCqn4Lw3KSKZeVRKSIOp8UxaRiwRSBi4%2BSGIqfVLKkVSkptiHpISxkSYJ5E7xMktkF0leS/ExgCbN9TZAFT6w1UwKXVJKkNTMRTUxLK1M/TrTipTERrogmMBeFNpzqDwJQJtQ5M4yyFewaLXQqwyaEeTW6VxL%2Bn48eYb02qV8HWAtT6gUI40uh1L6hTwpr/FaXaSBwAydpq3SIvLXkhwghprwe0EzLgGTRJp002aeBnmlLFwZk/UwlFLIgxSNAqRCAJtIraQzu%2Bo3fqW3EO6hokZLWEvhmRfiMT8IFyG4b5KyFLiapySVBFjKWnZAUeygFWXhDVkojmIMknwHJKoS0z9uMshwWLR6r7kPBCtdanCHCFTwVQuAWeGyAe5PcruPg17qKE9neyohZ8A%2BCxWRlEzERqhU/HwFBT21H4yVNcHyyGzSs0qrtbKtsRTkLhoE9/dYb4EjTRphAsae1oUjx6YRhE%2B5LUZLHP53gLBk0OObUEeHUj2Jd%2BE7KflrlCdP2DkluSeCZ7PoO5w/OuQVwPwM9SeagfTmkQYiFymEJc%2BNM0PKFr0kqQ2cSsnIo4qVJoXLc8GnIkoLzYYYk1vJRDdpZysJm81OSMU67G9Kh7o1LJFwYgf0bqsVCLrVXp5VVGqzAnjhlVaqXzRJS8tvJtj6ohgue3NaZJ3La6CjmuWk7hpRMf4HNhEDzYAV2LAFSJGRdzNAEAKeagCexv/WghZzJwkjikfeR9IZkjKtVEJn8tsN7B7YaMBZZPIItTMJE6iSgE80uUZxNIeZfeXWLQrSQ2Ke0jKsYsBQVwFYO8nelUiheIuSB9ToF3MnciZLUEyjyZK0L7I/Fb4aw7cIAc/BcyUCALTh9NMdHDxS7epNRrE5ICwvjRsLraJnbwtmWA7fE%2BFzqP3IIu7l81n2/omPniL9z%2B0JFEiqRWyRkU1MB5sIMmVUQpmXIVFBuNvjxLRwMFzmkIHRa3X0U7C6ObRT0o4WOl%2BB3GcNDMhnm/h2KL5fMisLBTBxOKgmRXQrs12bZ/EvOOnZQGYoM4WLboVi7cjkvMoYdJOXyYcvwvJwlKvmLikRQGIf49KjWZS1utb3IXeL/cviuaXkz9pDkD%2B9mdXMEpOIIx85Z%2BGJUwRwX1htFyEXRfdQPFIsycCCzBS82wVfBJCe4qTjY1hY7iZkCLZFgQMlkmL/AdSwzuMmM4TtyS1hHJTwp%2BL39YFVVRxUPK7lBNVRbi9UWIomXiKplXMmZalg87zLPsiy5aSEtIirKv%2BsS2cfWHiXkj9lO7H6IcowUgCTlvPc5doJhYUj9m3GbAeEouIMKycYxAtoXydH8zFF0Us4uiTpU2MXlDS1KDalvCcLYSUA3khACGUetQVjvAMdCofqsrBZZxEUmKU5WgLJ5PKhBocp8DGABVJebhesRUyirSA0YcVaIqlUVEZVeBKWOgEdLOlFVxSblW8rnxhYLVTpLJc0p1XOo9VBq1xRKvcXGr%2BSpqy6kS3nQJS0lTyvwAqxspDYDVopTzDA0mhELWZRmMFj6ptK0L/VIYeVaQCDV4l0lP9UrOGoXCRrMMMa4DKBgzGiDnxeLA5O6sK7q9xp68hIB/I5Y8At5kiRqpClYCiM0UfVZhUPNvGzYuhiLHgE%2BKZwvjK1QK8BdWrti1rW1nwtYc51%2BT3ZPhra6ru2ulqdr2AtSntRYMaQiC0hw6itQ1TsrKAGBxahtWXR4BloZwLAQopImBjdI61SAYcvJ2wnhAkEcgndbIWQq2yuqXcYRBKCFD9oVCv6/9QOlyA%2BhUUUicOdGGrGQgDhioGwJYAeD0BZgNYQcCOSlnIUK5CZNkAQC0CwQeBEG5itGBuEYTP2kIP9XhlA36sYhoAEAHMOKhVgAKBM2xJLH/UpBLAlC8MJBpAD7lIQ2G3DfiEJA1geATA4cjWC43xEPlVIyOCxtVD0AON1G6MDxq%2BB8aIEAmmlMJqE0ibxNUa/Af0WEnSbSerGngPJq41KbsgKmvDYJuUAablAqGsTYRr5o6aTOUmhOjOFY0PATNDmszRZrU2aaawTYLTQ5ok16aXNURWmZhoJ6gRHVFSVBFxuI13CmaZG4DdKCZn0sFNtG4OEVC%2BjVgpoTG%2BsDJrY0gxTNQ2d9NFtyVNSAKgWl0EUsUKdT9Nrmk8Kxrk2TRitC4UrZavK0iaKt6WhIrVsKT1boRbm1UMZpa1eaStPEMrTWG602auNvW5MtKIa06B3NRWsbW1om0daptImh4FVq9EgA5tShBbYNpPC5gzgFwFbdVu43jb%2Byk25QNtpQ07bFRjm1hH1sO3yyA04W6wMImgzWBRQH8S2l9p%2B2gQUtYG8VrFoc3QavgsG%2BDYhumCabrZzcCLb7AAAaKoRUBeAI0Xb4tCI77b9uB1UauNdG7LYxqoVx9JYbIawKBGcCjaLtZm0CCjuVBo6aw00ACvZou37a6toWt7RhRiIE9buFO6DCsAx27asdiWr4DjqB2Ua0tBOzLaHAY25aSdvcnQLgHWXnbdtZmvnaBAF2baWd6W4LVw053MbSeJ2tiBcHY3U61dV2jXVrus1dbWdu25IgdoG1OtSeawEWieHN2Pb1dlOzXSsG123a7dj2vXfIrHkzhjd5wC5M1oYitbzwkIK3b7ts0ibBwAemjQ7o53kSbZH2vXByDiTGgxQ2gUXOrk6CplGQvFQSlLH7HPAsg%2BgMFCUHEDxh4gVwf6ORovDRgfNPA5kZpw%2BXZBm9renDapvb0gAmtKmMxJHDMAosogXwHvSADb2EgiNqoB4MPvaBmAT22UlMO2EZDK6zmbPZTuLsb3JBxd0YOPdGE32MFBRga0zOvpOizxAp8BWBGYM0xsQ99/gRBDFWdJI0i9FmRkEKHiDYSMoM4OMOgHL2%2BBUdF4J/fWAP0gA6dIB1vRTusBFLGMMgTUGABkD5TwiEBqAwzpb3T7YD8Br4MgYIDIHUDGG71IyBWCfSIwskE8HXrAhI7ZwmB3qJ%2BABA8hI4EBo/XajwFWLWD3ugXcfvWVTbUDZOMfZR0hBcH%2BdKwQ/ZQeAD8HnUS%2BlfRfsfiMhFwgyKWN4F2zCsYMgOyFCezAMVgX9rPCAKIZ90SG3dNGgNQcnMRSyu4diZSGVqAPKBm9Oh5IFPqi0daO90tXTd%2B2cNla59bG6Q71JtRCGEgSW/tNGBcNOqfDDwPw2lLkPp6/UbIGQHiKYCyAwyMgcgGwFkCWBUj6AWQAsX4CfDRAEgMAohtSNEAMjCRvETWLDKWAzAg4N0IsDdBugmwCwRDQAE4wy7R5gLIEHCpHWgIAKo2kbKPkBsjMgVI3cxR6lGZAmRvEXAFgAoAMAOAfAMQDICUBqAdAbsKwA4BoBBAggEQOIEkDSAUDWkMEJSByl/A4wvIVfOLVWCxEsgJAXTMkkJB3GTUZg8qY6AfVTsCAagcBJgkb3BC9Qg0gDaUhZ78SbANUVNMIktoMyANWcZQGyGVDih%2By/aAyQeHAknRG52mTEQcMsDWJMIUJ9HTCdAgXgJQEoWeFSOSCMh0TGIpHjMDiP2HktfsDkMwRTBgnBQEJ1MniajikwaDIB5MH4ApNATixWJnE/9A5Mwm49vJ1E8oEpOfCsT9AWk%2BLoMiARGTCOzCpLTiSmBsJvKF4%2BoZf1sRfAsIT498avhCCiAvx1aiEOUBCgp4yoIUJqDhB8BiKkZKAA1ECTtAod1gBDUhssBeo/jy8ZvdYHtOOnSgVpjWracDMrBIyMp5Htie9PmR/jzekXM3sVOwhGTLgCxP6fDO4AfT5p/4wqcpMQAQzNpu0w6YjNUmhTswbM49wtPi6RcCphk4KDsAWI8zoKH0zYCz0cppQ3aFYDdwL0rgP9l%2BrCmXuTKWnZN2E%2BoCOZSAea7jde6%2BiMHH3rE/QOhpGA1AhgjA4TCJ0CEibhCsaaKxFEiiDGG6NgmpIFCAHJtcCDrBcUBSwEebEAnmPN55qGS1Gb3BAgQ653AIiYvApADzz518/CffObnPzkzN8x%2BZSDbnVQu50ipedKDHn5%2B0FmIBebmYwX56UBe89ZsfPc7/AG%2BlXeod33thlzXJhU3HrhC4AZ4fAUkyDFlMFx/o4ul83xDj0gwaLQIei1F0IvcGNQJF6wGRdC0Dnr9YwW/eK0a4P7SAOhvQ2/thr9mFDJ0b/Swj/0ngADdhkA44f8CMW%2BIGBtHSDGQNIGUD3DFS7gDUvo7Jo%2BBwg8QesMnQyDD0igyYfgI/66ddB9S9hEYNqQlLZQkYDCdYtiHJqJFuEykAlCYxbzsFhfTpcB20X1QbFhi8FaYthWWLgOyamxeIukXyL0V3HURYjMpBvLEoFU6ZeUBKHiAKhg4Dhc0PVdtDyLV/b4CgC6XmLOmdyz7s8tpXVQEoCxMevDAjdqFVh2xDYY612GHDkcH86paJMknIzDEXq3pf6uJWhc0F/y8hcexQXTzk19ysLgeA2DrG4kBI50ZkApGBjkxrIzke2PFiCj%2BxnnF2BKNlHzE5AcBKwmprCQ1r3R8gL0f6PpGtrQx2QKMZADjGTrFRkAIOEHBmAHglgN0JYDDKLAeA9AN0IOHoAPA3Q6x2QA8FSMPXMjT1kY%2BQAmNTHyAMxhAPAAgBzHBWagVnhQCoCJVvwuNiMaQFaBuhkNXgJgKijuYgTBju9YwIZxkD0BUjbQfhEQAvBKFBjOAJCBwB8Cc2%2B9eGwoHc0euqyEmvrRm6kYvhJHHrcWXo1tcSPsBOAu1oQHoH0B3NIAeIsYGpqFvBBIwG4bgHkf4BIbnKF4LIMEFaAJAMw%2BgUY3sakAMBEjyR2G4MeGM/bu0ygYAFGmUBugzAPAMwHJrKCEgu%2BEARY7Q0OuMBRghNnwJ1DJCeVcjAgfgMdblt4jzrOAfVVdZrGDgWjZgMMsDfLoQ2WjiwJsIsEsCDgwy11no30ZR5w3triNsY0jZOuo3EAmNtANjdxsrGCbONyO8TdJvk3vAVN6gPoFpvPB6bsgJm%2BQBZtGJ2bqRTm1%2BAVu83HrhAfjaxjtCDGRb8QA46PcluDGZb9djY4rYNvK2DAatq65rZ4Ha3dbD4fW3Hb4BG3ggJt5yubaQCW3rbhR6QIOrWsbWq7CNl227Y9te2fbftsTE0AsRB3CAIdskN2HDsd3xW4DixLHcEAJ2pjSdqNZdftsyAbrd1yu07eesiBXrddxO%2BQBrE8A/7YZFo26DDKDguwtRmYIsEWBJ6pbMNza/DeGMIPVraNpuw4I8Bt2mASAO5owFIA8OQAb9qWx/awcyBsN14PYKKFdvu2yIf9326UEAdd98gWQb%2BzI89ve35H/toByw9OuEPFgNRh4IhvqMl26jtDwcFDbQeO3HrzDnB29fwdS2eAVjph9g%2BRvlHyAsCX0LPsHBAA%3D%3D%3D +[godbolt]: https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAViAIzkA2AhgHaioCkATAEK8%2B5AM7oArqVTYQAcgD0csGADUqAA5rS2YMqYEARqRakAngDouABgCCcgFR2r15XeUABAGYEm2ZX//qmtoAtCxMTGZITi7uLGJESGT%2BygByBBiswsoAwqxiAG7YemzKEGyoeYXFbsLYbJgmbNhmGAC2AJTRrm4YaiakBMBIRDnofQNDIzyW9JbB0/QAnMoAynUNTaOkambK1uHKE8NZWrWkhZgWNi5yTnc8AMwE5UxiOMpcD9mowkSEbERPrh7k8Xm9fJ9skQTGpsAB9IhGYjCIEg54VcEfL4eMTlIgEdBsMKomy8UEY96QvStZEk6xOBSqDRaYBwgAi2C8TWEkTRHnqnJyAAUhQAlXAAcTh2RF4qlbNwADEAJIpXArOEACRBOC5vhlYsl0tlRoVKrVGu1NiJrWwwjULCkTKCOi4AHYBDYxMJnjprJhMKcsp82cpfpgQCAxM8iGpEQjPp7rHUxK1VJksqLtHxiCsCAAvXwgMN/SPRgEADgRHw90X8%2Bgr5GSH2u9foADYm/46359A8eF2/D3lPp2wAWZt3N1sxNOb2%2B5SKghFTAAdQImASWND4bLMargIeSfnHEXy6YmAA8h4PLURiGSxGo/uE0enERsK01KwP1ioTC6hYW1lAAFTpX5SDEVARmhWE4VaFhhAAaxrJNkgwNhfmwAAPTQSxYfFUFUQlflA5R8jCMQIQeHdSxANhU2wAZUDhalaS%2BMCHlwSMEOwiBOjfUlp1nITQ27UlHnWAgPGSO4bEZECkSIHkogkp5%2BV1YVDSlEDRWsZUQMtHVOWefUTR0vSDKM60gLtB0nUCFlUPfT9vwI6jsizYAcyIPNC1WcDESgkYQIAxSWGRZzhME6wPy/H8PMCyDoNAsKlJRL4vJ8vzpBABsgWc1s/BPHRYOo2in3LIgDxE5wAhIj9cNIfDCOUOISBHYg4R9fyH13Z9KwTD0K3dGcYvQhqcLw34CPSNr4nQEcTA/bqC3Kx890GwEPX0Lqet8ORlBG6Kk1G2q4rc39ISS4LUthcL2M87NczWyN9A7Ar3TQ/wSuUMrtw2gaiA7V9vr8DCsKalq5vaxbdqIVbepowGqpqj0PpO4cIca6aiFmojYaWlb9oB/rUaGvh4cRg6jrOmK6aTC6Er/G6UtC%2B70shLKXsLN7%2B0%2B2siuUX7/r6uiqv7UGscmqGZtawmqZJsXKpfba%2BH5zGhexqbmrlmGFqJ%2BEleRsnVa%2BxW1uUQ7jrG07Ndi1zmeurinAg272ewB7lK557fNevLxwFsHhZ9U9RZN8WY3HKWtZl3H8fmjqLaRirNuqinA/tibMJx3W8flg39GWo3LeVtO0cpvbLethmp1tuvZLUqSZPE%2Bl5MO5UASYokmBUvkBRkg05ThVUQNwUUUmsAAZaz6UeXVTK04fR/HyeZ61JwbTsx1fEc7RCusLf7R35QY27sJg0Fh34vcv8yq30CmxA8jKOwJ/dAIGlD2BGw3ZS1AkDYFQEhOE6BCikA8EwdAAB3ZQxZ%2Bpn2AEYJgcJsbsEPNkfQ6B0BMCbBRV4iVkZsW/lFeuNgma30hP6QMdosgsADEGJs/V9rVjCIMNgtoASsxGAQYQcI2HACaJgYc8C6KIOQaghq6DIRYJwU2CA9CaHCGDDwdspQBEcLqCMYIyh6DtHaNuB8lgg611Eo3ek05zFkmblY9uygACyn4yDmFUnPdSA8l6mlwAANThPY3A9jLyigAJobzUgvTYQ8vG%2BP8YEkJYTD62WPg5Zk%2B8vouRvldL41CgwjkQvCRRjCUYxkliMeyICi7EzWtw5QXleEflIEKR0KF0mxxzjraGRFsZ7AYbQ5Q5S4T6HyQDIZtR%2BG9OUbVbOkN46tW6abAEpSwxrThM8QZxdgzIwGZUkuhZaqmOvpdDyOS%2Bm2laOMpRwgmF0RYSMM56yql7Jdr/IKKVHGtGcRyfI6QIRX2SL9M5zjuokCMMAda/VjBGBMJCfIODZo%2BGKVtJs9ydnU1RONfwesiKAtMMCsgLAwW8DUfBT8eLQXYCmf4ChWSnreR5r4Fk1NrlPluYbUBN47x0mSFi4iOdyJwvxAi%2B%2Btk7qe05l8Rl%2B0gSRjKkSw46ASUfNMPxA%2BzZMX53SPw5RTEiAQGHGqvwZ9SA92EJGXh/C9CCOwMIr49zCl9MEGy9AHLsBEHIPqg1nqvXNghZazRAJ2WQmFcBD2XsMrZA9d6qNUbJXVK4jKgC0qQD4KokmlNb9I2Th4Dwd5nzsDfKkJGeVhxsAAEcqKkTYOgEYGjrW8B4AJYOyQtBEAkCUOwEAtBGqCAjVAiEMHdNhT%2BbwFKhbRvHc2YNvhQ3iuyLGp53EQBlUcFxPVY6DVEsVWSglFKACslNi7stvK6rgu62T6MpUOYSQtqUeW5n7fy8636A1Zai51x7v7Dh5UO%2BFvgp2irDZCJ9SbZWqMONAxVziVWtLqmqrFWqzi6szckI1JqzV8NrTa7IdqJkqL4E6l1brkMTqjb69hnCEbOqDQBB%2BM6Irey%2BMRkj47gPxqXYmtj6a02v3deutV9bc2mC%2BT8otpBYFaHLXaEYVaa1%2BrrdmxtmaW1tpcGu2DXqu1d22C21B/aYUCpHX9GjIq6OPVY4u5dQI1PMc3fc34%2BLCX7rfYR0957FNCzOqJc6jtKHZNw21ZlkZWUZR/rFYzwFBMmGE1ISELAmFJpxSYbdhKwOReixSr4cWwxJq3fZ8lhihYds0w0ntunfjUdhA/NL%2Bafmxfi2xxLyXsArtwAoi9MVb133C74OpWFGnNJqb1hp1WC2/ODgC0lOBRsFfU8kEbtXMraHqUxJpwDIzbPyU2IbK3mlBZWWsnZIX9n21GlYyS9RpK2NsIdawqApDKKFDg9ILj%2B6aSiVKaw2RsjqhWEKS8U9lTZFCVaNxESzLaThJ977Kxfv/cB8DzeST7K71Sa6K%2BnWKuARDe/BCyEmxLhXNeD9yh32cuedYP%2BPC%2BGIgIN8sIcIxMiMBuI%2BnaCuFfFkbgpjzG/AQFxy0miD4yrwUQkhSEnFF3ps6HxnnXqiVyogKT11hjkYE4vETzlHpjHTgErgUh3nMkeX/SBHHov8fnivIRknhGmz/oAKp0l%2BuamndOmAzeSP%2B/qgF9A%2BFWR4SEzuBiu4Z9A8XyKzfW4/dxghTYHdsdlR1nzNLjem7x2eQnVulduqM5VkVcfQtO74TJhEQeCBhHd1S7rgNve%2B%2BkpCJQgfadl5QYzji4e09Z%2Bj1RWPIGOOMyT0bqv9j7HKkvLbqvJuyL8/Nxn4nnfyeU9qUtvrWZ6GqqpQPrrufgJ24BrCjcXL1UJ2floehEBunD9H3K1oNIFVTZ%2Bbx2b47zXF5d83sPyhp%2BR7vD3rirgHwMThBxikAGJVo4RSBxjr5qrKbGqdJlYYIS5QA34Ehwj35OjX6i4GLop65Z7ubqaebqYY5fD2577oAH7k7coapEQn7YBn4X4j6XjX636oE1ZSCP6y6N6u4f5f5Z6/64D/7IyAFMDAGgHoDgHYCQEwaeowElDwZ9rlYcRWbIF36sHYB4GyTXoWJkKHJOzEFD4MHj7b7Tqp5IQz7q6Z4uYL6vIjDbakCrgDBXR/Ib6G5b5Y6%2BC74Pj742qhaUEJxeHKDQIOHYAQCX6MFgbKEsGjbsGy7%2BDPzprRExGnxF7Vol5N7Eht6f4R68HKD54CGhhCEiHKBgHYQQH3hOFqoRFoHlTc5yF6aKGrp87MFVEfBgYAB%2B/OWBbo2QpQEA6aLMXw3%2BrqWB4RmB6h3YmhHum%2BmOD8HhyMXhh%2Bfg36ZBmAARQRIRDBTBKBVRCRMRcRPG3O3qnB7%2BGRPBNuORQIeRRRYgQBiIoh4hkh5RzYlRqhe%2Br8l6NYM4XmieLh0xIqoRhhbhj8U%2BEeauluc%2BZxexBCg2y%2BDS9hxA2A2QUiAIUBf0UxehRhORpB5BPhR%2BrU/hgR8J6xV%2B4RTRqhOxHByRCMb%2B6R2Qk%2BpxH6fBlxBRtxRRYhJREhZRTa/gzx02IYNRVB8B4uVmjRWxLxcq7RmBNY3RUAfRzs3RuBLRaiHRYxV6nxhBaJ/4GJsxoY8xFBuJc0%2BJaxoRmxKhURBxXqRxNJdJWRZxuRAMzJIBrJ9xnJmaPJPyrxUJGKqpdctUi%2Bp%2BmAoCbATAJgKJRBmpgJ/xOegJk%2Bz8X%2BoJGuyu8%2BOJixVBZE/p5%2BDUDiGxJJopo2dx7JDxXJfgMhS%2BwAy2pAq%2BWGkZ1pHelhi66ZbpUgKpHxPpMUfptBAZBJv4xY/pgZwZoZGp/6kZKewJae8ZFhUeepKZfhyxqxhJxpOZppD%2BvKpEkJVE%2BZpRKJyQthcJH4kI1Z7ephgx38kYXZwRjZz6Uu7xBBkxPx6JEZBhUZtGJhZhYJd4x578XGU5nS/KG4c5H4RJYRSppJeZTpBZLpMuO5QRiJOc0iXwB5mRtZDJL8npi6Z5IpS5TZ15ExzhRyrhVWj5I5sZouCxP5/hd4gFJpkRPyG5HJW5/gUF8JMFM07O2QCFcZFuCZas2ubIh5Sa6F3OF5zZN5uFuh4ZBFo%2BAJz5o5Yu35Sxf5FQtBpAlFi51FTZYFm5UhBqjFH4zFeMrF/x5pzGJuRlJG0%2BplE645UeWuo05JiRPqAp8hCBVmEpyEuup5axQl2Fapt5eFvxEWhFE%2BJhpF8lKxJAwAwAPgKlwFuZNFGldFWlFRIF7pYs%2BMgp9RrWGFalahHwu6euHR3lrZSYi%2BZ5fZIZiVqJd54lfxgVGJMZiFR5Vl75SZX6qZhp852ZMVmFz63Sa5OVxRmljx25MJTEu5GWbFj5k%2Bwu/OQpnGPG6e5h1lfAPF/FaxglyVbBPRspjGAxCpGBblwlOFfgYZQ5tV0ZL5C1b5iZEJKFqaclbVs56FC5XV2VtFhZmaOlCJSJGChlMu9lj8Fl4601JFGVkY8RgN0aTVJ6Nl04dl/1vOvRr8/R8phGwxSpmBq1hJXlXpLZXxdsYkQ4TcF2LchNbc12DiouvIak0kHi72fi1gKwAA0gkmSGDp4lKPYgzczSDkfMjs6E5DBidUPiDaFtrFDPYqLpkUhPCPzhmXyqCeuJuEgAERuAkG9RBepiWdAqrcrXycjJYFiIqHAU5fuSLRAJYGINLk/sxqImlSbfBWbRDQanziwNLSLshKbR7augrTrRANrUrcoDonolgTtd0XolKbongQQULRiRLV7aLXHM1HHShAhG7cIEgNJB%2BAGbLd0j7QHf7QkHDfDfVPLZxROXeOrSiSWbUQoWxWbanTLSDXXfHX7TrSHRGrtajcdmqadq3NYsTVdoyCsEgPQjAt4q/FTW4jTW9uZHCCsJqNYGyJeKuN4tPHbrgCzfPCZJErPfPYvcvavVPOvQkrzSfHvGjv3lVf%2BrYU2JziHEbCPZgDAjUsPaPbAqIk%2BB4BfPCKLLWPbDHYCbYS/Y/c/YtmWX1rbpBBlnrh/TKlAwiABCiTytfSNaQAmrCGGCAxBl%2BfjQbn5feQ/EA%2BTig%2BAw0ug74K/U/aHmA%2BWZA3dYuunW/XCNtaGLYZGKcCevTJYn3edoQCTS2GTYyI4qQGCmNZPWSNPYKHTf4qKBKLgKuKKAZBvSDqzdveDsPDI3Iwo0oyfUjmfajgfAA4Q6g0XcdVXmw%2Bxhg%2BZX9ZdVxR%2BcRiQ%2BWeQ7ddA04BUIhFkMI6I0EQiPFAfJoLTu5CAMOL9KMj/Yg0LuY6g%2BQ%2B8WLbMvrB1PwndqmNce5AGSw5mmEwg7CF9IjQQsjceWjQ1QctMrnD%2BYTJIq0LtEIu7QLqGDNTjUYyKoqLffktk74E0Ng28d%2Bb9JoGMASmkxXmql49gGNb49%2BD7KQ0xKYyRhAJU9U9arUxHYqDxJgTM5ZWXUtTxes%2BOnM46KgCkwlOk0jeKSsyAAVTY7Lu6NKWUNgF0/k3KYuJGHtWBmcwVS7DjSM2M0QPFNBsjLqHEEwIeMHPBh4zqhAEoBY4w1Q2DfsZcxutmraCI74GeUkayTWhRN4CwD7r4B4EkNCzAi4yWlM6QPWngWoGID7ukME0LDyl8z4z89%2BKoKfgBZXRVc2q6ipuklnOMT5f4PS/CeM0wHLaRAKytIy0wESiHaGDgD4HuZ80xN44KxK3KmMExARGQCGCKyMGKz/fFFKwDLK66hlsHLq0K6q7CEYCClq2ayq6ogaw%2BEa/K6a4q6Mwy342q1a5qzRCEa698/FNK8oE6ya8OLa782GxM/a6ooG8G%2B8f4U/U0CqtjPLmBgNQlUNZXhiRY89Z/htetBY2JlulUfxO8cNSS2NXpXBdVcBNmwYU7d6o431uQzs7LvM6ZNnWbvW16lDdxbZV256kkwc60Kk1ncw902hZ5Xm4dXy8dYOVXi03kmMv9F4CuGO6hcOH0w6MAGk5CAuyuxeGu/Qym2otrQkEmw1Me/Fe9TLqC9qqQEhvCwgnwsILZP5b4Gcw6FoAGiyLQ6WeWV3hmvCwJn6%2B69%2BEWvuysbwui8oB4KQOgGmAkL4C%2B8BD%2B31mS6WyXTMs1ITFWqAuApAoS3yfC6hhfJGAAkAiAmAkxAR9Q9Wz1tE5Y4B9bcXQahB4e0xyx7s285LdgU8yALgQBxh9OYRAhuC7h1RxAlAtAi23LtmhG0wOBxbiTvh1J6fCUKe0gEm2EJKwpkJyWq2rAf1B8oUBAJuwM1nbu02Gx1%2BcCH/eeoVXjRkvg3R3%2BxA0%2BSKhY/9A06LRmA4iB/Cf40HkEyE6HDoFk%2BHKGI22Q4x%2B8eF4g4O4c2k%2Bx7E4neUwbG2zU/zgDA08HE08BIqKRb03B1u4Mw%2BLq5M7%2Bxl4s1l9c3x95yl%2B0uLf56y3AsoAl8O0c8lzDaGNy9oaUx0lNHoKgMQH58i2Ndq4u%2BExg/kAYsWO1yO4s1xh6PkKdr1%2B8be4hhC2AFC1g7CzHoDfWki2Cv%2Bb4FBzJm1Ji6wDizB/i1g0S6hw0uhzFBS1S6gDS%2BpnE3nAnLq8y7QQBd0nF9N6/Gyxm8WZy7Abq3k%2BuQ5%2BppD%2BV1G0qdAurZmnN/s4l6O0t3wK0NAmYPN510tz13Z%2B8ZDxfs1xStG4a0UMa8T2Txa%2Bq9az66T2N0EQ6/81T866G7T2Bp6xq6Sz6/D%2B2KzzK%2BzyG0LPG4SMEQYsmwj1exrZ6lF0xJGDmxeQDAWxBvcsW82WW%2BWWNW%2B659F79cxxOoDxx/ZVVx23jl2z219CtWxuhReU2Hj0l1eTjSJbO1ffO6RWZ9uxZ18AV1xCrWewD20/9FLiuYCDL2m9e8xxt%2BC/yU%2BOash%2BNf%2Bh%2B8YFogziY/r0xABzs/WhB2i%2Bd7B/B39IAmGCKg90xGp5/q63CGeU90WeH4nItJ0%2Bx6TI5XUZgiHxxq1tzns8kx187yc20dx25RHTKSc6HXxy82oiP0hO1g39XXRMZ8Ed7zu370mqgCy8ES31LtO0VQ3Dww8DYn3XYrYeI48JI4PLPXKMqCsGPKKJvQ8GzXTTf3f%2BPLo7aMkiji6IYxqScsosSwuSMJiM96HKIAP2gzNjcaUejOGnMzOMOGCMFhsoEsDYRLAMzO%2Bt6Afpv0AYX9XuK4xeTJQbCqDFEiLAibIwoBHMGAUBm0Bop48feELguFCKkFh0QqegULF%2BgEtYED4ShqA1pS/tMB3ULBuimDifc0uScNpvagAEPhGUkgjKCINS48pCYxsUMKZgYxzoaBUqNjMnFF4fcFBqZQmAgIBgIDkuONXps0lV6oNVsslTvmMlkFMJq4R0MQMINarfdOq4GItqoWgyg8Q4C4DXmKXIFRMSW82GLF8HKQJZJsqhPTiWT8GjYZUm%2BQtolmoGsgIByAqzHv1papl6CxJNRHBw8GjYvBDfCbOcmaKRMs2qDYIeNTCENYIho2KIeDxKAxCRMS6eIQqkSESoNBa0JsMYlXTpD1SHvDEv72TI/lyuBDZputjT7ftM%2Bs/AqEd3hACUZc3SFPs4zD5R85eBqEsiMJc6p8v2CMCvhQDq4i0yOW/azKRnb610E8mVbah3W6JnNp%2BBwg6jD18piUU%2BMnUPnCyN6ToJ8AMeTnr22Hp89hMnTjv4Fn6AigRU/G3P20SI2cQqqZMCDL1mG181iIPBvrH3vYnDDiWmNDGgEATAI8O1HKTpjjwTzUIAs/LEMCAD63Cu6bGUyuDSA7ZoLGCIuvl8Bs5Fo%2BiJARaKwGRY3dmoiHGDhbnr5KZ6hgMZfhABAhHC/ukvXob4RE5gs0RJMJQEYjEBNh60FjYluWSDbb1iABIdTsQGVqFg4OyyPZLpxxqojdUJHXuOhgtTsI607Q1kHYMhHGVoBZmDoQujeiHpNBkud4Vc3pEMc2o/mKDjSGEChA5MKxPFs1D2FRkBRjnMxIf2P6k0GQh0WwlYPP7uIZ6EOV/vfyFCfZuaxkPUOzThAZjx4WY7IDmJsif8%2Ba59X/v0MAaWDmkMzUAZbCfQzMFkRAJZFTF4IOMJ8TotQXAMY4lo7wrfIxKgPQHYI3cAgzgTgO/o1IrB1qWwq1yIZ8C%2BsVg8YbiLCYtF8MEAdsVbmtiW1QRPOJsQ6OkJ2hXU7HPccxnHFCCA%2BFVMwcAgsEksrB7xUJm0wFrIwFxSY3bCAA2y1B1xpQLccTh3HtAzx0aA8fC1lzGDaRHwxIheLfrOCMhCcf9FkxZBK83BCQmoT8hVSrD6KxUULtX2KH%2BCZ2XqBXqQAqEVclxA2aoXhNqE40OWBnBoWhMLTNCXCqEpVNCltFMpfxXULPFbEcG64S2rvI6j%2BUWFV5EJ2gZCdkPlR5D0JyIzNEUOypDNCJgQ8siRJoZkTgE4QyiQtgX5CjGhDEzrLkLaHqDkhnQjiZRm3E8S0hjw/UixFlG6pVBsAl0dAzdGPIIQ/AEyUenfIASu2zsVhrWLWwgAWEB2DZGePrRWDVR5Sa1GqL6xosJONHBcLyLCHGiQWApGyeiObDmjTUIAc1JhlIkNJlxn45pIMk2yHjkgdkpIbQMXSooPRe3bvJmhCnNJZxvo8pJNz9GXI0WgY4MdaNDFJAIxoGBtOt2Sl3sH2zHdKZaOykqTcpH4r8S5I3F/iPJPEoCVGlKlsSqpeUd0XGk9H7cZcdU4BA1JJZFouJsgtqbwg6lWoup4Y4gb1Kjr/052RhMwHdNAjTjmkncHANhAXDXicJrab8D/QBie46In0nwOLjukWAPm8gxrvEy6SZlmEKyaTHCCp6tBNkBEygk%2BH%2Bm7Jk%2BYgL6a%2BA2l3VcuGpKGYWGrApBCuOEuGT9Krz9QUZsMnwBRkhApBbc6M33CeRi5cNtCYZPGd9Jmj3tAs/k6GcoHWA1IwxrEbBGoAHLViH4ioXENwHuozk/yLADQMGQwlslBqDfcWeUH4hmBOsPPEFHxOyAczv4fEhvpdggC6y/wvM%2BoFbWjQCyoEYwSEMbMdT0BriTYPmfHk3yyzvwrE7ICrMlmtZehEjGSHCFQTfhvQgczZOSNDALAxwlgHgFPGHB5dfAl4NQDCOlkrFXZ8s%2BOZew8DSSZchs22QMXWCdEG%2ByQDwEbLERdwkErOb6jbJuTQzrkxgT9HZy16scyAgs62V8FtmuT7ZuCU2d4UjApyTAxcz%2BmQGgTGAsMac1dBnIbnel%2BJPdXhpdj7rXSqqbM6sE7NCyL5LZQsyEOsEdn1ATEN6G6YCU9mJy8Ss5XuQrOdL65qafsgOa8HtDXyyRD4cOZHOjm7zRZIqUeUMNCptQ5ZfctOTLwzmy9z5biOMQIwOSxzlAz0nCNagfFWFCB/SAqVbOFnFg15Lc7IGgLAUChsIkCj8WwEpmfgQs%2BuZmWdiP4D0T%2B5NUEimMv75jCxooFULgCnhshH%2Bz/a/pKFv738aFdCj/tvBSQ/9Bae8h%2BHwHyQ31iMedLcGxwLpIAZmPbPkauw7E2N/0t2e7MIEexDdWJK86wpdRIE4TP2/w4gQ%2BH4W1AiG42D6WQMi5V4tFkwvaUzMMWMCGCpMjEmYt2EMdjSpgzRU9lQDlVkY8i2hEouewNcsOYgxaGIpwEW5a%2BOtXxWU0UEGwuJD4NjvPlBl%2BKIlHUGrsjAbqCDM61XJuhcNbpK0mwAnRpnvJcZSUTMRMhcNJDhC4cJxRHZjr9KfA154QdeL4EoHsUZ8LFnA6qc%2BglwxM8l1Ygpe5xDTFLTwpSipYLhlzVLIwtSv3JCCaV7Cgsu3ZNPNQ6WWKXBrUf6OmUznMcSyagVxSYDiFMSOy%2B5M6oeRyV1lUpnqKZQx30n0TJRlk93s52Ny2L8B6mD%2BehW6SlLyll48Mjb1soPSA%2BKwxWemwb6bLlFOyvCkyImqSUoyhy48lZm5xnKLFzE7KvxCJEEIpRolXzC52filCHl0og0o9TWIvKPAggmCfeU%2BWw1vleuX5WfPZYMVUGuve8gCUhVJkPKhJGFRMIcUtLZlnA08S4wnn9ItlkYbnJ1lBXDkAIAJWppjhz62MXM3XaFaBP8CwqnGIAeFZr1BHyqm2/kjlVg3Y4oqblzwxBvEV6XTosS3hJZTir/LoVXlCqTgTCnmUXF7S1xYQiyUwlUq/AgK57MCuZhCqDlDVI5chRs4nKDUqq6Lkqs8Hz9M0po/1WqhGnYiKOeIyTrwLKhIru8pQJJeSJwJUisZpvb1PWlBJMr5W2QFkUS3ZG6BjAx3MMSX1xb8jEpw4N3pVVuV6r5qdyzwssUPmmqVi5qglVauZE2q/8dqm4o6SdXeD0KLvFEQNM27c4o15HXETFIJF0qelLtZCHfID65KM1ufbNDmpACgqC1bI7BMWq5FlreREHKMfgQEkfyKKay05XysYl4UycYKsfBCuKaroWVOw5pQquDX5DQ1HmE9Q9QUo%2BBjAp88ClhN5VAqr1zMRSsYH2XgqE1D6nvvC0DWK9FV6vS5fxG1VkVZy4VSKpL3/nOqgNbqkDbfHQ0Az4KXq7zhGubBwa0GCGySVIGQ3XKfyd9RPq6n/VKzBRtE0oOutWUq5Qw86gXKmsKYoaeU9GvhGBuUrnr1hQokkRbnYYdk/mY0ExTk2678bR14LcjXtiRihyVa2Sg7musk2IKlOgSqDpyLBQ8iR6JQexZFIaSGjyefUk0UprREqbuZamh8IEsdQyLIJCLHgOuuPI/j9NWQQzZXwSDsBYFOw8zZXylRVq4JMowaVkq3AKjVcFuRWgkBJW8UtNHmnTRqK5ALgWA6i/6M6mUD6iAlOtAvtWjajhAYE8mazbgwIWxjiF8Y0kHVopxqKJQQoUfEg0a3NbLw0oa%2BRZuLDn1Iw74tSV8BQGKgbAlgB4PQFmBNgxwTgq8UT3pgZCYFbIAgFoGgjajWuvWkADOMwALimto%2BTrd6AaRNh1tDY3mHlEbCpCZthQnCc1pSAG0hwyMdbaCUhCLblt%2BIQkE2B4BKjkBn29bb2SZHkjLtC4a7fQG7D3bUckYR7V8Ge1AJXtbAd7Z9o%2B2HawdiqjsoiPhKwTmOv0a7TwBB2hgHt/IyHUtuh3ai4dk277Ujt%2B0s8QZMkq7aqAeA47%2BaokkABDuyBQ6Vtb25QAjuUDtgydLoKTfQlR3yt/t1ak7PNvdjoAIqCKHrUjs23bb2te2tzkdt9g5Q3oZ2kaBdup2A7VQBtB8HjpXDi5xdGGpsPbK6E86kJG6nxoSGDLo7PUmO1UMDp11I7mdIEA3T4CN2fbjdDO0AObsFaW6VFenW3SkGx0O7edTO/HbSRd3PoPdnO9baVV93W6DUAeuncHrN1O6I9bupsA8FN2M7Y9QZP3dRJ%2Bg4SswZwC4ADF10Xh9dEu59JntJ2I6Q9vZOPVTs/XaEDkrsNRXbmsCigMVjxRfO3s73y7utnuvrb5OsFDaRtY26YHDpMQi7HlaikCAAA0VQioS8Gtul31SttqDSEL3pAj97pmg%2BkAMdtygNguhO8jHThLZDWAQIzgZPYzqd0L7lQS%2BpsBWE%2B2oKY9Fu3PfHsnmnRRdKUO/hfrtwrAV9IemXRvq%2BBb6d9%2BwxXXSgfSH7VdJ%2Bm3ThNwBEhru1%2Br3czt/0gR/96e5AbXrN0U60dje0/QuCL1MQLg2u0HSHrQOX6MDKwEnbohwOM7697%2Bgg/AYXBrALsp4FA%2BDrD3oHMDuiT7Q8HoNe68Dgu/3YXuPHnBrU9u8gynu4NUHeDU2ybYIb50BkG9Qupvd3X2Q2B/CHID5MaDFDaBeiyxToI8SEau0/0pfNQM8CyD6BfAgW8QLGHiBXB1MO2y8JGFZ0w6eINfUFS4bcOE62dbASMEDqsx6JM0ZgDTpCB8MgB3D2owI7TuCPtAzACbSXpofUyMhED2LIVKXy31OHkgW%2ByMDwZWCRh0jOLILIxqjpCxGQU8IWcp0r5hj80TEHI/4GgQZ0oqQUNQthsZBCh4gbUEsAMAGUAhFovIxfZeEaNqo8jIAefcMbcMX7rAua8amABkCagFjFk/PX4HGOTH79rhqIzMbmP14ZABAZYz0JSOeoh6eMe9mGCkinh7DoEOfYuE2O8oPwAIHkJmnGMFHPDyLAXeNVeNyHCjIAYo67t0QWT4WYR3UZvo71iiQAbxyE5ceABG60hiRiXvrLkjMdGQq4ejH9G8Bu5eRW%2BtFkkdGPNhmjI6CAN8b/2/G2D/wL3Qxt1T6IAFmaBSBHvLXKAXD%2BJ5IJEed2V73jYKT4xEfa2Rh2TGG2IzdrhNHHgT4Rr4GyYj2CmBDgJnoQicTY%2BzpwMgQCQpxkC7oZA5AAIzIEsDqn0AsgCNPwEdSiAJA6BR4PQHVNEBZA2p/ROQCQggBd0lgMwGODdAVg3QbodsAsDG2LBd03p5gLIDHDqnWgdptAZqe1PkBdTMgdU6ajQEWmtTSp8gHAFgAoAMAOAfAMQDICUBqAdAAcKwA4BoBBAggEQOIEkDSAZAEjMEJSFbl/AYwvIcnAmNWDWEsgiS2WSTgGO4TnE3I3mY6GVqWsCAagQBMgicOqM8x/slrT%2BkFSjowssITSIvgqojnl95MEYGyGVDihaSo%2BQmUeCtiHQ9F005AagOMRCw5zwsVWKBEvASgJQU8f7ckEZDbmfxKAmYA3BcNwgPYHIf3B1gAjTm1Fs5kePOePMbGl9iYPwNeeGSOo7z%2B59TIeYXOrAfjAFzc8oBvMgXUB9ABuGAefOcgUjQjJxKYBam5J91pfZo0xF8Cwhez/Zi%2BMsiICDmt6eYoUOPGVBChNQcIPgAzT1xQAJYPABEO0FH3WBRt42ywFbSHOLwXD1gBi0xdKDUXFGdF4SysD1wIXLAsl3i7mIEvtaeij51CzJDsAGJBLkl3AHxcouLwwDN5iAGJdov0XGLUl283udmA6Wn%2BajHIuCZ6IoWAIL5lwAYn0v5I%2BLWh2cjoYVRsUVgt/QwxuGMPBxTD0tFs/2SB1tR6gyga7XTo6j2GKWIwDTg1V9D4nukVUEGIueXO4BVzl4FIHCGu300maAMc2u9HtkFMIAwO1wA2k6LSlLAJVsQGVbp2VWP1s2Fw8ECBBLmVzIENc0VdavtXMr2VlIIqWUCtEOrWVrqzlbyuqgCrjNaq6UFKuPNyrMQKq2P3muT8IAjVjnc1eHBpGkDmR9wuCZSuZlILYBgo3CFwCTw%2BAF5gGHeftnvEt9bVriAUYBj3WgQT12ridZ%2BNnWLrF544/4EqPVGJO3I%2Bo6QHxOEnWjUDQK3ScOhdGa0vRkpa2aGObGWT/gF61xD/PL6HwCxpY6WdWO2XO9D13AOjYBgLGDjONr/SicOgrAzjIwWoOwZ0DXH59dxpfQ8a0TPGFhR148x9dJNz1zrS5lIBKABirXrhygB4Hp1Rvqgfjz18EwTbetdE8b2%2B06%2BdesCXXpLctrm9QZ5spA%2BbEoX62qlRPonBUWJrI3Zag54nM0YN3wFAHFtvWwM6t//Zre1sGJYtoYC2vnIIJQ3QIDJ3kcyczS9W0bp5889JeRh%2B3CbAdq67V3Kv1XHmvFla1Hcn4PAFTbIOMyqbVManLTOpvU/mdclGnizLRfsOafTvWnAE9CRXoipVP%2BnyAgZ%2B02ndjNhnZAkZkANGcLuATbTDwN0GYDdA8AvTFYRYG6EsBjh6AY4CsO2AEMqmHg6pkMxnYjPkAYzVp%2BM4gATPIA0A8HSwz4AoBUAMyX4EdGg2MCtA3QE2rwECyYimpNx6d8gNU2MDbKZAZp8gG0AoyXhc9Z9nAAhA4A%2BAn7fh/EIUFNS12IFBzD8LIBvtnwVToZvQIYEvuIkcAAD80wMEDOxnlT7ATgFnaECgPTUkAQCWMBh3f3gg4YEMNwANP8BxtgdS8FkGCCtAEgqYfQJGaLOFo9Evp1UxPbPvhmO99iZQMADuzKB27PAMwMDrKAS8DEEAVMyCjzuMBRgW9te8I4MT6mBA/AAu3A8AnF2cAaDRFbabHCLAzAu6HgPQGzRt3Fgw9isP3d3R0OK7Vd4M4w/rsiBG7M9wu/PfgAQAkzK97exmc3ur3Feu9/e2gMPsNIT7%2BgM%2BxfdMBQPb78He%2B4/drvP2EHb90Jx/dpx2gz7v9%2BICWcAddxgH6p0B0YFMAQOEn0Dz%2BNY5zOIP8HyDgwKg8RUYPtRWDnBzRDwfSO%2BAhD4IMQ8DpkOkAFDqh8aekANo6Hqdye3XZkDMPWH7Dzh9w9KBVomg/DwR0kDJADhRHLj5qOM8kdIPZHVp%2BRx2VLvKm/TAZoMzXdDPhmG7TduRzaZAA8Bd0jp2S2OHbD0BO7fd/e2OEeB0Px7Gzqe/M7jOL27HIAPhh4CcdMAkApqRgKQE%2Bf7OVn9Du5108W03g9gooFh2w6Ij9OeHQznKvkCyA9OIXHDswFw%2Bhd8OHn1p1u%2B2DMDD3FgiwIe7unbAum3QuLzsOXYYe12tnFjnZws7oc8ByXmz8x7PaVOATwEPoQkCADHBAA%3D%3D%3D diff --git a/QuickStart.md b/QuickStart.md index 61cd01a..cab61d8 100644 --- a/QuickStart.md +++ b/QuickStart.md @@ -1,5 +1,5 @@ # cppreg: quick start # -Copyright Sendyne Corp., 2010-2018. All rights reserved ([LICENSE](LICENSE)). +Copyright Sendyne Corp., 2010-2019. All rights reserved ([LICENSE](LICENSE)). This document is a brief introduction to `cppreg` and how to use it. For more details about the implementation refers to the [API documentation](API.md). @@ -14,7 +14,8 @@ There are two recommended ways to use `cppreg` in a project: # Include cppreg library. # The second argument is not necessarily required depending on the project setup. # This will import the cppreg target. - # Because cppreg is a header-only library the cppreg target is actually an INTERFACE library target. + # Because cppreg is a header-only library the cppreg target is actually an + # INTERFACE library target. add_subdirectory(/path/to/cppreg ${PROJECT_BINARY_DIR)/cppreg) ... @@ -59,7 +60,7 @@ The RX and TX data registers both contain a single DATA field occupying the whol The goal of `cppreg` is to facilitate the manipulation of such a peripheral. This can be done as follow: ```c++ -#include // use cppreg-all.h instead if you are using the single header. +#include // use cppreg-all.h if you are using the single header. using namespace cppreg; // Peripheral structure. @@ -150,7 +151,7 @@ while (true) { A few remarks: -* the `write` calls for the `Setup` register pass the data as template arguments, while the write call for the `TX` register pass it as a function argument: if the value to be written is known at compile time it is recommended to use the template form; the template form will detect overflow (see below) and will also make it possible to use a faster write implementation in some cases, +* the `write` calls for the `Setup` register pass the data as template arguments, while the write call for the `TX` register pass it as a function argument: if the value to be written is known at compile time it is recommended to use the template form; the template form will detect overflow (see below) and will also make it possible to use a more efficient write implementation in some cases, * `Field`-based types have `is_set` and `is_clear` defined to conveniently query their states. In this example, we can already see how `cppreg` limits the possibility of errors (see the [API documentation](API.md) for more details): diff --git a/README.md b/README.md index eef93df..022f3c2 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ # cppreg # -Copyright Sendyne Corp., 2010-2018. All rights reserved ([LICENSE](LICENSE)). +Copyright Sendyne Corp., 2010-2019. All rights reserved ([LICENSE](LICENSE)). ## Description ## -`cppreg`is a header-only C++11 library to facilitate the manipulation of MMIO registers (*i.e.*, memory-mapped I/O registers) in embedded devices. The idea is to make it possible to write expressive code and minimize the likelihood of ill-defined expressions when dealing with hardware registers on a MCU. The current features are: +`cppreg` is a header-only C++11 library to facilitate the manipulation of MMIO registers (*i.e.*, memory-mapped I/O registers) in embedded devices. The idea is to provide a way to write expressive code and minimize the likelihood of ill-defined expressions when dealing with hardware registers on a MCU. The current features are: * expressive syntax which shows the intent of the code when dealing with registers and fields, -* efficiency and performance on par with traditional C implementations (*e.g.*, CMSIS C code) when *at least some compiler optimizations* are enabled, -* [huge emphasis](Performance.md) on ensuring the assembly is the same if not better than CMSIS versions, -* field access policies (*e.g.*, read-only vs read-write) detect ill-defined access at compile-time, +* efficiency and performance on par with traditional C implementations (*e.g.* CMSIS C code) when *at least some compiler optimizations* are enabled, +* [emphasis](Performance.md) on ensuring the assembly is the same if not better than CMSIS versions, +* field access policies (*e.g.* read-only vs read-write) detect ill-defined access at compile-time, * compile-time detection of overflow, -* easily extendable to support, for example, mock-up. +* register memory can easily be mocked up so that testing is possible. For a short introduction and how-to see the [quick start guide](QuickStart.md). A more complete and detailed documentation is available [here](API.md). -The features provided by `cppreg` come with no overhead or performance penalty compared to traditional low-level C approaches. We give [here](Performance.md) an example comparing the assembly generated by a CMSIS-like implementation versus a `cppreg` one. +The features provided by `cppreg` come with no overhead or performance penalty compared to traditional low-level C approaches. We give [here](Performance.md) an example comparing the assembly generated by a CMSIS-like implementation versus a `cppreg`-based one. ## Requirements ## -`cppreg` is designed to be usable on virtually any hardware that statisfies the following requirements: +`cppreg` is designed to be usable on virtually any hardware that satisfies the following requirements: * MMIO register sizes are integral numbers of bytes (*e.g.*, 8 bits, 16 bits, ...), * registers are properly aligned: a N-bit register is aligned on a N-bit boundary, @@ -41,11 +41,11 @@ while ((MCG->S & MCG_S_PLLST_MASK) == 0) This piece of code is part of the clock setup on a flavor of the K64F MCU. `MCG` is a peripheral and `MCG->C6` and `MCG->S` are registers containing some fields which are required to be set to specific values to properly clock the MCU. Some of the issues with such code are: * the intent of the code is poorly expressed, and it requires at least the MCU data sheet or reference manual to be somewhat deciphered/understood, -* since the offsets and masks are known at compile time, it is error prone and somewhat tedious that the code has to manually implement shifting and masking operations, +* since the offsets and masks are known at compile time, it is error prone and somewhat tedious that the code has to re-implement shifting and masking operations, * the code syntax itself is extremely error prone; for example, forget the `|` in `|=` and you are most likely going to spend some time debugging the code, * there is no safety at all, that is, you might overflow the field, or you might try to write to a read-only field and no one will tell you (not the compiler, not the linker, and at runtime this could fail in various ways with little, if any, indication of where is the error coming from). -This does not have to be this way, and C++11 brings a lot of features and concepts that make it possible to achieve the same goal while clearly expressing the intent and being aware of any ill-formed instructions. Some will argue this will come at the cost of a massive performance hit, but this is actually not always the case (and more often than not, a C++ implementation can be very efficient; see [Ken Smith paper] and the example below). +This does not have to be this way, and C++11 brings a lot of features and concepts that make it possible to achieve the same goal while clearly expressing the intent and being aware of any ill-formed instructions. Some will argue this will come at the cost of a massive performance hit, but this is actually not always the case (and more often than not, a C++ implementation can be very efficient; see [Ken Smith] paper and the example below). This project has been inspired by the following previous works: diff --git a/cppreg.h b/cppreg.h index 759ec50..fbf3058 100644 --- a/cppreg.h +++ b/cppreg.h @@ -2,7 +2,7 @@ /** * @file cppreg.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. */ @@ -10,11 +10,11 @@ #define CPPREG_CPPREG_H +#include "Field.h" #include "Internals.h" #include "MergeWrite.h" #include "Register.h" #include "RegisterPack.h" -#include "Field.h" -#endif // CPPREG_CPPREG_H +#endif // CPPREG_CPPREG_H diff --git a/cppreg_Defines.h b/cppreg_Defines.h index b6d0046..4feccb9 100644 --- a/cppreg_Defines.h +++ b/cppreg_Defines.h @@ -2,7 +2,7 @@ /** * @file cppreg_Defines.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * This header mostly defines data types used across the project. These data * types have been defined with 32-bits address space hardware in mind. It @@ -17,50 +17,49 @@ #include "cppreg_Includes.h" -//! cppreg namespace. namespace cppreg { - //! Type alias for register and field addresses. - /** - * By design this type ensures that any address can be stored. - */ - using Address_t = std::uintptr_t; +//! Type alias for register and field addresses. +/** + * By design this type ensures that any address can be stored. + */ +using Address = std::uintptr_t; - //! Enumeration type for register size in bits. - /** - * This is used to enforce the supported register sizes. - */ - enum class RegBitSize { - b8, //!< 8-bit register. - b16, //!< 16-bit register. - b32, //!< 32-bit register. - b64 //!< 64-bit register. - }; - - - //! Type alias field width. - using FieldWidth_t = std::uint8_t; +//! Enumeration type for register size in bits. +/** + * This is used to enforce the supported register sizes. + */ +enum class RegBitSize : std::uint8_t { + b8, //!< 8-bit register. + b16, //!< 16-bit register. + b32, //!< 32-bit register. + b64 //!< 64-bit register. +}; - //! Type alias for field offset. - using FieldOffset_t = std::uint8_t; +//! Type alias field width. +using FieldWidth = std::uint8_t; - //! Shorthand for max value as a mask. - /** - * @tparam T Data type. - * - * This is used to define register masks. - */ - template - struct type_mask { - constexpr static const T value = std::numeric_limits::max(); - }; +//! Type alias for field offset. +using FieldOffset = std::uint8_t; -} +//! Shorthand for max value as a mask. +/** + * @tparam T Data type. + * + * This is used to define register masks. + */ +template +struct type_mask { + constexpr static const T value = std::numeric_limits::max(); +}; -#endif // CPPREG_CPPREG_DEFINES_H +} // namespace cppreg + + +#endif // CPPREG_CPPREG_DEFINES_H diff --git a/cppreg_Includes.h b/cppreg_Includes.h index 541217c..494b23c 100644 --- a/cppreg_Includes.h +++ b/cppreg_Includes.h @@ -2,7 +2,7 @@ /** * @file cppreg_Defines.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. */ @@ -15,4 +15,4 @@ #include -#endif // CPPREG_CPPREG_INCLUDES_H +#endif // CPPREG_CPPREG_INCLUDES_H diff --git a/policies/AccessPolicy.h b/policies/AccessPolicy.h index 898c400..4cabdbb 100644 --- a/policies/AccessPolicy.h +++ b/policies/AccessPolicy.h @@ -2,7 +2,7 @@ /** * @file AccessPolicy.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * Access policies are used to describe if register fields are read-write, * read-only or write-only. @@ -14,7 +14,7 @@ * the register proper masking and shifting is required. The switch between * trivial and non-trivial implementations is done automatically. * - The write implementation also distinguishes between writing constant - * values (i.e., known at compile time) and non-constant value. This was + * values (i.e., known at compile time) and non-constant value. This is * intended to make it possible to simplify operations at compile time and * minimize overhead. */ @@ -27,318 +27,288 @@ #include "cppreg_Defines.h" -//! cppreg namespace. namespace cppreg { - //! Register read implementation. +//!@{ Trivial register read/write detector. + +//! Boolean flag to detect trivial read/write. +/** + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + */ +template +struct is_trivial_rw + : std::integral_constant::value) + && (offset == FieldOffset{0})> {}; + +//! Trivial read/write enable_if helper. +/** + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + * @tparam U Enabled type if trivial. + */ +template +using is_trivial = + typename std::enable_if::value, U>::type; + +//! Non-trivial read/write enable_if helper. +/** + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + * @tparam U Enabled type if non-trivial. + */ +template +using is_not_trivial = + typename std::enable_if::value, U>::type; + +//!@} + + +//! Register read implementation. +/** + * @tparam MMIO Memory device type. + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + */ +template +struct RegisterRead { + + //! Non-trivial read implementation. /** - * @tparam MMIO_t Memory device type. - * @tparam T Register data type. - * @tparam mask Mask for the read operation. - * @tparam offset Offset for the read operation. - * - * The mask and offset are used to define a specific field within the - * register. + * @param mmio_device Pointer to the register memory device. + * @return The content of the register field. */ - template - struct RegisterRead { + template + static T read(const MMIO& mmio_device, + is_not_trivial* = nullptr) noexcept { + return static_cast((mmio_device & mask) >> offset); + } - //! Boolean flag for trivial implementation. - /** - * The trivial corresponds to reading the whole register, that is, - * the mask is identity and the offset is zero. - */ - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - - //! Non-trivial read implementation. - /** - * @param mmio_device Pointer to the register memory device. - * @return The content of the register field. - */ - template - static T read( - const MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - return static_cast((mmio_device & mask) >> offset); - }; - - //! Trivial read implementation. - /** - * @param mmio_device Pointer to the register memory device. - * @return The content of the register field. - */ - template - static T read( - const MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - return static_cast(mmio_device); - }; - - }; - - - //! Register write implementation. + //! Trivial read implementation. /** - * @tparam MMIO_t Memory device type. - * @tparam T Register data type. - * @tparam mask Mask for the read operation. - * @tparam offset Offset for the read operation. - * - * The mask and offset are used to define a specific field within the - * register. - * - * This write implementation is used only when the value to be written is - * not a constant expression. + * @param mmio_device Pointer to the register memory device. + * @return The content of the register field. */ - template - struct RegisterWrite { - - //! Boolean flag for trivial implementation. - /** - * The trivial corresponds to writing to the whole register, that is, - * the mask is identity and the offset is zero. - */ - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - - //! Non-trivial write implementation. - /** - * @param mmio_device Pointer to the register memory device. - * @param value Value to be written to the register field. - */ - template - static void write( - MMIO_t& mmio_device, - T value, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = static_cast( - (mmio_device & ~mask) | ((value << offset) & mask) - ); - }; - - //! Trivial write implementation. - /** - * @param mmio_device Pointer to the register memory device. - * @param value Value to be written to the register field. - */ - template - static void write( - MMIO_t& mmio_device, - T value, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = value; - }; - - }; + template + static T read(const MMIO& mmio_device, + is_trivial* = nullptr) noexcept { + return static_cast(mmio_device); + } +}; - //! Register write constant implementation. +//! Register write implementation. +/** + * @tparam MMIO Memory device type. + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + */ +template +struct RegisterWrite { + + //! Non-trivial write implementation. /** - * @tparam MMIO_t Memory device type. - * @tparam T Register data type. - * @tparam mask Mask for the read operation. - * @tparam offset Offset for the read operation. - * @tparam value Value to be written to the register field. - * - * The mask and offset are used to define a specific field within the - * register. - * - * This write implementation is used only when the value to be written is - * a constant expression. + * @param mmio_device Pointer to the register memory device. + * @param value Value to be written to the register field. */ - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - struct RegisterWriteConstant { + template + static void write(MMIO& mmio_device, + T value, + is_not_trivial* = nullptr) noexcept { + mmio_device = + static_cast((mmio_device & ~mask) | ((value << offset) & mask)); + } - //! Boolean flag for trivial implementation. - /** - * The trivial corresponds to writing to the whole register, that is, - * the mask is identity and the offset is zero. - */ - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - - //! Non-trivial write implementation. - /** - * @param mmio_device Pointer to the register memory device. - */ - template - static void write( - MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = static_cast( - (mmio_device & ~mask) | ((value << offset) & mask) - ); - }; - - //! Trivial write implementation. - /** - * @param mmio_device Pointer to the register memory device. - */ - template - static void write( - MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = value; - }; - - }; + //! Trivial write implementation. + /** + * @param mmio_device Pointer to the register memory device. + * @param value Value to be written to the register field. + */ + template + static void write(MMIO& mmio_device, + T value, + is_trivial* = nullptr) noexcept { + mmio_device = value; + } +}; - //! Read-only access policy. - struct read_only { +//! Register write constant implementation. +/** + * @tparam MMIO Memory device type. + * @tparam T Register data type. + * @tparam mask Mask for the read operation. + * @tparam offset Offset for the read operation. + * @tparam value Value to be written to the register field. + */ +template +struct RegisterWriteConstant { - //! Read access implementation. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @tparam offset Field offset. - * @param mmio_device Pointer to register mapped memory. - * @return The value at the field location. - */ - template - static T read(const MMIO_t& mmio_device) noexcept { - return RegisterRead::read(mmio_device); - }; + //! Non-trivial write implementation. + /** + * @param mmio_device Pointer to the register memory device. + */ + template + static void write(MMIO& mmio_device, + is_not_trivial* = nullptr) noexcept { + mmio_device = + static_cast((mmio_device & ~mask) | ((value << offset) & mask)); + } - }; + //! Trivial write implementation. + /** + * @param mmio_device Pointer to the register memory device. + */ + template + static void write(MMIO& mmio_device, + is_trivial* = nullptr) noexcept { + mmio_device = value; + } +}; - //! Read-write access policy. - struct read_write : read_only { +//! Read-only access policy. +struct read_only { - //! Write access implementation. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @tparam offset Field offset. - * @param mmio_device Pointer to register mapped memory. - * @param value Value to be written at the field location. - */ - template - static void write(MMIO_t& mmio_device, - const T value) noexcept { - RegisterWrite::write(mmio_device, value); - }; - - //! Write access implementation for constant value. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @tparam offset Field offset. - * @tparam value Value to be written at the field location. - * @param mmio_device Pointer to register mapped memory. - */ - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - static void write(MMIO_t& mmio_device) noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - - //! Set field implementation. - /** - * @tparam T Field data type. - * @tparam mask Field mask. - * @param mmio_device Pointer to register mapped memory. - */ - template - static void set(MMIO_t& mmio_device) - noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - - //! Clear field implementation. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @param mmio_device Pointer to register mapped memory. - */ - template - static void clear(MMIO_t& mmio_device) - noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - - //! Toggle field implementation. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @param mmio_device Pointer to register mapped memory. - */ - template - static void toggle(MMIO_t& mmio_device) - noexcept { - mmio_device = static_cast((mmio_device) ^ mask); - }; - - }; + //! Read access implementation. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @tparam offset Field offset. + * @param mmio_device Pointer to register mapped memory. + * @return The value at the field location. + */ + template + static T read(const MMIO& mmio_device) noexcept { + return RegisterRead::read(mmio_device); + } +}; - //! Write-only access policy. - struct write_only { +//! Read-write access policy. +struct read_write : read_only { - //! Write access implementation. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @tparam offset Field offset - * @param mmio_device Pointer to register mapped memory. - * @param value Value to be written at the field location. - */ - template - static void write(MMIO_t& mmio_device, const T value) noexcept { + //! Write access implementation. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @tparam offset Field offset. + * @param mmio_device Pointer to register mapped memory. + * @param value Value to be written at the field location. + */ + template + static void write(MMIO& mmio_device, const T value) noexcept { + RegisterWrite::write(mmio_device, value); + } - // For write-only fields we can only write to the whole register. - RegisterWrite::value, 0u>::write( - mmio_device, ((value << offset) & mask) - ); - }; + //! Write access implementation for constant value. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @tparam offset Field offset. + * @tparam value Value to be written at the field location. + * @param mmio_device Pointer to register mapped memory. + */ + template + static void write(MMIO& mmio_device) noexcept { + RegisterWriteConstant::write(mmio_device); + } - //! Write access implementation for constant value. - /** - * @tparam MMIO_t Register memory device type. - * @tparam T Field data type. - * @tparam mask Field mask. - * @tparam offset Field offset - * @tparam value Value to be written at the field location. - * @param mmio_device Pointer to register mapped memory. - */ - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - static void write(MMIO_t& mmio_device) noexcept { + //! Set field implementation. + /** + * @tparam T Field data type. + * @tparam mask Field mask. + * @param mmio_device Pointer to register mapped memory. + */ + template + static void set(MMIO& mmio_device) noexcept { + RegisterWriteConstant::write( + mmio_device); + } - // For write-only fields we can only write to the whole register. - RegisterWriteConstant< - MMIO_t, T, type_mask::value, 0u, ((value << offset) & mask) - > - ::write(mmio_device); + //! Clear field implementation. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @param mmio_device Pointer to register mapped memory. + */ + template + static void clear(MMIO& mmio_device) noexcept { + RegisterWriteConstant(~mask)>::write(mmio_device); + } - }; - - }; + //! Toggle field implementation. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @param mmio_device Pointer to register mapped memory. + */ + template + static void toggle(MMIO& mmio_device) noexcept { + mmio_device = static_cast((mmio_device) ^ mask); + } +}; -} +//! Write-only access policy. +struct write_only { + + //! Write access implementation. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @tparam offset Field offset + * @param mmio_device Pointer to register mapped memory. + * @param value Value to be written at the field location. + */ + template + static void write(MMIO& mmio_device, const T value) noexcept { + + // For write-only fields we can only write to the whole register. + RegisterWrite::value, FieldOffset{0}>::write( + mmio_device, ((value << offset) & mask)); + } + + //! Write access implementation for constant value. + /** + * @tparam MMIO Register memory device type. + * @tparam T Field data type. + * @tparam mask Field mask. + * @tparam offset Field offset + * @tparam value Value to be written at the field location. + * @param mmio_device Pointer to register mapped memory. + */ + template + static void write(MMIO& mmio_device) noexcept { + + // For write-only fields we can only write to the whole register. + RegisterWriteConstant::value, + FieldOffset{0}, + ((value << offset) & mask)>::write(mmio_device); + } +}; -#endif // CPPREG_ACCESSPOLICY_H +} // namespace cppreg + + +#endif // CPPREG_ACCESSPOLICY_H diff --git a/register/Field.h b/register/Field.h index 8a318be..76e8849 100644 --- a/register/Field.h +++ b/register/Field.h @@ -2,11 +2,11 @@ /** * @file Field.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * This header provides the definitions related to register field - * implementation. - * Strictly speaking a field is defined as a region of a register. + * implementation. Strictly speaking a field is defined as a region of a + * register. */ @@ -14,225 +14,195 @@ #define CPPREG_REGISTERFIELD_H -#include "Register.h" -#include "Mask.h" #include "AccessPolicy.h" -#include "ShadowValue.h" +#include "Internals.h" +#include "Mask.h" -//! cppreg namespace. namespace cppreg { - //! Register field implementation. + +//! Register field implementation. +/** + * @tparam BaseRegister Parent register. + * @tparam width Field width. + * @tparam offset Field offset. + * @tparam P Access policy type. + * + * This data structure provides static methods to deal with field access + * (read, write, set, clear, and toggle). These methods availability depends + * on the access policy (e.g., a read-only field does not implement a + * write method). + * In practice, fields are implemented by deriving from this class to + * create custom types. + */ +template +struct Field { + + //! Parent register for the field. + using parent_register = BaseRegister; + + //! Field data type derived from register data type. + using type = typename parent_register::type; + + //! MMIO type. + using MMIO = typename parent_register::MMIO; + + //! Field policy. + using policy = AccessPolicy; + + //! Field width. + constexpr static auto width = field_width; + + //! Field offset. + constexpr static auto offset = field_offset; + + //! Field mask. + constexpr static auto mask = make_shifted_mask(width, offset); + + //!@{ Helpers for write method selection based on shadow value. + template + using if_no_shadow = + typename std::enable_if::type; + template + using if_shadow = + typename std::enable_if::type; + //!@} + + //!@ Field read method. /** - * @tparam BaseRegister Parent register. - * @tparam width Field width. - * @tparam offset Field offset. - * @tparam P Access policy type. - * - * This data structure provides static methods to deal with field access - * (read, write, set, clear, and toggle). These methods availability depends - * on the access policy (e.g., a read-only field does not implement a - * write method). - * In practice, fields are implemented by deriving from this class to - * create custom types. + * @return Field value. */ - template < - typename BaseRegister, - FieldWidth_t field_width, - FieldOffset_t field_offset, - typename AccessPolicy - > - struct Field { + static type read() noexcept { + return policy::template read( + parent_register::ro_mem_device()); + } - //! Parent register for the field. - using parent_register = BaseRegister; + //! Field write value method (no shadow value). + /** + * @param value Value to be written to the field. + */ + template + static void write(const if_no_shadow value) noexcept { + policy::template write( + parent_register::rw_mem_device(), value); + } - //! Field data type derived from register data type. - using type = typename parent_register::type; + //! Field write value method (w/ shadow value). + /** + * @param value Value to be written to the field. + */ + template + static void write(const if_shadow value) noexcept { - //! MMIO type. - using MMIO_t = typename parent_register::MMIO_t; + // Update shadow value. + RegisterWrite::write( + parent_register::shadow::shadow_value, value); - //! Field policy. - using policy = AccessPolicy; - - //! Field width. - constexpr static const FieldWidth_t width = field_width; - - //! Field offset. - constexpr static const FieldOffset_t offset = field_offset; - - //! Field mask. - constexpr static const type mask = make_shifted_mask(width, - offset); - - //! Boolean flag indicating if a shadow value is used. - constexpr static const bool has_shadow = - parent_register::shadow::value; - - //! Customized overflow check implementation for Field types. - /** - * @tparam value Value to be checked for overflow. - * @return `true` if no overflow, `false` otherwise. - * - * This is only used for the template form of the write method. - */ - template - struct check_overflow : internals::check_overflow< - type, - value, - (mask >> offset) - > {}; - - //!@ Field read method. - /** - * @return Field value. - */ - static type read() noexcept { - return policy::template read( - parent_register::ro_mem_device() - ); - }; - - //! Field write method (no shadow value). - /** - * @param value Value to be written to the field. - */ - template - static void - write(const typename std::enable_if::type value) - noexcept { - policy::template write( + // Write as a block to the register, that is, we do not use the + // field mask and field offset. + policy:: + template write::value, FieldOffset{0}>( parent_register::rw_mem_device(), - value - ); - }; + parent_register::shadow::shadow_value); + } - //! Field write method (w/ shadow value). - /** - * @param value Value to be written to the field. - */ - template - static void - write(const typename std::enable_if::type value) - noexcept { + //! Field write constant method (no shadow value). + /** + * @tparam value Constant to be written to the field + * + * This method performs a compile-time check to avoid overflowing the + * field and uses the constant write implementation. + */ + template + static void write(if_no_shadow* = nullptr) noexcept { + policy::template write( + parent_register::rw_mem_device()); - // Update shadow value. - // This assumes that reading a write-only fields return some value. - RegisterWrite - ::write(parent_register::shadow::shadow_value, value); + // Check for overflow. + static_assert( + internals::check_overflow> offset)>::value, + "Field::write: value too large for the field"); + } - // Write as a block to the register, that is, we do not use the - // mask and offset. - policy::template write::value, 0u>( - parent_register::rw_mem_device(), - parent_register::shadow::shadow_value - ); + //! Field write constant method (w/ shadow value). + /** + * @tparam value Constant to be written to the field + * + * This method performs a compile-time check to avoid overflowing the + * field and uses the constant write implementation. + */ + template + static void write(if_shadow* = nullptr) noexcept { + // For this one we simply forward to the non-constant + // implementation because the shadow value needs to be updated. + write(value); - }; + // Check for overflow. + static_assert( + internals::check_overflow> offset)>::value, + "Field::write: value too large for the field"); + } - //! Field write method with overflow check (no shadow value). - /** - * @tparam value Value to be written to the field - * - * This method performs a compile-time check to avoid overflowing the - * field and uses the constant write implementation. - */ - template - static void write( - typename std::enable_if< - !has_shadow - && - check_overflow::value, - T - >::type* = nullptr - ) noexcept { - policy::template write( - parent_register::rw_mem_device() - ); - }; + //! Field set method. + /** + * This method will set all bits in the field. + */ + static void set() noexcept { + policy::template set( + parent_register::rw_mem_device()); + } - //! Field write method with overflow check (w/ shadow value). - /** - * @tparam value Value to be written to the field - * - * This method performs a compile-time check to avoid overflowing the - * field and uses the constant write implementation. - */ - template - static void write( - typename std::enable_if< - has_shadow - && - check_overflow::value, - T - >::type* = nullptr - ) noexcept { + //! Field clear method. + /** + * This method will clear all bits in the field. + */ + static void clear() noexcept { + policy::template clear( + parent_register::rw_mem_device()); + } - // For this particular we simply forward to the non-constant - // implementation because the shadow value needs to be updated. - write(value); + //! Field toggle method. + /** + * This method will toggle all bits in the field. + */ + static void toggle() noexcept { + policy::template toggle( + parent_register::rw_mem_device()); + } - }; + //! Is field set bool method. + /** + * @return `true` if all the bits are set to 1, `false` otherwise. + */ + static bool is_set() noexcept { + return (Field::read() == (mask >> offset)); + } - //! Field set method. - /** - * This method will set all bits in the field. - */ - static void set() noexcept { - policy::template - set(parent_register::rw_mem_device()); - }; + //! Is field clear bool method. + /** + * @return `true` if all the bits are set to 0, `false` otherwise. + */ + static bool is_clear() noexcept { + return (Field::read() == type{0}); + } - //! Field clear method. - /** - * This method will clear all bits in the field. - */ - static void clear() noexcept { - policy::template - clear(parent_register::rw_mem_device()); - }; - - //! Field toggle method. - /** - * This method will toggle all bits in the field. - */ - static void toggle() noexcept { - policy::template - toggle(parent_register::rw_mem_device()); - }; - - //! Is field set bool method. - /** - * @return `true` if all the bits are set to 1, `false` otherwise. - */ - static bool is_set() noexcept { - return (Field::read() == (mask >> offset)); - }; - - //! Is field clear bool method. - /** - * @return `true` if all the bits are set to 0, `false` otherwise. - */ - static bool is_clear() noexcept { - return (Field::read() == 0u); - }; - - // Consistency checking. - // The width of the field cannot exceed the register size and the - // width added to the offset cannot exceed the register size. - static_assert(parent_register::size >= width, - "field width is larger than parent register size"); - static_assert(parent_register::size >= width + offset, - "offset + width is larger than parent register size"); - static_assert(width != 0u, - "defining a Field type of width 0u is not allowed"); - - }; + // Consistency checking. + // The width of the field cannot exceed the register size and the + // width added to the offset cannot exceed the register size. + static_assert(parent_register::size >= width, + "Field:: field width is larger than parent register size"); + static_assert(parent_register::size >= width + offset, + "Field:: offset + width is larger than parent register size"); + static_assert(width != FieldWidth{0}, + "Field:: defining a Field type of zero width is not allowed"); +}; -} +} // namespace cppreg -#endif // CPPREG_REGISTERFIELD_H +#endif // CPPREG_REGISTERFIELD_H diff --git a/register/Internals.h b/register/Internals.h index e80f7f0..c8d5fe2 100644 --- a/register/Internals.h +++ b/register/Internals.h @@ -2,101 +2,52 @@ /** * @file Internals.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * This header collects various implementations which are required for cppreg * implementation but not intended to be fully exposed to the user. */ -#include "cppreg_Defines.h" -#include "Traits.h" - - #ifndef CPPREG_INTERNALS_H #define CPPREG_INTERNALS_H -//! cppreg::internals namespace. +#include "Traits.h" + + namespace cppreg { namespace internals { - //! Overflow check implementation. - /** - * @tparam T Data type. - * @tparam value Value to check. - * @tparam limit Overflow limit value. - * - * This structure defines a type result set to std::true_type if there is - * no overflow and set to std::false_type if there is overflow. - * There is overflow if value if strictly larger than limit. - */ - template < - typename T, - T value, - T limit - > - struct check_overflow : std::integral_constant {}; +//! Overflow check implementation. +/** + * @tparam T Data type. + * @tparam value Value to check. + * @tparam limit Overflow limit value. + * + * This structure defines a type result set to std::true_type if there is + * no overflow and set to std::false_type if there is overflow. + * There is overflow if value if strictly larger than limit. + */ +template +struct check_overflow : std::integral_constant {}; - //! is_aligned implementation. - /** - * @tparam address Address to be checked for alignment. - * @tparam alignment Alignment boundary in bytes. - * - * This will only derived from std::true_type if the address is aligned. - */ - template - struct is_aligned : std::integral_constant< - bool, - (address & (alignment - 1)) == 0 - > { - }; +//! is_aligned implementation. +/** + * @tparam address Address to be checked for alignment. + * @tparam alignment Alignment boundary in bytes. + * + * This will only derived from std::true_type if the address is aligned. + */ +template

+struct is_aligned + : std::integral_constant {}; - //! Memory map implementation for packed registers. - /** - * @tparam address Memory region base address. - * @tparam n Memory size in bytes. - * @tparam reg_size Register bit size enum value. - * - * This structure is used to map an array structure onto a memory region. - * The size of the array elements is defined by the register size. - */ - template - struct memory_map { - - //! Array type. - using mem_array_t = std::array< - volatile typename TypeTraits::type, - n / sizeof(typename TypeTraits::type) - >; - - //! Static reference to memory array. - static mem_array_t& array; - - // Alignment check. - static_assert( - is_aligned::byte_size>::value, - "memory_map: base address is mis-aligned for register type" - ); - - }; - - //! Memory array reference definition. - template - typename memory_map::mem_array_t& - memory_map::array = *( - reinterpret_cast - ::mem_array_t*>( - address - ) - ); +} // namespace internals +} // namespace cppreg -} -} - - -#endif // CPPREG_INTERNALS_H +#endif // CPPREG_INTERNALS_H diff --git a/register/Mask.h b/register/Mask.h index 36dd140..40d9a66 100644 --- a/register/Mask.h +++ b/register/Mask.h @@ -2,7 +2,7 @@ /** * @file Mask.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * The implementation is designed to compute masks prior to runtime by * relying on constexpr function. This will work as intended if the function @@ -17,42 +17,38 @@ #include "cppreg_Defines.h" -//! cppreg namespace. namespace cppreg { - //! Mask constexpr function. - /** - * @tparam Mask_t Mask data type (will be derived from register). - * @param width Mask width. - * @return The mask value. - */ - template - constexpr Mask_t make_mask(const FieldWidth_t width) noexcept { - return width == 0 ? - 0u - : - static_cast( - (make_mask(FieldWidth_t(width - 1)) << 1) | 1 - ); - }; - - - //! Shifted mask constexpr function. - /** - * @tparam Mask_t Mask data type (will be derived from register). - * @param width Mask width. - * @param offset Mask offset. - * @return The mask value. - */ - template - constexpr Mask_t make_shifted_mask(const FieldWidth_t width, - const FieldOffset_t offset) noexcept { - return static_cast(make_mask(width) << offset); - }; - - +//! Mask constexpr function. +/** + * @tparam Mask Mask data type (will be derived from register). + * @param width Mask width. + * @return The mask value. + */ +template +constexpr Mask make_mask(const FieldWidth width) noexcept { + return width == 0 ? static_cast(0u) + : static_cast( + (make_mask(FieldWidth(width - 1)) << 1) | 1); } -#endif // CPPREG_MASK_H +//! Shifted mask constexpr function. +/** + * @tparam Mask Mask data type (will be derived from register). + * @param width Mask width. + * @param offset Mask offset. + * @return The mask value. + */ +template +constexpr Mask make_shifted_mask(const FieldWidth width, + const FieldOffset offset) noexcept { + return static_cast(make_mask(width) << offset); +} + + +} // namespace cppreg + + +#endif // CPPREG_MASK_H diff --git a/register/Memory.h b/register/Memory.h new file mode 100644 index 0000000..9a13bf0 --- /dev/null +++ b/register/Memory.h @@ -0,0 +1,106 @@ +//! 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 diff --git a/register/MergeWrite.h b/register/MergeWrite.h index 7ee95f9..5ac1077 100644 --- a/register/MergeWrite.h +++ b/register/MergeWrite.h @@ -2,7 +2,7 @@ /** * @file MergeWrite.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * The "merge write" implementation is designed to make it possible to merge * write operations on different fields into a single one. @@ -18,250 +18,213 @@ #define CPPREG_MERGEWRITE_H -#include "Internals.h" #include "AccessPolicy.h" -#include +#include "Internals.h" -//! cppreg namespace. namespace cppreg { - //! Merge write constant implementation. +//! Merge write constant implementation. +/** + * @tparam Register Register on which the merged write will be performed. + * @tparam mask Initial mask. + * @tparam offset Initial offset. + * @tparam value Initial value. + * + * The initial data will come from the field on which the merge write + * will be initiated. + * + * This implementation is designed for operations in which all data is + * available at compile time. This makes it possible to leverage a + * template implementation and simplify most of the operations (based on + * the access polict implementation that detects trivial operations). In + * addition, this will also perform overflow checking. + */ +template +class MergeWrite_tmpl { + +private: + // Type alias to register base type. + using base_type = typename Register::type; + + // Accumulated value. + constexpr static auto _accumulated_value = + base_type{(value << offset) & mask}; + + // Combined mask. + constexpr static auto _combined_mask = mask; + + // Type helper. + template + using propagated = + MergeWrite_tmpl; + + // Default constructor. + MergeWrite_tmpl() = default; + + // Disabled for shadow value register. + static_assert(!Register::shadow::value, + "merge write is not available for shadow value register"); + +public: + //! Instantiation method. + static MergeWrite_tmpl create() noexcept { + return {}; + } + + //!@{ Non-copyable and non-moveable. + MergeWrite_tmpl(const MergeWrite_tmpl&) = delete; + MergeWrite_tmpl& operator=(const MergeWrite_tmpl&) = delete; + MergeWrite_tmpl& operator=(MergeWrite_tmpl&&) = delete; + MergeWrite_tmpl operator=(MergeWrite_tmpl) = delete; + MergeWrite_tmpl(MergeWrite_tmpl&&) = delete; + //!@} + + //! Closure method. /** - * @tparam Register Register on which the merged write will be performed. - * @tparam mask Initial mask. - * @tparam offset Initial offset. - * @tparam value Initial value. - * - * The initial data will come from the field on which the merge write - * will be initiated. - * - * This implementation is designed for operations in which all data is - * available at compile time. This makes it possible to leverage a - * template implementation and simplify most of the operations (based on - * the access policies implementation that detects trivial operations). In - * addition, this will also perform overflow checking. + * This is where the write happens. */ - template < - typename Register, - typename Register::type mask, - FieldOffset_t offset, - typename Register::type value - > class MergeWrite_tmpl { + void done() const&& noexcept { + // Get memory pointer. + typename Register::MMIO& mmio_device = Register::rw_mem_device(); - private: + // Write to the whole register using the current accumulated value + // and combined mask. + // No offset needed because we write to the whole register. + RegisterWriteConstant::write(mmio_device); + } - // Type alias to register base type. - using base_type = typename Register::type; - - // Disabled for shadow value register. - static_assert(!Register::shadow::value, - "merge write is not available for shadow value register"); - - // Accumulated value. - constexpr static const base_type _accumulated_value = - ((value << offset) & mask); - - // Combined mask. - constexpr static const base_type _combined_mask = mask; - - // Default constructor. - MergeWrite_tmpl() = default; - - - public: - - //! Instantiation method. - static MergeWrite_tmpl make() noexcept { return {}; }; - - //!@{ Non-copyable and non-moveable. - MergeWrite_tmpl(const MergeWrite_tmpl&) = delete; - MergeWrite_tmpl& operator=(const MergeWrite_tmpl&) = delete; - MergeWrite_tmpl& operator=(MergeWrite_tmpl&&) = delete; - MergeWrite_tmpl operator=(MergeWrite_tmpl) = delete; - MergeWrite_tmpl(MergeWrite_tmpl&&) = delete; - //!@} - - //! Closure method. - /** - * This is where the write happens. - */ - void done() const && noexcept { - - // Get memory pointer. - typename Register::MMIO_t& mmio_device = - Register::rw_mem_device(); - - // Write to the whole register using the current accumulated value - // and combined mask. - // No offset needed because we write to the whole register. - RegisterWriteConstant< - typename Register::MMIO_t, - typename Register::type, - _combined_mask, - 0u, - _accumulated_value - >::write(mmio_device); - - }; - - //! With method for constant value. - /** - * @tparam F Field to be written - * @tparam new_value Value to write to the field. - * @return A new instance for chaining other write operations. - */ - template < - typename F, - base_type new_value, - typename T = MergeWrite_tmpl< - Register, - (_combined_mask | F::mask), - 0u, - (_accumulated_value & ~F::mask) | ((new_value << F::offset) & - F::mask) - > - > - typename std::enable_if< - (internals::check_overflow< - typename Register::type, new_value, (F::mask >> F::offset) - >::value), - T - >::type&& - with() const && noexcept { - - // Check that the field belongs to the register. - static_assert(std::is_same< - typename F::parent_register, - Register - >::value, - "field is not from the same register in merge_write"); - - return std::move(T::make()); - - }; - - - }; - - - //! Merge write implementation. + //! With method for constant value. /** - * @tparam Register Register on which the merged write will be performed. - * @tparam mask Initial mask. - * - * The initial mask will come from the field on which the merge write - * will be initiated. + * @tparam F Field to be written + * @tparam new_value Value to write to the field. + * @return A merge write instance with accumulated data. */ - template < - typename Register, - typename Register::type mask - > - class MergeWrite { + template + propagated&& with() const&& noexcept { + + // Check that the field belongs to the register. + static_assert( + std::is_same::value, + "MergeWrite_tmpl:: field is not from the same register"); + + // Check that there is no overflow. + constexpr auto no_overflow = + internals::check_overflow> F::offset)>::value; + static_assert(no_overflow, + "MergeWrite_tmpl:: field overflow in with() call"); + + return std::move(propagated{}); + } +}; - public: +//! Merge write implementation. +/** + * @tparam Register Register on which the merged write will be performed. + * @tparam mask Initial mask. + * + * The initial mask will come from the field on which the merge write + * will be initiated. + */ +template +class MergeWrite { - //! Type alias to register base type. - using base_type = typename Register::type; +private: + // Type alias to register base type. + using base_type = typename Register::type; + + // Accumulated value. + base_type _accumulated_value; + + // Combined mask. + constexpr static auto _combined_mask = mask; + + // Type helper. + template + using propagated = MergeWrite; + + // Private default constructor. + constexpr MergeWrite() : _accumulated_value{0} {}; + constexpr explicit MergeWrite(const base_type v) : _accumulated_value{v} {}; + + // Disabled for shadow value register. + static_assert(!Register::shadow::value, + "merge write is not available for shadow value register"); + +public: + //! Static instantiation method. + constexpr static MergeWrite create(const base_type value) noexcept { + return MergeWrite(value); + } + + //!@ Move constructor. + MergeWrite(MergeWrite&& mw) noexcept + : _accumulated_value{mw._accumulated_value} {}; + + //!@{ Non-copyable. + MergeWrite(const MergeWrite&) = delete; + MergeWrite& operator=(const MergeWrite&) = delete; + MergeWrite& operator=(MergeWrite&&) = delete; + //!@} + + //! Closure method. + /** + * This is where the write happens. + */ + void done() const&& noexcept { + + // Get memory pointer. + typename Register::MMIO& mmio_device = Register::rw_mem_device(); + + // Write to the whole register using the current accumulated value + // and combined mask. + // No offset needed because we write to the whole register. + RegisterWrite::write(mmio_device, _accumulated_value); + } + + //! With method. + /** + * @tparam F Field type describing where to write in the register. + * @param value Value to write to the register. + * @return A merge write instance with accumulated data. + */ + template + propagated with(const base_type value) const&& noexcept { + + // Check that the field belongs to the register. + static_assert( + std::is_same::value, + "field is not from the same register in merge_write"); + + // Update accumulated value. + const auto new_value = static_cast( + (_accumulated_value & ~F::mask) | ((value << F::offset) & F::mask)); + + return std::move(propagated::create(new_value)); + } +}; - private: - - // Combined mask. - constexpr static const base_type _combined_mask = mask; +} // namespace cppreg - public: - - //! Static instantiation method. - constexpr static MergeWrite make(const base_type value) noexcept { - return MergeWrite(value); - }; - - //!@ Move constructor. - MergeWrite(MergeWrite&& mw) noexcept - : _accumulated_value(mw._accumulated_value) {}; - - //!@{ Non-copyable. - MergeWrite(const MergeWrite&) = delete; - MergeWrite& operator=(const MergeWrite&) = delete; - MergeWrite& operator=(MergeWrite&&) = delete; - //!@} - - //! Closure method. - /** - * This is where the write happens. - */ - void done() const && noexcept { - - // Get memory pointer. - typename Register::MMIO_t& mmio_device = - Register::rw_mem_device(); - - // Write to the whole register using the current accumulated value - // and combined mask. - // No offset needed because we write to the whole register. - RegisterWrite< - typename Register::MMIO_t, - base_type, - _combined_mask, - 0u - >::write(mmio_device, _accumulated_value); - - }; - - //! With method. - /** - * @tparam F Field type describing where to write in the register. - * @param value Value to write to the register. - * @return A reference to the current merge write data. - */ - template - MergeWrite - with(const base_type value) && noexcept { - - // Check that the field belongs to the register. - static_assert(std::is_same< - typename F::parent_register, - Register - >::value, - "field is not from the same register in merge_write"); - - // Update accumulated value. - _accumulated_value = (_accumulated_value & ~F::mask) - | ((value << F::offset) & F::mask); - - return - std::move( - MergeWrite - ::make(_accumulated_value) - ); - - }; - - - private: - - // Disabled for shadow value register. - static_assert(!Register::shadow::value, - "merge write is not available for shadow value register"); - - // Private default constructor. - constexpr MergeWrite() : _accumulated_value(0u) {}; - constexpr explicit MergeWrite(const base_type v) : - _accumulated_value(v) {}; - - // Accumulated value. - base_type _accumulated_value; - - - }; - - -} - - -#endif // CPPREG_MERGEWRITE_H +#endif // CPPREG_MERGEWRITE_H diff --git a/register/Register.h b/register/Register.h index 143da58..0fe68e5 100644 --- a/register/Register.h +++ b/register/Register.h @@ -2,7 +2,7 @@ /** * @file Register.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * This header provides the definitions related to register implementation. */ @@ -12,127 +12,119 @@ #define CPPREG_REGISTER_H -#include "Traits.h" +#include "Memory.h" #include "MergeWrite.h" #include "ShadowValue.h" -//! cppreg namespace. namespace cppreg { - //! Register data structure. +//! Register data structure. +/** + * @tparam reg_address Register address. + * @tparam reg_size Register size enum value. + * @tparam reset_value Register reset value (0x0 if unknown). + * @tparam use_shadow shadow Boolean flag to enable shadow value. + * + * This data structure will act as a container for fields and is + * therefore limited to a strict minimum. It only carries information + * about the register base address, size, and reset value. + * In practice, register are implemented by deriving from this class to + * create custom types. + */ +template
::type reset_value = 0x0, + bool use_shadow = false> +struct Register { + + //! Register base type. + using type = typename TypeTraits::type; + + //! MMIO pointer type. + using MMIO = volatile type; + + //! Boolean flag for shadow value management. + using shadow = Shadow; + + //! Register base address. + constexpr static auto base_address = reg_address; + + //! Register size in bits. + constexpr static auto size = TypeTraits::bit_size; + + //! Register reset value. + constexpr static auto reset = reset_value; + + //! Register pack for memory device. + using pack = RegisterPack; + + //! Memory modifier. /** - * @tparam reg_address Register address. - * @tparam reg_size Register size enum value. - * @tparam reset_value Register reset value (0x0 if unknown). - * @tparam use_shadow shadow Boolean flag to enable shadow value. - * - * This data structure will act as a container for fields and is - * therefore limited to a strict minimum. It only carries information - * about the register base address, size, and reset value. - * In practice, register are implemented by deriving from this class to - * create custom types. + * @return A reference to the writable register memory. */ - template < - Address_t reg_address, - RegBitSize reg_size, - typename TypeTraits::type reset_value = 0x0, - bool use_shadow = false - > - struct Register { + static MMIO& rw_mem_device() { + using mem_device = typename RegisterMemoryDevice::mem_device; + return mem_device::template rw_memory(); + } - //! Register base type. - using type = typename TypeTraits::type; + //! Memory accessor. + /** + * @return A reference to the read-only register memory. + */ + static const MMIO& ro_mem_device() { + using mem_device = typename RegisterMemoryDevice::mem_device; + return mem_device::template ro_memory(); + } - //! MMIO pointer type. - using MMIO_t = volatile type; + //! Merge write start function. + /** + * @tparam F Field on which to perform the first write operation. + * @param value Value to be written to the field. + * @return A merge write data structure to chain further writes. + */ + template + static MergeWrite merge_write( + const typename F::type value) noexcept { + return MergeWrite::create( + static_cast((value << F::offset) & F::mask)); + } - //! Boolean flag for shadow value management. - using shadow = Shadow; + //! Merge write start function for constant value. + /** + * @tparam F Field on which to perform the first write operation. + * @tparam value Value to be written to the field. + * @return A merge write data structure to chain further writes. + */ + template > + static T&& merge_write() noexcept { - //! Register base address. - constexpr static const Address_t base_address = reg_address; - - //! Register size in bits. - constexpr static const std::uint8_t size = - TypeTraits::bit_size; - - //! Register reset value. - constexpr static const type reset = reset_value; - - //! Memory modifier. - /** - * @return A reference to the writable register memory. - */ - static MMIO_t& rw_mem_device() { - return *(reinterpret_cast(base_address)); - }; - - //! Memory accessor. - /** - * @return A reference to the read-only register memory. - */ - static const MMIO_t& ro_mem_device() { - return *(reinterpret_cast(base_address)); - }; - - //! Merge write start function. - /** - * @tparam F Field on which to perform the first write operation. - * @param value Value to be written to the field. - * @return A merge write data structure to chain further writes. - */ - template - static MergeWrite - merge_write(const typename F::type value) noexcept { - return - MergeWrite - ::make(((value << F::offset) & F::mask)); - }; - - //! Merge write start function for constant value. - /** - * @tparam F Field on which to perform the first write operation. - * @tparam value Value to be written to the field. - * @return A merge write data structure to chain further writes. - */ - template < - typename F, - type value, - typename T = MergeWrite_tmpl< - typename F::parent_register, - F::mask, - F::offset, - value - > - > - static - typename std::enable_if< - internals::check_overflow< - type, value, (F::mask >> F::offset) - >::value, - T - >::type&& - merge_write() noexcept { - return std::move(T::make()); - }; - - // Sanity check. - static_assert(size != 0u, - "Register: register definition with zero size"); - - // Enforce alignment. + // Check overflow. static_assert( - internals::is_aligned::byte_size> - ::value, - "Register: address is mis-aligned for register type" - ); + internals::check_overflow> F::offset)>:: + value, + "Register::merge_write:: value too large for the field"); - }; + return std::move(T::create()); + } + + // Sanity check. + static_assert(size != 0u, "Register:: register definition with zero size"); + + // Enforce alignment. + static_assert(internals::is_aligned::byte_size>::value, + "Register:: address is mis-aligned for register type"); +}; -} +} // namespace cppreg -#endif // CPPREG_REGISTER_H +#endif // CPPREG_REGISTER_H diff --git a/register/RegisterPack.h b/register/RegisterPack.h index 97160ef..eb9bedf 100644 --- a/register/RegisterPack.h +++ b/register/RegisterPack.h @@ -2,217 +2,179 @@ /** * @file RegisterPack.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * - * This header provides the definitions related to register implementation. + * This header provides the definitions related to packed register + * implementation. */ -#include "Register.h" -#include "Internals.h" - - #ifndef CPPREG_REGISTERPACK_H #define CPPREG_REGISTERPACK_H -//! cppreg namespace. +#include "Internals.h" +#include "Memory.h" +#include "Register.h" + + namespace cppreg { - //! Register pack base implementation. +//! Packed register implementation. +/** + * @tparam RegisterPack Pack to which the register belongs. + * @tparam reg_size Register size enum value. + * @tparam bit_offset Offset in bits for the register with respect to base. + * @tparam reset_value Register reset value (0x0 if unknown). + * @tparam use_shadow Boolean flag to enable shadow value. + * + * This implementation is intended to be used when defining a register + * that belongs to a peripheral group. + */ +template ::type reset_value = 0x0, + bool use_shadow = false> +struct PackedRegister : Register { + + //! Register pack. + using pack = RegisterPack; + + //! Register type. + using base_reg = Register; + + //! Memory modifier. /** - * @tparam base_address Pack base address. - * @tparam pack_byte_size Pack size in bytes. + * @return A reference to the writable register memory. */ - template < - Address_t base_address, - std::uint32_t pack_byte_size - > struct RegisterPack { + static typename base_reg::MMIO& rw_mem_device() noexcept { + using mem_device = + typename RegisterMemoryDevice::mem_device; + return mem_device::template rw_memory(); + } - //! Base address. - constexpr static const Address_t pack_base = base_address; - - //! Pack size in bytes. - constexpr static const std::uint32_t size_in_bytes = pack_byte_size; - - }; - - - //! Packed register implementation. + //! Memory accessor. /** - * @tparam RegisterPack Pack to which the register belongs. - * @tparam reg_size Register size enum value. - * @tparam bit_offset Offset in bits for the register with respect to base. - * @tparam reset_value Register reset value (0x0 if unknown). - * @tparam use_shadow Boolean flag to enable shadow value. + * @return A reference to the read-only register memory. + */ + static const typename base_reg::MMIO& ro_mem_device() noexcept { + using mem_device = + typename RegisterMemoryDevice::mem_device; + return mem_device::template ro_memory(); + } + + // Safety check to detect if are overflowing the pack. + static_assert(TypeTraits::byte_size + (bit_offset / 8u) + <= RegisterPack::size_in_bytes, + "PackRegister:: packed register is overflowing the pack"); + + // A packed register of width N bits requires: + // - the pack address to be N-bits aligned (N/8 aligned), + // - the pack address with offset to be N-bits aligned (N/8 aligned). + static_assert( + internals::is_aligned::byte_size>::value, + "PackedRegister:: pack base address is mis-aligned for register type"); + static_assert( + internals::is_aligned::byte_size>::value, + "PackedRegister:: offset address is mis-aligned for register type"); +}; + + +//! Pack indexing structure. +/** + * @tparam T List of types (registers or fields) to index. + * + * This can be used to conveniently map indices over packed registers. + * The order in the variadic parameter pack will define the indexing + * (starting at zero). + */ +template +struct PackIndexing { + + //! Tuple type. + using tuple_t = typename std::tuple; + + //! Number of elements. + constexpr static const std::size_t n_elems = + std::tuple_size::value; + + //! Element accessor. + template + using elem = typename std::tuple_element::type; +}; + + +//! Template for loop implementation. +/** + * @tparam start Start index value. + * @tparam end End index value. + */ +template +struct for_loop { + + //! Loop method. + /** + * @tparam Func Function to be called at each iteration. * - * This implementation is intended to be used when defining a register - * that belongs to a peripheral group. + * This will call Op for the range [start, end). */ - template < - typename RegisterPack, - RegBitSize reg_size, - std::uint32_t bit_offset, - typename TypeTraits::type reset_value = 0x0, - bool use_shadow = false - > - struct PackedRegister : Register< - RegisterPack::pack_base + (bit_offset / 8u), - reg_size, - reset_value, - use_shadow - > { - - //! Register type. - using base_reg = Register< - RegisterPack::pack_base + (bit_offset / 8u), - reg_size, - reset_value, - use_shadow - >; - - //! Memory map type. - using mem_map_t = internals::memory_map< - RegisterPack::pack_base, - RegisterPack::size_in_bytes, - reg_size - >; - - //! Memory modifier. - /** - * @return A reference to the writable register memory. - */ - static typename base_reg::MMIO_t& rw_mem_device() noexcept { - return mem_map_t::array[bit_offset - / TypeTraits::bit_size]; - }; - - //! Memory accessor. - /** - * @return A reference to the read-only register memory. - */ - static const typename base_reg::MMIO_t& ro_mem_device() noexcept { - return mem_map_t::array[bit_offset - / TypeTraits::bit_size]; - }; - - // Safety check to detect if are overflowing the pack. - static_assert( - TypeTraits::byte_size + (bit_offset / 8u) <= - RegisterPack::size_in_bytes, - "PackRegister: packed register is overflowing the pack" - ); - - // A packed register of width N bits requires: - // - the pack address to be N-bits aligned (N/8 aligned), - // - the pack address with offset to be N-bits aligned (N/8 aligned). - static_assert( - internals::is_aligned< - RegisterPack::pack_base, - TypeTraits::byte_size - >::value, - "PackedRegister: pack base address is mis-aligned for register type" - ); - static_assert( - internals::is_aligned< - RegisterPack::pack_base + (bit_offset / 8u), - TypeTraits::byte_size - >::value, - "PackedRegister: offset address is mis-aligned for register type" - ); - - - }; - - - //! Pack indexing structure. - /** - * @tparam T List of types (registers or fields) to index. - * - * This can be used to conveniently map indices over packed registers. - * The order in the variadic parameter pack will define the indexing - * (starting at zero). - */ - template - struct PackIndexing { - - //! Tuple type. - using tuple_t = typename std::tuple; - - //! Number of elements. - constexpr static const std::size_t n_elems = - std::tuple_size::value; - - //! Element accessor. - template - using elem = typename std::tuple_element::type; - - }; - - - //! Template for loop implementation. - /** - * @tparam start Start index value. - * @tparam end End index value. - */ - template - struct for_loop { - - //! Loop method. - /** - * @tparam Func Function to be called at each iteration. - * - * This will call Op for the range [start, end). - */ - template - static void apply() noexcept { - Func().template operator()(); - if (start < end) - for_loop::template apply(); - }; + template + static void apply() noexcept { + Func().template operator()(); + if (start < end) + for_loop::template apply(); + } #if __cplusplus >= 201402L - //! Apply method. - /** - * @tparam Op Operator type to be called. - * - * This is only available with C++14 and up as this requires polymorphic - * lambdas to be used in a somewhat useful manner. - * - * Typical example: - * use lambda [](auto index) { index.value will be the loop index}; - */ - template - static void apply(Op&& f) noexcept { - if (start < end) { - f(std::integral_constant{}); - for_loop::apply(std::forward(f)); - }; - }; -#endif // __cplusplus 201402L - - }; - template - struct for_loop { - template - static void apply() noexcept {}; -#if __cplusplus >= 201402L - template - static void apply(Op&& f) noexcept {}; -#endif // __cplusplus 201402L - }; - - - //! Template range loop implementation. + //! Apply method. /** - * @tparam IndexedPack Indexed pack type. + * @tparam Op Operator type to be called. + * + * This is only available with C++14 and up as this requires polymorphic + * lambdas to be used in a somewhat useful manner. + * + * Typical example: + * use lambda [](auto index) { index.value will be the loop index}; */ - template - struct pack_loop : for_loop<0, IndexedPack::n_elems> {}; + template + static void apply(Op&& f) noexcept { + if (start < end) { + f(std::integral_constant{}); + for_loop::apply(std::forward(f)); + }; + } +#endif // __cplusplus 201402L +}; +template +struct for_loop { + template + static void apply() noexcept {} +#if __cplusplus >= 201402L + template + static void apply(Op&& f) noexcept {} +#endif // __cplusplus 201402L +}; -} +//! Template range loop implementation. +/** + * @tparam IndexedPack Indexed pack type. + */ +template +struct pack_loop : for_loop<0, IndexedPack::n_elems> {}; -#endif // CPPREG_REGISTERPACK_H +} // namespace cppreg + + +#endif // CPPREG_REGISTERPACK_H diff --git a/register/ShadowValue.h b/register/ShadowValue.h index 2725bb9..9c15fc3 100644 --- a/register/ShadowValue.h +++ b/register/ShadowValue.h @@ -2,7 +2,7 @@ /** * @file ShadowValue.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. */ @@ -13,39 +13,33 @@ #include "cppreg_Defines.h" -//! cppreg namespace. namespace cppreg { - //! Shadow value generic implementation. - /** - * @tparam Register Register type. - * @tparam use_shadow Boolean flag indicating if shadow value is required. - * - * This implementation is for register which do not require shadow value. - */ - template - struct Shadow : std::false_type {}; +//! Shadow value generic implementation. +/** + * @tparam Register Register type. + * @tparam use_shadow Boolean flag indicating if shadow value is required. + */ +template +struct Shadow : std::false_type {}; - //! Shadow value implementation. - /** - * @tparam Register Register type. - * - * This implementation is for register which do require shadow value. - * - * See - */ - template - struct Shadow : std::true_type { - static typename Register::type shadow_value; - }; - template - typename Register::type Shadow::shadow_value = - Register::reset; +//! Shadow value specialization. +/** + * @tparam Register Register type. + * + * This implementation is for register which do require shadow value. + */ +template +struct Shadow : std::true_type { + static typename Register::type shadow_value; +}; +template +typename Register::type Shadow::shadow_value = Register::reset; -} +} // namespace cppreg -#endif // CPPREG_SHADOWVALUE_H +#endif // CPPREG_SHADOWVALUE_H diff --git a/register/Traits.h b/register/Traits.h index b3359e0..68e41ab 100644 --- a/register/Traits.h +++ b/register/Traits.h @@ -2,7 +2,7 @@ /** * @file Traits.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. * * This header provides some traits for register type instantiation. */ @@ -15,47 +15,55 @@ #include "cppreg_Defines.h" -//! cppreg namespace. namespace cppreg { - //! Register type traits based on size. - /** - * @tparam S Register size in bits. - */ - template - struct TypeTraits; +//! Register type traits based on size. +/** + * @tparam S Register size in bits. + */ +template +struct TypeTraits {}; - //!@{ TypeTraits specializations. - //! 8-bit specialization. - template <> struct TypeTraits { - using type = std::uint8_t; - constexpr static const std::uint8_t bit_size = 8u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - //! 16-bit specialization. - template <> struct TypeTraits { - using type = std::uint16_t; - constexpr static const std::uint8_t bit_size = 16u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - //! 32-bit specialization. - template <> struct TypeTraits { - using type = std::uint32_t; - constexpr static const std::uint8_t bit_size = 32u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - //! 64-bit specialization. - template <> struct TypeTraits { - using type = std::uint64_t; - constexpr static const std::uint8_t bit_size = 64u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - //!@} +//!@{ TypeTraits specializations. + +//! 8-bit specialization. +template <> +struct TypeTraits { + using type = std::uint8_t; + constexpr static auto bit_size = std::uint8_t{8}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; + +//! 16-bit specialization. +template <> +struct TypeTraits { + using type = std::uint16_t; + constexpr static auto bit_size = std::uint8_t{16}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; + +//! 32-bit specialization. +template <> +struct TypeTraits { + using type = std::uint32_t; + constexpr static auto bit_size = std::uint8_t{32}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; + +//! 64-bit specialization. +template <> +struct TypeTraits { + using type = std::uint64_t; + constexpr static auto bit_size = std::uint8_t{64}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; + +//!@} -} +} // namespace cppreg -#endif // CPPREG_TRAITS_H +#endif // CPPREG_TRAITS_H diff --git a/single/cppreg-all.h b/single/cppreg-all.h index e9cd4d8..ce670e3 100644 --- a/single/cppreg-all.h +++ b/single/cppreg-all.h @@ -2,7 +2,7 @@ /** * @file cppreg-all.h * @author Nicolas Clauvelin (nclauvelin@sendyne.com) - * @copyright Copyright 2010-2018 Sendyne Corp. All rights reserved. + * @copyright Copyright 2010-2019 Sendyne Corp. All rights reserved. */ #include @@ -14,638 +14,565 @@ #ifndef CPPREG_CPPREG_DEFINES_H #define CPPREG_CPPREG_DEFINES_H namespace cppreg { - using Address_t = std::uintptr_t; - enum class RegBitSize { - b8, - b16, - b32, - b64 - }; - using FieldWidth_t = std::uint8_t; - using FieldOffset_t = std::uint8_t; - template - struct type_mask { - constexpr static const T value = std::numeric_limits::max(); - }; -} -#endif +using Address = std::uintptr_t; +enum class RegBitSize : std::uint8_t { + b8, + b16, + b32, + b64 +}; +using FieldWidth = std::uint8_t; +using FieldOffset = std::uint8_t; +template +struct type_mask { + constexpr static const T value = std::numeric_limits::max(); +}; +} +#endif // Traits.h #ifndef CPPREG_TRAITS_H #define CPPREG_TRAITS_H namespace cppreg { - template - struct TypeTraits; - template <> struct TypeTraits { - using type = std::uint8_t; - constexpr static const std::uint8_t bit_size = 8u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - template <> struct TypeTraits { - using type = std::uint16_t; - constexpr static const std::uint8_t bit_size = 16u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - template <> struct TypeTraits { - using type = std::uint32_t; - constexpr static const std::uint8_t bit_size = 32u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; - template <> struct TypeTraits { - using type = std::uint64_t; - constexpr static const std::uint8_t bit_size = 64u; - constexpr static const std::uint8_t byte_size = bit_size / 8u; - }; -} -#endif +template +struct TypeTraits {}; +template <> +struct TypeTraits { + using type = std::uint8_t; + constexpr static auto bit_size = std::uint8_t{8}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; +template <> +struct TypeTraits { + using type = std::uint16_t; + constexpr static auto bit_size = std::uint8_t{16}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; +template <> +struct TypeTraits { + using type = std::uint32_t; + constexpr static auto bit_size = std::uint8_t{32}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; +template <> +struct TypeTraits { + using type = std::uint64_t; + constexpr static auto bit_size = std::uint8_t{64}; + constexpr static auto byte_size = std::uint8_t{bit_size / 8}; +}; +} +#endif // Internals.h #ifndef CPPREG_INTERNALS_H #define CPPREG_INTERNALS_H namespace cppreg { namespace internals { - template < - typename T, - T value, - T limit - > - struct check_overflow : std::integral_constant {}; - template - struct is_aligned : std::integral_constant< - bool, - (address & (alignment - 1)) == 0 - > { - }; - template - struct memory_map { - using mem_array_t = std::array< - volatile typename TypeTraits::type, - n / sizeof(typename TypeTraits::type) - >; - static mem_array_t& array; +template +struct check_overflow : std::integral_constant {}; +template
+struct is_aligned + : std::integral_constant {}; +} +} +#endif + +// Memory.h +#ifndef CPPREG_DEV_MEMORY_H +#define CPPREG_DEV_MEMORY_H +namespace cppreg { +template
+struct RegisterPack { + constexpr static const Address pack_base = base_address; + constexpr static const std::uint32_t size_in_bytes = pack_byte_size; +}; +template
+struct MemoryDevice { + using memory_storage = std::array; + static memory_storage& _mem_storage; + template + static const volatile typename TypeTraits::type& ro_memory() { static_assert( - is_aligned::byte_size>::value, - "memory_map: base address is mis-aligned for register type" - ); - }; - template - typename memory_map::mem_array_t& - memory_map::array = *( - reinterpret_cast - ::mem_array_t*>( - address - ) - ); -} -} -#endif + internals::is_aligned::type>::value>::value, + "MemoryDevice:: ro request not aligned"); + return *(reinterpret_cast::type*>( + &_mem_storage[byte_offset])); + } + template + static volatile typename TypeTraits::type& rw_memory() { + static_assert( + internals::is_aligned::type>::value>::value, + "MemoryDevice:: rw request not aligned"); + return *( + reinterpret_cast::type*>( + &_mem_storage[byte_offset])); + } +}; +template
+typename MemoryDevice::memory_storage& MemoryDevice::_mem_storage = + *(reinterpret_cast::memory_storage*>(a)); +template +struct RegisterMemoryDevice { + using mem_device = + MemoryDevice; +}; +} +#endif // AccessPolicy.h #ifndef CPPREG_ACCESSPOLICY_H #define CPPREG_ACCESSPOLICY_H namespace cppreg { - template - struct RegisterRead { - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - template - static T read( - const MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - return static_cast((mmio_device & mask) >> offset); - }; - template - static T read( - const MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - return static_cast(mmio_device); - }; - }; - template - struct RegisterWrite { - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - template - static void write( - MMIO_t& mmio_device, - T value, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = static_cast( - (mmio_device & ~mask) | ((value << offset) & mask) - ); - }; - template - static void write( - MMIO_t& mmio_device, - T value, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = value; - }; - }; - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - struct RegisterWriteConstant { - constexpr static const bool is_trivial = - (mask == type_mask::value) && (offset == 0u); - template - static void write( - MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = static_cast( - (mmio_device & ~mask) | ((value << offset) & mask) - ); - }; - template - static void write( - MMIO_t& mmio_device, - typename std::enable_if::type = nullptr - ) noexcept { - mmio_device = value; - }; - }; - struct read_only { - template - static T read(const MMIO_t& mmio_device) noexcept { - return RegisterRead::read(mmio_device); - }; - }; - struct read_write : read_only { - template - static void write(MMIO_t& mmio_device, - const T value) noexcept { - RegisterWrite::write(mmio_device, value); - }; - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - static void write(MMIO_t& mmio_device) noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - template - static void set(MMIO_t& mmio_device) - noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - template - static void clear(MMIO_t& mmio_device) - noexcept { - RegisterWriteConstant - ::write(mmio_device); - }; - template - static void toggle(MMIO_t& mmio_device) - noexcept { - mmio_device = static_cast((mmio_device) ^ mask); - }; - }; - struct write_only { - template - static void write(MMIO_t& mmio_device, const T value) noexcept { - RegisterWrite::value, 0u>::write( - mmio_device, ((value << offset) & mask) - ); - }; - template < - typename MMIO_t, typename T, T mask, FieldOffset_t offset, T value - > - static void write(MMIO_t& mmio_device) noexcept { - RegisterWriteConstant< - MMIO_t, T, type_mask::value, 0u, ((value << offset) & mask) - > - ::write(mmio_device); - }; - }; -} -#endif +template +struct is_trivial_rw + : std::integral_constant::value) + && (offset == FieldOffset{0})> {}; +template +using is_trivial = + typename std::enable_if::value, U>::type; +template +using is_not_trivial = + typename std::enable_if::value, U>::type; +template +struct RegisterRead { + template + static T read(const MMIO& mmio_device, + is_not_trivial* = nullptr) noexcept { + return static_cast((mmio_device & mask) >> offset); + } + template + static T read(const MMIO& mmio_device, + is_trivial* = nullptr) noexcept { + return static_cast(mmio_device); + } +}; +template +struct RegisterWrite { + template + static void write(MMIO& mmio_device, + T value, + is_not_trivial* = nullptr) noexcept { + mmio_device = + static_cast((mmio_device & ~mask) | ((value << offset) & mask)); + } + template + static void write(MMIO& mmio_device, + T value, + is_trivial* = nullptr) noexcept { + mmio_device = value; + } +}; +template +struct RegisterWriteConstant { + template + static void write(MMIO& mmio_device, + is_not_trivial* = nullptr) noexcept { + mmio_device = + static_cast((mmio_device & ~mask) | ((value << offset) & mask)); + } + template + static void write(MMIO& mmio_device, + is_trivial* = nullptr) noexcept { + mmio_device = value; + } +}; +struct read_only { + template + static T read(const MMIO& mmio_device) noexcept { + return RegisterRead::read(mmio_device); + } +}; +struct read_write : read_only { + template + static void write(MMIO& mmio_device, const T value) noexcept { + RegisterWrite::write(mmio_device, value); + } + template + static void write(MMIO& mmio_device) noexcept { + RegisterWriteConstant::write(mmio_device); + } + template + static void set(MMIO& mmio_device) noexcept { + RegisterWriteConstant::write( + mmio_device); + } + template + static void clear(MMIO& mmio_device) noexcept { + RegisterWriteConstant(~mask)>::write(mmio_device); + } + template + static void toggle(MMIO& mmio_device) noexcept { + mmio_device = static_cast((mmio_device) ^ mask); + } +}; +struct write_only { + template + static void write(MMIO& mmio_device, const T value) noexcept { + RegisterWrite::value, FieldOffset{0}>::write( + mmio_device, ((value << offset) & mask)); + } + template + static void write(MMIO& mmio_device) noexcept { + RegisterWriteConstant::value, + FieldOffset{0}, + ((value << offset) & mask)>::write(mmio_device); + } +}; +} +#endif // Mask.h #ifndef CPPREG_MASK_H #define CPPREG_MASK_H namespace cppreg { - template - constexpr Mask_t make_mask(const FieldWidth_t width) noexcept { - return width == 0 ? - 0u - : - static_cast( - (make_mask(FieldWidth_t(width - 1)) << 1) | 1 - ); - }; - template - constexpr Mask_t make_shifted_mask(const FieldWidth_t width, - const FieldOffset_t offset) noexcept { - return static_cast(make_mask(width) << offset); - }; +template +constexpr Mask make_mask(const FieldWidth width) noexcept { + return width == 0 ? static_cast(0u) + : static_cast( + (make_mask(FieldWidth(width - 1)) << 1) | 1); } -#endif +template +constexpr Mask make_shifted_mask(const FieldWidth width, + const FieldOffset offset) noexcept { + return static_cast(make_mask(width) << offset); +} +} +#endif // ShadowValue.h #ifndef CPPREG_SHADOWVALUE_H #define CPPREG_SHADOWVALUE_H namespace cppreg { - template - struct Shadow : std::false_type {}; - template - struct Shadow : std::true_type { - static typename Register::type shadow_value; - }; - template - typename Register::type Shadow::shadow_value = - Register::reset; -} -#endif +template +struct Shadow : std::false_type {}; +template +struct Shadow : std::true_type { + static typename Register::type shadow_value; +}; +template +typename Register::type Shadow::shadow_value = Register::reset; +} +#endif // MergeWrite.h #ifndef CPPREG_MERGEWRITE_H #define CPPREG_MERGEWRITE_H namespace cppreg { - template < - typename Register, - typename Register::type mask, - FieldOffset_t offset, - typename Register::type value - > class MergeWrite_tmpl { - private: - using base_type = typename Register::type; - static_assert(!Register::shadow::value, - "merge write is not available for shadow value register"); - constexpr static const base_type _accumulated_value = - ((value << offset) & mask); - constexpr static const base_type _combined_mask = mask; - MergeWrite_tmpl() = default; - public: - static MergeWrite_tmpl make() noexcept { return {}; }; - MergeWrite_tmpl(const MergeWrite_tmpl&) = delete; - MergeWrite_tmpl& operator=(const MergeWrite_tmpl&) = delete; - MergeWrite_tmpl& operator=(MergeWrite_tmpl&&) = delete; - MergeWrite_tmpl operator=(MergeWrite_tmpl) = delete; - MergeWrite_tmpl(MergeWrite_tmpl&&) = delete; - void done() const && noexcept { - typename Register::MMIO_t& mmio_device = - Register::rw_mem_device(); - RegisterWriteConstant< - typename Register::MMIO_t, - typename Register::type, - _combined_mask, - 0u, - _accumulated_value - >::write(mmio_device); - }; - template < - typename F, - base_type new_value, - typename T = MergeWrite_tmpl< - Register, - (_combined_mask | F::mask), - 0u, - (_accumulated_value & ~F::mask) | ((new_value << F::offset) & - F::mask) - > - > - typename std::enable_if< - (internals::check_overflow< - typename Register::type, new_value, (F::mask >> F::offset) - >::value), - T - >::type&& - with() const && noexcept { - static_assert(std::is_same< - typename F::parent_register, - Register - >::value, - "field is not from the same register in merge_write"); - return std::move(T::make()); - }; - }; - template < - typename Register, - typename Register::type mask - > - class MergeWrite { - public: - using base_type = typename Register::type; - private: - constexpr static const base_type _combined_mask = mask; - public: - constexpr static MergeWrite make(const base_type value) noexcept { - return MergeWrite(value); - }; - MergeWrite(MergeWrite&& mw) noexcept - : _accumulated_value(mw._accumulated_value) {}; - MergeWrite(const MergeWrite&) = delete; - MergeWrite& operator=(const MergeWrite&) = delete; - MergeWrite& operator=(MergeWrite&&) = delete; - void done() const && noexcept { - typename Register::MMIO_t& mmio_device = - Register::rw_mem_device(); - RegisterWrite< - typename Register::MMIO_t, - base_type, - _combined_mask, - 0u - >::write(mmio_device, _accumulated_value); - }; - template - MergeWrite - with(const base_type value) && noexcept { - static_assert(std::is_same< - typename F::parent_register, - Register - >::value, - "field is not from the same register in merge_write"); - _accumulated_value = (_accumulated_value & ~F::mask) - | ((value << F::offset) & F::mask); - return - std::move( - MergeWrite - ::make(_accumulated_value) - ); - }; - private: - static_assert(!Register::shadow::value, - "merge write is not available for shadow value register"); - constexpr MergeWrite() : _accumulated_value(0u) {}; - constexpr explicit MergeWrite(const base_type v) : - _accumulated_value(v) {}; - base_type _accumulated_value; - }; -} -#endif +template +class MergeWrite_tmpl { +private: + using base_type = typename Register::type; + constexpr static auto _accumulated_value = + base_type{(value << offset) & mask}; + constexpr static auto _combined_mask = mask; + template + using propagated = + MergeWrite_tmpl; + MergeWrite_tmpl() = default; + static_assert(!Register::shadow::value, + "merge write is not available for shadow value register"); +public: + static MergeWrite_tmpl create() noexcept { + return {}; + } + MergeWrite_tmpl(const MergeWrite_tmpl&) = delete; + MergeWrite_tmpl& operator=(const MergeWrite_tmpl&) = delete; + MergeWrite_tmpl& operator=(MergeWrite_tmpl&&) = delete; + MergeWrite_tmpl operator=(MergeWrite_tmpl) = delete; + MergeWrite_tmpl(MergeWrite_tmpl&&) = delete; + void done() const&& noexcept { + typename Register::MMIO& mmio_device = Register::rw_mem_device(); + RegisterWriteConstant::write(mmio_device); + } + template + propagated&& with() const&& noexcept { + static_assert( + std::is_same::value, + "MergeWrite_tmpl:: field is not from the same register"); + constexpr auto no_overflow = + internals::check_overflow> F::offset)>::value; + static_assert(no_overflow, + "MergeWrite_tmpl:: field overflow in with() call"); + return std::move(propagated{}); + } +}; +template +class MergeWrite { +private: + using base_type = typename Register::type; + base_type _accumulated_value; + constexpr static auto _combined_mask = mask; + template + using propagated = MergeWrite; + constexpr MergeWrite() : _accumulated_value{0} {}; + constexpr explicit MergeWrite(const base_type v) : _accumulated_value{v} {}; + static_assert(!Register::shadow::value, + "merge write is not available for shadow value register"); +public: + constexpr static MergeWrite create(const base_type value) noexcept { + return MergeWrite(value); + } + MergeWrite(MergeWrite&& mw) noexcept + : _accumulated_value{mw._accumulated_value} {}; + MergeWrite(const MergeWrite&) = delete; + MergeWrite& operator=(const MergeWrite&) = delete; + MergeWrite& operator=(MergeWrite&&) = delete; + void done() const&& noexcept { + typename Register::MMIO& mmio_device = Register::rw_mem_device(); + RegisterWrite::write(mmio_device, _accumulated_value); + } + template + propagated with(const base_type value) const&& noexcept { + static_assert( + std::is_same::value, + "field is not from the same register in merge_write"); + const auto new_value = static_cast( + (_accumulated_value & ~F::mask) | ((value << F::offset) & F::mask)); + return std::move(propagated::create(new_value)); + } +}; +} +#endif // Register.h #ifndef CPPREG_REGISTER_H #define CPPREG_REGISTER_H namespace cppreg { - template < - Address_t reg_address, - RegBitSize reg_size, - typename TypeTraits::type reset_value = 0x0, - bool use_shadow = false - > - struct Register { - using type = typename TypeTraits::type; - using MMIO_t = volatile type; - using shadow = Shadow; - constexpr static const Address_t base_address = reg_address; - constexpr static const std::uint8_t size = - TypeTraits::bit_size; - constexpr static const type reset = reset_value; - static MMIO_t& rw_mem_device() { - return *(reinterpret_cast(base_address)); - }; - static const MMIO_t& ro_mem_device() { - return *(reinterpret_cast(base_address)); - }; - template - static MergeWrite - merge_write(const typename F::type value) noexcept { - return - MergeWrite - ::make(((value << F::offset) & F::mask)); - }; - template < - typename F, - type value, - typename T = MergeWrite_tmpl< - typename F::parent_register, - F::mask, - F::offset, - value - > - > - static - typename std::enable_if< - internals::check_overflow< - type, value, (F::mask >> F::offset) - >::value, - T - >::type&& - merge_write() noexcept { - return std::move(T::make()); - }; - static_assert(size != 0u, - "Register: register definition with zero size"); +template
::type reset_value = 0x0, + bool use_shadow = false> +struct Register { + using type = typename TypeTraits::type; + using MMIO = volatile type; + using shadow = Shadow; + constexpr static auto base_address = reg_address; + constexpr static auto size = TypeTraits::bit_size; + constexpr static auto reset = reset_value; + using pack = RegisterPack; + static MMIO& rw_mem_device() { + using mem_device = typename RegisterMemoryDevice::mem_device; + return mem_device::template rw_memory(); + } + static const MMIO& ro_mem_device() { + using mem_device = typename RegisterMemoryDevice::mem_device; + return mem_device::template ro_memory(); + } + template + static MergeWrite merge_write( + const typename F::type value) noexcept { + return MergeWrite::create( + static_cast((value << F::offset) & F::mask)); + } + template > + static T&& merge_write() noexcept { static_assert( - internals::is_aligned::byte_size> - ::value, - "Register: address is mis-aligned for register type" - ); - }; -} -#endif + internals::check_overflow> F::offset)>:: + value, + "Register::merge_write:: value too large for the field"); + return std::move(T::create()); + } + static_assert(size != 0u, "Register:: register definition with zero size"); + static_assert(internals::is_aligned::byte_size>::value, + "Register:: address is mis-aligned for register type"); +}; +} +#endif // RegisterPack.h #ifndef CPPREG_REGISTERPACK_H #define CPPREG_REGISTERPACK_H namespace cppreg { - template < - Address_t base_address, - std::uint32_t pack_byte_size - > struct RegisterPack { - constexpr static const Address_t pack_base = base_address; - constexpr static const std::uint32_t size_in_bytes = pack_byte_size; - }; - template < - typename RegisterPack, - RegBitSize reg_size, - std::uint32_t bit_offset, - typename TypeTraits::type reset_value = 0x0, - bool use_shadow = false - > - struct PackedRegister : Register< - RegisterPack::pack_base + (bit_offset / 8u), - reg_size, - reset_value, - use_shadow - > { - using base_reg = Register< - RegisterPack::pack_base + (bit_offset / 8u), - reg_size, - reset_value, - use_shadow - >; - using mem_map_t = internals::memory_map< - RegisterPack::pack_base, - RegisterPack::size_in_bytes, - reg_size - >; - static typename base_reg::MMIO_t& rw_mem_device() noexcept { - return mem_map_t::array[bit_offset - / TypeTraits::bit_size]; - }; - static const typename base_reg::MMIO_t& ro_mem_device() noexcept { - return mem_map_t::array[bit_offset - / TypeTraits::bit_size]; - }; - static_assert( - TypeTraits::byte_size + (bit_offset / 8u) <= - RegisterPack::size_in_bytes, - "PackRegister: packed register is overflowing the pack" - ); - static_assert( - internals::is_aligned< - RegisterPack::pack_base, - TypeTraits::byte_size - >::value, - "PackedRegister: pack base address is mis-aligned for register type" - ); - static_assert( - internals::is_aligned< - RegisterPack::pack_base + (bit_offset / 8u), - TypeTraits::byte_size - >::value, - "PackedRegister: offset address is mis-aligned for register type" - ); - }; - template - struct PackIndexing { - using tuple_t = typename std::tuple; - constexpr static const std::size_t n_elems = - std::tuple_size::value; - template - using elem = typename std::tuple_element::type; - }; - template - struct for_loop { - template - static void apply() noexcept { - Func().template operator()(); - if (start < end) - for_loop::template apply(); - }; +template ::type reset_value = 0x0, + bool use_shadow = false> +struct PackedRegister : Register { + using pack = RegisterPack; + using base_reg = Register; + static typename base_reg::MMIO& rw_mem_device() noexcept { + using mem_device = + typename RegisterMemoryDevice::mem_device; + return mem_device::template rw_memory(); + } + static const typename base_reg::MMIO& ro_mem_device() noexcept { + using mem_device = + typename RegisterMemoryDevice::mem_device; + return mem_device::template ro_memory(); + } + static_assert(TypeTraits::byte_size + (bit_offset / 8u) + <= RegisterPack::size_in_bytes, + "PackRegister:: packed register is overflowing the pack"); + static_assert( + internals::is_aligned::byte_size>::value, + "PackedRegister:: pack base address is mis-aligned for register type"); + static_assert( + internals::is_aligned::byte_size>::value, + "PackedRegister:: offset address is mis-aligned for register type"); +}; +template +struct PackIndexing { + using tuple_t = typename std::tuple; + constexpr static const std::size_t n_elems = + std::tuple_size::value; + template + using elem = typename std::tuple_element::type; +}; +template +struct for_loop { + template + static void apply() noexcept { + Func().template operator()(); + if (start < end) + for_loop::template apply(); + } #if __cplusplus >= 201402L - template - static void apply(Op&& f) noexcept { - if (start < end) { - f(std::integral_constant{}); - for_loop::apply(std::forward(f)); - }; + template + static void apply(Op&& f) noexcept { + if (start < end) { + f(std::integral_constant{}); + for_loop::apply(std::forward(f)); }; -#endif - }; - template - struct for_loop { - template - static void apply() noexcept {}; + } +#endif +}; +template +struct for_loop { + template + static void apply() noexcept {} #if __cplusplus >= 201402L - template - static void apply(Op&& f) noexcept {}; -#endif - }; - template - struct pack_loop : for_loop<0, IndexedPack::n_elems> {}; -} -#endif + template + static void apply(Op&& f) noexcept {} +#endif +}; +template +struct pack_loop : for_loop<0, IndexedPack::n_elems> {}; +} +#endif // Field.h #ifndef CPPREG_REGISTERFIELD_H #define CPPREG_REGISTERFIELD_H namespace cppreg { - template < - typename BaseRegister, - FieldWidth_t field_width, - FieldOffset_t field_offset, - typename AccessPolicy - > - struct Field { - using parent_register = BaseRegister; - using type = typename parent_register::type; - using MMIO_t = typename parent_register::MMIO_t; - using policy = AccessPolicy; - constexpr static const FieldWidth_t width = field_width; - constexpr static const FieldOffset_t offset = field_offset; - constexpr static const type mask = make_shifted_mask(width, - offset); - constexpr static const bool has_shadow = - parent_register::shadow::value; - template - struct check_overflow : internals::check_overflow< - type, - value, - (mask >> offset) - > {}; - static type read() noexcept { - return policy::template read( - parent_register::ro_mem_device() - ); - }; - template - static void - write(const typename std::enable_if::type value) - noexcept { - policy::template write( +template +struct Field { + using parent_register = BaseRegister; + using type = typename parent_register::type; + using MMIO = typename parent_register::MMIO; + using policy = AccessPolicy; + constexpr static auto width = field_width; + constexpr static auto offset = field_offset; + constexpr static auto mask = make_shifted_mask(width, offset); + template + using if_no_shadow = + typename std::enable_if::type; + template + using if_shadow = + typename std::enable_if::type; + static type read() noexcept { + return policy::template read( + parent_register::ro_mem_device()); + } + template + static void write(const if_no_shadow value) noexcept { + policy::template write( + parent_register::rw_mem_device(), value); + } + template + static void write(const if_shadow value) noexcept { + RegisterWrite::write( + parent_register::shadow::shadow_value, value); + policy:: + template write::value, FieldOffset{0}>( parent_register::rw_mem_device(), - value - ); - }; - template - static void - write(const typename std::enable_if::type value) - noexcept { - RegisterWrite - ::write(parent_register::shadow::shadow_value, value); - policy::template write::value, 0u>( - parent_register::rw_mem_device(), - parent_register::shadow::shadow_value - ); - }; - template - static void write( - typename std::enable_if< - !has_shadow - && - check_overflow::value, - T - >::type* = nullptr - ) noexcept { - policy::template write( - parent_register::rw_mem_device() - ); - }; - template - static void write( - typename std::enable_if< - has_shadow - && - check_overflow::value, - T - >::type* = nullptr - ) noexcept { - write(value); - }; - static void set() noexcept { - policy::template - set(parent_register::rw_mem_device()); - }; - static void clear() noexcept { - policy::template - clear(parent_register::rw_mem_device()); - }; - static void toggle() noexcept { - policy::template - toggle(parent_register::rw_mem_device()); - }; - static bool is_set() noexcept { - return (Field::read() == (mask >> offset)); - }; - static bool is_clear() noexcept { - return (Field::read() == 0u); - }; - static_assert(parent_register::size >= width, - "field width is larger than parent register size"); - static_assert(parent_register::size >= width + offset, - "offset + width is larger than parent register size"); - static_assert(width != 0u, - "defining a Field type of width 0u is not allowed"); - }; -} -#endif + parent_register::shadow::shadow_value); + } + template + static void write(if_no_shadow* = nullptr) noexcept { + policy::template write( + parent_register::rw_mem_device()); + static_assert( + internals::check_overflow> offset)>::value, + "Field::write: value too large for the field"); + } + template + static void write(if_shadow* = nullptr) noexcept { + write(value); + static_assert( + internals::check_overflow> offset)>::value, + "Field::write: value too large for the field"); + } + static void set() noexcept { + policy::template set( + parent_register::rw_mem_device()); + } + static void clear() noexcept { + policy::template clear( + parent_register::rw_mem_device()); + } + static void toggle() noexcept { + policy::template toggle( + parent_register::rw_mem_device()); + } + static bool is_set() noexcept { + return (Field::read() == (mask >> offset)); + } + static bool is_clear() noexcept { + return (Field::read() == type{0}); + } + static_assert(parent_register::size >= width, + "Field:: field width is larger than parent register size"); + static_assert(parent_register::size >= width + offset, + "Field:: offset + width is larger than parent register size"); + static_assert(width != FieldWidth{0}, + "Field:: defining a Field type of zero width is not allowed"); +}; +} +#endif From a6f09754ca5336404a6c7a0d3b2491bd2943748a Mon Sep 17 00:00:00 2001 From: Nicolas Clauvelin Date: Wed, 24 Apr 2019 17:02:17 -0400 Subject: [PATCH 2/2] Add Gitlab templates --- .gitlab/issue_templates/bug.md | 41 ++++++++++++++++++++++ .gitlab/issue_templates/configuration.md | 27 ++++++++++++++ .gitlab/issue_templates/documentation.md | 19 ++++++++++ .gitlab/issue_templates/feature_request.md | 21 +++++++++++ .gitlab/issue_templates/improvement.md | 21 +++++++++++ .gitlab/issue_templates/question.md | 17 +++++++++ .gitlab/issue_templates/requirement.md | 21 +++++++++++ .gitlab/merge_request_templates/default.md | 23 ++++++++++++ 8 files changed, 190 insertions(+) create mode 100644 .gitlab/issue_templates/bug.md create mode 100644 .gitlab/issue_templates/configuration.md create mode 100644 .gitlab/issue_templates/documentation.md create mode 100644 .gitlab/issue_templates/feature_request.md create mode 100644 .gitlab/issue_templates/improvement.md create mode 100644 .gitlab/issue_templates/question.md create mode 100644 .gitlab/issue_templates/requirement.md create mode 100644 .gitlab/merge_request_templates/default.md diff --git a/.gitlab/issue_templates/bug.md b/.gitlab/issue_templates/bug.md new file mode 100644 index 0000000..53ac427 --- /dev/null +++ b/.gitlab/issue_templates/bug.md @@ -0,0 +1,41 @@ +### Summary + +*(Summarize the bug or unexpected behavior encountered concisely)* + +### Version and platform information + +*(Give the commit/branch or version information of the project for which the bug was observed)* + +*(If the bug was observed on a specific platform give the details here)* + +### Customer information + +*(If the bug was reported by a customer give the relevant details here)* + +### Steps to reproduce + +*(How can the bug be reproduced - be as accurate as possible)* + +### What is the current *bug* behavior? + +*(What actually happens: e.g. crash, wrong results, ...)* + +### What is the expected *correct* behavior? + +*(What you should be happening instead)* + +### Relevant logs, screenshots, or inputs + +*(Paste using code block (```) or attach any piece of information)* + +*(If specific inputs are needed to observe the bug paste them or attach them)* + +### Possible causes or fixes + +*(If you have identified the cause of the bug or have a potential fix please link the line(s) of code and comment appropriately)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:bug" diff --git a/.gitlab/issue_templates/configuration.md b/.gitlab/issue_templates/configuration.md new file mode 100644 index 0000000..22758af --- /dev/null +++ b/.gitlab/issue_templates/configuration.md @@ -0,0 +1,27 @@ +### Questionnaire + +* [ ] Issue related to GitLab project configuration? +* [ ] Issue related to project build process (e.g. toolchain)? +* [ ] Issue related to Git configuration (e.g. gitignore file)? + +### Version information + +*(Give the commit/branch or version information of the project for which this configuration issue needs to be considered)* + +### Policy or guidelines reference + +*(Refer here to the policy or guideline that relates to this issue and indicate if a violation or deviation should be addressed)* + +### Details + +*(Explain here or attach what should be done to fix this issue)* + +### Attachments + +*(Paste using code block (```) or attach any piece of information illustrating the issue)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:configuration" diff --git a/.gitlab/issue_templates/documentation.md b/.gitlab/issue_templates/documentation.md new file mode 100644 index 0000000..7bfc9a1 --- /dev/null +++ b/.gitlab/issue_templates/documentation.md @@ -0,0 +1,19 @@ +### Questionnaire + +* [ ] New or additional documentation needed? +* [ ] Current documentation is out of date or erroneous? +* [ ] Documentation needs review? + +### Version information + +*(Give the commit/branch or version information of the project for which this documentation issue needs to be considered)* + +### Details + +*(Explain here or attach what should be done to fix this issue)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:documentation" diff --git a/.gitlab/issue_templates/feature_request.md b/.gitlab/issue_templates/feature_request.md new file mode 100644 index 0000000..2bb4bab --- /dev/null +++ b/.gitlab/issue_templates/feature_request.md @@ -0,0 +1,21 @@ +### Problem to solve + +*(What is the new feature trying to solve or provide?)* + +### Customer information + +*(If the feature was suggested by a customer give the relevant details here)* + +### Proposal + +*(Explain what this feature will bring in terms of benefits and how it fits in the project scope)* + +### Links and references + +*(Add links or references if applicable)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:feature request" diff --git a/.gitlab/issue_templates/improvement.md b/.gitlab/issue_templates/improvement.md new file mode 100644 index 0000000..56fac0a --- /dev/null +++ b/.gitlab/issue_templates/improvement.md @@ -0,0 +1,21 @@ +### Functionality to improve and goal + +*(Explain what exactly needs to be improved and what is the goal)* + +### Customer information + +*(If the improvement was suggested by a customer give the relevant details here)* + +### Proposal + +*(Explain how the functionality could be improved and the various things to consider to achieve this goal)* + +### Links and references + +*(Add links or references if applicable)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:improvement" diff --git a/.gitlab/issue_templates/question.md b/.gitlab/issue_templates/question.md new file mode 100644 index 0000000..5361c86 --- /dev/null +++ b/.gitlab/issue_templates/question.md @@ -0,0 +1,17 @@ +### Question + +*(Write the question as explicit as you can)* + +### Customer information + +*(If the question was submitted by a customer give the relevant details here)* + +### Additional information + +*(Add links, references, or any other piece of information)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:question" diff --git a/.gitlab/issue_templates/requirement.md b/.gitlab/issue_templates/requirement.md new file mode 100644 index 0000000..028a7bf --- /dev/null +++ b/.gitlab/issue_templates/requirement.md @@ -0,0 +1,21 @@ +### Requirement specifications + +*(Give the details about the requirement that needs to be implemented)* + +### Project information + +*(If this issue relates to a requirement defined in a project specification existing somewhere give all references and information here)* + +### Customer information + +*(If the requirement was defined by a customer give the relevant details here)* + +### Testing + +*(Explain how the requirement implementation should be tested or how it fit in the current testing plan of the project)* + +*Final check: set origin label, set priority/severity if applicable* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"kind:requirement" diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md new file mode 100644 index 0000000..e612009 --- /dev/null +++ b/.gitlab/merge_request_templates/default.md @@ -0,0 +1,23 @@ +### Summary of the MR + +*(Explain what modifications are part of this MR; refer to issues or milestones if needed)* + +### List of issues addressed by this MR + +*(Edit the list of issues)* + +* Closes #xxx +* Closes #xxx +* ... + +### Additional information + +* [ ] Does the MR update any submodule? +* [ ] Does the MR break any functionality or alter performance ? +* [ ] Does the MR require issues to be created to deal with side effects? + +*(Give more details if needed)* + +*Clean up: remove any comment from the template if not applicable* + +/label ~"merge:review"