@@ -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+
644662def load_adt (data ):
645663 return ADTNode (ADTNodeStruct .parse (data ))
646664
0 commit comments