Documentation
#pragma once

#include <stdint.h>

namespace regmap_accessor
{
    template<typename ACCESSOR>
    class {{ peripheral.name }}
    {
        public:
            {% for reg in peripheral.regs %}
            class {{ reg.name }}
            {
                public:
                    {{ reg.name }}(uint32_t raw_value): _value(raw_value)
                    {}

                    {% for field in reg.fields %}
                    uint32_t get_{{ field.name | lower }}()
                    {
                        constexpr uint32_t msb_mask = (1 << ({{ field.msb }} + 1)) - 1;
                        constexpr uint32_t lsb_mask = (1 << {{ field.lsb }}) - 1;
                        constexpr uint32_t mask = msb_mask & ~lsb_mask;
                        return (_value & mask) >> {{ field.lsb }};
                    }
                    {% endfor %}

                private:
                    uint32_t _value;
            };
            {% endfor %}

            {{ peripheral.name }}(ACCESSOR& accessor): _accessor(accessor)
            {}

            {% for reg in peripheral.regs %}
            uint32_t get_{{ reg.name | lower }}()
            {
                return _accessor.peek32({{ reg.offset }});
            }
            {% endfor %}

        private:
            ACCESSOR& _accessor;
    };
}