@@ -18,7 +18,8 @@ use liquid::{
18
18
} ;
19
19
use rayon:: prelude:: { IntoParallelRefIterator , ParallelIterator } ;
20
20
use svd_parser:: expand:: {
21
- derive_cluster, derive_enumerated_values, derive_register, BlockPath , RegisterPath ,
21
+ derive_cluster, derive_enumerated_values, derive_field, derive_register, BlockPath ,
22
+ RegisterPath ,
22
23
} ;
23
24
use svd_parser:: {
24
25
expand:: { derive_peripheral, Index } ,
@@ -122,9 +123,12 @@ fn parse_cluster(
122
123
cpath : & BlockPath ,
123
124
index : & Index ,
124
125
) -> anyhow:: Result < ( ) > {
126
+ let mut cpath = cpath. clone ( ) ;
125
127
let ctag = if let Some ( dfname) = ctag. derived_from . as_ref ( ) {
126
128
let mut ctag = ctag. clone ( ) ;
127
- derive_cluster ( & mut ctag, dfname, & cpath. parent ( ) . unwrap ( ) , index) ?;
129
+ if let Some ( path) = derive_cluster ( & mut ctag, dfname, & cpath. parent ( ) . unwrap ( ) , index) ? {
130
+ cpath = path;
131
+ }
128
132
Cow :: Owned ( ctag)
129
133
} else {
130
134
Cow :: Borrowed ( ctag)
@@ -162,16 +166,19 @@ fn parse_register_array(
162
166
rpath : & RegisterPath ,
163
167
index : & Index ,
164
168
) -> anyhow:: Result < ( ) > {
169
+ let mut rpath = rpath. clone ( ) ;
165
170
let rtag = if let Some ( dfname) = rtag. derived_from . as_ref ( ) {
166
171
let mut rtag = rtag. clone ( ) ;
167
- derive_register ( & mut rtag, dfname, & rpath. block , index) ?;
172
+ if let Some ( path) = derive_register ( & mut rtag, dfname, & rpath. block , index) ? {
173
+ rpath = path;
174
+ }
168
175
Cow :: Owned ( rtag)
169
176
} else {
170
177
Cow :: Borrowed ( rtag)
171
178
} ;
172
179
match rtag. as_ref ( ) {
173
180
Register :: Single ( r) => {
174
- let register = parse_register ( r, rpath, index)
181
+ let register = parse_register ( r, & rpath, index)
175
182
. with_context ( || format ! ( "In register {}" , r. name) ) ?;
176
183
registers. push ( register) ;
177
184
}
@@ -184,7 +191,7 @@ fn parse_register_array(
184
191
r. description = r
185
192
. description
186
193
. map ( |d| d. replace ( "[%s]" , & idx) . replace ( "%s" , & idx) ) ;
187
- let register = parse_register ( & r, rpath, index)
194
+ let register = parse_register ( & r, & rpath, index)
188
195
. with_context ( || format ! ( "In register {}" , r. name) ) ?;
189
196
registers. push ( register) ;
190
197
}
@@ -209,9 +216,19 @@ fn parse_register(
209
216
210
217
let mut flds = Vec :: new ( ) ;
211
218
for f in rtag. fields ( ) {
219
+ let mut fpath = rpath. new_field ( & f. name ) ;
220
+ let f = if let Some ( dfname) = f. derived_from . as_ref ( ) {
221
+ let mut f = f. clone ( ) ;
222
+ if let Some ( path) = derive_field ( & mut f, dfname, rpath, index) ? {
223
+ fpath = path;
224
+ }
225
+ f
226
+ } else {
227
+ f. clone ( )
228
+ } ;
212
229
match f {
213
230
Field :: Single ( f) => {
214
- flds. push ( Cow :: Borrowed ( f ) ) ;
231
+ flds. push ( ( f , fpath ) ) ;
215
232
}
216
233
Field :: Array ( f, d) => {
217
234
for ( i, idx) in d. indexes ( ) . enumerate ( ) {
@@ -225,22 +242,20 @@ fn parse_register(
225
242
f. description = f
226
243
. description
227
244
. map ( |d| d. replace ( "[%s]" , & idx) . replace ( "%s" , & idx) ) ;
228
- flds. push ( Cow :: Owned ( f ) ) ;
245
+ flds. push ( ( f , fpath . clone ( ) ) ) ;
229
246
}
230
247
}
231
248
}
232
249
}
233
250
234
- flds. sort_by_key ( |f| f. bit_offset ( ) ) ;
251
+ flds. sort_by_key ( |f| f. 0 . bit_offset ( ) ) ;
235
252
236
253
let mut filling = 0_u64 ;
237
254
238
255
let mut fields = Vec :: with_capacity ( flds. len ( ) ) ;
239
- for ftag in & flds {
256
+ for ( ftag, fpath ) in & flds {
240
257
register_fields_total += 1 ;
241
258
242
- let fpath = rpath. new_field ( & ftag. name ) ;
243
-
244
259
let foffset = ftag. bit_offset ( ) ;
245
260
let fwidth = ftag. bit_width ( ) ;
246
261
let bit_mask = ( u64:: MAX >> ( u64:: BITS - fwidth) ) << foffset;
@@ -256,7 +271,7 @@ fn parse_register(
256
271
let mut doc = "Allowed values:<br>" . to_string ( ) ;
257
272
let enums = if let Some ( dfname) = enums. derived_from . as_ref ( ) {
258
273
let mut enums = enums. clone ( ) ;
259
- derive_enumerated_values ( & mut enums, dfname, & fpath, index) ?;
274
+ derive_enumerated_values ( & mut enums, dfname, fpath, index) ?;
260
275
Cow :: Owned ( enums)
261
276
} else {
262
277
Cow :: Borrowed ( enums)
@@ -310,7 +325,7 @@ fn parse_register(
310
325
2
311
326
] ;
312
327
313
- for ftag in flds. iter ( ) . rev ( ) {
328
+ for ( ftag, _ ) in flds. iter ( ) . rev ( ) {
314
329
let foffset = ftag. bit_offset ( ) ;
315
330
let faccs = ftag. access . map ( Access :: as_str) . unwrap_or ( raccs) ;
316
331
let access = short_access ( faccs) ;
0 commit comments