rust-embedded / svd2rust

Generate Rust register maps (`struct`s) from SVD files
Apache License 2.0
674 stars 147 forks source link

Build Errors in Code Generated from Renesas RA6M3 SVD #852

Open AddisonH opened 2 weeks ago

AddisonH commented 2 weeks ago

Hello, I am seeing many errors when attempting to build a PAC from a Renesas RA6M3 SVD file. I've already fixed some errors that I found in the Renesas provided file. I've attached the modified file below.

R7FA6M3AH.svd.txt

Here is a sample of the errors that I'm seeing:

Error E0412

``` error[E0412]: cannot find type `P40pfs` in this scope --> src\pfs.rs:68:15 | 68 | p400pfs: [P40pfs; 10], | ^^^^^^ help: a type alias with a similar name exists: `P400pfs` ... 2702 | pub type P100pfs = crate::Reg; | ---------------------------------------------------- similarly named type alias `P400pfs` defined here ```

Error E0592

``` error[E0592]: duplicate definitions with name `offset` --> src\generic.rs:223:5 | 223 | pub const fn offset(&self) -> u8 { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `offset` | ::: src\glcdc\tcon_tim.rs:28:5 | 28 | pub fn offset(self) -> &'a mut crate::W { | -------------------------------------------- other definition for `offset` ```

Error E0599

``` error[E0599]: the method `variant` exists for struct `FieldWriter<'a, REG, 11, Fh, Safe>`, but its trait bounds were not satisfied --> src\glcdc\bg_peri.rs:29:14 | 7 | pub struct Fh(u16); | ------------- doesn't satisfy `Fh: generic::IsEnum` ... 29 | self.variant(Fh::Fh) | ^^^^^^^ method cannot be called on `FieldWriter<'a, REG, 11, Fh, Safe>` due to unsatisfied trait bounds | ::: src\generic\raw.rs:44:1 | 44 | pub struct FieldWriter<'a, REG, const WI: u8, FI = u8, Safety = Unsafe> | ----------------------------------------------------------------------- method `variant` not found for this struct | note: trait bound `Fh: generic::IsEnum` was not satisfied --> src\generic.rs:312:9 | 309 | impl<'a, REG, const WI: u8, FI, Safety> FieldWriter<'a, REG, WI, FI, Safety> | ------------------------------------ ... 312 | FI: IsEnum, | ^^^^^^ unsatisfied trait bound introduced here note: the trait `generic::IsEnum` must be implemented --> src\generic.rs:54:1 | 54 | pub trait IsEnum: FieldSpec {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ```

Here is the full log: cargo_check.txt

I've tested this SVD file with several versions of svd2rust. I found that version 0.30.x works without error, but I begin to have trouble starting with version 0.31.x and up. These error logs are from the latest tagged version, v 0.33.4.

Here is my PAC that I'm working on: ra6m3-pac.zip

Please let me know if I can offer up any more detail or assist with debugging. Thanks.

burrbull commented 2 weeks ago

It looks like 2 main issues here:

1st was introduced in #692. Looks like:

error[E0592]: duplicate definitions with name `p400pfs`
    --> src/pfs.rs:1050:5
     |
1045 |     pub const fn p400pfs(&self, n: usize) -> &P400PFS {
     |     ------------------------------------------------- other definition for `p400pfs`
...
1050 |     pub const fn p400pfs(&self) -> &P400PFS {
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `p400pfs`

There should be pub const fn p40pfs(&self, n: usize) -> &P40PFS on 1045. Register description:

                <register derivedFrom="P100PFS">
                    <dim>10</dim>
                    <dimIncrement>0x4</dimIncrement>
                    <dimIndex>0-9</dimIndex>
                    <name>P40%sPFS</name>
                    <description>P40%s Pin Function Control Register</description>
                    <addressOffset>0x100</addressOffset>
                    <size>32</size>
                    <access>read-write</access>
                    <resetValue>0x00000000</resetValue>
                    <resetMask>0xFFFFFFFD</resetMask>
                </register>

2nd is related to special case not covered in #767. EnumeratedValues with only one isDefault value.

                        <field>
                            <name>GAIN01</name>
                            <description>Gain value of area 1Unsigned 11-bit fixed point</description>
                            <lsb>0</lsb>
                            <msb>10</msb>
                            <access>read-write</access>
                            <enumeratedValues>
                                <enumeratedValue>
                                    <name>GAIN01</name>
                                    <description>GAIN01/1024</description>
                                    <isDefault>true</isDefault>
                                </enumeratedValue>
                            </enumeratedValues>
                        </field>
burrbull commented 2 weeks ago

cc @n8tlarsen