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]
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.
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}.