Skip to content

Commit e41895b

Browse files
committed
check bitmask on _add
1 parent 666ee0d commit e41895b

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-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

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ This changelog tracks the Rust `svdtools` project. See
1313
## [v0.3.21] 2024-12-31
1414

1515
* `_derive` field
16+
* WARN when add field intersecting with other fields
1617

1718
## [v0.3.20] 2024-11-14
1819

src/patch/mod.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use svd_parser::svd::{
1616
WriteConstraintRange,
1717
};
1818
use svd_parser::SVDError::DimIndexParse;
19-
use svd_rs::{BitRange, DimArrayIndex, DimElement, DimElementBuilder, MaybeArray};
19+
use svd_rs::{BitRange, DimArrayIndex, DimElement, DimElementBuilder, Field, MaybeArray};
2020
use yaml_rust::{yaml::Hash, Yaml, YamlLoader};
2121

2222
use hashlink::linked_hash_map;
@@ -888,6 +888,21 @@ impl Interpolate for FieldPath {
888888
}
889889
}
890890

891+
fn bitmask(f: &Field) -> u64 {
892+
let BitRange { offset, width, .. } = f.bit_range;
893+
let mask = (!0u64 >> (64 - width)) << offset;
894+
match f {
895+
Field::Single(_) => mask,
896+
Field::Array(_, d) => {
897+
let mut bits = 0;
898+
for i in 0..d.dim {
899+
bits |= mask << (i * d.dim_increment);
900+
}
901+
bits
902+
}
903+
}
904+
}
905+
891906
#[cfg(test)]
892907
mod tests {
893908
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

@@ -347,6 +341,10 @@ impl RegisterExt for Register {
347341
} else {
348342
fnew.single()
349343
};
344+
let exist_bits = self.get_bitmask();
345+
if exist_bits & super::bitmask(&fnew) != 0 {
346+
log::warn!("field {fname} conflicts with other fields in register {rpath}");
347+
}
350348
self.fields.get_or_insert_with(Default::default).push(fnew);
351349
Ok(())
352350
}

0 commit comments

Comments
 (0)