Skip to content

Commit d03b484

Browse files
committed
inline expand lists
1 parent 5e8b5c3 commit d03b484

File tree

1 file changed

+52
-90
lines changed

1 file changed

+52
-90
lines changed

src/generate/peripheral.rs

Lines changed: 52 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -650,11 +650,16 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
650650

651651
let cluster_size = cluster_info_size_in_bits(cluster, config)
652652
.with_context(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
653+
let description = cluster
654+
.description
655+
.as_ref()
656+
.unwrap_or(&cluster.name)
657+
.to_string();
653658

654659
match cluster {
655660
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
656661
syn_field: cluster_to_syn_field(cluster)?,
657-
description: info.description.as_ref().unwrap_or(&info.name).into(),
662+
description,
658663
offset: info.address_offset,
659664
size: cluster_size,
660665
accessors: None,
@@ -680,28 +685,21 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
680685
let array_convertible = sequential_addresses && convert_list;
681686

682687
if array_convertible {
683-
if sequential_indexes_from0 {
684-
cluster_expanded.push(RegisterBlockField {
685-
syn_field: cluster_to_syn_field(cluster)?,
686-
description: info.description.as_ref().unwrap_or(&info.name).into(),
687-
offset: info.address_offset,
688-
size: cluster_size * array_info.dim,
689-
accessors: None,
690-
});
688+
let accessors = if sequential_indexes_from0 {
689+
None
691690
} else {
692691
let span = Span::call_site();
693692
let mut accessors = TokenStream::new();
694693
let nb_name = util::replace_suffix(&info.name, "");
695694
let ty = name_to_ty(&nb_name)?;
696695
let nb_name_cs = nb_name.to_snake_case_ident(span);
697-
let description = info.description.as_ref().unwrap_or(&info.name);
698696
for (i, idx) in array_info.indexes().enumerate() {
699697
let idx_name =
700698
util::replace_suffix(&info.name, &idx).to_snake_case_ident(span);
701699
let comment = make_comment(
702700
cluster_size,
703701
info.address_offset + (i as u32) * cluster_size / 8,
704-
description,
702+
&description,
705703
);
706704
let i = unsuffixed(i as _);
707705
accessors.extend(quote! {
@@ -712,23 +710,32 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
712710
}
713711
});
714712
}
715-
cluster_expanded.push(RegisterBlockField {
716-
syn_field: cluster_to_syn_field(cluster)?,
717-
description: description.into(),
718-
offset: info.address_offset,
719-
size: cluster_size * array_info.dim,
720-
accessors: Some(accessors),
721-
});
722-
}
713+
Some(accessors)
714+
};
715+
cluster_expanded.push(RegisterBlockField {
716+
syn_field: cluster_to_syn_field(cluster)?,
717+
description,
718+
offset: info.address_offset,
719+
size: cluster_size * array_info.dim,
720+
accessors,
721+
});
723722
} else if sequential_indexes_from0 && config.const_generic {
724723
// Include a ZST ArrayProxy giving indexed access to the
725724
// elements.
726725
cluster_expanded.push(array_proxy(info, array_info)?);
727726
} else {
728-
for (field_num, syn_field) in expand_svd_cluster(cluster)?.into_iter().enumerate() {
727+
let ty_name = util::replace_suffix(&info.name, "");
728+
let ty = name_to_ty(&ty_name)?;
729+
730+
for (field_num, idx) in array_info.indexes().enumerate() {
731+
let nb_name = util::replace_suffix(&info.name, &idx);
732+
733+
let syn_field =
734+
new_syn_field(nb_name.to_snake_case_ident(Span::call_site()), ty.clone());
735+
729736
cluster_expanded.push(RegisterBlockField {
730737
syn_field,
731-
description: info.description.as_ref().unwrap_or(&info.name).into(),
738+
description: description.clone(),
732739
offset: info.address_offset + field_num as u32 * array_info.dim_increment,
733740
size: cluster_size,
734741
accessors: None,
@@ -750,12 +757,13 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
750757
.properties
751758
.size
752759
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
760+
let description = register.description.clone().unwrap_or_default();
753761

754762
match register {
755763
Register::Single(info) => register_expanded.push(RegisterBlockField {
756764
syn_field: register_to_syn_field(register, config.ignore_groups)
757765
.with_context(|| "syn error occured")?,
758-
description: info.description.clone().unwrap_or_default(),
766+
description,
759767
offset: info.address_offset,
760768
size: register_size,
761769
accessors: None,
@@ -781,21 +789,14 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
781789
.filter(|r| *r.start() == 0)
782790
.is_some();
783791

784-
if sequential_indexes_from0 {
785-
register_expanded.push(RegisterBlockField {
786-
syn_field: register_to_syn_field(register, config.ignore_groups)?,
787-
description: info.description.clone().unwrap_or_default(),
788-
offset: info.address_offset,
789-
size: register_size * array_info.dim,
790-
accessors: None,
791-
});
792+
let accessors = if sequential_indexes_from0 {
793+
None
792794
} else {
793795
let span = Span::call_site();
794796
let mut accessors = TokenStream::new();
795797
let nb_name = util::replace_suffix(&info.fullname(config.ignore_groups), "");
796798
let ty = name_to_wrapped_ty(&nb_name)?;
797799
let nb_name_cs = nb_name.to_snake_case_ident(span);
798-
let description = info.description.clone().unwrap_or_default();
799800
let info_name = info.fullname(config.ignore_groups);
800801
for (i, idx) in array_info.indexes().enumerate() {
801802
let idx_name =
@@ -814,22 +815,29 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
814815
}
815816
});
816817
}
817-
register_expanded.push(RegisterBlockField {
818-
syn_field: register_to_syn_field(register, config.ignore_groups)?,
819-
description,
820-
offset: info.address_offset,
821-
size: register_size * array_info.dim,
822-
accessors: Some(accessors),
823-
});
824-
}
818+
Some(accessors)
819+
};
820+
register_expanded.push(RegisterBlockField {
821+
syn_field: register_to_syn_field(register, config.ignore_groups)?,
822+
description,
823+
offset: info.address_offset,
824+
size: register_size * array_info.dim,
825+
accessors,
826+
});
825827
} else {
826-
for (field_num, syn_field) in expand_svd_register(register, config.ignore_groups)?
827-
.into_iter()
828-
.enumerate()
829-
{
828+
let info_name = info.fullname(config.ignore_groups);
829+
let ty_name = util::replace_suffix(&info_name, "");
830+
let ty = name_to_wrapped_ty(&ty_name)?;
831+
832+
for (field_num, idx) in array_info.indexes().enumerate() {
833+
let nb_name = util::replace_suffix(&info_name, &idx);
834+
835+
let syn_field =
836+
new_syn_field(nb_name.to_snake_case_ident(Span::call_site()), ty.clone());
837+
830838
register_expanded.push(RegisterBlockField {
831839
syn_field,
832-
description: info.description.clone().unwrap_or_default(),
840+
description: description.clone(),
833841
offset: info.address_offset + field_num as u32 * array_info.dim_increment,
834842
size: register_size,
835843
accessors: None,
@@ -922,29 +930,6 @@ fn cluster_block(
922930
})
923931
}
924932

925-
/// Takes a svd::Register which may be a register array, and turn in into
926-
/// a list of syn::Field where the register arrays have been expanded.
927-
fn expand_svd_register(register: &Register, ignore_group: bool) -> Result<Vec<syn::Field>> {
928-
if let Register::Array(info, array_info) = register {
929-
let ty_name = util::replace_suffix(&info.fullname(ignore_group), "");
930-
931-
let mut out = vec![];
932-
for idx in array_info.indexes() {
933-
let nb_name = util::replace_suffix(&info.fullname(ignore_group), &idx);
934-
935-
let ty = name_to_wrapped_ty(&ty_name)?;
936-
937-
out.push(new_syn_field(
938-
nb_name.to_snake_case_ident(Span::call_site()),
939-
ty,
940-
));
941-
}
942-
Ok(out)
943-
} else {
944-
Ok(vec![register_to_syn_field(register, ignore_group)?])
945-
}
946-
}
947-
948933
/// Convert a parsed `Register` into its `Field` equivalent
949934
fn register_to_syn_field(register: &Register, ignore_group: bool) -> Result<syn::Field> {
950935
Ok(match register {
@@ -992,29 +977,6 @@ fn array_proxy(
992977
})
993978
}
994979

995-
/// Takes a svd::Cluster which may contain a register array, and turn it into
996-
/// a list of syn::Field where the register arrays have been expanded.
997-
fn expand_svd_cluster(cluster: &Cluster) -> Result<Vec<syn::Field>, syn::Error> {
998-
if let Cluster::Array(info, array_info) = cluster {
999-
let ty_name = util::replace_suffix(&info.name, "");
1000-
1001-
let mut out = vec![];
1002-
for idx in array_info.indexes() {
1003-
let nb_name = util::replace_suffix(&info.name, &idx);
1004-
1005-
let ty = name_to_ty(&ty_name)?;
1006-
1007-
out.push(new_syn_field(
1008-
nb_name.to_snake_case_ident(Span::call_site()),
1009-
ty,
1010-
));
1011-
}
1012-
Ok(out)
1013-
} else {
1014-
Ok(vec![cluster_to_syn_field(cluster)?])
1015-
}
1016-
}
1017-
1018980
/// Convert a parsed `Cluster` into its `Field` equivalent
1019981
fn cluster_to_syn_field(cluster: &Cluster) -> Result<syn::Field, syn::Error> {
1020982
Ok(match cluster {

0 commit comments

Comments
 (0)