Skip to content

Commit

Permalink
Merge pull request #227 from simpkins/derive_from
Browse files Browse the repository at this point in the history
Skip checking the derivedFrom destination if it is an absolute name
  • Loading branch information
burrbull committed Apr 4, 2024
2 parents 763135a + b9de3a4 commit 578aebe
Show file tree
Hide file tree
Showing 9 changed files with 401 additions and 6 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,5 @@ itertools = "0.12.0"
phf = { version = "0.11", features = ["macros"] }

[dev-dependencies]
similar = "2.5.0"
tempfile = "3.3"
102 changes: 102 additions & 0 deletions res/cluster/esp32s3.svd
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<device schemaVersion="1.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1.xsd">
<name>ESP32S3</name>
<peripherals>
<peripheral>
<name>USB0</name>
<description>USB OTG (On-The-Go)</description>
<groupName>USB</groupName>
<baseAddress>0x60080000</baseAddress>
<addressBlock>
<offset>0x0</offset>
<size>0x2A0</size>
<usage>registers</usage>
</addressBlock>
<registers>
<register>
<name>DIEPCTL0</name>
<addressOffset>0x900</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>D_MPS0</name>
<bitOffset>0</bitOffset>
<bitWidth>2</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT0</name>
<addressOffset>0x908</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>D_XFERCOMPL0</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPCTL1</name>
<addressOffset>0x920</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>D_MPS1</name>
<bitOffset>0</bitOffset>
<bitWidth>11</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT1</name>
<addressOffset>0x928</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>D_XFERCOMPL1</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPCTL2</name>
<addressOffset>0x940</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>D_MPS2</name>
<bitOffset>0</bitOffset>
<bitWidth>11</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT2</name>
<addressOffset>0x948</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>D_XFERCOMPL2</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
</registers>
</peripheral>
</peripherals>
</device>
88 changes: 88 additions & 0 deletions res/cluster/expected.svd
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<device schemaVersion="1.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1.xsd">
<name>ESP32S3</name>
<peripherals>
<peripheral>
<name>USB0</name>
<description>USB OTG (On-The-Go)</description>
<groupName>USB</groupName>
<baseAddress>0x60080000</baseAddress>
<addressBlock>
<offset>0x0</offset>
<size>0x2A0</size>
<usage>registers</usage>
</addressBlock>
<registers>
<cluster>
<name>IN_EP0</name>
<description>Device IN Endpoint 0</description>
<addressOffset>0x900</addressOffset>
<register>
<name>DIEPCTL</name>
<addressOffset>0x0</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>MPS</name>
<bitOffset>0</bitOffset>
<bitWidth>2</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT</name>
<addressOffset>0x8</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>XFERCOMPL</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
</cluster>
<cluster>
<dim>2</dim>
<dimIncrement>0x20</dimIncrement>
<dimIndex>1-2</dimIndex>
<name>IN_EP%s</name>
<description>Device IN Endpoints 1-6</description>
<addressOffset>0x920</addressOffset>
<register>
<name>DIEPCTL</name>
<addressOffset>0x0</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>MPS</name>
<bitOffset>0</bitOffset>
<bitWidth>11</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT</name>
<addressOffset>0x8</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>XFERCOMPL</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
</cluster>
</registers>
</peripheral>
</peripherals>
</device>
28 changes: 28 additions & 0 deletions res/cluster/patch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
_svd: esp32s3.svd

