@@ -6,11 +6,11 @@ use std::collections::HashSet;
66use std:: { fs:: File , io:: Read , path:: Path } ;
77
88use super :: iterators:: { MatchIter , Matched } ;
9- use super :: modify_register_properties;
109use super :: peripheral:: PeripheralExt ;
1110use super :: yaml_ext:: { AsType , GetVal } ;
1211use super :: { abspath, matchname, PatchResult , VAL_LVL } ;
1312use super :: { make_address_block, make_address_blocks, make_cpu, make_interrupt, make_peripheral} ;
13+ use super :: { make_dim_element, modify_dim_element, modify_register_properties} ;
1414
1515pub type PerMatchIterMut < ' a , ' b > = MatchIter < ' b , std:: slice:: IterMut < ' a , Peripheral > > ;
1616
@@ -219,31 +219,37 @@ impl DeviceExt for Device {
219219
220220 fn modify_peripheral ( & mut self , pspec : & str , pmod : & Hash ) -> PatchResult {
221221 let mut modified = HashSet :: new ( ) ;
222- for ptag in self . iter_peripherals ( pspec) {
223- modified. insert ( ptag. name . clone ( ) ) ;
224-
225- ptag. modify_from ( make_peripheral ( pmod, true ) ?, VAL_LVL ) ?;
226- if let Some ( ints) = pmod. get_hash ( "interrupts" ) ? {
227- for ( iname, val) in ints {
228- let iname = iname. str ( ) ?;
229- let int = make_interrupt ( val. hash ( ) ?) ?;
230- for i in & mut ptag. interrupt {
231- if i. name == iname {
232- i. modify_from ( int, VAL_LVL ) ?;
233- break ;
222+ let ptags = self . iter_peripherals ( pspec) . collect :: < Vec < _ > > ( ) ;
223+ if !ptags. is_empty ( ) {
224+ let peripheral_builder = make_peripheral ( pmod, true ) ?;
225+ let dim = make_dim_element ( pmod) ?;
226+ for ptag in ptags {
227+ modified. insert ( ptag. name . clone ( ) ) ;
228+
229+ modify_dim_element ( ptag, & dim) ?;
230+ ptag. modify_from ( peripheral_builder. clone ( ) , VAL_LVL ) ?;
231+ if let Some ( ints) = pmod. get_hash ( "interrupts" ) ? {
232+ for ( iname, val) in ints {
233+ let iname = iname. str ( ) ?;
234+ let int = make_interrupt ( val. hash ( ) ?) ?;
235+ for i in & mut ptag. interrupt {
236+ if i. name == iname {
237+ i. modify_from ( int, VAL_LVL ) ?;
238+ break ;
239+ }
234240 }
235241 }
236242 }
237- }
238- if let Some ( abmod) = pmod. get_hash ( "addressBlock" ) . ok ( ) . flatten ( ) {
239- let v = & mut ptag. address_block ;
240- let ab = make_address_block ( abmod) ?;
241- match v. as_deref_mut ( ) {
242- Some ( [ adb] ) => adb. modify_from ( ab, VAL_LVL ) ?,
243- _ => * v = Some ( vec ! [ ab. build( VAL_LVL ) ?] ) ,
243+ if let Some ( abmod) = pmod. get_hash ( "addressBlock" ) . ok ( ) . flatten ( ) {
244+ let v = & mut ptag. address_block ;
245+ let ab = make_address_block ( abmod) ?;
246+ match v. as_deref_mut ( ) {
247+ Some ( [ adb] ) => adb. modify_from ( ab, VAL_LVL ) ?,
248+ _ => * v = Some ( vec ! [ ab. build( VAL_LVL ) ?] ) ,
249+ }
250+ } else if let Some ( abmod) = pmod. get_vec ( "addressBlocks" ) . ok ( ) . flatten ( ) {
251+ ptag. address_block = Some ( make_address_blocks ( abmod) ?) ;
244252 }
245- } else if let Some ( abmod) = pmod. get_vec ( "addressBlocks" ) . ok ( ) . flatten ( ) {
246- ptag. address_block = Some ( make_address_blocks ( abmod) ?) ;
247253 }
248254 }
249255 // If this peripheral has derivations, update the derived
@@ -265,12 +271,16 @@ impl DeviceExt for Device {
265271 return Err ( anyhow ! ( "device already has a peripheral {pname}" ) ) ;
266272 }
267273
268- self . peripherals . push (
269- make_peripheral ( padd, false ) ?
270- . name ( pname. to_string ( ) )
271- . build ( VAL_LVL ) ?
272- . single ( ) ,
273- ) ;
274+ let pnew = make_peripheral ( padd, false ) ?
275+ . name ( pname. to_string ( ) )
276+ . build ( VAL_LVL ) ?;
277+ let pnew = if let Some ( dim) = make_dim_element ( padd) ? {
278+ pnew. array ( dim. build ( VAL_LVL ) ?)
279+ } else {
280+ pnew. single ( )
281+ } ;
282+
283+ self . peripherals . push ( pnew) ;
274284 Ok ( ( ) )
275285 }
276286
0 commit comments