Skip to content

Commit 6f460b1

Browse files
povikmarcan
authored andcommitted
m1n1.adt: Add create_node() method
Signed-off-by: Martin Povišer <[email protected]>
1 parent 2b33d7f commit 6f460b1

1 file changed

Lines changed: 24 additions & 6 deletions

File tree

proxyclient/m1n1/adt.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -308,12 +308,9 @@ def parse_prop(node, path, node_name, name, v, is_template=False):
308308
break
309309
n = n._parent
310310
else:
311-
ac, sc = node._parent.address_cells, node._parent.size_cells
312-
at = Hex(Int64ul) if ac == 2 else Array(ac, Hex(Int32ul))
313-
st = Hex(Int64ul) if sc == 2 else Array(sc, Hex(Int32ul))
314-
t = SafeGreedyRange(Struct("addr" / at, "size" / st))
315-
if len(v) % ((ac + sc) * 4):
316-
t = None
311+
rs = node._reg_struct
312+
if len(v) % rs.sizeof() == 0:
313+
t = SafeGreedyRange(rs)
317314

318315
elif name == "ranges":
319316
try:
@@ -571,6 +568,14 @@ def __repr__(self):
571568
def __iter__(self):
572569
return iter(self._children)
573570

571+
@property
572+
def _reg_struct(self):
573+
ac, sc = self._parent.address_cells, self._parent.size_cells
574+
return Struct(
575+
"addr" / Hex(Int64ul) if ac == 2 else Array(ac, Hex(Int32ul)),
576+
"size" / Hex(Int64ul) if sc == 2 else Array(sc, Hex(Int32ul))
577+
)
578+
574579
def get_reg(self, idx):
575580
reg = self.reg[idx]
576581
addr = reg.addr
@@ -641,6 +646,19 @@ def build_addr_lookup(self):
641646

642647
return lookup
643648

649+
def create_node(self, name):
650+
while name.startswith("/"):
651+
name = name[1:]
652+
if "/" in name:
653+
a, b = name.split("/", 1)
654+
return self[a].create_node(b)
655+
656+
node = ADTNode(path=self._path + "/", parent=self)
657+
node.name = name
658+
node._types["reg"] = (SafeGreedyRange(node._reg_struct), False)
659+
self[name] = node
660+
return node
661+
644662
def load_adt(data):
645663
return ADTNode(ADTNodeStruct.parse(data))
646664

0 commit comments

Comments
 (0)