USB0:
_cluster:
IN_EP0:
description: "Device IN Endpoint 0"
DIEPCTL0:
name: DIEPCTL
_modify:
D_MPS0:
name: MPS
DIEPINT0:
name: DIEPINT
_modify:
D_XFERCOMPL0:
name: XFERCOMPL
IN_EP%s:
description: "Device IN Endpoints 1-6"
DIEPCTL[1-6]:
name: DIEPCTL
_modify:
D_MPS1:
name: MPS
DIEPINT[1-6]:
name: DIEPINT
_modify:
D_XFERCOMPL1:
name: XFERCOMPL
79 changes: 79 additions & 0 deletions res/cross_cluster_derive/expected.svd
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<device schemaVersion="1.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="CMSIS-SVD_Schema_1_1.xsd">
<name>ESP32S3</name>
<peripherals>
<peripheral>
<name>USB0</name>
<description>USB OTG (On-The-Go)</description>
<groupName>USB</groupName>
<baseAddress>0x60080000</baseAddress>
<addressBlock>
<offset>0x0</offset>
<size>0x2A0</size>
<usage>registers</usage>
</addressBlock>
<registers>
<cluster>
<name>IN_EP0</name>
<description>Device IN Endpoint 0</description>
<addressOffset>0x900</addressOffset>
<register>
<name>DIEPCTL</name>
<addressOffset>0x0</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>MPS</name>
<bitOffset>0</bitOffset>
<bitWidth>2</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register>
<name>DIEPINT</name>
<addressOffset>0x8</addressOffset>
<size>0x20</size>
<fields>
<field>
<name>XFERCOMPL</name>
<bitOffset>0</bitOffset>
<bitWidth>1</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
</cluster>
<cluster>
<dim>2</dim>
<dimIncrement>0x20</dimIncrement>
<dimIndex>1-2</dimIndex>
<name>IN_EP%s</name>
<description>Device IN Endpoints 1-6</description>
<addressOffset>0x920</addressOffset>
<register>
<name>DIEPCTL</name>
<addressOffset>0x0</addressOffset>
<size>0x20</size>
<resetValue>0x00008000</resetValue>
<fields>
<field>
<name>MPS</name>
<bitOffset>0</bitOffset>
<bitWidth>11</bitWidth>
<access>read-write</access>
</field>
</fields>
</register>
<register derivedFrom="USB0.IN_EP0.DIEPINT">
<name>DIEPINT</name>
<addressOffset>0x8</addressOffset>
</register>
</cluster>
</registers>
</peripheral>
</peripherals>
</device>
36 changes: 36 additions & 0 deletions res/cross_cluster_derive/patch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
_svd: ../cluster/esp32s3.svd

USB0:
_cluster:
# Endpoint 0 is different than the other endpoints, and does not have
# quite the same register definitions. We therefore have to cluster it
# by itself.
IN_EP0:
description: "Device IN Endpoint 0"
DIEPCTL0:
name: DIEPCTL
_modify:
D_MPS0:
name: MPS
DIEPINT0:
name: DIEPINT
_modify:
D_XFERCOMPL0:
name: XFERCOMPL
# The remaining endpoints are all the same.
IN_EP%s:
description: "Device IN Endpoints 1-6"
DIEPCTL[1-6]:
name: DIEPCTL
_modify:
D_MPS1:
name: MPS
DIEPINT[1-6]:
name: DIEPINT
_modify:
D_XFERCOMPL1:
name: XFERCOMPL
_derive:
# The DIEPINT registers for endpoints 1-N are the same as endpoint 0,
# so use the same type definition.
DIEPINT: USB0.IN_EP0.DIEPINT
2 changes: 1 addition & 1 deletion src/patch/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use yaml_rust::{yaml::Hash, Yaml, YamlLoader};
use anyhow::{anyhow, Context, Result};
pub type PatchResult = anyhow::Result<()>;

mod device;
pub(crate) mod device;
use device::DeviceExt;
mod iterators;
mod peripheral;
Expand Down
33 changes: 29 additions & 4 deletions src/patch/peripheral.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,10 +255,18 @@ pub(crate) trait RegisterBlockExt: Name {
return Err(anyhow!("derive: incorrect syntax for {rname}"));
};

self.get_reg(rderive).ok_or_else(|| {
let present = self.present_registers();
anyhow!("Could not find `{bpath}:{rderive}. Present registers: {present}.")
})?;
// Attempt to verify that the destination register name is correct.
if rderive.contains('.') {
// This is an absolute identifier name
// TODO: at the moment we cannot verify absolute names. We don't have a reference
// to the Device in order to try and look up the name. Since we are mutating a member
// of the device, we cannot get a reference to it.
} else {
self.get_reg(rderive).ok_or_else(|| {
let present = self.present_registers();
anyhow!("Could not find `{bpath}:{rderive}. Present registers: {present}.")
})?;
}

match self.get_mut_reg(rname) {
Some(register) => register.modify_from(info, VAL_LVL)?,
Expand Down Expand Up @@ -1498,3 +1506,20 @@ fn collect_in_cluster(
regs.insert(place, RegisterCluster::Cluster(cluster));
Ok(())
}

#[cfg(test)]
mod tests {
use crate::test_utils;
use anyhow::Result;
use std::path::Path;

#[test]
fn cluster() -> Result<()> {
test_utils::test_expected(Path::new("cluster"))
}

#[test]
fn cross_cluster_derive() -> Result<()> {
test_utils::test_expected(Path::new("cross_cluster_derive"))
}
}
Loading

0 comments on commit 578aebe

Please sign in to comment.