Skip to content

Commit a92657b

Browse files
committed
shorthand derive across cluster
1 parent 25985dc commit a92657b

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

CHANGELOG-rust.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ This changelog tracks the Rust `svdtools` project. See
55

66
## [Unreleased]
77

8+
## [v0.4.3] 2025-01-31
9+
10+
* Allow shorthand when `_derive` across clusters
11+
812
## [v0.4.2] 2025-01-25
913

1014
* Fix optional `fspec` in `set_field_modified_write_values`
@@ -209,7 +213,8 @@ Other changes:
209213

210214
* Initial release with feature-parity with the Python project.
211215

212-
[Unreleased]: https://github.com/rust-embedded/svdtools/compare/v0.4.2...HEAD
216+
[Unreleased]: https://github.com/rust-embedded/svdtools/compare/v0.4.3...HEAD
217+
[v0.4.3]: https://github.com/rust-embedded/svdtools/compare/v0.4.2...v0.4.3
213218
[v0.4.2]: https://github.com/rust-embedded/svdtools/compare/v0.4.1...v0.4.2
214219
[v0.4.1]: https://github.com/rust-embedded/svdtools/compare/v0.4.0...v0.4.1
215220
[v0.4.0]: https://github.com/rust-embedded/svdtools/compare/v0.3.21...v0.4.0

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "svdtools"
3-
version = "0.4.2"
3+
version = "0.4.3"
44
repository = "https://github.com/rust-embedded/svdtools/"
55
description = "Tool for modifying bugs in CMSIS SVD"
66
authors = ["Andrey Zgarbul <[email protected]>", "MarcoIeni"]

src/patch/peripheral.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,24 @@ pub(crate) trait RegisterBlockExt: Name {
247247
/// Remove fields from rname and mark it as derivedFrom rderive.
248248
/// Update all derivedFrom referencing rname
249249
fn derive_register(&mut self, rspec: &str, rderive: &Yaml, bpath: &BlockPath) -> PatchResult {
250+
fn make_path(dpath: &str, bpath: &BlockPath) -> String {
251+
let mut parts = dpath.split(".");
252+
match (parts.next(), parts.next(), parts.next()) {
253+
(Some(cname), Some(rname), None) if !bpath.path.is_empty() => bpath
254+
.parent()
255+
.unwrap()
256+
.new_cluster(cname)
257+
.new_register(rname)
258+
.to_string(),
259+
_ => dpath.into(),
260+
}
261+
}
250262
let (rspec, ignore) = rspec.spec();
251263
let (rderive, dim, info) = if let Some(rderive) = rderive.as_str() {
252264
(
253265
rderive,
254266
None,
255-
RegisterInfo::builder().derived_from(Some(rderive.into())),
267+
RegisterInfo::builder().derived_from(Some(make_path(rderive, bpath))),
256268
)
257269
} else if let Some(hash) = rderive.as_hash() {
258270
let rderive = hash.get_str("_from")?.ok_or_else(|| {
@@ -261,7 +273,7 @@ pub(crate) trait RegisterBlockExt: Name {
261273
(
262274
rderive,
263275
make_dim_element(hash)?,
264-
make_register(hash, Some(bpath))?.derived_from(Some(rderive.into())),
276+
make_register(hash, Some(bpath))?.derived_from(Some(make_path(rderive, bpath))),
265277
)
266278
} else {
267279
return Err(anyhow!("derive: incorrect syntax for {rspec}"));
@@ -1783,11 +1795,12 @@ fn collect_in_cluster(
17831795
.address_offset(address_offset);
17841796
let mut config = config.clone();
17851797
config.update_fields = true;
1798+
let cpath = path.new_cluster(cname);
17861799
let mut cluster = if single {
17871800
for (_, (rmod, mut registers)) in rdict.into_iter() {
17881801
let mut reg = registers.swap_remove(0);
17891802
let rmod = rmod.hash()?;
1790-
reg.process(rmod, &path.new_cluster(cname), &config)
1803+
reg.process(rmod, &cpath, &config)
17911804
.with_context(|| format!("Processing register `{}`", reg.name))?;
17921805
if let Some(name) = rmod.get_str("name")? {
17931806
reg.name = name.into();
@@ -1801,7 +1814,6 @@ fn collect_in_cluster(
18011814
for (rspec, (rmod, mut registers)) in rdict.into_iter() {
18021815
let mut reg = registers.swap_remove(0);
18031816
let rmod = rmod.hash()?;
1804-
let cpath = path.new_cluster(cname);
18051817
reg.process(rmod, &cpath, &config)
18061818
.with_context(|| format!("Processing register `{}`", reg.name))?;
18071819
reg.name = if let Some(name) = rmod.get_str("name")? {

src/patch/register.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,11 +361,22 @@ impl RegisterExt for Register {
361361
fn derive_field(&mut self, fspec: &str, fderive: &Yaml, rpath: &RegisterPath) -> PatchResult {
362362
fn make_path(dpath: &str, rpath: &RegisterPath) -> String {
363363
let mut parts = dpath.split(".");
364-
if let (Some(reg), Some(field), None) = (parts.next(), parts.next(), parts.next()) {
365-
let fpath = rpath.block.new_register(reg).new_field(field);
366-
fpath.to_string()
367-
} else {
368-
dpath.into()
364+
match (parts.next(), parts.next(), parts.next(), parts.next()) {
365+
(Some(cname), Some(rname), Some(fname), None) if !rpath.block.path.is_empty() => {
366+
let fpath = rpath
367+
.block
368+
.parent()
369+
.unwrap()
370+
.new_cluster(cname)
371+
.new_register(rname)
372+
.new_field(fname);
373+
fpath.to_string()
374+
}
375+
(Some(reg), Some(field), None, None) => {
376+
let fpath = rpath.block.new_register(reg).new_field(field);
377+
fpath.to_string()
378+
}
379+
_ => dpath.into(),
369380
}
370381
}
371382
let (fspec, ignore) = fspec.spec();

0 commit comments

Comments
 (0)