@@ -245,25 +245,6 @@ pub fn fields(
245
245
r_impl_items : & mut Vec < Tokens > ,
246
246
w_impl_items : & mut Vec < Tokens > ,
247
247
) -> Result < ( ) > {
248
- struct F < ' a > {
249
- _pc_w : Ident ,
250
- _sc : Ident ,
251
- access : Option < Access > ,
252
- description : String ,
253
- evs : & ' a [ EnumeratedValues ] ,
254
- mask : Tokens ,
255
- name : & ' a str ,
256
- offset : Tokens ,
257
- pc_r : Ident ,
258
- _pc_r : Ident ,
259
- pc_w : Ident ,
260
- sc : Ident ,
261
- bits : Ident ,
262
- ty : Ident ,
263
- width : u32 ,
264
- write_constraint : Option < & ' a WriteConstraint > ,
265
- }
266
-
267
248
impl < ' a > F < ' a > {
268
249
fn from ( f : & ' a Field ) -> Result < Self > {
269
250
// TODO(AJM) - do we need to do anything with this range type?
@@ -277,7 +258,7 @@ pub fn fields(
277
258
let pc_r = Ident :: from ( & * format ! ( "{}R" , pc) ) ;
278
259
let _pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
279
260
let pc_w = Ident :: from ( & * format ! ( "{}W" , pc) ) ;
280
- let _pc_w = Ident :: from ( & * format ! ( "{}_W " , pc) ) ;
261
+ let _pc_w = Ident :: from ( & * format ! ( "_{}W " , pc) ) ;
281
262
let _sc = Ident :: from ( & * format ! ( "_{}" , sc) ) ;
282
263
let bits = if width == 1 {
283
264
Ident :: from ( "bit" )
@@ -376,52 +357,13 @@ pub fn fields(
376
357
}
377
358
378
359
if base. is_none ( ) {
379
- let variants = Variant :: from_enumerated_values ( evs) ?;
380
360
let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
381
- let desc = format ! ( "Possible values of the field `{}`" , f. name, ) ;
382
-
383
- let vars = variants
384
- . iter ( )
385
- . map ( |v| {
386
- let desc = util:: escape_brackets ( & v. doc ) ;
387
- let pc = & v. pc ;
388
- quote ! {
389
- #[ doc = #desc]
390
- #pc
391
- }
392
- } )
393
- . collect :: < Vec < _ > > ( ) ;
361
+ let variants = Variant :: from_enumerated_values ( evs) ?;
394
362
395
- mod_items. push ( quote ! {
396
- #[ doc = #desc]
397
- #[ derive( Clone , Copy , Debug , PartialEq ) ]
398
- pub enum #pc_r {
399
- #( #vars) , *
400
- }
401
- } ) ;
363
+ add_from_variants ( mod_items, & variants, pc_r, & f) ;
402
364
403
365
let mut enum_items = vec ! [ ] ;
404
366
405
- let arms = variants. iter ( ) . map ( |v| {
406
- let pc = & v. pc ;
407
- let value = util:: unsuffixed_or_bool ( v. value , f. width ) ;
408
-
409
- quote ! {
410
- #pc_r:: #pc => #value
411
- }
412
- } ) ;
413
-
414
- mod_items. push ( quote ! {
415
- impl crate :: ToBits <#fty> for #pc_r {
416
- #[ inline( always) ]
417
- fn _bits( & self ) -> #fty {
418
- match * self {
419
- #( #arms) , *
420
- }
421
- }
422
- }
423
- } ) ;
424
-
425
367
let mut arms = variants
426
368
. iter ( )
427
369
. map ( |v| {
@@ -530,7 +472,6 @@ pub fn fields(
530
472
unsafety = None ;
531
473
}
532
474
let pc_w = & f. pc_w ;
533
- let pc_w_doc = format ! ( "Values that can be written to the field `{}`" , f. name) ;
534
475
535
476
let base_pc_w = base. as_ref ( ) . map ( |base| {
536
477
let pc = base. field . to_sanitized_upper_case ( ) ;
@@ -539,38 +480,7 @@ pub fn fields(
539
480
} ) ;
540
481
541
482
if base. is_none ( ) {
542
- let variants_pc = variants. iter ( ) . map ( |v| & v. pc ) ;
543
- let variants_doc = variants
544
- . iter ( )
545
- . map ( |v| util:: escape_brackets ( & v. doc ) . to_owned ( ) ) ;
546
- mod_items. push ( quote ! {
547
- #[ doc = #pc_w_doc]
548
- #[ derive( Clone , Copy , Debug , PartialEq ) ]
549
- pub enum #pc_w {
550
- #( #[ doc = #variants_doc]
551
- #variants_pc) , *
552
- }
553
- } ) ;
554
-
555
- let arms = variants. iter ( ) . map ( |v| {
556
- let pc = & v. pc ;
557
- let value = util:: unsuffixed_or_bool ( v. value , f. width ) ;
558
-
559
- quote ! {
560
- #pc_w:: #pc => #value
561
- }
562
- } ) ;
563
-
564
- mod_items. push ( quote ! {
565
- impl crate :: ToBits <#fty> for #pc_w {
566
- #[ inline( always) ]
567
- fn _bits( & self ) -> #fty {
568
- match * self {
569
- #( #arms) , *
570
- }
571
- }
572
- }
573
- } ) ;
483
+ add_from_variants ( mod_items, & variants, pc_w, & f) ;
574
484
}
575
485
576
486
proxy_items. push ( quote ! {
@@ -725,6 +635,51 @@ impl Variant {
725
635
}
726
636
}
727
637
638
+ fn add_from_variants ( mod_items : & mut Vec < Tokens > , variants : & Vec < Variant > , pc : & Ident , f : & F ) {
639
+ let fty = & f. ty ;
640
+ let desc = format ! ( "Possible values of the field `{}`" , f. name) ;
641
+
642
+ let vars = variants
643
+ . iter ( )
644
+ . map ( |v| {
645
+ let desc = util:: escape_brackets ( & v. doc ) ;
646
+ let pcv = & v. pc ;
647
+ quote ! {
648
+ #[ doc = #desc]
649
+ #pcv
650
+ }
651
+ } )
652
+ . collect :: < Vec < _ > > ( ) ;
653
+
654
+ mod_items. push ( quote ! {
655
+ #[ doc = #desc]
656
+ #[ derive( Clone , Copy , Debug , PartialEq ) ]
657
+ pub enum #pc {
658
+ #( #vars) , *
659
+ }
660
+ } ) ;
661
+
662
+ let arms = variants. iter ( ) . map ( |v| {
663
+ let pcv = & v. pc ;
664
+ let value = util:: unsuffixed_or_bool ( v. value , f. width ) ;
665
+
666
+ quote ! {
667
+ #pc:: #pcv => #value
668
+ }
669
+ } ) ;
670
+
671
+ mod_items. push ( quote ! {
672
+ impl crate :: ToBits <#fty> for #pc {
673
+ #[ inline( always) ]
674
+ fn _bits( & self ) -> #fty {
675
+ match * self {
676
+ #( #arms) , *
677
+ }
678
+ }
679
+ }
680
+ } ) ;
681
+ }
682
+
728
683
fn derive_from_base ( mod_items : & mut Vec < Tokens > , base : & Base , pc : & Ident , base_pc : & Ident , fname : & str ) -> quote:: Tokens {
729
684
let desc = format ! ( "Possible values of the field `{}`" , fname, ) ;
730
685
@@ -768,6 +723,25 @@ fn derive_from_base(mod_items: &mut Vec<Tokens>, base: &Base, pc: &Ident, base_p
768
723
}
769
724
}
770
725
726
+ struct F < ' a > {
727
+ _pc_w : Ident ,
728
+ _sc : Ident ,
729
+ access : Option < Access > ,
730
+ description : String ,
731
+ evs : & ' a [ EnumeratedValues ] ,
732
+ mask : Tokens ,
733
+ name : & ' a str ,
734
+ offset : Tokens ,
735
+ pc_r : Ident ,
736
+ _pc_r : Ident ,
737
+ pc_w : Ident ,
738
+ sc : Ident ,
739
+ bits : Ident ,
740
+ ty : Ident ,
741
+ width : u32 ,
742
+ write_constraint : Option < & ' a WriteConstraint > ,
743
+ }
744
+
771
745
#[ derive( Clone , Debug ) ]
772
746
pub struct Base < ' a > {
773
747
pub peripheral : Option < & ' a str > ,
0 commit comments