Skip to content

Commit 5572cbd

Browse files
committed
Fix calculating mwv bitmasks with field arrays
1 parent 89af369 commit 5572cbd

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
77

88
## [Unreleased]
99

10+
- Fix calculating `modifiedWriteValues` bitmasks with field arrays
1011
- Fix building without `yaml` feature
1112
- Compatibility with `riscv` 0.12 and `riscv-rt` 0.13
1213
- Add `riscv_config` section in `settings.yaml`

src/generate/register.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,15 +1343,23 @@ pub fn fields(
13431343
}
13441344

13451345
// Update register modify bit masks
1346-
let bitmask = (u64::MAX >> (64 - width)) << offset;
1347-
use ModifiedWriteValues::*;
1348-
match mwv {
1349-
Modify | Set | Clear => {}
1350-
OneToSet | OneToClear | OneToToggle => {
1351-
one_to_modify_fields_bitmap |= bitmask;
1352-
}
1353-
ZeroToClear | ZeroToSet | ZeroToToggle => {
1354-
zero_to_modify_fields_bitmap |= bitmask;
1346+
let offsets = match f {
1347+
MaybeArray::Array(info, dim) => (0..dim.dim)
1348+
.map(|i| i * dim.dim_increment + info.bit_offset())
1349+
.collect(),
1350+
MaybeArray::Single(info) => vec![info.bit_offset()],
1351+
};
1352+
for o in offsets {
1353+
let bitmask = (u64::MAX >> (64 - width)) << o;
1354+
use ModifiedWriteValues::*;
1355+
match mwv {
1356+
Modify | Set | Clear => {}
1357+
OneToSet | OneToClear | OneToToggle => {
1358+
one_to_modify_fields_bitmap |= bitmask;
1359+
}
1360+
ZeroToClear | ZeroToSet | ZeroToToggle => {
1361+
zero_to_modify_fields_bitmap |= bitmask;
1362+
}
13551363
}
13561364
}
13571365
}

0 commit comments

Comments
 (0)