@@ -4,7 +4,8 @@ use std::collections::HashMap;
4
4
5
5
use quote:: ToTokens ;
6
6
use proc_macro2:: TokenStream ;
7
- use crate :: svd:: { Cluster , ClusterInfo , Defaults , Peripheral , Register , RegisterCluster , RegisterInfo } ;
7
+ use crate :: svd:: { Cluster , ClusterInfo , RegisterProperties , Peripheral , Register , RegisterCluster } ;
8
+ use svd_parser:: derive_from:: DeriveFrom ;
8
9
use proc_macro2:: { Ident , Span , Punct , Spacing } ;
9
10
use log:: warn;
10
11
use syn:: { parse_str, Token } ;
@@ -17,7 +18,7 @@ use crate::generate::register;
17
18
pub fn render (
18
19
p_original : & Peripheral ,
19
20
all_peripherals : & [ Peripheral ] ,
20
- defaults : & Defaults ,
21
+ defaults : & RegisterProperties ,
21
22
nightly : bool ,
22
23
) -> Result < Vec < TokenStream > > {
23
24
let mut out = vec ! [ ] ;
@@ -95,21 +96,6 @@ pub fn render(
95
96
reg_map. insert ( & r. name , r. clone ( ) ) ;
96
97
}
97
98
98
- // Compute the effective, derived version of a register given the definition
99
- // with the derived_from property on it (`info`) and its `ancestor`
100
- fn derive_reg_info ( info : & RegisterInfo , ancestor : & RegisterInfo ) -> RegisterInfo {
101
- let mut derived = info. clone ( ) ;
102
-
103
- derived. size = derived. size . or ( ancestor. size ) ;
104
- derived. access = derived. access . or ( ancestor. access ) ;
105
- derived. reset_value = derived. reset_value . or ( ancestor. reset_value ) ;
106
- derived. reset_mask = derived. reset_mask . or ( ancestor. reset_mask ) ;
107
- derived. fields = derived. fields . or ( ancestor. fields . clone ( ) ) ;
108
- derived. write_constraint = derived. write_constraint . or ( ancestor. write_constraint ) ;
109
-
110
- derived
111
- }
112
-
113
99
// Build up an alternate erc list by expanding any derived registers
114
100
let mut alt_erc : Vec < RegisterCluster > = registers. iter ( ) . filter_map ( |r| {
115
101
match r. derived_from {
@@ -124,10 +110,10 @@ pub fn render(
124
110
125
111
let d = match * * ancestor {
126
112
Register :: Array ( ref info, ref array_info) => {
127
- Some ( RegisterCluster :: Register ( Register :: Array ( derive_reg_info ( * r , info) , array_info. clone ( ) ) ) )
113
+ Some ( RegisterCluster :: Register ( Register :: Array ( r . derive_from ( info) , array_info. clone ( ) ) ) )
128
114
}
129
115
Register :: Single ( ref info) => {
130
- Some ( RegisterCluster :: Register ( Register :: Single ( derive_reg_info ( * r , info) ) ) )
116
+ Some ( RegisterCluster :: Register ( Register :: Single ( r . derive_from ( info) ) ) )
131
117
}
132
118
} ;
133
119
@@ -155,13 +141,15 @@ pub fn render(
155
141
return Ok ( out) ;
156
142
}
157
143
144
+ let defaults = p. default_register_properties . derive_from ( defaults) ;
145
+
158
146
// Push any register or cluster blocks into the output
159
147
let mut mod_items = vec ! [ ] ;
160
- mod_items. push ( register_or_cluster_block ( ercs, defaults, None , nightly) ?) ;
148
+ mod_items. push ( register_or_cluster_block ( ercs, & defaults, None , nightly) ?) ;
161
149
162
150
// Push all cluster related information into the peripheral module
163
151
for c in & clusters {
164
- mod_items. push ( cluster_block ( c, defaults, p, all_peripherals, nightly) ?) ;
152
+ mod_items. push ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
165
153
}
166
154
167
155
// Push all regsiter realted information into the peripheral module
@@ -171,7 +159,7 @@ pub fn render(
171
159
registers,
172
160
p,
173
161
all_peripherals,
174
- defaults,
162
+ & defaults,
175
163
) ?) ;
176
164
}
177
165
@@ -428,7 +416,7 @@ impl FieldRegions {
428
416
429
417
fn register_or_cluster_block (
430
418
ercs : & [ RegisterCluster ] ,
431
- defs : & Defaults ,
419
+ defs : & RegisterProperties ,
432
420
name : Option < & str > ,
433
421
_nightly : bool ,
434
422
) -> Result < TokenStream > {
@@ -563,7 +551,7 @@ fn register_or_cluster_block(
563
551
/// `RegisterBlockField`s containing `Field`s.
564
552
fn expand (
565
553
ercs : & [ RegisterCluster ] ,
566
- defs : & Defaults ,
554
+ defs : & RegisterProperties ,
567
555
name : Option < & str > ,
568
556
) -> Result < Vec < RegisterBlockField > > {
569
557
let mut ercs_expanded = vec ! [ ] ;
@@ -582,7 +570,7 @@ fn expand(
582
570
583
571
/// Recursively calculate the size of a cluster. A cluster's size is the maximum
584
572
/// end position of its recursive children.
585
- fn cluster_size_in_bits ( info : & ClusterInfo , defs : & Defaults ) -> Result < u32 > {
573
+ fn cluster_size_in_bits ( info : & ClusterInfo , defs : & RegisterProperties ) -> Result < u32 > {
586
574
let mut size = 0 ;
587
575
588
576
for c in & info. children {
@@ -606,12 +594,10 @@ fn cluster_size_in_bits(info: &ClusterInfo, defs: &Defaults) -> Result<u32> {
606
594
}
607
595
608
596
/// Render a given cluster (and any children) into `RegisterBlockField`s
609
- fn expand_cluster ( cluster : & Cluster , defs : & Defaults ) -> Result < Vec < RegisterBlockField > > {
597
+ fn expand_cluster ( cluster : & Cluster , defs : & RegisterProperties ) -> Result < Vec < RegisterBlockField > > {
610
598
let mut cluster_expanded = vec ! [ ] ;
611
599
612
- let reg_size = cluster. size . or ( defs. size ) ;
613
- let mut defs = defs. clone ( ) ;
614
- defs. size = reg_size;
600
+ let defs = cluster. default_register_properties . derive_from ( defs) ;
615
601
616
602
let cluster_size = cluster_size_in_bits ( cluster, & defs)
617
603
. chain_err ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
@@ -663,7 +649,7 @@ fn expand_cluster(cluster: &Cluster, defs: &Defaults) -> Result<Vec<RegisterBloc
663
649
/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
664
650
fn expand_register (
665
651
register : & Register ,
666
- defs : & Defaults ,
652
+ defs : & RegisterProperties ,
667
653
name : Option < & str > ,
668
654
) -> Result < Vec < RegisterBlockField > > {
669
655
let mut register_expanded = vec ! [ ] ;
@@ -719,7 +705,7 @@ fn expand_register(
719
705
/// Render a Cluster Block into `TokenStream`
720
706
fn cluster_block (
721
707
c : & Cluster ,
722
- defaults : & Defaults ,
708
+ defaults : & RegisterProperties ,
723
709
p : & Peripheral ,
724
710
all_peripherals : & [ Peripheral ] ,
725
711
nightly : bool ,
@@ -738,9 +724,7 @@ fn cluster_block(
738
724
. replace ( "%s" , "" ) ;
739
725
let name_sc = Ident :: new ( & mod_name. to_sanitized_snake_case ( ) , Span :: call_site ( ) ) ;
740
726
741
- let reg_size = c. size . or ( defaults. size ) ;
742
- let mut defaults = defaults. clone ( ) ;
743
- defaults. size = reg_size;
727
+ let defaults = c. default_register_properties . derive_from ( defaults) ;
744
728
745
729
let reg_block = register_or_cluster_block ( & c. children , & defaults, Some ( & mod_name) , nightly) ?;
746
730
0 commit comments