@@ -249,6 +249,7 @@ pub fn unsuffixed_or_bool(n: u64, width: u32) -> Lit {
249
249
250
250
#[ derive( Clone , Debug ) ]
251
251
pub struct Base < ' a > {
252
+ pub peripheral : Option < & ' a str > ,
252
253
pub register : Option < & ' a str > ,
253
254
pub field : & ' a str ,
254
255
}
@@ -260,27 +261,38 @@ pub fn lookup<'a>
260
261
register : & ' a Register ,
261
262
all_registers : & ' a [ Register ] ,
262
263
peripheral : & ' a Peripheral ,
264
+ all_peripherals : & ' a [ Peripheral ] ,
263
265
usage : Usage ,
264
266
) -> Result < Option < ( & ' a EnumeratedValues , Option < Base < ' a > > ) > > {
265
267
let evs = evs. iter ( )
266
268
. map (
267
269
|evs| if let Some ( ref base) = evs. derived_from {
268
270
let mut parts = base. split ( '.' ) ;
269
271
270
- match ( parts. next ( ) , parts. next ( ) , parts. next ( ) ) {
271
- ( Some ( base_register) , Some ( base_field) , Some ( base_evs) ) => {
272
+ match ( parts. next ( ) , parts. next ( ) , parts. next ( ) , parts. next ( ) ) {
273
+ ( Some ( base_peripheral) , Some ( base_register) , Some ( base_field) , Some ( base_evs) ) => {
274
+ lookup_in_peripherals (
275
+ base_peripheral,
276
+ base_register,
277
+ base_field,
278
+ base_evs,
279
+ all_peripherals,
280
+ )
281
+ }
282
+ ( Some ( base_register) , Some ( base_field) , Some ( base_evs) , None ) => {
272
283
lookup_in_peripheral (
284
+ None ,
273
285
base_register,
274
286
base_field,
275
287
base_evs,
276
288
all_registers,
277
289
peripheral,
278
290
)
279
291
}
280
- ( Some ( base_field) , Some ( base_evs) , None ) => {
292
+ ( Some ( base_field) , Some ( base_evs) , None , None ) => {
281
293
lookup_in_fields ( base_evs, base_field, fields, register)
282
294
}
283
- ( Some ( base_evs) , None , None ) => {
295
+ ( Some ( base_evs) , None , None , None ) => {
284
296
lookup_in_register ( base_evs, register)
285
297
}
286
298
_ => unreachable ! ( ) ,
@@ -307,7 +319,7 @@ fn lookup_in_fields<'f>(
307
319
register : & Register ,
308
320
) -> Result < ( & ' f EnumeratedValues , Option < Base < ' f > > ) > {
309
321
if let Some ( base_field) = fields. iter ( ) . find ( |f| f. name == base_field) {
310
- return lookup_in_field ( base_evs, None , base_field) ;
322
+ return lookup_in_field ( base_evs, None , None , base_field) ;
311
323
} else {
312
324
Err (
313
325
format ! (
@@ -321,6 +333,7 @@ fn lookup_in_fields<'f>(
321
333
322
334
fn lookup_in_peripheral < ' p >
323
335
(
336
+ base_peripheral : Option < & ' p str > ,
324
337
base_register : & ' p str ,
325
338
base_field : & str ,
326
339
base_evs : & str ,
@@ -339,7 +352,7 @@ fn lookup_in_peripheral<'p>
339
352
. unwrap_or ( & [ ] )
340
353
. iter ( )
341
354
. find ( |f| f. name == base_field) {
342
- lookup_in_field ( base_evs, Some ( base_register) , field)
355
+ lookup_in_field ( base_evs, Some ( base_register) , base_peripheral , field)
343
356
} else {
344
357
Err (
345
358
format ! (
@@ -363,6 +376,7 @@ fn lookup_in_peripheral<'p>
363
376
fn lookup_in_field < ' f > (
364
377
base_evs : & str ,
365
378
base_register : Option < & ' f str > ,
379
+ base_peripheral : Option < & ' f str > ,
366
380
field : & ' f Field ,
367
381
) -> Result < ( & ' f EnumeratedValues , Option < Base < ' f > > ) > {
368
382
for evs in & field. enumerated_values {
@@ -373,6 +387,7 @@ fn lookup_in_field<'f>(
373
387
Base {
374
388
field : & field. name ,
375
389
register : base_register,
390
+ peripheral : base_peripheral,
376
391
} ,
377
392
) ) ) ,
378
393
) ;
@@ -416,6 +431,7 @@ fn lookup_in_register<'r>
416
431
Base {
417
432
field : field,
418
433
register : None ,
434
+ peripheral : None
419
435
} ,
420
436
) ) ,
421
437
) ;
@@ -437,6 +453,40 @@ fn lookup_in_register<'r>
437
453
}
438
454
}
439
455
456
+ fn lookup_in_peripherals < ' p >
457
+ (
458
+ base_peripheral : & ' p str ,
459
+ base_register : & ' p str ,
460
+ base_field : & str ,
461
+ base_evs : & str ,
462
+ all_peripherals : & ' p [ Peripheral ] ,
463
+ ) -> Result < ( & ' p EnumeratedValues , Option < Base < ' p > > ) > {
464
+ if let Some ( peripheral) = all_peripherals
465
+ . iter ( )
466
+ . find ( |p| { p. name == base_peripheral } ) {
467
+ let all_registers = peripheral. registers
468
+ . as_ref ( )
469
+ . map ( |x| x. as_ref ( ) )
470
+ . unwrap_or ( & [ ] [ ..] ) ;
471
+ lookup_in_peripheral (
472
+ Some ( base_peripheral) ,
473
+ base_register,
474
+ base_field,
475
+ base_evs,
476
+ all_registers,
477
+ peripheral
478
+ )
479
+ } else {
480
+ Err (
481
+ format ! (
482
+ "No peripheral {}" ,
483
+ base_peripheral
484
+ ) ,
485
+ ) ?
486
+ }
487
+ }
488
+
489
+
440
490
pub trait U32Ext {
441
491
fn to_ty ( & self ) -> Result < Ident > ;
442
492
fn to_ty_width ( & self ) -> Result < u32 > ;
0 commit comments