Skip to content

Commit fc2d126

Browse files
bors[bot]burrbull
andauthored
Merge #691
691: small refactoring r=Emilgardis a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents 8d9446a + 0a0d8e3 commit fc2d126

File tree

2 files changed

+83
-99
lines changed

2 files changed

+83
-99
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](http://semver.org/).
77

88
## [Unreleased]
99

10+
- `fields` fn refactoring
1011
- Test patched STM32
1112
- simplify ci strategy
1213
- Fix generated code for MSP430 atomics

src/generate/register.rs

Lines changed: 82 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub fn render(
5656
pub use #mod_derived as #name_snake_case;
5757
})
5858
} else {
59-
let name_constant_case_spec = format!("{name}_SPEC").to_constant_case_ident(span);
59+
let regspec_ident = format!("{name}_SPEC").to_constant_case_ident(span);
6060
let access = util::access_of(&register.properties, register.fields.as_deref());
6161
let accs = if access.can_read() && access.can_write() {
6262
"rw"
@@ -67,13 +67,12 @@ pub fn render(
6767
} else {
6868
return Err(anyhow!("Incorrect access of register {}", register.name));
6969
};
70-
let alias_doc = format!(
71-
"{name} ({accs}) register accessor: an alias for `Reg<{name_constant_case_spec}>`"
72-
);
70+
let alias_doc =
71+
format!("{name} ({accs}) register accessor: an alias for `Reg<{regspec_ident}>`");
7372
let mut out = TokenStream::new();
7473
out.extend(quote! {
7574
#[doc = #alias_doc]
76-
pub type #name_constant_case = crate::Reg<#name_snake_case::#name_constant_case_spec>;
75+
pub type #name_constant_case = crate::Reg<#name_snake_case::#regspec_ident>;
7776
});
7877
let mod_items = render_register_mod(
7978
register,
@@ -104,7 +103,7 @@ pub fn render_register_mod(
104103
let properties = &register.properties;
105104
let name = util::name_of(register, config.ignore_groups);
106105
let span = Span::call_site();
107-
let name_constant_case_spec = format!("{name}_SPEC").to_constant_case_ident(span);
106+
let regspec_ident = format!("{name}_SPEC").to_constant_case_ident(span);
108107
let name_snake_case = name.to_snake_case_ident(span);
109108
let rsize = properties
110109
.size
@@ -126,8 +125,6 @@ pub fn render_register_mod(
126125
);
127126

128127
let mut mod_items = TokenStream::new();
129-
let mut r_impl_items = TokenStream::new();
130-
let mut w_impl_items = TokenStream::new();
131128
let mut methods = vec![];
132129

133130
let can_read = access.can_read();
@@ -144,23 +141,23 @@ pub fn render_register_mod(
144141
mod_items.extend(quote! {
145142
#[doc = #desc]
146143
#derive
147-
pub struct R(crate::R<#name_constant_case_spec>);
144+
pub struct R(crate::R<#regspec_ident>);
148145
});
149146

150147
if !config.derive_more {
151148
mod_items.extend(quote! {
152149
impl core::ops::Deref for R {
153-
type Target = crate::R<#name_constant_case_spec>;
150+
type Target = crate::R<#regspec_ident>;
154151

155152
#[inline(always)]
156153
fn deref(&self) -> &Self::Target {
157154
&self.0
158155
}
159156
}
160157

161-
impl From<crate::R<#name_constant_case_spec>> for R {
158+
impl From<crate::R<#regspec_ident>> for R {
162159
#[inline(always)]
163-
fn from(reader: crate::R<#name_constant_case_spec>) -> Self {
160+
fn from(reader: crate::R<#regspec_ident>) -> Self {
164161
R(reader)
165162
}
166163
}
@@ -179,13 +176,13 @@ pub fn render_register_mod(
179176
mod_items.extend(quote! {
180177
#[doc = #desc]
181178
#derive
182-
pub struct W(crate::W<#name_constant_case_spec>);
179+
pub struct W(crate::W<#regspec_ident>);
183180
});
184181

185182
if !config.derive_more {
186183
mod_items.extend(quote! {
187184
impl core::ops::Deref for W {
188-
type Target = crate::W<#name_constant_case_spec>;
185+
type Target = crate::W<#regspec_ident>;
189186

190187
#[inline(always)]
191188
fn deref(&self) -> &Self::Target {
@@ -200,9 +197,9 @@ pub fn render_register_mod(
200197
}
201198
}
202199

203-
impl From<crate::W<#name_constant_case_spec>> for W {
200+
impl From<crate::W<#regspec_ident>> for W {
204201
#[inline(always)]
205-
fn from(writer: crate::W<#name_constant_case_spec>) -> Self {
202+
fn from(writer: crate::W<#regspec_ident>) -> Self {
206203
W(writer)
207204
}
208205
}
@@ -219,8 +216,10 @@ pub fn render_register_mod(
219216
methods.push("modify");
220217
}
221218

222-
let mut zero_to_modify_fields_bitmap: u64 = 0;
223-
let mut one_to_modify_fields_bitmap: u64 = 0;
219+
let mut r_impl_items = TokenStream::new();
220+
let mut w_impl_items = TokenStream::new();
221+
let mut zero_to_modify_fields_bitmap = 0;
222+
let mut one_to_modify_fields_bitmap = 0;
224223

225224
if let Some(cur_fields) = register.fields.as_ref() {
226225
// filter out all reserved fields, as we should not generate code for
@@ -231,20 +230,21 @@ pub fn render_register_mod(
231230
.collect();
232231

233232
if !cur_fields.is_empty() {
234-
fields(
233+
(
234+
r_impl_items,
235+
w_impl_items,
236+
zero_to_modify_fields_bitmap,
237+
one_to_modify_fields_bitmap,
238+
) = fields(
235239
cur_fields,
236-
register,
237-
path,
238-
index,
239-
&name_constant_case_spec,
240+
&regspec_ident,
240241
&rty,
242+
register.modified_write_values,
241243
access,
242244
properties,
243245
&mut mod_items,
244-
&mut r_impl_items,
245-
&mut w_impl_items,
246-
&mut zero_to_modify_fields_bitmap,
247-
&mut one_to_modify_fields_bitmap,
246+
path,
247+
index,
248248
config,
249249
)?;
250250
}
@@ -329,9 +329,9 @@ pub fn render_register_mod(
329329

330330
mod_items.extend(quote! {
331331
#[doc = #doc]
332-
pub struct #name_constant_case_spec;
332+
pub struct #regspec_ident;
333333

334-
impl crate::RegisterSpec for #name_constant_case_spec {
334+
impl crate::RegisterSpec for #regspec_ident {
335335
type Ux = #rty;
336336
}
337337
});
@@ -340,7 +340,7 @@ pub fn render_register_mod(
340340
let doc = format!("`read()` method returns [{name_snake_case}::R](R) reader structure",);
341341
mod_items.extend(quote! {
342342
#[doc = #doc]
343-
impl crate::Readable for #name_constant_case_spec {
343+
impl crate::Readable for #regspec_ident {
344344
type Reader = R;
345345
}
346346
});
@@ -354,7 +354,7 @@ pub fn render_register_mod(
354354

355355
mod_items.extend(quote! {
356356
#[doc = #doc]
357-
impl crate::Writable for #name_constant_case_spec {
357+
impl crate::Writable for #regspec_ident {
358358
type Writer = W;
359359
const ZERO_TO_MODIFY_FIELDS_BITMAP: Self::Ux = #zero_to_modify_fields_bitmap;
360360
const ONE_TO_MODIFY_FIELDS_BITMAP: Self::Ux = #one_to_modify_fields_bitmap;
@@ -365,7 +365,7 @@ pub fn render_register_mod(
365365
let doc = format!("`reset()` method sets {} to value {rv}", register.name);
366366
mod_items.extend(quote! {
367367
#[doc = #doc]
368-
impl crate::Resettable for #name_constant_case_spec {
368+
impl crate::Resettable for #regspec_ident {
369369
const RESET_VALUE: Self::Ux = #rv;
370370
}
371371
});
@@ -376,20 +376,20 @@ pub fn render_register_mod(
376376
#[allow(clippy::too_many_arguments)]
377377
pub fn fields(
378378
mut fields: Vec<&Field>,
379-
register: &Register,
380-
rpath: &RegisterPath,
381-
index: &Index,
382-
name_constant_case_spec: &Ident,
379+
regspec_ident: &Ident,
383380
rty: &Ident,
381+
rmwv: Option<ModifiedWriteValues>,
384382
access: Access,
385383
properties: &RegisterProperties,
386384
mod_items: &mut TokenStream,
387-
r_impl_items: &mut TokenStream,
388-
w_impl_items: &mut TokenStream,
389-
zero_to_modify_fields_bitmap: &mut u64,
390-
one_to_modify_fields_bitmap: &mut u64,
385+
rpath: &RegisterPath,
386+
index: &Index,
391387
config: &Config,
392-
) -> Result<()> {
388+
) -> Result<(TokenStream, TokenStream, u64, u64)> {
389+
let mut r_impl_items = TokenStream::new();
390+
let mut w_impl_items = TokenStream::new();
391+
let mut zero_to_modify_fields_bitmap = 0u64;
392+
let mut one_to_modify_fields_bitmap = 0u64;
393393
let span = Span::call_site();
394394
let can_read = access.can_read();
395395
let can_write = access.can_write();
@@ -666,29 +666,23 @@ pub fn fields(
666666
let base_field = util::replace_suffix(&base.field.name, "");
667667
let base_r = (base_field + "_R").to_constant_case_ident(span);
668668
if !reader_derives.contains(&reader_ty) {
669-
derive_from_base(
670-
mod_items,
671-
base,
672-
&fpath,
673-
&reader_ty,
674-
&base_r,
675-
&field_reader_brief,
676-
)?;
669+
let base_path = base_syn_path(base, &fpath, &base_r)?;
670+
mod_items.extend(quote! {
671+
#[doc = #field_reader_brief]
672+
pub use #base_path as #reader_ty;
673+
});
677674
reader_derives.insert(reader_ty.clone());
678675
}
679676
// only pub use enum when base.register != None. if base.register == None, it emits
680677
// pub use enum from same module which is not expected
681678
if base.register() != fpath.register() {
682679
// use the same enum structure name
683680
if !enum_derives.contains(&value_read_ty) {
684-
derive_from_base(
685-
mod_items,
686-
base,
687-
&fpath,
688-
&value_read_ty,
689-
&value_read_ty,
690-
&description,
691-
)?;
681+
let base_path = base_syn_path(base, &fpath, &value_read_ty)?;
682+
mod_items.extend(quote! {
683+
#[doc = #description]
684+
pub use #base_path as #value_read_ty;
685+
});
692686
enum_derives.insert(value_read_ty.clone());
693687
}
694688
}
@@ -763,10 +757,7 @@ pub fn fields(
763757
// If this field can be written, generate write proxy. Generate write value if it differs from
764758
// the read value, or else we reuse read value.
765759
if can_write {
766-
let mwv = f
767-
.modified_write_values
768-
.or(register.modified_write_values)
769-
.unwrap_or_default();
760+
let mwv = f.modified_write_values.or(rmwv).unwrap_or_default();
770761
// gets a brief of write proxy
771762
let field_writer_brief = format!("Field `{name}{brief_suffix}` writer - {description}");
772763

@@ -864,7 +855,7 @@ pub fn fields(
864855
},
865856
span,
866857
);
867-
quote! { crate::#wproxy<'a, #rty, #name_constant_case_spec, #value_write_ty, O> }
858+
quote! { crate::#wproxy<'a, #rty, #regspec_ident, #value_write_ty, O> }
868859
} else {
869860
let wproxy = Ident::new(
870861
if unsafety {
@@ -875,7 +866,7 @@ pub fn fields(
875866
span,
876867
);
877868
let width = &util::unsuffixed(width as _);
878-
quote! { crate::#wproxy<'a, #rty, #name_constant_case_spec, #fty, #value_write_ty, #width, O> }
869+
quote! { crate::#wproxy<'a, #rty, #regspec_ident, #fty, #value_write_ty, #width, O> }
879870
};
880871
mod_items.extend(quote! {
881872
#[doc = #field_writer_brief]
@@ -899,14 +890,11 @@ pub fn fields(
899890
if writer_reader_different_enum {
900891
// use the same enum structure name
901892
if !writer_enum_derives.contains(&value_write_ty) {
902-
derive_from_base(
903-
mod_items,
904-
base,
905-
&fpath,
906-
&value_write_ty,
907-
&value_write_ty,
908-
&description,
909-
)?;
893+
let base_path = base_syn_path(base, &fpath, &value_write_ty)?;
894+
mod_items.extend(quote! {
895+
#[doc = #description]
896+
pub use #base_path as #value_write_ty;
897+
});
910898
writer_enum_derives.insert(value_write_ty.clone());
911899
}
912900
}
@@ -920,14 +908,11 @@ pub fn fields(
920908
let base_field = util::replace_suffix(&base.field.name, "");
921909
let base_w = (base_field + "_W").to_constant_case_ident(span);
922910
if !writer_derives.contains(&writer_ty) {
923-
derive_from_base(
924-
mod_items,
925-
base,
926-
&fpath,
927-
&writer_ty,
928-
&base_w,
929-
&field_writer_brief,
930-
)?;
911+
let base_path = base_syn_path(base, &fpath, &base_w)?;
912+
mod_items.extend(quote! {
913+
#[doc = #field_writer_brief]
914+
pub use #base_path as #writer_ty;
915+
});
931916
writer_derives.insert(writer_ty.clone());
932917
}
933918
}
@@ -981,16 +966,21 @@ pub fn fields(
981966
match mwv {
982967
Modify | Set | Clear => {}
983968
OneToSet | OneToClear | OneToToggle => {
984-
*one_to_modify_fields_bitmap |= bitmask;
969+
one_to_modify_fields_bitmap |= bitmask;
985970
}
986971
ZeroToClear | ZeroToSet | ZeroToToggle => {
987-
*zero_to_modify_fields_bitmap |= bitmask;
972+
zero_to_modify_fields_bitmap |= bitmask;
988973
}
989974
}
990975
}
991976
}
992977

993-
Ok(())
978+
Ok((
979+
r_impl_items,
980+
w_impl_items,
981+
zero_to_modify_fields_bitmap,
982+
one_to_modify_fields_bitmap,
983+
))
994984
}
995985

996986
fn unsafety(write_constraint: Option<&WriteConstraint>, width: u32) -> bool {
@@ -1180,33 +1170,26 @@ fn description_with_bits(description: &str, offset: u64, width: u32) -> String {
11801170
res
11811171
}
11821172

1183-
fn derive_from_base(
1184-
mod_items: &mut TokenStream,
1173+
fn base_syn_path(
11851174
base: &EnumPath,
1186-
field: &FieldPath,
1187-
pc: &Ident,
1188-
base_pc: &Ident,
1189-
desc: &str,
1190-
) -> Result<(), syn::Error> {
1175+
fpath: &FieldPath,
1176+
base_ident: &Ident,
1177+
) -> Result<syn::TypePath, syn::Error> {
11911178
let span = Span::call_site();
1192-
let path = if base.register() == field.register() {
1193-
ident_to_path(base_pc.clone())
1194-
} else if base.register().block == field.register().block {
1179+
let path = if base.register() == fpath.register() {
1180+
ident_to_path(base_ident.clone())
1181+
} else if base.register().block == fpath.register().block {
11951182
let mut segments = Punctuated::new();
11961183
segments.push(path_segment(Ident::new("super", span)));
11971184
segments.push(path_segment(base.register().name.to_snake_case_ident(span)));
1198-
segments.push(path_segment(base_pc.clone()));
1185+
segments.push(path_segment(base_ident.clone()));
11991186
type_path(segments)
12001187
} else {
12011188
let mut rmod_ = crate::util::register_path_to_ty(base.register(), span);
1202-
rmod_.path.segments.push(path_segment(base_pc.clone()));
1189+
rmod_.path.segments.push(path_segment(base_ident.clone()));
12031190
rmod_
12041191
};
1205-
mod_items.extend(quote! {
1206-
#[doc = #desc]
1207-
pub use #path as #pc;
1208-
});
1209-
Ok(())
1192+
Ok(path)
12101193
}
12111194

12121195
fn lookup_filter(

0 commit comments

Comments
 (0)