@@ -12,7 +12,7 @@ use svd_parser::svd::{
12
12
WriteConstraintRange ,
13
13
} ;
14
14
use svd_parser:: SVDError :: DimIndexParse ;
15
- use svd_rs:: { BitRange , DimElement , DimElementBuilder , MaybeArray } ;
15
+ use svd_rs:: { BitRange , DimArrayIndex , DimElement , DimElementBuilder , MaybeArray } ;
16
16
use yaml_rust:: { yaml:: Hash , Yaml , YamlLoader } ;
17
17
18
18
use anyhow:: { anyhow, Context , Result } ;
@@ -323,10 +323,13 @@ fn make_ev_array(values: &Hash) -> Result<EnumeratedValuesBuilder> {
323
323
) ) ;
324
324
}
325
325
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 ( ) ?;
330
333
let def = value == -1 ;
331
334
let value = value as u64 ;
332
335
let ev = EnumeratedValue :: builder ( )
@@ -398,8 +401,11 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
398
401
None
399
402
} )
400
403
. 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
+ ) ;
403
409
if let Some ( dim) = h. get_u32 ( "dim" ) ? {
404
410
d = d. dim ( dim)
405
411
}
@@ -413,6 +419,33 @@ fn make_dim_element(h: &Hash) -> Result<Option<DimElementBuilder>> {
413
419
} )
414
420
}
415
421
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
+
416
449
fn modify_dim_element < T : Clone > (
417
450
tag : & mut MaybeArray < T > ,
418
451
dim : & Option < DimElementBuilder > ,
0 commit comments