Skip to content

Commit 11d8b05

Browse files
authored
Merge pull request #212 from rust-embedded/cluster-of-arrays
cluster of arrays
2 parents 17ba105 + 3fdff29 commit 11d8b05

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

CHANGELOG-rust.md

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

88
* Add `_expand_array`
9+
* Allow register arrays in `collect_in_cluster`
10+
* Custom `dimIncrement` for 1-element `cluster` or `array`
911

1012
## [v0.3.10] 2024-02-26
1113

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: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,10 +1249,8 @@ fn collect_in_array(
12491249
let dim_increment = if dim > 1 {
12501250
offsets[1] - offsets[0]
12511251
} else {
1252-
registers[0]
1253-
.properties
1254-
.size
1255-
.map(|s| s / 8)
1252+
rmod.get_u32("dimIncrement")?
1253+
.or_else(|| registers[0].properties.size.map(|s| s / 8))
12561254
.unwrap_or_default()
12571255
};
12581256
if !check_offsets(&offsets, dim_increment) {
@@ -1359,24 +1357,24 @@ fn collect_in_cluster(
13591357
let mut first = None;
13601358
let mut dim = 0;
13611359
let mut dim_index = Vec::new();
1362-
let mut dim_increment = 0;
1360+
let mut dim_increment = cmod.get_u32("dimIncrement")?.unwrap_or(0);
13631361
let mut offsets = Vec::new();
13641362
let mut place = usize::MAX;
13651363
let mut rspecs = Vec::new();
13661364
let single = !cname.contains("%s");
13671365

13681366
for (rspec, rmod) in cmod {
13691367
let rspec = rspec.str()?;
1370-
if rspec == "description" {
1368+
if rspec == "description" || rspec == "dimIncrement" {
13711369
continue;
13721370
}
13731371
let mut registers = Vec::new();
13741372
let mut i = 0;
13751373
let (rspec, ignore) = rspec.spec();
13761374
while i < regs.len() {
13771375
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) {
1376+
RegisterCluster::Register(r) if matchname(&r.name, rspec) => {
1377+
if let RegisterCluster::Register(r) = regs.remove(i) {
13801378
registers.push(r);
13811379
place = place.min(i);
13821380
}
@@ -1399,15 +1397,29 @@ fn collect_in_cluster(
13991397
));
14001398
}
14011399
rspecs.push(rspec.to_string());
1400+
14021401
if single {
14031402
if registers.len() > 1 {
14041403
return Err(anyhow!("{path}: more than one registers {rspec} found"));
14051404
}
14061405
} else {
14071406
registers.sort_by_key(|r| r.address_offset);
1407+
if let Register::Array(_, rdim) = &registers[0] {
1408+
if !registers
1409+
.iter()
1410+
.skip(1)
1411+
.all(|r| matches!(r, Register::Array(_, d) if d == rdim))
1412+
{
1413+
return Err(anyhow!("`{rspec}` have different dim blocks"));
1414+
}
1415+
} else if !registers.iter().skip(1).all(|r| r.is_single()) {
1416+
return Err(anyhow!(
1417+
"Some of `{rspec}` registers are arrays and some are not"
1418+
));
1419+
}
14081420
let bitmasks = registers
14091421
.iter()
1410-
.map(RegisterInfo::get_bitmask)
1422+
.map(|r| RegisterInfo::get_bitmask(r))
14111423
.collect::<Vec<_>>();
14121424
let new_dim_index = registers
14131425
.iter()
@@ -1483,7 +1495,7 @@ fn collect_in_cluster(
14831495
config.update_fields = true;
14841496
let cluster = if single {
14851497
for (_, (rmod, mut registers)) in rdict.into_iter() {
1486-
let mut reg = registers.swap_remove(0).single();
1498+
let mut reg = registers.swap_remove(0);
14871499
let rmod = rmod.hash()?;
14881500
reg.process(rmod, path, &config)
14891501
.with_context(|| format!("Processing register `{}`", reg.name))?;
@@ -1497,7 +1509,7 @@ fn collect_in_cluster(
14971509
cinfo.children(children).build(VAL_LVL)?.single()
14981510
} else {
14991511
for (rspec, (rmod, mut registers)) in rdict.into_iter() {
1500-
let mut reg = registers.swap_remove(0).single();
1512+
let mut reg = registers.swap_remove(0);
15011513
let rmod = rmod.hash()?;
15021514
reg.process(rmod, path, &config)
15031515
.with_context(|| format!("Processing register `{}`", reg.name))?;

0 commit comments

Comments
 (0)