@@ -2,9 +2,7 @@ use std::borrow::Cow;
2
2
use std:: cmp:: Ordering ;
3
3
use svd_parser:: expand:: { derive_cluster, derive_peripheral, derive_register, BlockPath , Index } ;
4
4
5
- use crate :: svd:: {
6
- array:: names, Cluster , ClusterInfo , DimElement , Peripheral , Register , RegisterCluster ,
7
- } ;
5
+ use crate :: svd:: { array:: names, Cluster , ClusterInfo , Peripheral , Register , RegisterCluster } ;
8
6
use log:: { debug, trace, warn} ;
9
7
use proc_macro2:: { Ident , Punct , Spacing , Span , TokenStream } ;
10
8
use quote:: { quote, ToTokens } ;
@@ -533,13 +531,11 @@ fn register_or_cluster_block(
533
531
last_end = region. end ;
534
532
}
535
533
536
- let name = Ident :: new (
537
- & match name {
538
- Some ( name) => name. to_sanitized_constant_case ( ) ,
539
- None => "RegisterBlock" . into ( ) ,
540
- } ,
541
- span,
542
- ) ;
534
+ let name = if let Some ( name) = name {
535
+ name. to_constant_case_ident ( span)
536
+ } else {
537
+ Ident :: new ( "RegisterBlock" , span)
538
+ } ;
543
539
544
540
let accessors = if !accessors. is_empty ( ) {
545
541
quote ! {
@@ -654,14 +650,24 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
654
650
. unwrap_or ( & cluster. name )
655
651
. to_string ( ) ;
656
652
653
+ let ty_name = if cluster. is_single ( ) {
654
+ cluster. name . to_string ( )
655
+ } else {
656
+ util:: replace_suffix ( & cluster. name , "" )
657
+ } ;
658
+ let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
659
+
657
660
match cluster {
658
- Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
659
- syn_field : cluster_to_syn_field ( cluster) ?,
660
- description,
661
- offset : info. address_offset ,
662
- size : cluster_size,
663
- accessors : None ,
664
- } ) ,
661
+ Cluster :: Single ( info) => {
662
+ let syn_field = new_syn_field ( info. name . to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
663
+ cluster_expanded. push ( RegisterBlockField {
664
+ syn_field,
665
+ description,
666
+ offset : info. address_offset ,
667
+ size : cluster_size,
668
+ accessors : None ,
669
+ } )
670
+ }
665
671
Cluster :: Array ( info, array_info) => {
666
672
let sequential_addresses =
667
673
( array_info. dim == 1 ) || ( cluster_size == array_info. dim_increment * BITS_PER_BYTE ) ;
@@ -688,9 +694,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
688
694
} else {
689
695
let span = Span :: call_site ( ) ;
690
696
let mut accessors = TokenStream :: new ( ) ;
691
- let nb_name = util:: replace_suffix ( & info. name , "" ) ;
692
- let ty = name_to_ty ( & nb_name) ;
693
- let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
697
+ let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
694
698
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
695
699
let idx_name =
696
700
util:: replace_suffix ( & info. name , & idx) . to_snake_case_ident ( span) ;
@@ -710,8 +714,12 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
710
714
}
711
715
Some ( accessors)
712
716
} ;
717
+ let array_ty = new_syn_array ( ty, array_info. dim ) ;
713
718
cluster_expanded. push ( RegisterBlockField {
714
- syn_field : cluster_to_syn_field ( cluster) ?,
719
+ syn_field : new_syn_field (
720
+ ty_name. to_snake_case_ident ( Span :: call_site ( ) ) ,
721
+ array_ty,
722
+ ) ,
715
723
description,
716
724
offset : info. address_offset ,
717
725
size : cluster_size * array_info. dim ,
@@ -720,11 +728,17 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
720
728
} else if sequential_indexes_from0 && config. const_generic {
721
729
// Include a ZST ArrayProxy giving indexed access to the
722
730
// elements.
723
- cluster_expanded. push ( array_proxy ( info, array_info) ) ;
731
+ let ap_path = array_proxy_type ( ty, array_info) ;
732
+ let syn_field =
733
+ new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ap_path) ;
734
+ cluster_expanded. push ( RegisterBlockField {
735
+ syn_field,
736
+ description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
737
+ offset : info. address_offset ,
738
+ size : 0 ,
739
+ accessors : None ,
740
+ } ) ;
724
741
} else {
725
- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
726
- let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
727
-
728
742
for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
729
743
let nb_name = util:: replace_suffix ( & info. name , & idx) ;
730
744
let syn_field =
@@ -756,15 +770,25 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
756
770
. ok_or_else ( || anyhow ! ( "Register {} has no `size` field" , register. name) ) ?;
757
771
let description = register. description . clone ( ) . unwrap_or_default ( ) ;
758
772
773
+ let info_name = register. fullname ( config. ignore_groups ) ;
774
+ let ty_name = if register. is_single ( ) {
775
+ info_name. to_string ( )
776
+ } else {
777
+ util:: replace_suffix ( & info_name, "" )
778
+ } ;
779
+ let ty = name_to_wrapped_ty ( & ty_name) ;
780
+
759
781
match register {
760
- Register :: Single ( info) => register_expanded. push ( RegisterBlockField {
761
- syn_field : register_to_syn_field ( register, config. ignore_groups )
762
- . with_context ( || "syn error occured" ) ?,
763
- description,
764
- offset : info. address_offset ,
765
- size : register_size,
766
- accessors : None ,
767
- } ) ,
782
+ Register :: Single ( info) => {
783
+ let syn_field = new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
784
+ register_expanded. push ( RegisterBlockField {
785
+ syn_field,
786
+ description,
787
+ offset : info. address_offset ,
788
+ size : register_size,
789
+ accessors : None ,
790
+ } )
791
+ }
768
792
Register :: Array ( info, array_info) => {
769
793
let sequential_addresses = ( array_info. dim == 1 )
770
794
|| ( register_size == array_info. dim_increment * BITS_PER_BYTE ) ;
@@ -791,10 +815,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
791
815
} else {
792
816
let span = Span :: call_site ( ) ;
793
817
let mut accessors = TokenStream :: new ( ) ;
794
- let nb_name = util:: replace_suffix ( & info. fullname ( config. ignore_groups ) , "" ) ;
795
- let ty = name_to_wrapped_ty ( & nb_name) ;
796
- let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
797
- let info_name = info. fullname ( config. ignore_groups ) ;
818
+ let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
798
819
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
799
820
let idx_name =
800
821
util:: replace_suffix ( & info_name, & idx) . to_snake_case_ident ( span) ;
@@ -814,18 +835,17 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
814
835
}
815
836
Some ( accessors)
816
837
} ;
838
+ let array_ty = new_syn_array ( ty, array_info. dim ) ;
839
+ let syn_field =
840
+ new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty) ;
817
841
register_expanded. push ( RegisterBlockField {
818
- syn_field : register_to_syn_field ( register , config . ignore_groups ) ? ,
842
+ syn_field,
819
843
description,
820
844
offset : info. address_offset ,
821
845
size : register_size * array_info. dim ,
822
846
accessors,
823
847
} ) ;
824
848
} else {
825
- let info_name = info. fullname ( config. ignore_groups ) ;
826
- let ty_name = util:: replace_suffix ( & info_name, "" ) ;
827
- let ty = name_to_wrapped_ty ( & ty_name) ;
828
-
829
849
for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
830
850
let nb_name = util:: replace_suffix ( & info_name, & idx) ;
831
851
let syn_field =
@@ -959,58 +979,6 @@ fn cluster_block(
959
979
} )
960
980
}
961
981
962
- /// Convert a parsed `Register` into its `Field` equivalent
963
- fn register_to_syn_field ( register : & Register , ignore_group : bool ) -> Result < syn:: Field > {
964
- Ok ( match register {
965
- Register :: Single ( info) => {
966
- let info_name = info. fullname ( ignore_group) ;
967
- let ty = name_to_wrapped_ty ( & info_name) ;
968
- new_syn_field ( info_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty)
969
- }
970
- Register :: Array ( info, array_info) => {
971
- let info_name = info. fullname ( ignore_group) ;
972
- let nb_name = util:: replace_suffix ( & info_name, "" ) ;
973
- let ty = name_to_wrapped_ty ( & nb_name) ;
974
- let array_ty = new_syn_array ( ty, array_info. dim ) ;
975
-
976
- new_syn_field ( nb_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty)
977
- }
978
- } )
979
- }
980
-
981
- /// Return an syn::Type for an ArrayProxy.
982
- fn array_proxy ( info : & ClusterInfo , array_info : & DimElement ) -> RegisterBlockField {
983
- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
984
- let ty = name_to_ty ( & ty_name) ;
985
-
986
- let ap_path = array_proxy_type ( ty, array_info) ;
987
-
988
- RegisterBlockField {
989
- syn_field : new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ap_path) ,
990
- description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
991
- offset : info. address_offset ,
992
- size : 0 ,
993
- accessors : None ,
994
- }
995
- }
996
-
997
- /// Convert a parsed `Cluster` into its `Field` equivalent
998
- fn cluster_to_syn_field ( cluster : & Cluster ) -> Result < syn:: Field , syn:: Error > {
999
- Ok ( match cluster {
1000
- Cluster :: Single ( info) => {
1001
- let ty = syn:: Type :: Path ( name_to_ty ( & info. name ) ) ;
1002
- new_syn_field ( info. name . to_snake_case_ident ( Span :: call_site ( ) ) , ty)
1003
- }
1004
- Cluster :: Array ( info, array_info) => {
1005
- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
1006
- let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
1007
- let array_ty = new_syn_array ( ty, array_info. dim ) ;
1008
-
1009
- new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty)
1010
- }
1011
- } )
1012
- }
1013
-
1014
982
fn new_syn_field ( ident : Ident , ty : syn:: Type ) -> syn:: Field {
1015
983
let span = Span :: call_site ( ) ;
1016
984
syn:: Field {
0 commit comments