~ruther/avr-device

a8ea131202942e2e7884b90761cf66b62c5c2ca8 — Rahix 4 years ago c4a0807
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 <rahix@rahix.de>
1 files changed, 17 insertions(+), 13 deletions(-)

M patch/svdpatch.py
M patch/svdpatch.py => patch/svdpatch.py +17 -13
@@ 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:

Do not follow this link