Skip to content

Commit 827f02c

Browse files
committed
derive advanced syntax (python)
1 parent 76a2885 commit 827f02c

File tree

1 file changed

+40
-14
lines changed

1 file changed

+40
-14
lines changed

svdtools/patch.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)