modm_data.atdf

Microchip ATDF Device Descriptions

Parses the ATDF files contained in the Microchip device packs for AVR and SAM devices.

 1# Copyright 2026, Niklas Hauser
 2# SPDX-License-Identifier: MPL-2.0
 3
 4"""
 5# Microchip ATDF Device Descriptions
 6
 7Parses the ATDF files contained in the Microchip device packs for AVR and SAM
 8devices.
 9"""
10
11from . import avr, sam
12from .identifier import avr_did_from_string, sam_did_from_string
13
14__all__ = [
15    "avr",
16    "sam",
17    "avr_did_from_string",
18    "sam_did_from_string",
19]
def avr_did_from_string(string: str) -> modm_data.kg.DeviceIdentifier | None:
12def avr_did_from_string(string: str) -> DeviceIdentifier | None:
13    """
14    Parses AVR device strings, for example, `atmega328p-au` or `at90can128-16au`.
15
16    :return: The device identifier or None if the string cannot be parsed.
17    """
18    string = string.lower()
19    if not string.startswith("at"):
20        return None
21
22    match_string = r"at(?P<family>tiny|mega|xmega)(?P<name>\d+)"
23    if string.startswith("at90"):
24        match_string = r"at(?P<family>90)(?P<type>can|pwm|usb)(?P<name>\d+)-(?P<speed>\d+)(?P<package>\w+)"
25
26    if (match := re.search(match_string, string)) is None:
27        return None
28
29    i = DeviceIdentifier()
30    i.set("platform", "avr")
31    i.set("family", match.group("family").lower())
32    i.set("name", match.group("name").lower())
33
34    if i.family == "90":
35        i.naming_schema = "at{family}{type}{name}-{speed}{package}"
36        i.set("type", match.group("type").lower())
37        i.set("speed", match.group("speed"))
38        i.set("package", match.group("package"))
39        return i
40
41    if i.family in ["tiny", "mega"]:
42        i.naming_schema = "at{family}{name}{type}-{speed}{package}"
43        search = "at" + i.family + i.name + r"(?P<type>\w*)-(?P<speed>\d*)(?P<package>\w+)"
44        if match := re.search(search, string):
45            i.set("type", match.group("type").lower())
46            i.set("speed", match.group("speed"))
47            i.set("package", match.group("package"))
48            return i
49        return None
50
51    # xmega
52    i.naming_schema = "at{family}{name}{type}{pin}"
53    search = "at" + i.family + i.name + r"(?P<type>[A-Ea-e]?[1-5]?)(?P<package>[Bb]?[Uu]?)"
54    if match := re.search(search, string):
55        if match.group("type") != "":
56            i.set("type", match.group("type").lower())
57        if match.group("package") != "":
58            i.set("pin", match.group("package"))
59    return i

Parses AVR device strings, for example, atmega328p-au or at90can128-16au.

Returns

The device identifier or None if the string cannot be parsed.

def sam_did_from_string(string: str) -> modm_data.kg.DeviceIdentifier:
 87def sam_did_from_string(string: str) -> DeviceIdentifier:
 88    """
 89    Parses SAM device strings, for example, `ATSAMD21E15A-MUT`, organized as
 90    `{platform}{series}{pin}{flash}{variant}-{package}{grade}`.
 91    """
 92    string = string.lower()
 93    if string.startswith("sam") or string.startswith("atsam"):
 94        if string.startswith("atsam4"):
 95            match_string = (
 96                r"sam(?P<series>\d\w)(?P<flash>\d{1,2})(?P<pin>\w)(?P<variant>\w)?-(?P<package>\w)(?P<grade>\w)"
 97            )
 98        else:
 99            match_string = r"sam(?P<series>\w((\d{2})|(\w\d)))(?P<pin>\w)(?P<flash>\d{2})(?P<variant>\w)?-(?P<package>\w\w*)(?P<grade>\w)$"
100        if match := re.search(match_string, string):
101            i = DeviceIdentifier("{platform}{series}{pin}{flash}{variant}-{package}{grade}")
102            i.set("platform", "sam")
103            i.set("series", match.group("series"))
104            i.set("pin", match.group("pin"))
105            i.set("flash", match.group("flash"))
106            i.set("variant", match.group("variant") or "")
107            i.set("package", match.group("package"))
108            i.set("grade", match.group("grade"))
109            i.set("family", sam_family_from_series(match.group("series")).lower())
110            return i
111
112    raise ValueError(f"Unknown identifier '{string}'!")

Parses SAM device strings, for example, ATSAMD21E15A-MUT, organized as {platform}{series}{pin}{flash}{variant}-{package}{grade}.