From a8ea131202942e2e7884b90761cf66b62c5c2ca8 Mon Sep 17 00:00:00 2001 From: Rahix Date: Wed, 5 Aug 2020 06:05:21 +0200 Subject: [PATCH] svdpatch: Fix _replace_enum when used on derived fields Make sure the enum is replaced properly in the case of derived enumerated values. Signed-off-by: Rahix --- patch/svdpatch.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/patch/svdpatch.py b/patch/svdpatch.py index 0d1f592..7d75c1c 100644 --- a/patch/svdpatch.py +++ b/patch/svdpatch.py @@ -632,24 +632,28 @@ def process_field_enum(pname, rtag, fspec, field, usage="read-write"): field = field["_replace_enum"] replace_if_exists = True - derived = None + derived, enum, enum_name, enum_usage = None, None, None, None for ftag in iter_fields(rtag, fspec): name = ftag.find('name').text - if derived is None: + + if enum is None: enum = make_enumerated_values(name, field, usage=usage) enum_name = enum.find('name').text enum_usage = enum.find('usage').text - for ev in ftag.iter('enumeratedValues'): - ev_usage_tag = ev.find('usage') - ev_usage = ev_usage_tag.text if ev_usage_tag is not None else 'read-write' - if ev_usage == enum_usage or ev_usage == "read-write": - if replace_if_exists: - ftag.remove(ev) - else: - print(pname, fspec, field) - raise SvdPatchError( - "{}: field {} already has enumeratedValues for {}. Use '_replace_enum' to overwrite." - .format(pname, name, ev_usage)) + + for ev in ftag.iter('enumeratedValues'): + ev_usage_tag = ev.find('usage') + ev_usage = ev_usage_tag.text if ev_usage_tag is not None else 'read-write' + if ev_usage == enum_usage or ev_usage == "read-write": + if replace_if_exists: + ftag.remove(ev) + else: + print(pname, fspec, field) + raise SvdPatchError( + "{}: field {} already has enumeratedValues for {}. Use '_replace_enum' to overwrite." + .format(pname, name, ev_usage)) + + if derived is None: ftag.append(enum) derived = make_derived_enumerated_values(enum_name) else: -- 2.48.1