@@ -12,7 +12,7 @@ use svd_parser::svd::{
1212 WriteConstraintRange ,
1313} ;
1414use svd_parser:: SVDError :: DimIndexParse ;
15- use svd_rs:: { BitRange , DimElement , DimElementBuilder , MaybeArray } ;
15+ use svd_rs:: { BitRange , DimArrayIndex , DimElement , DimElementBuilder , MaybeArray } ;
1616use yaml_rust:: { yaml:: Hash , Yaml , YamlLoader } ;
1717
1818use anyhow:: { anyhow, Context , Result } ;
@@ -323,10 +323,13 @@ fn make_ev_array(values: &Hash) -> Result<EnumeratedValuesBuilder> {
323323 ) ) ;
324324 }
325325 let vd = vd. vec ( ) ?;
326- let description = vd. get ( 1 ) . and_then ( Yaml :: as_str) . ok_or_else ( || {
327- anyhow ! ( "enumeratedValue can't have empty description for value {vname}" )
328- } ) ?;
329- let value = vd[ 0 ] . i64 ( ) ?;
326+ let Some ( ( value, description) ) = vd. first ( ) . zip ( vd. get ( 1 ) ) else {
327+ return Err ( anyhow ! (
328+ "enumeratedValue {vname} can't have empty value or description"
329+ ) ) ;
330+ } ;
331+ let value = value. i64 ( ) ?;
332+ let description = description. str ( ) ?;
330333 let def = value == -1 ;
331334 let value = value as u64 ;
332335 let ev = EnumeratedValue :: builder ( )
@@ -398,8 +401,11 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
398401 None
399402 } )
400403 . dim_name ( h. get_string ( "dimName" ) ?)
401- // TODO
402- . dim_array_index ( None ) ;
404+ . dim_array_index (
405+ h. get_hash ( "dimArrayIndex" ) ?
406+ . map ( make_dim_array_index)
407+ . transpose ( ) ?,
408+ ) ;
403409 if let Some ( dim) = h. get_u32 ( "dim" ) ? {
404410 d = d. dim ( dim)
405411 }
@@ -413,6 +419,33 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
413419 } )
414420}
415421
422+ fn make_dim_array_index ( h : & Hash ) -> Result < DimArrayIndex > {
423+ let mut values = Vec :: new ( ) ;
424+ for ( vname, vd) in h {
425+ let vname = vname. str ( ) ?;
426+ if let Some ( vd) = vd. as_vec ( ) {
427+ let Some ( ( value, description) ) = vd. first ( ) . zip ( vd. get ( 1 ) ) else {
428+ return Err ( anyhow ! (
429+ "enumeratedValue {vname} can't have empty value or description"
430+ ) ) ;
431+ } ;
432+ let value = value. i64 ( ) ?;
433+ let description = description. str ( ) ?;
434+ values. push (
435+ EnumeratedValue :: builder ( )
436+ . value ( Some ( value as u64 ) )
437+ . description ( Some ( description. into ( ) ) )
438+ . build ( VAL_LVL ) ?,
439+ )
440+ }
441+ }
442+
443+ Ok ( DimArrayIndex {
444+ header_enum_name : h. get_string ( "headerEnumName" ) ?,
445+ values,
446+ } )
447+ }
448+
416449fn modify_dim_element < T : Clone > (
417450 tag : & mut MaybeArray < T > ,
418451 dim : & Option < DimElementBuilder > ,
0 commit comments