Skip to content

Commit 0d4a06b

Browse files
committed
cluster of arrays
1 parent 17ba105 commit 0d4a06b

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

CHANGELOG-rust.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ This changelog tracks the Rust `svdtools` project. See
66
## [Unreleased]
77

88
* Add `_expand_array`
9+
* Allow register arrays in `collect_in_cluster`
910

1011
## [v0.3.10] 2024-02-26
1112

src/patch/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,8 @@ fn spec_ind(spec: &str) -> Option<(usize, usize)> {
693693
use regex::Regex;
694694
let spec = spec.split(',').next().unwrap_or(spec);
695695
static RE: Lazy<Regex> = Lazy::new(|| {
696-
Regex::new(r"^\w*((?:[\?*]|\[\d+(?:-\d+)?\]|\[[a-zA-Z]+(?:-[a-zA-Z]+)?\])+)\w*$").unwrap()
696+
Regex::new(r"^[\w%]*((?:[\?*]|\[\d+(?:-\d+)?\]|\[[a-zA-Z]+(?:-[a-zA-Z]+)?\])+)[\w%]*$")
697+
.unwrap()
697698
});
698699
let Some(caps) = RE.captures(spec) else {
699700
return None;

src/patch/peripheral.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,8 +1375,8 @@ fn collect_in_cluster(
13751375
let (rspec, ignore) = rspec.spec();
13761376
while i < regs.len() {
13771377
match &regs[i] {
1378-
RegisterCluster::Register(Register::Single(r)) if matchname(&r.name, rspec) => {
1379-
if let RegisterCluster::Register(Register::Single(r)) = regs.remove(i) {
1378+
RegisterCluster::Register(r) if matchname(&r.name, rspec) => {
1379+
if let RegisterCluster::Register(r) = regs.remove(i) {
13801380
registers.push(r);
13811381
place = place.min(i);
13821382
}
@@ -1399,15 +1399,29 @@ fn collect_in_cluster(
13991399
));
14001400
}
14011401
rspecs.push(rspec.to_string());
1402+
14021403
if single {
14031404
if registers.len() > 1 {
14041405
return Err(anyhow!("{path}: more than one registers {rspec} found"));
14051406
}
14061407
} else {
14071408
registers.sort_by_key(|r| r.address_offset);
1409+
if let Register::Array(_, rdim) = &registers[0] {
1410+
if !registers
1411+
.iter()
1412+
.skip(1)
1413+
.all(|r| matches!(r, Register::Array(_, d) if d == rdim))
1414+
{
1415+
return Err(anyhow!("`{rspec}` have different dim blocks"));
1416+
}
1417+
} else if !registers.iter().skip(1).all(|r| r.is_single()) {
1418+
return Err(anyhow!(
1419+
"Some of `{rspec}` registers are arrays and some are not"
1420+
));
1421+
}
14081422
let bitmasks = registers
14091423
.iter()
1410-
.map(RegisterInfo::get_bitmask)
1424+
.map(|r| RegisterInfo::get_bitmask(r))
14111425
.collect::<Vec<_>>();
14121426
let new_dim_index = registers
14131427
.iter()
@@ -1483,7 +1497,7 @@ fn collect_in_cluster(
14831497
config.update_fields = true;
14841498
let cluster = if single {
14851499
for (_, (rmod, mut registers)) in rdict.into_iter() {
1486-
let mut reg = registers.swap_remove(0).single();
1500+
let mut reg = registers.swap_remove(0);
14871501
let rmod = rmod.hash()?;
14881502
reg.process(rmod, path, &config)
14891503
.with_context(|| format!("Processing register `{}`", reg.name))?;
@@ -1497,7 +1511,7 @@ fn collect_in_cluster(
14971511
cinfo.children(children).build(VAL_LVL)?.single()
14981512
} else {
14991513
for (rspec, (rmod, mut registers)) in rdict.into_iter() {
1500-
let mut reg = registers.swap_remove(0).single();
1514+
let mut reg = registers.swap_remove(0);
15011515
let rmod = rmod.hash()?;
15021516
reg.process(rmod, path, &config)
15031517
.with_context(|| format!("Processing register `{}`", reg.name))?;

0 commit comments

Comments
 (0)