Skip to content

Commit 17ba105

Browse files
authored
Merge pull request #210 from rust-embedded/expand-array
expand array
2 parents a8460c8 + aba20b2 commit 17ba105

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

CHANGELOG-rust.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ This changelog tracks the Rust `svdtools` project. See
55

66
## [Unreleased]
77

8+
* Add `_expand_array`
9+
810
## [v0.3.10] 2024-02-26
911

1012
* Allow to specify `name` for `enumeratedValues`

src/patch/peripheral.rs

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ pub trait RegisterBlockExt {
103103
/// Collect same registers in peripheral into register array
104104
fn collect_in_array(&mut self, rspec: &str, rmod: &Hash, config: &Config) -> PatchResult;
105105

106+
/// Expand register array
107+
fn expand_array(&mut self, rspec: &str, rmod: &Hash, config: &Config) -> PatchResult;
108+
106109
/// Collect registers in peripheral into clusters
107110
fn collect_in_cluster(&mut self, cname: &str, cmod: &Hash, config: &Config) -> PatchResult;
108111

@@ -337,6 +340,13 @@ impl PeripheralExt for Peripheral {
337340
}
338341
}
339342

343+
// Expand register arrays
344+
for (rspec, rmod) in pmod.hash_iter("_expand_array") {
345+
let rspec = rspec.str()?;
346+
self.expand_array(rspec, rmod.hash()?, config)
347+
.with_context(|| format!("During expand of `{rspec}` array"))?;
348+
}
349+
340350
// Collect registers in arrays
341351
for (rspec, rmod) in pmod.hash_iter("_array") {
342352
let rspec = rspec.str()?;
@@ -544,21 +554,24 @@ impl RegisterBlockExt for Peripheral {
544554
registers.retain(
545555
|rc| !matches!(rc, RegisterCluster::Register(r) if matchname(&r.name, rspec)),
546556
);
557+
Ok(())
558+
} else {
559+
Err(anyhow!("No registers or clusters"))
547560
}
548-
Ok(())
549561
}
550562

551563
fn delete_cluster(&mut self, cspec: &str) -> PatchResult {
552564
if let Some(registers) = &mut self.registers {
553565
registers.retain(
554566
|rc| !matches!(rc, RegisterCluster::Cluster(c) if matchname(&c.name, cspec)),
555567
);
568+
Ok(())
569+
} else {
570+
Err(anyhow!("No registers or clusters"))
556571
}
557-
Ok(())
558572
}
559573

560574
fn modify_cluster(&mut self, cspec: &str, cmod: &Hash) -> PatchResult {
561-
// TODO: empty error
562575
let ctags = self.iter_clusters(cspec).collect::<Vec<_>>();
563576
if !ctags.is_empty() {
564577
let cluster_builder = make_cluster(cmod)?;
@@ -567,8 +580,10 @@ impl RegisterBlockExt for Peripheral {
567580
modify_dim_element(ctag, &dim)?;
568581
ctag.modify_from(cluster_builder.clone(), VAL_LVL)?;
569582
}
583+
Ok(())
584+
} else {
585+
Err(anyhow!("No clusters"))
570586
}
571-
Ok(())
572587
}
573588

574589
fn strip_start(&mut self, prefix: &str) -> PatchResult {
@@ -621,9 +636,18 @@ impl RegisterBlockExt for Peripheral {
621636
fn collect_in_array(&mut self, rspec: &str, rmod: &Hash, config: &Config) -> PatchResult {
622637
let pname = self.name.clone();
623638
if let Some(regs) = self.registers.as_mut() {
624-
collect_in_array(regs, &pname, rspec, rmod, config)?;
639+
collect_in_array(regs, &pname, rspec, rmod, config)
640+
} else {
641+
Err(anyhow!("No registers or clusters"))
642+
}
643+
}
644+
645+
fn expand_array(&mut self, rspec: &str, rmod: &Hash, config: &Config) -> PatchResult {
646+
if let Some(regs) = self.registers.as_mut() {
647+
expand_array(regs, rspec, rmod, config)
648+
} else {
649+
Err(anyhow!("No registers or clusters"))
625650
}
626-
Ok(())
627651
}
628652

629653
fn collect_in_cluster(&mut self, cname: &str, cmod: &Hash, config: &Config) -> PatchResult {
@@ -866,6 +890,13 @@ impl ClusterExt for Cluster {
866890
}
867891
}
868892

893+
// Expand register arrays
894+
for (rspec, rmod) in pmod.hash_iter("_expand_array") {
895+
let rspec = rspec.str()?;
896+
self.expand_array(rspec, rmod.hash()?, config)
897+
.with_context(|| format!("During expand of `{rspec}` array"))?;
898+
}
899+
869900
// Collect registers in arrays
870901
for (rspec, rmod) in pmod.hash_iter("_array") {
871902
let rspec = rspec.str()?;
@@ -1096,6 +1127,11 @@ impl RegisterBlockExt for Cluster {
10961127
collect_in_array(regs, &pname, rspec, rmod, config)
10971128
}
10981129

1130+
fn expand_array(&mut self, rspec: &str, rmod: &Hash, config: &Config) -> PatchResult {
1131+
let regs = &mut self.children;
1132+
expand_array(regs, rspec, rmod, config)
1133+
}
1134+
10991135
fn collect_in_cluster(&mut self, cname: &str, cmod: &Hash, config: &Config) -> PatchResult {
11001136
let pname = self.name.clone();
11011137
let regs = &mut self.children;
@@ -1287,6 +1323,31 @@ fn collect_in_array(
12871323
Ok(())
12881324
}
12891325

1326+
fn expand_array(
1327+
regs: &mut Vec<RegisterCluster>,
1328+
rspec: &str,
1329+
_rmod: &Hash,
1330+
_config: &Config,
1331+
) -> PatchResult {
1332+
let mut found = false;
1333+
for rc in std::mem::take(regs) {
1334+
match rc {
1335+
RegisterCluster::Register(Register::Array(r, d)) if matchname(&r.name, rspec) => {
1336+
found = true;
1337+
for ri in svd::register::expand(&r, &d) {
1338+
regs.push(RegisterCluster::Register(ri.single()))
1339+
}
1340+
}
1341+
rc => regs.push(rc),
1342+
}
1343+
}
1344+
if !found {
1345+
Err(anyhow!("Register {rspec} not found"))
1346+
} else {
1347+
Ok(())
1348+
}
1349+
}
1350+
12901351
fn collect_in_cluster(
12911352
regs: &mut Vec<RegisterCluster>,
12921353
path: &str,

0 commit comments

Comments
 (0)