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):
 9def owl_from_datasheet(onto, ds):
10    pass
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):
29def owl_from_doc(onto, doc):
30    if doc.name.startswith("DS"):
31        owl_from_datasheet(onto, doc)
32    elif doc.name.startswith("RM"):
33        owl_from_reference_manual(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)