@@ -508,22 +508,35 @@ def delete_peripheral(self, pspec):
508508 for ptag in list (self .iter_peripherals (pspec )):
509509 self .device .find ("peripherals" ).remove (ptag )
510510
511- def derive_peripheral (self , pname , pderive ):
511+ def derive_peripheral (self , pname , pmod ):
512512 """
513513 Remove registers from pname and mark it as derivedFrom pderive.
514514 Update all derivedFrom referencing pname.
515515 """
516516 parent = self .device .find ("peripherals" )
517+ if isinstance (pmod , str ):
518+ pderive = pmod
519+ base_address = None
520+ elif isinstance (pmod , dict ):
521+ pderive = pmod ["_from" ]
522+ base_address = pmod .get ("baseAddress" , None )
523+ else :
524+ raise SvdPatchError ("derive: incorrect syntax for {}" .format (pname ))
517525 ptag = parent .find ("./peripheral[name='{}']" .format (pname ))
518526 derived = parent .find ("./peripheral[name='{}']" .format (pderive ))
519- if ptag is None :
520- raise SvdPatchError ("peripheral {} not found" .format (pname ))
521527 if derived is None :
522528 raise SvdPatchError ("peripheral {} not found" .format (pderive ))
523- for value in list (ptag ):
524- if value .tag in ("name" , "baseAddress" , "interrupt" ):
525- continue
526- ptag .remove (value )
529+ if ptag is None :
530+ ptag = ET .SubElement (parent , "register" )
531+ ET .SubElement (ptag , "name" ).text = pname
532+ ET .SubElement (ptag , "addressOffset" ).text = base_address
533+ else :
534+ for value in list (ptag ):
535+ if value .tag in ("name" , "baseAddress" , "interrupt" ):
536+ continue
537+ ptag .remove (value )
538+ if base_address :
539+ ptag .find ("baseAddress" ).text = base_address
527540 for value in ptag :
528541 last = value
529542 last .tail = "\n "
@@ -823,22 +836,35 @@ def add_register(self, rname, radd):
823836 ET .SubElement (rnew , key ).text = str (value )
824837 rnew .tail = "\n "
825838
826- def derive_register (self , rname , rderive ):
839+ def derive_register (self , rname , rmod ):
827840 """
828841 Remove fields from rname and mark it as derivedFrom rderive.
829842 Update all derivedFrom referencing rname.
830843 """
831844 parent = self .ptag .find ("registers" )
845+ if isinstance (rmod , str ):
846+ rderive = rmod
847+ address_offset = None
848+ elif isinstance (rmod , dict ):
849+ rderive = rmod ["_from" ]
850+ address_offset = rmod .get ("addressOffset" , None )
851+ else :
852+ raise SvdPatchError ("derive: incorrect syntax for {}" .format (rname ))
832853 rtag = parent .find ("./register[name='{}']" .format (rname ))
833854 derived = parent .find ("./register[name='{}']" .format (rderive ))
834- if rtag is None :
835- raise SvdPatchError ("register {} not found" .format (rname ))
836855 if derived is None :
837856 raise SvdPatchError ("register {} not found" .format (rderive ))
838- for value in list (rtag ):
839- if value .tag in ("name" , "addressOffset" ):
840- continue
841- rtag .remove (value )
857+ if rtag is None :
858+ rtag = ET .SubElement (parent , "register" )
859+ ET .SubElement (rtag , "name" ).text = rname
860+ ET .SubElement (rtag , "addressOffset" ).text = address_offset
861+ else :
862+ for value in list (rtag ):
863+ if value .tag in ("name" , "addressOffset" ):
864+ continue
865+ rtag .remove (value )
866+ if address_offset :
867+ rtag .find ("addressOffset" ).text = address_offset
842868 for value in rtag :
843869 last = value
844870 last .tail = "\n "
0 commit comments