Source code for ifgen.svd.group
"""
A module implementing interfaces for processing a group of peripherals.
"""
# built-in
from pathlib import Path
from typing import Any
# third-party
from vcorelib.io import ARBITER
# internal
from ifgen.svd.group.base import PeripheralGroup, peripheral_groups
from ifgen.svd.group.fields import EnumMap, StructMap, struct_fields
from ifgen.svd.model.peripheral import Peripheral
__all__ = ["PeripheralGroup", "peripheral_groups", "handle_group"]
def struct_instance(peripheral: Peripheral) -> dict[str, Any]:
"""Get struct instance data."""
return {
"name": peripheral.name,
"address": peripheral.raw_data["baseAddress"],
}
def struct_data(
group: PeripheralGroup,
structs: StructMap,
enums: EnumMap,
min_enum_members: int,
) -> dict[str, Any]:
"""Get struct data for a peripheral group."""
data: dict[str, Any] = {}
peripheral = group.root
peripheral.handle_description(data)
data["instances"] = [struct_instance(x) for x in group.peripherals]
size, data["fields"] = struct_fields(
peripheral.registers,
structs,
enums,
peripheral.base_name(lower=False),
min_enum_members,
)
# Too difficult due to padding.
# data["expected_size"] = size
del size
return data
[docs]
def handle_group(
output_dir: Path,
group: PeripheralGroup,
includes: set[Path],
min_enum_members: int,
) -> None:
"""Handle a peripheral group."""
output = output_dir.joinpath("include.yaml")
includes.add(output)
structs: StructMap = {}
enums: EnumMap = {}
structs[group.root.base_name()] = struct_data(
group, structs, enums, min_enum_members
)
ARBITER.encode(output, {"structs": structs, "enums": enums})