Skip to content

Commit 5195d7c

Browse files
committed
register aliases instead of clone
1 parent dc60b65 commit 5195d7c

File tree

2 files changed

+69
-27
lines changed

2 files changed

+69
-27
lines changed

src/generate/peripheral.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -877,10 +877,9 @@ fn render_ercs(
877877
rpath = derive_register(reg, &dpath, path, index)?;
878878
}
879879
let reg_name = &reg.name;
880-
let rpath = rpath.unwrap_or_else(|| path.new_register(reg_name));
881880

882-
let rendered_reg =
883-
register::render(reg, &rpath, index, config).with_context(|| {
881+
let rendered_reg = register::render(reg, path, &rpath, index, config)
882+
.with_context(|| {
884883
let descrip = reg.description.as_deref().unwrap_or("No description");
885884
format!(
886885
"Error rendering register\nName: {reg_name}\nDescription: {descrip}"

src/generate/register.rs

Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,79 @@ use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
99
use quote::{quote, ToTokens};
1010
use std::collections::HashSet;
1111
use svd_parser::expand::{
12-
derive_enumerated_values, derive_field, EnumPath, FieldPath, Index, RegisterPath,
12+
derive_enumerated_values, derive_field, BlockPath, EnumPath, FieldPath, Index, RegisterPath,
1313
};
1414

1515
use crate::util::{self, ident_to_path, path_segment, type_path, Config, ToSanitizedCase, U32Ext};
1616
use anyhow::{anyhow, Result};
1717
use syn::punctuated::Punctuated;
1818

1919
pub fn render(
20+
register: &Register,
21+
path: &BlockPath,
22+
dpath: &Option<RegisterPath>,
23+
index: &Index,
24+
config: &Config,
25+
) -> Result<TokenStream> {
26+
let mut out = TokenStream::new();
27+
let name = util::name_of(register, config.ignore_groups);
28+
let span = Span::call_site();
29+
let name_constant_case = name.to_constant_case_ident(span);
30+
let name_constant_case_spec = format!("{name}_SPEC").to_constant_case_ident(span);
31+
let name_snake_case = name.to_snake_case_ident(span);
32+
let description = util::escape_brackets(
33+
util::respace(&register.description.clone().unwrap_or_else(|| {
34+
warn!("Missing description for register {}", register.name);
35+
Default::default()
36+
}))
37+
.as_ref(),
38+
);
39+
let alias_doc =
40+
format!("{name} register accessor: an alias for `Reg<{name_constant_case_spec}>`");
41+
let wrapped_name = util::name_to_wrapped_ty(&name);
42+
out.extend(quote! {
43+
#[doc = #alias_doc]
44+
pub type #name_constant_case = #wrapped_name;
45+
});
46+
47+
let mod_items = if let Some(dpath) = dpath {
48+
let mut mod_items = TokenStream::new();
49+
let mut derived_spec = if &dpath.block == path {
50+
let mut segments = Punctuated::new();
51+
segments.push(path_segment(Ident::new("super", span)));
52+
type_path(segments)
53+
} else {
54+
util::block_path_to_ty(&dpath.block, span)
55+
};
56+
let dname = util::name_of(index.registers.get(dpath).unwrap(), config.ignore_groups);
57+
derived_spec
58+
.path
59+
.segments
60+
.push(path_segment(dname.to_snake_case_ident(span)));
61+
derived_spec.path.segments.push(path_segment(
62+
format!("{}_SPEC", dname).to_constant_case_ident(span),
63+
));
64+
65+
mod_items.extend(quote! {
66+
#[doc = #description]
67+
pub use #derived_spec as #name_constant_case_spec;
68+
});
69+
mod_items
70+
} else {
71+
render_register_mod(register, &path.new_register(&register.name), index, config)?
72+
};
73+
74+
out.extend(quote! {
75+
#[doc = #description]
76+
pub mod #name_snake_case {
77+
#mod_items
78+
}
79+
});
80+
81+
Ok(out)
82+
}
83+
84+
pub fn render_register_mod(
2085
register: &Register,
2186
path: &RegisterPath,
2287
index: &Index,
@@ -26,7 +91,6 @@ pub fn render(
2691
let access = util::access_of(properties, register.fields.as_deref());
2792
let name = util::name_of(register, config.ignore_groups);
2893
let span = Span::call_site();
29-
let name_constant_case = name.to_constant_case_ident(span);
3094
let name_constant_case_spec = format!("{name}_SPEC").to_constant_case_ident(span);
3195
let name_snake_case = name.to_snake_case_ident(span);
3296
let rsize = properties
@@ -285,28 +349,7 @@ pub fn render(
285349
}
286350
});
287351
}
288-
289-
let mut out = TokenStream::new();
290-
let alias_doc =
291-
format!("{name} register accessor: an alias for `Reg<{name_constant_case_spec}>`");
292-
let wrapped_name = util::name_to_wrapped_ty(&name);
293-
out.extend(quote! {
294-
#[doc = #alias_doc]
295-
pub type #name_constant_case = #wrapped_name;
296-
});
297-
298-
out.extend(quote! {
299-
#[doc = #description]
300-
pub mod #name_snake_case #open
301-
});
302-
303-
out.extend(mod_items);
304-
305-
out.extend(quote! {
306-
#close
307-
});
308-
309-
Ok(out)
352+
Ok(mod_items)
310353
}
311354

312355
#[allow(clippy::too_many_arguments)]

0 commit comments

Comments
 (0)