Devicetree DTS alias support (#483)
* **New Features** * Phandle support for device-to-device property references. * Recognition of #define-style declarations in device trees. * Device nodes may include optional aliases alongside node names. * **Improvements** * Flatter, consistent device hierarchy processing for generation. * Error and log messages now reference node names for clearer diagnostics. * **Other** * Added a static ESP32-based device tree and minor DTS comment updates.
This commit is contained in:
committed by
GitHub
parent
ecc0a9c076
commit
626d0d9776
@@ -3,6 +3,7 @@ from typing import List
|
||||
from lark import Transformer
|
||||
from lark import Token
|
||||
from source.models import *
|
||||
from dataclasses import dataclass
|
||||
|
||||
def flatten_token_array(tokens: List[Token], name: str):
|
||||
result_list = list()
|
||||
@@ -10,6 +11,11 @@ def flatten_token_array(tokens: List[Token], name: str):
|
||||
result_list.append(token.value)
|
||||
return Token(name, result_list)
|
||||
|
||||
@dataclass
|
||||
class NodeNameAndAlias:
|
||||
name: str
|
||||
alias: str
|
||||
|
||||
class DtsTransformer(Transformer):
|
||||
# Flatten the start node into a list
|
||||
def start(self, tokens):
|
||||
@@ -20,17 +26,20 @@ class DtsTransformer(Transformer):
|
||||
raise Exception(f"Unsupported DTS version: {version}")
|
||||
return DtsVersion(version)
|
||||
def device(self, tokens: list):
|
||||
identifier = "UNKNOWN"
|
||||
node_name = None
|
||||
node_alias = None
|
||||
properties = list()
|
||||
devices = list()
|
||||
for index, entry in enumerate(tokens):
|
||||
if index == 0:
|
||||
identifier = entry.value
|
||||
elif type(entry) is DeviceProperty:
|
||||
properties.append(entry)
|
||||
elif type(entry) is Device:
|
||||
devices.append(entry)
|
||||
return Device(identifier, properties, devices)
|
||||
child_devices = list()
|
||||
for index, item in enumerate(tokens):
|
||||
if type(item) is Token and item.type == 'NODE_NAME':
|
||||
node_name = item.value
|
||||
elif type(item) is Token and item.type == 'NODE_ALIAS':
|
||||
node_alias = item.value
|
||||
elif type(item) is DeviceProperty:
|
||||
properties.append(item)
|
||||
elif type(item) is Device:
|
||||
child_devices.append(item)
|
||||
return Device(node_name, node_alias, properties, child_devices)
|
||||
def device_property(self, objects: List[object]):
|
||||
name = objects[0]
|
||||
# Boolean property has no value as the value is implied to be true
|
||||
@@ -44,13 +53,20 @@ class DtsTransformer(Transformer):
|
||||
if type(token) is Token:
|
||||
raise Exception(f"Failed to convert token to PropertyValue: {token}")
|
||||
return token
|
||||
def PHANDLE(self, token: Token):
|
||||
return PropertyValue(type="phandle", value=token.value[1:])
|
||||
def values(self, object):
|
||||
return PropertyValue(type="values", value=object)
|
||||
def value(self, object):
|
||||
# PHANDLE is already converted to PropertyValue
|
||||
if isinstance(object[0], PropertyValue):
|
||||
return object[0]
|
||||
return PropertyValue(type="value", value=object[0])
|
||||
def array(self, object):
|
||||
return PropertyValue(type="array", value=object)
|
||||
def VALUE(self, token: Token):
|
||||
if token.value.startswith("&"):
|
||||
return PropertyValue(type="phandle", value=token.value[1:])
|
||||
return token.value
|
||||
def NUMBER(self, token: Token):
|
||||
return token.value
|
||||
@@ -64,4 +80,6 @@ class DtsTransformer(Transformer):
|
||||
result_list.append(token.value)
|
||||
return PropertyValue("text_array", result_list)
|
||||
def INCLUDE_C(self, token: Token):
|
||||
return IncludeC(token.value)
|
||||
return IncludeC(token.value)
|
||||
def DEFINE_C(self, token: Token):
|
||||
return DefineC(token.value)
|
||||
Reference in New Issue
Block a user