From a92657b765147daefb32b4e52909b1754d549ea3 Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Fri, 31 Jan 2025 08:58:54 +0300 Subject: [PATCH] shorthand derive across cluster --- CHANGELOG-rust.md | 7 ++++++- Cargo.toml | 2 +- src/patch/peripheral.rs | 20 ++++++++++++++++---- src/patch/register.rs | 21 ++++++++++++++++----- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/CHANGELOG-rust.md b/CHANGELOG-rust.md index 3d68df1..e100575 100644 --- a/CHANGELOG-rust.md +++ b/CHANGELOG-rust.md @@ -5,6 +5,10 @@ This changelog tracks the Rust `svdtools` project. See ## [Unreleased] +## [v0.4.3] 2025-01-31 + +* Allow shorthand when `_derive` across clusters + ## [v0.4.2] 2025-01-25 * Fix optional `fspec` in `set_field_modified_write_values` @@ -209,7 +213,8 @@ Other changes: * Initial release with feature-parity with the Python project. -[Unreleased]: https://github.com/rust-embedded/svdtools/compare/v0.4.2...HEAD +[Unreleased]: https://github.com/rust-embedded/svdtools/compare/v0.4.3...HEAD +[v0.4.3]: https://github.com/rust-embedded/svdtools/compare/v0.4.2...v0.4.3 [v0.4.2]: https://github.com/rust-embedded/svdtools/compare/v0.4.1...v0.4.2 [v0.4.1]: https://github.com/rust-embedded/svdtools/compare/v0.4.0...v0.4.1 [v0.4.0]: https://github.com/rust-embedded/svdtools/compare/v0.3.21...v0.4.0 diff --git a/Cargo.toml b/Cargo.toml index c699e72..6c43b86 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svdtools" -version = "0.4.2" +version = "0.4.3" repository = "https://github.com/rust-embedded/svdtools/" description = "Tool for modifying bugs in CMSIS SVD" authors = ["Andrey Zgarbul ", "MarcoIeni"] diff --git a/src/patch/peripheral.rs b/src/patch/peripheral.rs index 8a16820..2f94082 100644 --- a/src/patch/peripheral.rs +++ b/src/patch/peripheral.rs @@ -247,12 +247,24 @@ pub(crate) trait RegisterBlockExt: Name { /// Remove fields from rname and mark it as derivedFrom rderive. /// Update all derivedFrom referencing rname fn derive_register(&mut self, rspec: &str, rderive: &Yaml, bpath: &BlockPath) -> PatchResult { + fn make_path(dpath: &str, bpath: &BlockPath) -> String { + let mut parts = dpath.split("."); + match (parts.next(), parts.next(), parts.next()) { + (Some(cname), Some(rname), None) if !bpath.path.is_empty() => bpath + .parent() + .unwrap() + .new_cluster(cname) + .new_register(rname) + .to_string(), + _ => dpath.into(), + } + } let (rspec, ignore) = rspec.spec(); let (rderive, dim, info) = if let Some(rderive) = rderive.as_str() { ( rderive, None, - RegisterInfo::builder().derived_from(Some(rderive.into())), + RegisterInfo::builder().derived_from(Some(make_path(rderive, bpath))), ) } else if let Some(hash) = rderive.as_hash() { let rderive = hash.get_str("_from")?.ok_or_else(|| { @@ -261,7 +273,7 @@ pub(crate) trait RegisterBlockExt: Name { ( rderive, make_dim_element(hash)?, - make_register(hash, Some(bpath))?.derived_from(Some(rderive.into())), + make_register(hash, Some(bpath))?.derived_from(Some(make_path(rderive, bpath))), ) } else { return Err(anyhow!("derive: incorrect syntax for {rspec}")); @@ -1783,11 +1795,12 @@ fn collect_in_cluster( .address_offset(address_offset); let mut config = config.clone(); config.update_fields = true; + let cpath = path.new_cluster(cname); let mut cluster = if single { for (_, (rmod, mut registers)) in rdict.into_iter() { let mut reg = registers.swap_remove(0); let rmod = rmod.hash()?; - reg.process(rmod, &path.new_cluster(cname), &config) + reg.process(rmod, &cpath, &config) .with_context(|| format!("Processing register `{}`", reg.name))?; if let Some(name) = rmod.get_str("name")? { reg.name = name.into(); @@ -1801,7 +1814,6 @@ fn collect_in_cluster( for (rspec, (rmod, mut registers)) in rdict.into_iter() { let mut reg = registers.swap_remove(0); let rmod = rmod.hash()?; - let cpath = path.new_cluster(cname); reg.process(rmod, &cpath, &config) .with_context(|| format!("Processing register `{}`", reg.name))?; reg.name = if let Some(name) = rmod.get_str("name")? { diff --git a/src/patch/register.rs b/src/patch/register.rs index 36e08b7..457f2e2 100644 --- a/src/patch/register.rs +++ b/src/patch/register.rs @@ -361,11 +361,22 @@ impl RegisterExt for Register { fn derive_field(&mut self, fspec: &str, fderive: &Yaml, rpath: &RegisterPath) -> PatchResult { fn make_path(dpath: &str, rpath: &RegisterPath) -> String { let mut parts = dpath.split("."); - if let (Some(reg), Some(field), None) = (parts.next(), parts.next(), parts.next()) { - let fpath = rpath.block.new_register(reg).new_field(field); - fpath.to_string() - } else { - dpath.into() + match (parts.next(), parts.next(), parts.next(), parts.next()) { + (Some(cname), Some(rname), Some(fname), None) if !rpath.block.path.is_empty() => { + let fpath = rpath + .block + .parent() + .unwrap() + .new_cluster(cname) + .new_register(rname) + .new_field(fname); + fpath.to_string() + } + (Some(reg), Some(field), None, None) => { + let fpath = rpath.block.new_register(reg).new_field(field); + fpath.to_string() + } + _ => dpath.into(), } } let (fspec, ignore) = fspec.spec();