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):
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"?>')