Skip to content

SVD with faulty field access values cannot be loaded by the Rust version of svdtools patch #291

Description

@romainreignier

Hi,
I am using the Python version of svdtools to patch some GigaDevice GD32F303 SVD files.
In these files, the SVD does not even comply with CMSIS-SVD.xsd because I have some fields with read or write access:

<field>
    <name>IRC48MSTBIC</name>
    <description>Internal 48 MHz RC oscillator Stabilization Interrupt Clear</description>
    <bitOffset>22</bitOffset>
    <bitWidth>1</bitWidth>
    <access>write</access>
</field>

In the YAML, I have some rules to change this:

_svd: ../svd/gd32f303.svd

RCU:
  ADDINT:
    _modify:
      IRC48MSTBIC:
        access: write-only
RTC:
  PSC[LH]:
    _modify:
      PSC:
        access: write-only
  _modify:
    DIV[LH]:
      access: read-only
    ALRM[LH]:
      access: write-only
USART0:
  STAT1:
    _modify:
      EBF:
        access: write-only
      RTF:
        access: write-only

I have tried the Rust version of svdtools to see the difference but I cannot even run it, I have this error:

$ svdtools patch devices/gd32f303.yaml svd/gd32f303.svd.patched.rust
[2025-05-29T13:39:58Z ERROR svdtools::cli] by svdtools (0.5.0)
    
    Caused by:
        0: In device `GD32F30x_XD`
        1: In peripheral `RCU`
        2: In register `ADDINT`
        3: In field `IRC48MSTBIC`
        4: Parsing unknown access at 25442:15
        5: unknown access variant 'write' found

I have ran a debugger on it and this is this line of svd-parser that fails: https://github.com/rust-embedded/svd/blob/60a3b6019a4375e683e9bc3ffbe9ad6aeebb6828/svd-parser/src/field.rs#L32 called from this line in svdtools:

let mut dev = svd_parser::parse_with_config(&contents, &parser_config)?;

I understand that svd-parser should only load valid SVD file.
But svdtools is made to fix buggy SVD files but cannot be used on a SVD file not following the spec.

For now, I can keep using the more permissive Python version. But I wanted to let you know of this issue.

I can also do a two-step process with a first pass with the Python version and only the YAML provided above and then a second pass with the Rust version on the Python patched SVD :)

One of the faulty SVD for reference: https://github.com/gd32-rust/gd32-rs/blob/2e4796265091558e922c5d69d0a31ffd641548b2/svd/vendor/GD32F30x_XD.svd

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions