Skip to content

Commit 5e79524

Browse files
authored
Merge pull request #219 from rust-embedded/dimArrayIndex
dimArrayIndex
2 parents 4785e90 + a624e80 commit 5e79524

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

CHANGELOG-rust.md

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

66
## [Unreleased]
77

8+
* `dimArrayIndex` support
89
* Allow to modify registers in `_cluster:`
910
* Add addressOffset check in `collect_in_cluster`
1011
* Refactor `RegisterBlockExt`, use `BlockPath` for better errors

src/patch/mod.rs

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use svd_parser::svd::{
1212
WriteConstraintRange,
1313
};
1414
use svd_parser::SVDError::DimIndexParse;
15-
use svd_rs::{BitRange, DimElement, DimElementBuilder, MaybeArray};
15+
use svd_rs::{BitRange, DimArrayIndex, DimElement, DimElementBuilder, MaybeArray};
1616
use yaml_rust::{yaml::Hash, Yaml, YamlLoader};
1717

1818
use anyhow::{anyhow, Context, Result};
@@ -323,10 +323,13 @@ fn make_ev_array(values: &Hash) -> Result<EnumeratedValuesBuilder> {
323323
));
324324
}
325325
let vd = vd.vec()?;
326-
let description = vd.get(1).and_then(Yaml::as_str).ok_or_else(|| {
327-
anyhow!("enumeratedValue can't have empty description for value {vname}")
328-
})?;
329-
let value = vd[0].i64()?;
326+
let Some((value, description)) = vd.first().zip(vd.get(1)) else {
327+
return Err(anyhow!(
328+
"enumeratedValue {vname} can't have empty value or description"
329+
));
330+
};
331+
let value = value.i64()?;
332+
let description = description.str()?;
330333
let def = value == -1;
331334
let value = value as u64;
332335
let ev = EnumeratedValue::builder()
@@ -398,8 +401,11 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
398401
None
399402
})
400403
.dim_name(h.get_string("dimName")?)
401-
// TODO
402-
.dim_array_index(None);
404+
.dim_array_index(
405+
h.get_hash("dimArrayIndex")?
406+
.map(make_dim_array_index)
407+
.transpose()?,
408+
);
403409
if let Some(dim) = h.get_u32("dim")? {
404410
d = d.dim(dim)
405411
}
@@ -413,6 +419,33 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
413419
})
414420
}
415421

422+
fn make_dim_array_index(h: &Hash) -> Result<DimArrayIndex> {
423+
let mut values = Vec::new();
424+
for (vname, vd) in h {
425+
let vname = vname.str()?;
426+
if let Some(vd) = vd.as_vec() {
427+
let Some((value, description)) = vd.first().zip(vd.get(1)) else {
428+
return Err(anyhow!(
429+
"enumeratedValue {vname} can't have empty value or description"
430+
));
431+
};
432+
let value = value.i64()?;
433+
let description = description.str()?;
434+
values.push(
435+
EnumeratedValue::builder()
436+
.value(Some(value as u64))
437+
.description(Some(description.into()))
438+
.build(VAL_LVL)?,
439+
)
440+
}
441+
}
442+
443+
Ok(DimArrayIndex {
444+
header_enum_name: h.get_string("headerEnumName")?,
445+
values,
446+
})
447+
}
448+
416449
fn modify_dim_element<T: Clone>(
417450
tag: &mut MaybeArray<T>,
418451
dim: &Option<DimElementBuilder>,

0 commit comments

Comments
 (0)