modm_data.owl.stmicro.model
1# Copyright 2022, Niklas Hauser 2# SPDX-License-Identifier: MPL-2.0 3 4import re 5from ...html.stmicro import find_device_filter 6 7 8def owl_from_datasheet(onto, ds): 9 pass 10 11 12def owl_from_reference_manual(onto, rm): 13 odid = onto.DeviceIdentifier(onto.did.string.lower()) 14 15 dfilter = find_device_filter(onto.did, rm.flash_latencies) 16 table_data = rm.flash_latencies[dfilter] 17 print(dfilter, table_data) 18 for min_voltage, frequencies in table_data.items(): 19 # print(min_voltage, frequencies) 20 for wait_state, max_frequency in enumerate(frequencies): 21 ofreq = onto.FlashWaitState(f"WaitState_{wait_state}_{min_voltage}mV") 22 ofreq.hasWaitState = wait_state 23 ofreq.hasMaxFrequency = int(max_frequency * 1e6) 24 ofreq.hasMinOperatingVoltage = min_voltage / 1000.0 25 odid.hasFlashWaitState.append(ofreq) 26 27 28def owl_from_doc(onto, doc): 29 if doc.name.startswith("DS"): 30 owl_from_datasheet(onto, doc) 31 elif doc.name.startswith("RM"): 32 owl_from_reference_manual(onto, doc) 33 34 35def owl_from_did(onto): 36 # Add device identifiers 37 odid = onto.DeviceIdentifier(onto.did.string.lower()) 38 odid.hasDeviceSchema = onto.did.naming_schema 39 odid.hasDevicePlatform = onto.did.platform 40 odid.hasDeviceFamily = onto.did.family 41 odid.hasDeviceName = onto.did.name 42 odid.hasDevicePin = onto.did.pin 43 odid.hasDeviceSize = onto.did.size 44 odid.hasDevicePackage = onto.did.package 45 odid.hasDeviceTemperature = onto.did.temperature 46 odid.hasDeviceVariant = onto.did.variant 47 if onto.did.get("core", False): 48 odid.hasDeviceCore = onto.did.core 49 50 51def owl_from_cubemx(onto, data): 52 odid = onto.DeviceIdentifier(onto.did.string.lower()) 53 54 # Add internal memories 55 for memory in data["memories"]: 56 omem = onto.Memory("Memory_" + memory['name'].upper()) 57 odid.hasMemory.append(omem) 58 omem.hasName = memory["name"].upper() 59 omem.hasMemoryStartAddress = int(memory["start"], 16) 60 omem.hasMemorySize = int(memory["size"]) 61 omem.hasMemoryAccess = memory["access"] 62 63 # Add the peripherals and their type 64 for (pbase, name, version, ptype, features, stype) in data["modules"]: 65 oper = onto.Peripheral("Peripheral_" + name.upper()) 66 odid.hasPeripheral.append(oper) 67 oper.hasName = name.upper() 68 if pbase != name: 69 oper.hasPeripheralInstance = int(name.replace(pbase, "")) 70 oper.hasPeripheralType = pbase + ptype.replace("stm32", "") 71 72 # Add package 73 opack = onto.Package("Package_" + data["package"]) 74 opack.hasName = str(data["package"]) 75 odid.hasPackage.append(opack) 76 opack.hasPackagePinCount = int(data["pin-count"]) 77 78 # Add pinout for package 79 io_pins = {} 80 for pin in data["pinout"]: 81 opin = onto.Pin("Pin_" + pin["name"]) 82 opin.hasName = pin["name"] 83 opin.hasPinType = pin["type"] 84 if pin["type"] == "I/O" and (number := re.search(r"P\w(\d+)", pin["name"])): 85 opin.hasPort = pin["name"][1] 86 opin.hasPinNumber = int(number.group(1)) 87 io_pins[(opin.hasPort.lower(), opin.hasPinNumber)] = opin 88 opack.hasPin.append(opin) 89 onto.pinPosition[opack, onto.hasPin, opin].append(pin["position"]) 90 91 # Add alternate and additional functions to pins 92 for (port, number, signals) in data["gpios"]: 93 opin = io_pins[(port, int(number))] 94 for signal in signals: 95 peripheral = (signal["driver"] or "").upper() + (signal["instance"] or "") 96 name = signal["name"].upper() 97 af = signal["af"] 98 signame = "Signal_" + peripheral + "_" + name 99 osig = onto.AlternateFunction(signame) if af else onto.AdditionalFunction(signame) 100 osig.hasPeripheral.append(onto.Peripheral("Peripheral_" + peripheral)) 101 osig.hasName = name 102 opin.hasSignal.append(osig) 103 if af: onto.alternateFunction[opin, onto.hasSignal, osig].append(int(af)) 104 105 106def owl_from_header(onto, header): 107 odid = onto.DeviceIdentifier(onto.did.string.lower()) 108 109 # Add interrupt vector table 110 for interrupt in header.interrupt_table: 111 if interrupt["position"] >= 0: 112 oint = onto.InterruptVector("InterruptVector_" + interrupt["name"]) 113 oint.hasInterruptVectorPosition = interrupt["position"] 114 odid.hasInterruptVector.append(oint)
def
owl_from_datasheet(onto, ds):
def
owl_from_reference_manual(onto, rm):
13def owl_from_reference_manual(onto, rm): 14 odid = onto.DeviceIdentifier(onto.did.string.lower()) 15 16 dfilter = find_device_filter(onto.did, rm.flash_latencies) 17 table_data = rm.flash_latencies[dfilter] 18 print(dfilter, table_data) 19 for min_voltage, frequencies in table_data.items(): 20 # print(min_voltage, frequencies) 21 for wait_state, max_frequency in enumerate(frequencies): 22 ofreq = onto.FlashWaitState(f"WaitState_{wait_state}_{min_voltage}mV") 23 ofreq.hasWaitState = wait_state 24 ofreq.hasMaxFrequency = int(max_frequency * 1e6) 25 ofreq.hasMinOperatingVoltage = min_voltage / 1000.0 26 odid.hasFlashWaitState.append(ofreq)
def
owl_from_doc(onto, doc):
def
owl_from_did(onto):
36def owl_from_did(onto): 37 # Add device identifiers 38 odid = onto.DeviceIdentifier(onto.did.string.lower()) 39 odid.hasDeviceSchema = onto.did.naming_schema 40 odid.hasDevicePlatform = onto.did.platform 41 odid.hasDeviceFamily = onto.did.family 42 odid.hasDeviceName = onto.did.name 43 odid.hasDevicePin = onto.did.pin 44 odid.hasDeviceSize = onto.did.size 45 odid.hasDevicePackage = onto.did.package 46 odid.hasDeviceTemperature = onto.did.temperature 47 odid.hasDeviceVariant = onto.did.variant 48 if onto.did.get("core", False): 49 odid.hasDeviceCore = onto.did.core
def
owl_from_cubemx(onto, data):
52def owl_from_cubemx(onto, data): 53 odid = onto.DeviceIdentifier(onto.did.string.lower()) 54 55 # Add internal memories 56 for memory in data["memories"]: 57 omem = onto.Memory("Memory_" + memory['name'].upper()) 58 odid.hasMemory.append(omem) 59 omem.hasName = memory["name"].upper() 60 omem.hasMemoryStartAddress = int(memory["start"], 16) 61 omem.hasMemorySize = int(memory["size"]) 62 omem.hasMemoryAccess = memory["access"] 63 64 # Add the peripherals and their type 65 for (pbase, name, version, ptype, features, stype) in data["modules"]: 66 oper = onto.Peripheral("Peripheral_" + name.upper()) 67 odid.hasPeripheral.append(oper) 68 oper.hasName = name.upper() 69 if pbase != name: 70 oper.hasPeripheralInstance = int(name.replace(pbase, "")) 71 oper.hasPeripheralType = pbase + ptype.replace("stm32", "") 72 73 # Add package 74 opack = onto.Package("Package_" + data["package"]) 75 opack.hasName = str(data["package"]) 76 odid.hasPackage.append(opack) 77 opack.hasPackagePinCount = int(data["pin-count"]) 78 79 # Add pinout for package 80 io_pins = {} 81 for pin in data["pinout"]: 82 opin = onto.Pin("Pin_" + pin["name"]) 83 opin.hasName = pin["name"] 84 opin.hasPinType = pin["type"] 85 if pin["type"] == "I/O" and (number := re.search(r"P\w(\d+)", pin["name"])): 86 opin.hasPort = pin["name"][1] 87 opin.hasPinNumber = int(number.group(1)) 88 io_pins[(opin.hasPort.lower(), opin.hasPinNumber)] = opin 89 opack.hasPin.append(opin) 90 onto.pinPosition[opack, onto.hasPin, opin].append(pin["position"]) 91 92 # Add alternate and additional functions to pins 93 for (port, number, signals) in data["gpios"]: 94 opin = io_pins[(port, int(number))] 95 for signal in signals: 96 peripheral = (signal["driver"] or "").upper() + (signal["instance"] or "") 97 name = signal["name"].upper() 98 af = signal["af"] 99 signame = "Signal_" + peripheral + "_" + name 100 osig = onto.AlternateFunction(signame) if af else onto.AdditionalFunction(signame) 101 osig.hasPeripheral.append(onto.Peripheral("Peripheral_" + peripheral)) 102 osig.hasName = name 103 opin.hasSignal.append(osig) 104 if af: onto.alternateFunction[opin, onto.hasSignal, osig].append(int(af))
def
owl_from_header(onto, header):
107def owl_from_header(onto, header): 108 odid = onto.DeviceIdentifier(onto.did.string.lower()) 109 110 # Add interrupt vector table 111 for interrupt in header.interrupt_table: 112 if interrupt["position"] >= 0: 113 oint = onto.InterruptVector("InterruptVector_" + interrupt["name"]) 114 oint.hasInterruptVectorPosition = interrupt["position"] 115 odid.hasInterruptVector.append(oint)