atmega32u4 0.1.3

Low level access to ATmega32U4 registers
Documentation
#!/usr/bin/env python3
import textwrap
import json
from svd.peripheral import peripheral as peripheral_gen

def bit_fields(name, bits, *, doc, one, onedoc, zero, zerodoc):
    print(f"""\
          <fields>""")
    for i in reversed(bits):
        print(f"""\
            <field>
              <name>{name}{i}</name>
              <description>Pin {i} {doc}</description>
              <bitRange>[{i}:{i}]</bitRange>
              <enumeratedValues>
                <enumeratedValue>
                  <name>{zero}</name>
                  <description>{zerodoc}</description>
                  <value>0</value>
                </enumeratedValue>
                <enumeratedValue>
                  <name>{one}</name>
                  <description>{onedoc}</description>
                  <value>1</value>
                </enumeratedValue>
              </enumeratedValues>
            </field>""")
    print(f"""\
          </fields>""")

def main():
    print("""\
<?xml version="1.0" encoding="utf-8"?>

<device schemaVersion="1.3" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="CMSIS-SVD.xsd">
  <vendor>Atmel</vendor>
  <name>ATmega32U4</name>
  <version>0.1</version>
  <description>8-bit Microcontroller with 32K bytes of ISP Flash and USB Controller</description>

  <cpu>
    <name>ATmega32U4</name>
    <revision>r0p0</revision>
    <endian>little</endian>
    <mpuPresent>false</mpuPresent>
    <fpuPresent>true</fpuPresent>
    <nvicPrioBits>8</nvicPrioBits>
    <vendorSystickConfig>false</vendorSystickConfig>
    <deviceNumInterrupts>43</deviceNumInterrupts>
  </cpu>

  <addressUnitBits>8</addressUnitBits>
  <size>8</size>
  <access>read-write</access>
  <resetValue>0</resetValue>
  <resetMask>0xff</resetMask>

  <peripherals>""")

    data = json.load(open("atmega32u4.json"))

    for peripheral in data:
        ty = peripheral["type"]
        if ty == "port":
            name = peripheral["name"]
            doc_name = peripheral["doc_name"]
            base_addr = peripheral["base"]
            char = peripheral["chr"]
            bits = peripheral["pins"]
            print(f"""\
    <peripheral>
      <name>{name}</name>
      <baseAddress>{base_addr}</baseAddress>

      <addressBlock>
        <offset>0x00</offset>
        <size>0x03</size>
        <usage>registers</usage>
      </addressBlock>

      <registers>
        <register>
          <name>PIN</name>
          <description>{doc_name} Input Pins Address</description>
          <access>read-only</access>
          <addressOffset>0x00</addressOffset>""")
            bit_fields(
                f"P",
                bits,
                doc="Input",
                one="HIGH",
                onedoc="Pin is high",
                zero="LOW",
                zerodoc="Pin is low",
            )
            print(f"""\
        </register>

        <register>
          <name>DDR</name>
          <description>{doc_name} Data Direction Register</description>
          <addressOffset>0x01</addressOffset>""")
            bit_fields(
                f"DD",
                bits,
                doc="Direction",
                one="OUTPUT",
                onedoc="Pin is configured as an output",
                zero="INPUT",
                zerodoc="Pin is configured as an input",
            )
            print(f"""\
        </register>

        <register>
          <name>PORT</name>
          <description>{doc_name} Output/Data Register</description>
          <addressOffset>0x02</addressOffset>""")
            bit_fields(
                f"D",
                bits,
                doc="Output/Data",
                one="HIGH",
                onedoc="Pin is high",
                zero="LOW",
                zerodoc="Pin is low",
            )
            print(f"""\
        </register>
      </registers>
    </peripheral>""")
        elif ty == "ext":
            p = open(peripheral["path"]).read().strip()
            print(textwrap.indent(p, "    "))
        elif ty == "toml":
            peripheral_gen(peripheral["path"])

    print("""\
  </peripherals>
</device>""")


if __name__ == "__main__":
    main()