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 ( _) ) => {
@@ -697,21 +689,22 @@ impl RegisterExt for Register {
697689 set_enum ( ftag, evs. clone ( ) , orig_usage, true , access) ?;
698690 }
699691 } else {
700- let offsets = self
701- . iter_fields ( fspec)
702- . map ( |f| ( f. bit_range . offset , f. name . to_string ( ) ) )
703- . collect :: < Vec < _ > > ( ) ;
692+ let mut offsets: Vec < _ > = Vec :: new ( ) ;
693+ for ( i, f) in self . fields ( ) . enumerate ( ) {
694+ if matchname ( & f. name , fspec) {
695+ offsets. push ( ( f. bit_range . offset , f. name . to_string ( ) , i) ) ;
696+ }
697+ }
704698 if offsets. is_empty ( ) {
705699 return Err ( anyhow ! (
706700 "Could not find field {pname}:{}:{fspec}. Present fields: {}.`" ,
707701 self . name,
708- self . fields( )
709- . map( |f| f. name. as_str( ) )
710- . collect:: <Vec <_>>( )
711- . join( ", " )
702+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
712703 ) ) ;
713704 }
714- let ( min_offset, fname) = offsets. iter ( ) . min_by_key ( |on| on. 0 ) . unwrap ( ) ;
705+ let ( min_offset, fname, min_offset_pos) =
706+ offsets. iter ( ) . min_by_key ( |& on| on. 0 ) . unwrap ( ) ;
707+ let min_pos = offsets. iter ( ) . map ( |on| on. 2 ) . min ( ) . unwrap ( ) ;
715708 let name = make_ev_name ( & fname. replace ( "%s" , "" ) , usage) ?;
716709 for ftag in self . iter_fields ( fspec) {
717710 let access = ftag. access . or ( reg_access) . unwrap_or_default ( ) ;
@@ -735,6 +728,13 @@ impl RegisterExt for Register {
735728 ) ?;
736729 }
737730 }
731+ // Move field with derived enums before other
732+ if let Some ( fields) = self . fields . as_mut ( ) {
733+ if * min_offset_pos != min_pos {
734+ let f = fields. remove ( * min_offset_pos) ;
735+ fields. insert ( min_pos, f) ;
736+ }
737+ }
738738 }
739739 Ok ( ( ) )
740740 }
@@ -752,10 +752,7 @@ impl RegisterExt for Register {
752752 return Err ( anyhow ! (
753753 "Could not find field {pname}:{}:{fspec}. Present fields: {}.`" ,
754754 self . name,
755- self . fields( )
756- . map( |f| f. name. as_str( ) )
757- . collect:: <Vec <_>>( )
758- . join( ", " )
755+ self . fields( ) . map( |f| f. name. as_str( ) ) . join( ", " )
759756 ) ) ;
760757 }
761758 Ok ( ( ) )
0 commit comments