modm_data.svd.write

  1# Copyright 2022, Niklas Hauser
  2# SPDX-License-Identifier: MPL-2.0
  3
  4from lxml import etree
  5from .model import *
  6
  7
  8def _add_element(node, tag, text=None):
  9    element = etree.Element(tag)
 10    if text is not None: element.text = str(text)
 11    node.append(element)
 12    return element
 13
 14
 15def _format_device(xmlnode, treenode):
 16    _add_element(xmlnode, "name", str(treenode.name).upper().replace("X", "x"))
 17    _add_element(xmlnode, "version", "1.0")
 18    descr = ",".join(d.string.upper() for d in (treenode.compatible or []))
 19    _add_element(xmlnode, "description", descr)
 20    _add_element(xmlnode, "addressUnitBits", "8")
 21    _add_element(xmlnode, "width", "32")
 22    _add_element(xmlnode, "size", "0x20")
 23    _add_element(xmlnode, "resetValue", "0")
 24    _add_element(xmlnode, "resetMask", "0xFFFFFFFF")
 25    return _add_element(xmlnode, "peripherals")
 26
 27
 28def _format_peripheral(xmlnode, treenode):
 29    peripheral = _add_element(xmlnode, "peripheral")
 30    _add_element(peripheral, "name", treenode.name)
 31    _add_element(peripheral, "baseAddress", hex(treenode.address))
 32    if treenode.children:
 33        return _add_element(peripheral, "registers")
 34    else:
 35        return peripheral
 36
 37
 38def _format_register(xmlnode, treenode):
 39    register = _add_element(xmlnode, "register")
 40    _add_element(register, "name", treenode.name)
 41    _add_element(register, "addressOffset", hex(treenode.offset))
 42    _add_element(register, "size", hex(treenode.width * 8))
 43    if treenode.children:
 44        return _add_element(register, "fields")
 45    else:
 46        return register
 47
 48
 49def _format_bit_field(xmlnode, treenode):
 50    field = _add_element(xmlnode, "field")
 51    _add_element(field, "name", treenode.name)
 52    _add_element(field, "bitOffset", treenode.position)
 53    _add_element(field, "bitWidth", treenode.width)
 54    return field
 55
 56
 57def _format_svd(xmlnode, treenode):
 58
 59    current = xmlnode
 60    if isinstance(treenode, Device):
 61        current = _format_device(xmlnode, treenode)
 62
 63    elif isinstance(treenode, Peripheral):
 64        current = _format_peripheral(current, treenode)
 65
 66    elif isinstance(treenode, Register):
 67        current = _format_register(current, treenode)
 68
 69    elif isinstance(treenode, BitField):
 70        _format_bit_field(current, treenode)
 71
 72    # elif isinstance(treenode, EnumeratedValue):
 73    #     _format_enumerated_value(current, treenode)
 74
 75    for child in treenode.children:
 76        _format_svd(current, child)
 77
 78
 79def format_svd(register_tree):
 80    device = etree.Element("device")
 81    device.set("schemaVersion", "1.1")
 82    # device.set("xmlns:xs", "http://www.w3.org/2001/XMLSchema-instance")
 83    # device.set("xs:noNamespaceSchemaLocation", "CMSIS-SVD_Schema_1_1.xsd")
 84
 85    _format_svd(device, register_tree)
 86
 87    svd = etree.ElementTree(device)
 88    return svd
 89
 90
 91def write_svd(svd, path, pretty=True):
 92    with open(path, "wb") as file:
 93        svd.write(file, pretty_print=pretty,
 94                  doctype='<?xml version="1.0" encoding="utf-8" standalone="no"?>')
 95
 96
 97def read_svd(path) -> Device:
 98
 99    parser = SVDParser.for_xml_file(path)
100    for peripheral in parser.get_device().peripherals:
101        print("%s @ 0x%08x" % (peripheral.name, peripheral.base_address))
102
103    with open(path, "wb") as file:
104        svd.write(file, pretty_print=pretty,
105                  doctype='<?xml version="1.0" encoding="utf-8" standalone="no"?>')
def format_svd(register_tree):
80def format_svd(register_tree):
81    device = etree.Element("device")
82    device.set("schemaVersion", "1.1")
83    # device.set("xmlns:xs", "http://www.w3.org/2001/XMLSchema-instance")
84    # device.set("xs:noNamespaceSchemaLocation", "CMSIS-SVD_Schema_1_1.xsd")
85
86    _format_svd(device, register_tree)
87
88    svd = etree.ElementTree(device)
89    return svd
def write_svd(svd, path, pretty=True):
92def write_svd(svd, path, pretty=True):
93    with open(path, "wb") as file:
94        svd.write(file, pretty_print=pretty,
95                  doctype='<?xml version="1.0" encoding="utf-8" standalone="no"?>')
def read_svd(path) -> modm_data.svd.model.Device:
 98def read_svd(path) -> Device:
 99
100    parser = SVDParser.for_xml_file(path)
101    for peripheral in parser.get_device().peripherals:
102        print("%s @ 0x%08x" % (peripheral.name, peripheral.base_address))
103
104    with open(path, "wb") as file:
105        svd.write(file, pretty_print=pretty,
106                  doctype='<?xml version="1.0" encoding="utf-8" standalone="no"?>')