Skip to content

Commit 9b45be3

Browse files
committed
check bitmask on _add
1 parent a24feb5 commit 9b45be3

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

src/patch/mod.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use svd_parser::svd::{
1414
WriteConstraintRange,
1515
};
1616
use svd_parser::SVDError::DimIndexParse;
17-
use svd_rs::{BitRange, DimArrayIndex, DimElement, DimElementBuilder, MaybeArray};
17+
use svd_rs::{BitRange, DimArrayIndex, DimElement, DimElementBuilder, Field, MaybeArray};
1818
use yaml_rust::{yaml::Hash, Yaml, YamlLoader};
1919

2020
use hashlink::linked_hash_map;
@@ -875,6 +875,21 @@ impl Interpolate for FieldPath {
875875
}
876876
}
877877

878+
fn bitmask(f: &Field) -> u64 {
879+
let BitRange { offset, width, .. } = f.bit_range;
880+
let mask = (!0u64 >> (64 - width)) << offset;
881+
match f {
882+
Field::Single(_) => mask,
883+
Field::Array(_, d) => {
884+
let mut bits = 0;
885+
for i in 0..d.dim {
886+
bits |= mask << (i * d.dim_increment);
887+
}
888+
bits
889+
}
890+
}
891+
}
892+
878893
#[cfg(test)]
879894
mod tests {
880895
use super::*;

src/patch/register.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,7 @@ pub(crate) trait RegisterInfoExt {
2828

2929
impl RegisterInfoExt for RegisterInfo {
3030
fn get_bitmask(&self) -> u64 {
31-
let mut mask = 0x0;
32-
if let Some(fields) = self.fields.as_ref() {
33-
for ftag in fields {
34-
mask |= (!0 >> (64 - ftag.bit_range.width)) << ftag.bit_range.offset;
35-
}
36-
}
37-
mask
31+
self.fields().fold(0, |mask, f| mask | super::bitmask(f))
3832
}
3933
}
4034

@@ -331,6 +325,12 @@ impl RegisterExt for Register {
331325
} else {
332326
fnew.single()
333327
};
328+
let exist_bits = self.get_bitmask();
329+
if exist_bits & super::bitmask(&fnew) != 0 {
330+
return Err(anyhow!(
331+
"field {fname} conflicts with other fields in register {rpath}"
332+
));
333+
}
334334
self.fields.get_or_insert_with(Default::default).push(fnew);
335335
Ok(())
336336
}

0 commit comments

Comments
 (0)