@@ -357,11 +357,13 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
357
357
let access = access ( & register) ;
358
358
359
359
items. extend ( gen_register ( register, d) ) ;
360
- if access != Access :: WriteOnly {
361
- items. extend ( gen_register_r ( register, d) ) ;
362
- }
363
- if access != Access :: ReadOnly {
364
- items. extend ( gen_register_w ( register, d) ) ;
360
+ if let Some ( ref fields) = register. fields {
361
+ if access != Access :: WriteOnly {
362
+ items. extend ( gen_register_r ( register, d, fields) ) ;
363
+ }
364
+ if access != Access :: ReadOnly {
365
+ items. extend ( gen_register_w ( register, d, fields) ) ;
366
+ }
365
367
}
366
368
}
367
369
@@ -454,13 +456,14 @@ fn type_of(r: &Register) -> String {
454
456
455
457
fn access ( r : & Register ) -> Access {
456
458
r. access . unwrap_or_else ( || {
457
- let fields = r. fields
458
- . as_ref ( )
459
- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) ;
460
- if fields. iter ( ) . all ( |f| f. access == Some ( Access :: ReadOnly ) ) {
461
- Access :: ReadOnly
462
- } else if fields. iter ( ) . all ( |f| f. access == Some ( Access :: WriteOnly ) ) {
463
- Access :: WriteOnly
459
+ if let Some ( ref fields) = r. fields {
460
+ if fields. iter ( ) . all ( |f| f. access == Some ( Access :: ReadOnly ) ) {
461
+ Access :: ReadOnly
462
+ } else if fields. iter ( ) . all ( |f| f. access == Some ( Access :: WriteOnly ) ) {
463
+ Access :: WriteOnly
464
+ } else {
465
+ Access :: ReadWrite
466
+ }
464
467
} else {
465
468
Access :: ReadWrite
466
469
}
@@ -479,8 +482,6 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
479
482
. to_ty ( ) ;
480
483
let access = access ( r) ;
481
484
482
- let name_r = Ident :: new ( format ! ( "{}R" , ty) ) ;
483
- let name_w = Ident :: new ( format ! ( "{}W" , ty) ) ;
484
485
match access {
485
486
Access :: ReadOnly => {
486
487
items. push ( quote ! {
@@ -489,80 +490,130 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
489
490
register: :: volatile_register:: RO <#bits_ty>
490
491
}
491
492
} ) ;
492
-
493
- items. push ( quote ! {
494
- impl #name {
495
- pub fn read( & self ) -> #name_r {
496
- #name_r { bits: self . register. read( ) }
497
- }
498
- }
499
- } ) ;
500
493
}
501
-
502
494
Access :: ReadWrite => {
503
495
items. push ( quote ! {
504
496
#[ repr( C ) ]
505
497
pub struct #name {
506
498
register: :: volatile_register:: RW <#bits_ty>
507
499
}
508
500
} ) ;
509
-
510
- items. push ( quote ! {
511
- impl #name {
512
- pub fn modify<F >( & mut self , f: F )
513
- where for <' w> F : FnOnce ( & #name_r, & ' w mut #name_w) -> & ' w mut #name_w,
514
- {
515
- let bits = self . register. read( ) ;
516
- let r = #name_r { bits: bits } ;
517
- let mut w = #name_w { bits: bits } ;
518
- f( & r, & mut w) ;
519
- self . register. write( w. bits) ;
520
- }
521
-
522
- pub fn read( & self ) -> #name_r {
523
- #name_r { bits: self . register. read( ) }
524
- }
525
-
526
- pub fn write<F >( & mut self , f: F )
527
- where F : FnOnce ( & mut #name_w) -> & mut #name_w,
528
- {
529
- let mut w = #name_w:: reset_value( ) ;
530
- f( & mut w) ;
531
- self . register. write( w. bits) ;
532
- }
533
- }
534
- } ) ;
535
501
}
536
-
537
502
Access :: WriteOnly => {
538
503
items. push ( quote ! {
539
504
#[ repr( C ) ]
540
505
pub struct #name {
541
506
register: :: volatile_register:: WO <#bits_ty>
542
507
}
543
508
} ) ;
509
+ }
510
+ _ => unreachable ! ( ) ,
511
+ }
544
512
545
- items. push ( quote ! {
546
- impl #name {
547
- pub fn write<F >( & self , f: F )
548
- where F : FnOnce ( & mut #name_w) -> & mut #name_w,
549
- {
550
- let mut w = #name_w:: reset_value( ) ;
551
- f( & mut w) ;
552
- self . register. write( w. bits) ;
513
+ if r. fields . is_some ( ) {
514
+ let name_r = Ident :: new ( format ! ( "{}R" , ty) ) ;
515
+ let name_w = Ident :: new ( format ! ( "{}W" , ty) ) ;
516
+ match access {
517
+ Access :: ReadOnly => {
518
+ items. push ( quote ! {
519
+ impl #name {
520
+ pub fn read( & self ) -> #name_r {
521
+ #name_r { bits: self . register. read( ) }
522
+ }
553
523
}
554
- }
555
- } ) ;
524
+ } ) ;
525
+ }
526
+ Access :: ReadWrite => {
527
+ items. push ( quote ! {
528
+ impl #name {
529
+ pub fn modify<F >( & mut self , f: F )
530
+ where for <' w> F : FnOnce ( & #name_r, & ' w mut #name_w) -> & ' w mut #name_w,
531
+ {
532
+ let bits = self . register. read( ) ;
533
+ let r = #name_r { bits: bits } ;
534
+ let mut w = #name_w { bits: bits } ;
535
+ f( & r, & mut w) ;
536
+ self . register. write( w. bits) ;
537
+ }
538
+
539
+ pub fn read( & self ) -> #name_r {
540
+ #name_r { bits: self . register. read( ) }
541
+ }
542
+
543
+ pub fn write<F >( & mut self , f: F )
544
+ where F : FnOnce ( & mut #name_w) -> & mut #name_w,
545
+ {
546
+ let mut w = #name_w:: reset_value( ) ;
547
+ f( & mut w) ;
548
+ self . register. write( w. bits) ;
549
+ }
550
+ }
551
+ } ) ;
552
+ }
553
+
554
+ Access :: WriteOnly => {
555
+ items. push ( quote ! {
556
+ impl #name {
557
+ pub fn write<F >( & self , f: F )
558
+ where F : FnOnce ( & mut #name_w) -> & mut #name_w,
559
+ {
560
+ let mut w = #name_w:: reset_value( ) ;
561
+ f( & mut w) ;
562
+ self . register. write( w. bits) ;
563
+ }
564
+ }
565
+ } ) ;
566
+ }
567
+
568
+ _ => unreachable ! ( ) ,
556
569
}
570
+ } else {
571
+ match access {
572
+ Access :: ReadOnly => {
573
+ items. push ( quote ! {
574
+ impl #name {
575
+ pub fn read( & self ) -> #bits_ty {
576
+ self . register. read( )
577
+ }
578
+ }
579
+ } ) ;
580
+ }
581
+ Access :: ReadWrite => {
582
+ items. push ( quote ! {
583
+ impl #name {
584
+ pub fn read( & self ) -> #bits_ty {
585
+ self . register. read( )
586
+ }
587
+
588
+ pub fn write( & mut self , value: #bits_ty) {
589
+ self . register. write( value) ;
590
+ }
591
+ }
592
+ } ) ;
593
+ }
557
594
558
- _ => unreachable ! ( ) ,
595
+ Access :: WriteOnly => {
596
+ items. push ( quote ! {
597
+ impl #name {
598
+ pub fn write( & mut self , value: #bits_ty) {
599
+ self . register. write( value) ;
600
+ }
601
+ }
602
+ } ) ;
603
+ }
604
+
605
+ _ => unreachable ! ( ) ,
606
+ }
559
607
}
560
608
561
609
items
562
610
}
563
611
564
612
#[ doc( hidden) ]
565
- pub fn gen_register_r ( r : & Register , d : & Defaults ) -> Vec < Tokens > {
613
+ pub fn gen_register_r ( r : & Register ,
614
+ d : & Defaults ,
615
+ fields : & [ svd:: Field ] )
616
+ -> Vec < Tokens > {
566
617
let mut items = vec ! [ ] ;
567
618
568
619
let name = Ident :: new ( format ! ( "{}R" , type_of( r) ) ) ;
@@ -580,9 +631,7 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
580
631
581
632
let mut impl_items = vec ! [ ] ;
582
633
583
- for field in r. fields
584
- . as_ref ( )
585
- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) {
634
+ for field in fields {
586
635
if let Some ( Access :: WriteOnly ) = field. access {
587
636
continue ;
588
637
}
@@ -643,7 +692,10 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
643
692
}
644
693
645
694
#[ doc( hidden) ]
646
- pub fn gen_register_w ( r : & Register , d : & Defaults ) -> Vec < Tokens > {
695
+ pub fn gen_register_w ( r : & Register ,
696
+ d : & Defaults ,
697
+ fields : & [ svd:: Field ] )
698
+ -> Vec < Tokens > {
647
699
let mut items = vec ! [ ] ;
648
700
649
701
let name = Ident :: new ( format ! ( "{}W" , type_of( r) ) ) ;
@@ -673,9 +725,7 @@ pub fn gen_register_w(r: &Register, d: &Defaults) -> Vec<Tokens> {
673
725
} ) ;
674
726
}
675
727
676
- for field in r. fields
677
- . as_ref ( )
678
- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) {
728
+ for field in fields {
679
729
if let Some ( Access :: ReadOnly ) = field. access {
680
730
continue ;
681
731
}
0 commit comments