Skip to content

Commit 084c5dc

Browse files
committed
check bitmask on _add
1 parent a24feb5 commit 084c5dc

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

.github/workflows/ci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,4 @@ jobs:
6363
python -m pip install --upgrade pip
6464
pip install .
6565
- name: Check
66-
run: bash tools/check_${{ matrix.target }}.sh
66+
run: RUST_LOG=warn bash tools/check_${{ matrix.target }}.sh

CHANGELOG-rust.md

+2
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+
* WARN when add field intersecting with other fields
9+
810
## [v0.3.20] 2024-11-14
911

1012
* Implement `_expand_cluster`

src/patch/mod.rs

+16-1
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

+5-7
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,10 @@ 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+
log::warn!("field {fname} conflicts with other fields in register {rpath}");
331+
}
334332
self.fields.get_or_insert_with(Default::default).push(fnew);
335333
Ok(())
336334
}

0 commit comments

Comments
 (0)