Skip to content

Commit 18f02e1

Browse files
committed
yet another try to fix use_mask
1 parent 7358e78 commit 18f02e1

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

src/generate/register.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::svd::{
2-
Access, BitRange, EnumeratedValues, Field, Peripheral, Register, RegisterProperties, Usage,
3-
WriteConstraint,
2+
Access, BitRange, DeriveFrom, EnumeratedValues, Field, Peripheral, Register,
3+
RegisterProperties, Usage, WriteConstraint,
44
};
55
use cast::u64;
66
use core::u64;
@@ -19,16 +19,15 @@ pub fn render(
1919
defs: &RegisterProperties,
2020
config: &Config,
2121
) -> Result<TokenStream> {
22-
let access = util::access_of(register);
22+
let properties = register.properties.derive_from(defs);
23+
let access = util::access_of(&properties, register.fields.as_deref());
2324
let name = util::name_of(register, config.ignore_groups);
2425
let span = Span::call_site();
2526
let name_pc = Ident::new(&name.to_sanitized_upper_case(), span);
2627
let name_uc_spec = Ident::new(&format!("{}_SPEC", &name.to_sanitized_upper_case()), span);
2728
let name_sc = Ident::new(&name.to_sanitized_snake_case(), span);
28-
let rsize = register
29-
.properties
29+
let rsize = properties
3030
.size
31-
.or(defs.size)
3231
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
3332
let rsize = if rsize < 8 {
3433
8
@@ -45,11 +44,6 @@ pub fn render(
4544
}))
4645
.as_ref(),
4746
);
48-
let res_val = register
49-
.properties
50-
.reset_value
51-
.or(defs.reset_value)
52-
.map(|v| v as u64);
5347

5448
let mut mod_items = TokenStream::new();
5549
let mut r_impl_items = TokenStream::new();
@@ -58,7 +52,7 @@ pub fn render(
5852

5953
let can_read = [Access::ReadOnly, Access::ReadWriteOnce, Access::ReadWrite].contains(&access);
6054
let can_write = access != Access::ReadOnly;
61-
let can_reset = res_val.is_some();
55+
let can_reset = properties.reset_value.is_some();
6256

6357
if can_read {
6458
let desc = format!("Register `{}` reader", register.name);
@@ -142,8 +136,8 @@ pub fn render(
142136
peripheral,
143137
all_peripherals,
144138
&rty,
145-
res_val,
146139
access,
140+
&properties,
147141
&mut mod_items,
148142
&mut r_impl_items,
149143
&mut w_impl_items,
@@ -262,7 +256,7 @@ pub fn render(
262256
}
263257
});
264258
}
265-
if let Some(rv) = res_val.map(util::hex) {
259+
if let Some(rv) = properties.reset_value.map(util::hex) {
266260
let doc = format!("`reset()` method sets {} to value {}", register.name, &rv);
267261
mod_items.extend(quote! {
268262
#[doc = #doc]
@@ -295,8 +289,8 @@ pub fn fields(
295289
peripheral: &Peripheral,
296290
all_peripherals: &[Peripheral],
297291
rty: &Ident,
298-
reset_value: Option<u64>,
299292
access: Access,
293+
properties: &RegisterProperties,
300294
mod_items: &mut TokenStream,
301295
r_impl_items: &mut TokenStream,
302296
w_impl_items: &mut TokenStream,
@@ -326,11 +320,11 @@ pub fn fields(
326320
let mask = u64::MAX >> (64 - width);
327321
let hexmask = &util::hex(mask);
328322
let offset = u64::from(offset);
329-
let rv = reset_value.map(|rv| (rv >> offset) & mask);
323+
let rv = properties.reset_value.map(|rv| (rv >> offset) & mask);
330324
let fty = width.to_ty()?;
331325
let evs = &f.enumerated_values;
332326

333-
let use_mask = if let Some(size) = parent.properties.size {
327+
let use_mask = if let Some(size) = properties.size {
334328
size != width
335329
} else {
336330
true

src/util.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::borrow::Cow;
22

3-
use crate::svd::{Access, Cluster, Register, RegisterCluster, RegisterInfo};
3+
use crate::svd::{
4+
Access, Cluster, Field, Register, RegisterCluster, RegisterInfo, RegisterProperties,
5+
};
46
use inflections::Inflect;
57
use proc_macro2::{Ident, Literal, Span, TokenStream};
68
use quote::{quote, ToTokens};
@@ -197,9 +199,9 @@ pub fn replace_suffix(name: &str, suffix: &str) -> String {
197199
}
198200
}
199201

200-
pub fn access_of(register: &Register) -> Access {
201-
register.properties.access.unwrap_or_else(|| {
202-
if let Some(fields) = &register.fields {
202+
pub fn access_of(properties: &RegisterProperties, fields: Option<&[Field]>) -> Access {
203+
properties.access.unwrap_or_else(|| {
204+
if let Some(fields) = fields {
203205
if fields.iter().all(|f| f.access == Some(Access::ReadOnly)) {
204206
Access::ReadOnly
205207
} else if fields.iter().all(|f| f.access == Some(Access::WriteOnce)) {

0 commit comments

Comments
 (0)