11use anyhow:: { anyhow, Context } ;
2+ use itertools:: Itertools ;
23use svd_parser:: svd:: {
34 Access , BitRange , DimElement , EnumeratedValues , Field , FieldInfo , ModifiedWriteValues ,
45 ReadAction , Register , RegisterInfo , Usage , WriteConstraint , WriteConstraintRange ,
@@ -323,10 +324,7 @@ impl RegisterExt for Register {
323324 return Err ( anyhow ! (
324325 "Could not find any fields to merge {}:{key}. Present fields: {}.`" ,
325326 self . name,
326- self . fields( )
327- . map( |f| f. name. as_str( ) )
328- . collect:: <Vec <_>>( )
329- . join( ", " )
327+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
330328 ) ) ;
331329 }
332330 let mut bitwidth = 0 ;
@@ -377,10 +375,7 @@ impl RegisterExt for Register {
377375 return Err ( anyhow ! (
378376 "{}: fields {fspec} not found. Present fields: {}.`" ,
379377 self . name,
380- self . fields( )
381- . map( |f| f. name. as_str( ) )
382- . collect:: <Vec <_>>( )
383- . join( ", " )
378+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
384379 ) ) ;
385380 }
386381 fields. sort_by_key ( |f| f. bit_range . offset ) ;
@@ -443,10 +438,7 @@ impl RegisterExt for Register {
443438 return Err ( anyhow ! (
444439 "Could not find any fields to split {}:{fspec}. Present fields: {}.`" ,
445440 self . name,
446- self . fields( )
447- . map( |f| f. name. as_str( ) )
448- . collect:: <Vec <_>>( )
449- . join( ", " )
441+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
450442 ) ) ;
451443 }
452444 ( Some ( _) , Some ( _) ) => {
@@ -664,10 +656,7 @@ impl RegisterExt for Register {
664656 // This is a derived enumeratedValues => Try to find the
665657 // original definition to extract its <usage>
666658 let mut derived_enums = self
667- . fields
668- . as_ref ( )
669- . unwrap ( )
670- . iter ( )
659+ . fields ( )
671660 . flat_map ( |f| f. enumerated_values . iter ( ) )
672661 . filter ( |e| e. name . as_deref ( ) == Some ( d) ) ;
673662 let orig_usage = match ( derived_enums. next ( ) , derived_enums. next ( ) ) {
@@ -697,21 +686,22 @@ impl RegisterExt for Register {
697686 set_enum ( ftag, evs. clone ( ) , orig_usage, true , access) ?;
698687 }
699688 } else {
700- let offsets = self
701- . iter_fields ( fspec)
702- . map ( |f| ( f. bit_range . offset , f. name . to_string ( ) ) )
703- . collect :: < Vec < _ > > ( ) ;
689+ let mut offsets: Vec < _ > = Vec :: new ( ) ;
690+ for ( i, f) in self . fields ( ) . enumerate ( ) {
691+ if matchname ( & f. name , fspec) {
692+ offsets. push ( ( f. bit_range . offset , f. name . to_string ( ) , i) ) ;
693+ }
694+ }
704695 if offsets. is_empty ( ) {
705696 return Err ( anyhow ! (
706697 "Could not find field {pname}:{}:{fspec}. Present fields: {}.`" ,
707698 self . name,
708- self . fields( )
709- . map( |f| f. name. as_str( ) )
710- . collect:: <Vec <_>>( )
711- . join( ", " )
699+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
712700 ) ) ;
713701 }
714- let ( min_offset, fname) = offsets. iter ( ) . min_by_key ( |on| on. 0 ) . unwrap ( ) ;
702+ let ( min_offset, fname, min_offset_pos) =
703+ offsets. iter ( ) . min_by_key ( |& on| on. 0 ) . unwrap ( ) ;
704+ let min_pos = offsets. iter ( ) . map ( |on| on. 2 ) . min ( ) . unwrap ( ) ;
715705 let name = make_ev_name ( & fname. replace ( "%s" , "" ) , usage) ?;
716706 for ftag in self . iter_fields ( fspec) {
717707 let access = ftag. access . or ( reg_access) . unwrap_or_default ( ) ;
@@ -735,6 +725,13 @@ impl RegisterExt for Register {
735725 ) ?;
736726 }
737727 }
728+ // Move field with derived enums before other
729+ if let Some ( fields) = self . fields . as_mut ( ) {
730+ if * min_offset_pos != min_pos {
731+ let f = fields. remove ( * min_offset_pos) ;
732+ fields. insert ( min_pos, f) ;
733+ }
734+ }
738735 }
739736 Ok ( ( ) )
740737 }
@@ -752,10 +749,7 @@ impl RegisterExt for Register {
752749 return Err ( anyhow ! (
753750 "Could not find field {pname}:{}:{fspec}. Present fields: {}.`" ,
754751 self . name,
755- self . fields( )
756- . map( |f| f. name. as_str( ) )
757- . collect:: <Vec <_>>( )
758- . join( ", " )
752+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
759753 ) ) ;
760754 }
761755 Ok ( ( ) )
0 commit comments