@@ -439,7 +439,7 @@ fn register_or_cluster_block(
439
439
let mut accessors = TokenStream :: new ( ) ;
440
440
441
441
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" ) ?;
443
443
444
444
// Locate conflicting regions; we'll need to use unions to represent them.
445
445
let mut regions = FieldRegions :: default ( ) ;
@@ -564,17 +564,13 @@ fn register_or_cluster_block(
564
564
565
565
/// Expand a list of parsed `Register`s or `Cluster`s, and render them to
566
566
/// `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 > > {
572
568
let mut ercs_expanded = vec ! [ ] ;
573
569
574
570
debug ! ( "Expanding registers or clusters into Register Block Fields" ) ;
575
571
for erc in ercs {
576
572
match & erc {
577
- RegisterCluster :: Register ( register) => match expand_register ( register, name , config) {
573
+ RegisterCluster :: Register ( register) => match expand_register ( register, config) {
578
574
Ok ( expanded_reg) => {
579
575
trace ! ( "Register: {}" , register. name) ;
580
576
ercs_expanded. extend ( expanded_reg) ;
@@ -584,7 +580,7 @@ fn expand(
584
580
return handle_reg_error ( "Error expanding register" , register, res) ;
585
581
}
586
582
} ,
587
- RegisterCluster :: Cluster ( cluster) => match expand_cluster ( cluster, name , config) {
583
+ RegisterCluster :: Cluster ( cluster) => match expand_cluster ( cluster, config) {
588
584
Ok ( expanded_cluster) => {
589
585
trace ! ( "Cluster: {}" , cluster. name) ;
590
586
ercs_expanded. extend ( expanded_cluster) ;
@@ -631,7 +627,7 @@ fn cluster_info_size_in_bits(info: &ClusterInfo, config: &Config) -> Result<u32>
631
627
for c in & info. children {
632
628
let end = match c {
633
629
RegisterCluster :: Register ( reg) => {
634
- let reg_size: u32 = expand_register ( reg, None , config) ?
630
+ let reg_size: u32 = expand_register ( reg, config) ?
635
631
. iter ( )
636
632
. map ( |rbf| rbf. size )
637
633
. sum ( ) ;
@@ -649,19 +645,15 @@ fn cluster_info_size_in_bits(info: &ClusterInfo, config: &Config) -> Result<u32>
649
645
}
650
646
651
647
/// 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 > > {
657
649
let mut cluster_expanded = vec ! [ ] ;
658
650
659
651
let cluster_size = cluster_info_size_in_bits ( cluster, config)
660
652
. with_context ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
661
653
662
654
match cluster {
663
655
Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
664
- syn_field : convert_svd_cluster ( cluster, name ) ?,
656
+ syn_field : convert_svd_cluster ( cluster) ?,
665
657
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
666
658
offset : info. address_offset ,
667
659
size : cluster_size,
@@ -690,7 +682,7 @@ fn expand_cluster(
690
682
if array_convertible {
691
683
if sequential_indexes_from0 {
692
684
cluster_expanded. push ( RegisterBlockField {
693
- syn_field : convert_svd_cluster ( cluster, name ) ?,
685
+ syn_field : convert_svd_cluster ( cluster) ?,
694
686
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
695
687
offset : info. address_offset ,
696
688
size : cluster_size * array_info. dim ,
@@ -700,7 +692,7 @@ fn expand_cluster(
700
692
let span = Span :: call_site ( ) ;
701
693
let mut accessors = TokenStream :: new ( ) ;
702
694
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) ?;
704
696
let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
705
697
let description = info. description . as_ref ( ) . unwrap_or ( & info. name ) ;
706
698
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
@@ -721,7 +713,7 @@ fn expand_cluster(
721
713
} ) ;
722
714
}
723
715
cluster_expanded. push ( RegisterBlockField {
724
- syn_field : convert_svd_cluster ( cluster, name ) ?,
716
+ syn_field : convert_svd_cluster ( cluster) ?,
725
717
description : description. into ( ) ,
726
718
offset : info. address_offset ,
727
719
size : cluster_size * array_info. dim ,
@@ -731,11 +723,9 @@ fn expand_cluster(
731
723
} else if sequential_indexes_from0 && config. const_generic {
732
724
// Include a ZST ArrayProxy giving indexed access to the
733
725
// elements.
734
- cluster_expanded. push ( array_proxy ( info, array_info, name ) ?) ;
726
+ cluster_expanded. push ( array_proxy ( info, array_info) ?) ;
735
727
} 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 ( ) {
739
729
cluster_expanded. push ( RegisterBlockField {
740
730
syn_field,
741
731
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
@@ -753,11 +743,7 @@ fn expand_cluster(
753
743
754
744
/// If svd register arrays can't be converted to rust arrays (non sequential addresses, non
755
745
/// 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 > > {
761
747
let mut register_expanded = vec ! [ ] ;
762
748
763
749
let register_size = register
@@ -767,7 +753,7 @@ fn expand_register(
767
753
768
754
match register {
769
755
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 )
771
757
. with_context ( || "syn error occured" ) ?,
772
758
description : info. description . clone ( ) . unwrap_or_default ( ) ,
773
759
offset : info. address_offset ,
@@ -797,7 +783,7 @@ fn expand_register(
797
783
798
784
if sequential_indexes_from0 {
799
785
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 ) ?,
801
787
description : info. description . clone ( ) . unwrap_or_default ( ) ,
802
788
offset : info. address_offset ,
803
789
size : register_size * array_info. dim ,
@@ -807,7 +793,7 @@ fn expand_register(
807
793
let span = Span :: call_site ( ) ;
808
794
let mut accessors = TokenStream :: new ( ) ;
809
795
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) ?;
811
797
let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
812
798
let description = info. description . clone ( ) . unwrap_or_default ( ) ;
813
799
let info_name = info. fullname ( config. ignore_groups ) ;
@@ -829,18 +815,17 @@ fn expand_register(
829
815
} ) ;
830
816
}
831
817
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 ) ?,
833
819
description,
834
820
offset : info. address_offset ,
835
821
size : register_size * array_info. dim ,
836
822
accessors : Some ( accessors) ,
837
823
} ) ;
838
824
}
839
825
} 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 ( )
844
829
{
845
830
register_expanded. push ( RegisterBlockField {
846
831
syn_field,
@@ -911,13 +896,7 @@ fn cluster_block(
911
896
let mod_items = render_ercs ( & mut c. children , path, index, config) ?;
912
897
913
898
// 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 , "" ) ;
921
900
922
901
let reg_block = register_or_cluster_block ( & c. children , Some ( & mod_name) , config) ?;
923
902
@@ -927,32 +906,33 @@ fn cluster_block(
927
906
928
907
let name_snake_case = mod_name. to_snake_case_ident ( Span :: call_site ( ) ) ;
929
908
909
+ let struct_path = name_to_ty ( & mod_name) ?;
910
+
930
911
Ok ( quote ! {
931
- #reg_block
912
+ #[ doc = #description]
913
+ pub use #struct_path;
932
914
933
- ///Register block
915
+ ///Cluster
934
916
#[ doc = #description]
935
917
pub mod #name_snake_case {
918
+ #reg_block
919
+
936
920
#mod_items
937
921
}
938
922
} )
939
923
}
940
924
941
925
/// Takes a svd::Register which may be a register array, and turn in into
942
926
/// 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 > > {
948
928
if let Register :: Array ( info, array_info) = register {
949
929
let ty_name = util:: replace_suffix ( & info. fullname ( ignore_group) , "" ) ;
950
930
951
931
let mut out = vec ! [ ] ;
952
932
for idx in array_info. indexes ( ) {
953
933
let nb_name = util:: replace_suffix ( & info. fullname ( ignore_group) , & idx) ;
954
934
955
- let ty = name_to_wrapped_ty ( & ty_name, name ) ?;
935
+ let ty = name_to_wrapped_ty ( & ty_name) ?;
956
936
957
937
out. push ( new_syn_field (
958
938
nb_name. to_snake_case_ident ( Span :: call_site ( ) ) ,
@@ -961,27 +941,23 @@ fn expand_svd_register(
961
941
}
962
942
Ok ( out)
963
943
} else {
964
- Ok ( vec ! [ convert_svd_register( register, name , ignore_group) ?] )
944
+ Ok ( vec ! [ convert_svd_register( register, ignore_group) ?] )
965
945
}
966
946
}
967
947
968
948
/// 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 > {
974
950
Ok ( match register {
975
951
Register :: Single ( info) => {
976
952
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)
978
954
. with_context ( || format ! ( "Error converting register name {info_name}" ) ) ?;
979
955
new_syn_field ( info_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty)
980
956
}
981
957
Register :: Array ( info, array_info) => {
982
958
let info_name = info. fullname ( ignore_group) ;
983
959
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)
985
961
. with_context ( || format ! ( "Error converting register name {nb_name}" ) ) ?;
986
962
let array_ty = new_syn_array ( ty, array_info. dim ) ;
987
963
@@ -994,10 +970,9 @@ fn convert_svd_register(
994
970
fn array_proxy (
995
971
info : & ClusterInfo ,
996
972
array_info : & DimElement ,
997
- name : Option < & str > ,
998
973
) -> Result < RegisterBlockField , syn:: Error > {
999
974
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) ;
1001
976
1002
977
let ap_path = parse_str :: < syn:: TypePath > ( & format ! (
1003
978
"crate::ArrayProxy<{tys}, {}, {}>" ,
@@ -1019,18 +994,15 @@ fn array_proxy(
1019
994
1020
995
/// Takes a svd::Cluster which may contain a register array, and turn it into
1021
996
/// 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 > {
1026
998
if let Cluster :: Array ( info, array_info) = cluster {
1027
999
let ty_name = util:: replace_suffix ( & info. name , "" ) ;
1028
1000
1029
1001
let mut out = vec ! [ ] ;
1030
1002
for idx in array_info. indexes ( ) {
1031
1003
let nb_name = util:: replace_suffix ( & info. name , & idx) ;
1032
1004
1033
- let ty = name_to_ty ( & ty_name, name ) ?;
1005
+ let ty = name_to_ty ( & ty_name) ?;
1034
1006
1035
1007
out. push ( new_syn_field (
1036
1008
nb_name. to_snake_case_ident ( Span :: call_site ( ) ) ,
@@ -1039,21 +1011,21 @@ fn expand_svd_cluster(
1039
1011
}
1040
1012
Ok ( out)
1041
1013
} else {
1042
- Ok ( vec ! [ convert_svd_cluster( cluster, name ) ?] )
1014
+ Ok ( vec ! [ convert_svd_cluster( cluster) ?] )
1043
1015
}
1044
1016
}
1045
1017
1046
1018
/// 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 > {
1048
1020
Ok ( match cluster {
1049
1021
Cluster :: Single ( info) => {
1050
1022
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) ?;
1052
1024
new_syn_field ( info. name . to_snake_case_ident ( Span :: call_site ( ) ) , ty)
1053
1025
}
1054
1026
Cluster :: Array ( info, array_info) => {
1055
1027
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) ?;
1057
1029
let array_ty = new_syn_array ( ty, array_info. dim ) ;
1058
1030
1059
1031
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 {
1091
1063
} )
1092
1064
}
1093
1065
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( ) ,
1103
1070
name. to_sanitized_constant_case( )
1104
- }
1071
+ )
1105
1072
}
1106
1073
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) ;
1109
1076
parse_str :: < syn:: TypePath > ( & ident) . map ( syn:: Type :: Path )
1110
1077
}
1111
1078
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
+ )
1127
1085
}
1128
1086
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) ;
1131
1089
parse_str :: < syn:: TypePath > ( & ident)
1132
1090
. map ( syn:: Type :: Path )
1133
1091
. map_err ( anyhow:: Error :: from)
0 commit comments