Skip to content

Commit 4893406

Browse files
bors[bot]burrbull
andauthored
Merge #641
641: move cluster struct inside mod r=therealprof a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents 3846eda + 004ab67 commit 4893406

File tree

2 files changed

+57
-98
lines changed

2 files changed

+57
-98
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+
- Move cluster struct inside mod
1011
- Use inlined variables in `format!` (Rust 1.58)
1112
- Refactor `periperal.rs`
1213
- use `svd_parser::expand::Index` for derive

src/generate/peripheral.rs

Lines changed: 56 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ fn register_or_cluster_block(
439439
let mut accessors = TokenStream::new();
440440

441441
let ercs_expanded =
442-
expand(ercs, name, config).with_context(|| "Could not expand register or cluster block")?;
442+
expand(ercs, config).with_context(|| "Could not expand register or cluster block")?;
443443

444444
// Locate conflicting regions; we'll need to use unions to represent them.
445445
let mut regions = FieldRegions::default();
@@ -564,17 +564,13 @@ fn register_or_cluster_block(
564564

565565
/// Expand a list of parsed `Register`s or `Cluster`s, and render them to
566566
/// `RegisterBlockField`s containing `Field`s.
567-
fn expand(
568-
ercs: &[RegisterCluster],
569-
name: Option<&str>,
570-
config: &Config,
571-
) -> Result<Vec<RegisterBlockField>> {
567+
fn expand(ercs: &[RegisterCluster], config: &Config) -> Result<Vec<RegisterBlockField>> {
572568
let mut ercs_expanded = vec![];
573569

574570
debug!("Expanding registers or clusters into Register Block Fields");
575571
for erc in ercs {
576572
match &erc {
577-
RegisterCluster::Register(register) => match expand_register(register, name, config) {
573+
RegisterCluster::Register(register) => match expand_register(register, config) {
578574
Ok(expanded_reg) => {
579575
trace!("Register: {}", register.name);
580576
ercs_expanded.extend(expanded_reg);
@@ -584,7 +580,7 @@ fn expand(
584580
return handle_reg_error("Error expanding register", register, res);
585581
}
586582
},
587-
RegisterCluster::Cluster(cluster) => match expand_cluster(cluster, name, config) {
583+
RegisterCluster::Cluster(cluster) => match expand_cluster(cluster, config) {
588584
Ok(expanded_cluster) => {
589585
trace!("Cluster: {}", cluster.name);
590586
ercs_expanded.extend(expanded_cluster);
@@ -631,7 +627,7 @@ fn cluster_info_size_in_bits(info: &ClusterInfo, config: &Config) -> Result<u32>
631627
for c in &info.children {
632628
let end = match c {
633629
RegisterCluster::Register(reg) => {
634-
let reg_size: u32 = expand_register(reg, None, config)?
630+
let reg_size: u32 = expand_register(reg, config)?
635631
.iter()
636632
.map(|rbf| rbf.size)
637633
.sum();
@@ -649,19 +645,15 @@ fn cluster_info_size_in_bits(info: &ClusterInfo, config: &Config) -> Result<u32>
649645
}
650646

651647
/// Render a given cluster (and any children) into `RegisterBlockField`s
652-
fn expand_cluster(
653-
cluster: &Cluster,
654-
name: Option<&str>,
655-
config: &Config,
656-
) -> Result<Vec<RegisterBlockField>> {
648+
fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBlockField>> {
657649
let mut cluster_expanded = vec![];
658650

659651
let cluster_size = cluster_info_size_in_bits(cluster, config)
660652
.with_context(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
661653

662654
match cluster {
663655
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
664-
syn_field: convert_svd_cluster(cluster, name)?,
656+
syn_field: convert_svd_cluster(cluster)?,
665657
description: info.description.as_ref().unwrap_or(&info.name).into(),
666658
offset: info.address_offset,
667659
size: cluster_size,
@@ -690,7 +682,7 @@ fn expand_cluster(
690682
if array_convertible {
691683
if sequential_indexes_from0 {
692684
cluster_expanded.push(RegisterBlockField {
693-
syn_field: convert_svd_cluster(cluster, name)?,
685+
syn_field: convert_svd_cluster(cluster)?,
694686
description: info.description.as_ref().unwrap_or(&info.name).into(),
695687
offset: info.address_offset,
696688
size: cluster_size * array_info.dim,
@@ -700,7 +692,7 @@ fn expand_cluster(
700692
let span = Span::call_site();
701693
let mut accessors = TokenStream::new();
702694
let nb_name = util::replace_suffix(&info.name, "");
703-
let ty = name_to_ty(&nb_name, name)?;
695+
let ty = name_to_ty(&nb_name)?;
704696
let nb_name_cs = nb_name.to_snake_case_ident(span);
705697
let description = info.description.as_ref().unwrap_or(&info.name);
706698
for (i, idx) in array_info.indexes().enumerate() {
@@ -721,7 +713,7 @@ fn expand_cluster(
721713
});
722714
}
723715
cluster_expanded.push(RegisterBlockField {
724-
syn_field: convert_svd_cluster(cluster, name)?,
716+
syn_field: convert_svd_cluster(cluster)?,
725717
description: description.into(),
726718
offset: info.address_offset,
727719
size: cluster_size * array_info.dim,
@@ -731,11 +723,9 @@ fn expand_cluster(
731723
} else if sequential_indexes_from0 && config.const_generic {
732724
// Include a ZST ArrayProxy giving indexed access to the
733725
// elements.
734-
cluster_expanded.push(array_proxy(info, array_info, name)?);
726+
cluster_expanded.push(array_proxy(info, array_info)?);
735727
} else {
736-
for (field_num, syn_field) in
737-
expand_svd_cluster(cluster, name)?.into_iter().enumerate()
738-
{
728+
for (field_num, syn_field) in expand_svd_cluster(cluster)?.into_iter().enumerate() {
739729
cluster_expanded.push(RegisterBlockField {
740730
syn_field,
741731
description: info.description.as_ref().unwrap_or(&info.name).into(),
@@ -753,11 +743,7 @@ fn expand_cluster(
753743

754744
/// If svd register arrays can't be converted to rust arrays (non sequential addresses, non
755745
/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
756-
fn expand_register(
757-
register: &Register,
758-
name: Option<&str>,
759-
config: &Config,
760-
) -> Result<Vec<RegisterBlockField>> {
746+
fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterBlockField>> {
761747
let mut register_expanded = vec![];
762748

763749
let register_size = register
@@ -767,7 +753,7 @@ fn expand_register(
767753

768754
match register {
769755
Register::Single(info) => register_expanded.push(RegisterBlockField {
770-
syn_field: convert_svd_register(register, name, config.ignore_groups)
756+
syn_field: convert_svd_register(register, config.ignore_groups)
771757
.with_context(|| "syn error occured")?,
772758
description: info.description.clone().unwrap_or_default(),
773759
offset: info.address_offset,
@@ -797,7 +783,7 @@ fn expand_register(
797783

798784
if sequential_indexes_from0 {
799785
register_expanded.push(RegisterBlockField {
800-
syn_field: convert_svd_register(register, name, config.ignore_groups)?,
786+
syn_field: convert_svd_register(register, config.ignore_groups)?,
801787
description: info.description.clone().unwrap_or_default(),
802788
offset: info.address_offset,
803789
size: register_size * array_info.dim,
@@ -807,7 +793,7 @@ fn expand_register(
807793
let span = Span::call_site();
808794
let mut accessors = TokenStream::new();
809795
let nb_name = util::replace_suffix(&info.fullname(config.ignore_groups), "");
810-
let ty = name_to_wrapped_ty(&nb_name, name)?;
796+
let ty = name_to_wrapped_ty(&nb_name)?;
811797
let nb_name_cs = nb_name.to_snake_case_ident(span);
812798
let description = info.description.clone().unwrap_or_default();
813799
let info_name = info.fullname(config.ignore_groups);
@@ -829,18 +815,17 @@ fn expand_register(
829815
});
830816
}
831817
register_expanded.push(RegisterBlockField {
832-
syn_field: convert_svd_register(register, name, config.ignore_groups)?,
818+
syn_field: convert_svd_register(register, config.ignore_groups)?,
833819
description,
834820
offset: info.address_offset,
835821
size: register_size * array_info.dim,
836822
accessors: Some(accessors),
837823
});
838824
}
839825
} else {
840-
for (field_num, syn_field) in
841-
expand_svd_register(register, name, config.ignore_groups)?
842-
.into_iter()
843-
.enumerate()
826+
for (field_num, syn_field) in expand_svd_register(register, config.ignore_groups)?
827+
.into_iter()
828+
.enumerate()
844829
{
845830
register_expanded.push(RegisterBlockField {
846831
syn_field,
@@ -911,13 +896,7 @@ fn cluster_block(
911896
let mod_items = render_ercs(&mut c.children, path, index, config)?;
912897

913898
// Generate the register block.
914-
let mod_name = util::replace_suffix(
915-
match c {
916-
Cluster::Single(info) => &info.name,
917-
Cluster::Array(info, _ai) => &info.name,
918-
},
919-
"",
920-
);
899+
let mod_name = util::replace_suffix(&c.name, "");
921900

922901
let reg_block = register_or_cluster_block(&c.children, Some(&mod_name), config)?;
923902

@@ -927,32 +906,33 @@ fn cluster_block(
927906

928907
let name_snake_case = mod_name.to_snake_case_ident(Span::call_site());
929908

909+
let struct_path = name_to_ty(&mod_name)?;
910+
930911
Ok(quote! {
931-
#reg_block
912+
#[doc = #description]
913+
pub use #struct_path;
932914

933-
///Register block
915+
///Cluster
934916
#[doc = #description]
935917
pub mod #name_snake_case {
918+
#reg_block
919+
936920
#mod_items
937921
}
938922
})
939923
}
940924

941925
/// Takes a svd::Register which may be a register array, and turn in into
942926
/// a list of syn::Field where the register arrays have been expanded.
943-
fn expand_svd_register(
944-
register: &Register,
945-
name: Option<&str>,
946-
ignore_group: bool,
947-
) -> Result<Vec<syn::Field>> {
927+
fn expand_svd_register(register: &Register, ignore_group: bool) -> Result<Vec<syn::Field>> {
948928
if let Register::Array(info, array_info) = register {
949929
let ty_name = util::replace_suffix(&info.fullname(ignore_group), "");
950930

951931
let mut out = vec![];
952932
for idx in array_info.indexes() {
953933
let nb_name = util::replace_suffix(&info.fullname(ignore_group), &idx);
954934

955-
let ty = name_to_wrapped_ty(&ty_name, name)?;
935+
let ty = name_to_wrapped_ty(&ty_name)?;
956936

957937
out.push(new_syn_field(
958938
nb_name.to_snake_case_ident(Span::call_site()),
@@ -961,27 +941,23 @@ fn expand_svd_register(
961941
}
962942
Ok(out)
963943
} else {
964-
Ok(vec![convert_svd_register(register, name, ignore_group)?])
944+
Ok(vec![convert_svd_register(register, ignore_group)?])
965945
}
966946
}
967947

968948
/// Convert a parsed `Register` into its `Field` equivalent
969-
fn convert_svd_register(
970-
register: &Register,
971-
name: Option<&str>,
972-
ignore_group: bool,
973-
) -> Result<syn::Field> {
949+
fn convert_svd_register(register: &Register, ignore_group: bool) -> Result<syn::Field> {
974950
Ok(match register {
975951
Register::Single(info) => {
976952
let info_name = info.fullname(ignore_group);
977-
let ty = name_to_wrapped_ty(&info_name, name)
953+
let ty = name_to_wrapped_ty(&info_name)
978954
.with_context(|| format!("Error converting register name {info_name}"))?;
979955
new_syn_field(info_name.to_snake_case_ident(Span::call_site()), ty)
980956
}
981957
Register::Array(info, array_info) => {
982958
let info_name = info.fullname(ignore_group);
983959
let nb_name = util::replace_suffix(&info_name, "");
984-
let ty = name_to_wrapped_ty(&nb_name, name)
960+
let ty = name_to_wrapped_ty(&nb_name)
985961
.with_context(|| format!("Error converting register name {nb_name}"))?;
986962
let array_ty = new_syn_array(ty, array_info.dim);
987963

@@ -994,10 +970,9 @@ fn convert_svd_register(
994970
fn array_proxy(
995971
info: &ClusterInfo,
996972
array_info: &DimElement,
997-
name: Option<&str>,
998973
) -> Result<RegisterBlockField, syn::Error> {
999974
let ty_name = util::replace_suffix(&info.name, "");
1000-
let tys = name_to_ty_str(&ty_name, name);
975+
let tys = name_to_ty_str(&ty_name);
1001976

1002977
let ap_path = parse_str::<syn::TypePath>(&format!(
1003978
"crate::ArrayProxy<{tys}, {}, {}>",
@@ -1019,18 +994,15 @@ fn array_proxy(
1019994

1020995
/// Takes a svd::Cluster which may contain a register array, and turn it into
1021996
/// a list of syn::Field where the register arrays have been expanded.
1022-
fn expand_svd_cluster(
1023-
cluster: &Cluster,
1024-
name: Option<&str>,
1025-
) -> Result<Vec<syn::Field>, syn::Error> {
997+
fn expand_svd_cluster(cluster: &Cluster) -> Result<Vec<syn::Field>, syn::Error> {
1026998
if let Cluster::Array(info, array_info) = cluster {
1027999
let ty_name = util::replace_suffix(&info.name, "");
10281000

10291001
let mut out = vec![];
10301002
for idx in array_info.indexes() {
10311003
let nb_name = util::replace_suffix(&info.name, &idx);
10321004

1033-
let ty = name_to_ty(&ty_name, name)?;
1005+
let ty = name_to_ty(&ty_name)?;
10341006

10351007
out.push(new_syn_field(
10361008
nb_name.to_snake_case_ident(Span::call_site()),
@@ -1039,21 +1011,21 @@ fn expand_svd_cluster(
10391011
}
10401012
Ok(out)
10411013
} else {
1042-
Ok(vec![convert_svd_cluster(cluster, name)?])
1014+
Ok(vec![convert_svd_cluster(cluster)?])
10431015
}
10441016
}
10451017

10461018
/// Convert a parsed `Cluster` into its `Field` equivalent
1047-
fn convert_svd_cluster(cluster: &Cluster, name: Option<&str>) -> Result<syn::Field, syn::Error> {
1019+
fn convert_svd_cluster(cluster: &Cluster) -> Result<syn::Field, syn::Error> {
10481020
Ok(match cluster {
10491021
Cluster::Single(info) => {
10501022
let ty_name = util::replace_suffix(&info.name, "");
1051-
let ty = name_to_ty(&ty_name, name)?;
1023+
let ty = name_to_ty(&ty_name)?;
10521024
new_syn_field(info.name.to_snake_case_ident(Span::call_site()), ty)
10531025
}
10541026
Cluster::Array(info, array_info) => {
10551027
let ty_name = util::replace_suffix(&info.name, "");
1056-
let ty = name_to_ty(&ty_name, name)?;
1028+
let ty = name_to_ty(&ty_name)?;
10571029
let array_ty = new_syn_array(ty, array_info.dim);
10581030

10591031
new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), array_ty)
@@ -1091,43 +1063,29 @@ fn new_syn_u32(len: u32, span: Span) -> syn::Expr {
10911063
})
10921064
}
10931065

1094-
fn name_to_ty_str<'a, 'b>(name: &'a str, ns: Option<&'b str>) -> Cow<'a, str> {
1095-
if let Some(ns) = ns {
1096-
Cow::Owned(
1097-
String::from("self::")
1098-
+ &ns.to_sanitized_snake_case()
1099-
+ "::"
1100-
+ &name.to_sanitized_constant_case(),
1101-
)
1102-
} else {
1066+
fn name_to_ty_str(name: &str) -> String {
1067+
format!(
1068+
"{}::{}",
1069+
name.to_sanitized_snake_case(),
11031070
name.to_sanitized_constant_case()
1104-
}
1071+
)
11051072
}
11061073

1107-
fn name_to_ty(name: &str, ns: Option<&str>) -> Result<syn::Type, syn::Error> {
1108-
let ident = name_to_ty_str(name, ns);
1074+
fn name_to_ty(name: &str) -> Result<syn::Type, syn::Error> {
1075+
let ident = name_to_ty_str(name);
11091076
parse_str::<syn::TypePath>(&ident).map(syn::Type::Path)
11101077
}
11111078

1112-
fn name_to_wrapped_ty_str(name: &str, ns: Option<&str>) -> String {
1113-
if let Some(ns) = ns {
1114-
format!(
1115-
"crate::Reg<self::{}::{}::{}_SPEC>",
1116-
&ns.to_sanitized_snake_case(),
1117-
&name.to_sanitized_snake_case(),
1118-
&name.to_sanitized_constant_case(),
1119-
)
1120-
} else {
1121-
format!(
1122-
"crate::Reg<{}::{}_SPEC>",
1123-
&name.to_sanitized_snake_case(),
1124-
&name.to_sanitized_constant_case(),
1125-
)
1126-
}
1079+
fn name_to_wrapped_ty_str(name: &str) -> String {
1080+
format!(
1081+
"crate::Reg<{}::{}_SPEC>",
1082+
&name.to_sanitized_snake_case(),
1083+
&name.to_sanitized_constant_case(),
1084+
)
11271085
}
11281086

1129-
fn name_to_wrapped_ty(name: &str, ns: Option<&str>) -> Result<syn::Type> {
1130-
let ident = name_to_wrapped_ty_str(name, ns);
1087+
fn name_to_wrapped_ty(name: &str) -> Result<syn::Type> {
1088+
let ident = name_to_wrapped_ty_str(name);
11311089
parse_str::<syn::TypePath>(&ident)
11321090
.map(syn::Type::Path)
11331091
.map_err(anyhow::Error::from)

0 commit comments

Comments
 (0)