Source code for ifgen.svd.process

"""
A module implementing interfaces for processing registers and clusters.
"""

# built-in
from xml.etree import ElementTree

# internal
from ifgen.svd.model.field import get_fields
from ifgen.svd.model.peripheral import (
    Cluster,
    Peripheral,
    Register,
    RegisterData,
)

ClusterMap = dict[str, "Cluster"]
RegisterMap = dict[str, Register]


[docs] def handle_registers( registers: ElementTree.Element, peripheral: Peripheral, cluster_map: ClusterMap = None, register_map: RegisterMap = None, ) -> RegisterData: """Handle the 'registers' element.""" result: RegisterData = [] if cluster_map is None: cluster_map = {} if register_map is None: register_map = {} for item in registers: if item.tag == "cluster": result.append( cluster( item, cluster_map, peripheral, register_map=register_map ) ) elif item.tag == "register": result.append(register(item, register_map, peripheral)) return result
[docs] def cluster( element: ElementTree.Element, cluster_map: ClusterMap, peripheral: Peripheral, register_map: RegisterMap = None, ) -> Cluster: """Create a Cluster instance from an SVD element.""" derived_cluster = None derived = element.attrib.get("derivedFrom") if derived is not None: derived_cluster = cluster_map[derived] # pragma: nocover inst = Cluster.create( element, derived_cluster, handle_registers( element, peripheral, cluster_map=cluster_map, register_map=register_map, ), peripheral, ) cluster_map[inst.name] = inst return inst
[docs] def register( element: ElementTree.Element, register_map: RegisterMap, peripheral: Peripheral, ) -> Register: """Create a Register instance from an SVD element.""" derived_register = None derived = element.attrib.get("derivedFrom") if derived is not None: derived_register = register_map[derived] # pragma: nocover # Handle writeConstraint at some point? # Load fields. fields = None fields_elem = element.find("fields") if fields_elem is not None: fields = get_fields(fields_elem) inst = Register.create(element, derived_register, fields, peripheral) register_map[inst.name] = inst # Keep track of alternates. if inst.is_alternate(): alt = inst.alternate() assert alt is not None register_map[alt].alternates.append(inst) return inst