@@ -128,9 +128,6 @@ pub(crate) trait RegisterBlockExt: Name {
128
128
/// Get register by name
129
129
fn get_reg ( & self , name : & str ) -> Option < & Register > ;
130
130
131
- /// Get mutable register by name
132
- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > ;
133
-
134
131
/// Register/cluster block
135
132
#[ allow( unused) ]
136
133
fn children ( & self ) -> Option < & Vec < RegisterCluster > > ;
@@ -249,22 +246,22 @@ pub(crate) trait RegisterBlockExt: Name {
249
246
250
247
/// Remove fields from rname and mark it as derivedFrom rderive.
251
248
/// Update all derivedFrom referencing rname
252
- fn derive_register ( & mut self , rname : & str , rderive : & Yaml , bpath : & BlockPath ) -> PatchResult {
249
+ fn derive_register ( & mut self , rspec : & str , rderive : & Yaml , bpath : & BlockPath ) -> PatchResult {
253
250
let ( rderive, info) = if let Some ( rderive) = rderive. as_str ( ) {
254
251
(
255
252
rderive,
256
253
RegisterInfo :: builder ( ) . derived_from ( Some ( rderive. into ( ) ) ) ,
257
254
)
258
255
} else if let Some ( hash) = rderive. as_hash ( ) {
259
256
let rderive = hash. get_str ( "_from" ) ?. ok_or_else ( || {
260
- anyhow ! ( "derive: source register not given, please add a _from field to {rname }" )
257
+ anyhow ! ( "derive: source register not given, please add a _from field to {rspec }" )
261
258
} ) ?;
262
259
(
263
260
rderive,
264
261
make_register ( hash, Some ( bpath) ) ?. derived_from ( Some ( rderive. into ( ) ) ) ,
265
262
)
266
263
} else {
267
- return Err ( anyhow ! ( "derive: incorrect syntax for {rname }" ) ) ;
264
+ return Err ( anyhow ! ( "derive: incorrect syntax for {rspec }" ) ) ;
268
265
} ;
269
266
270
267
// Attempt to verify that the destination register name is correct.
@@ -280,25 +277,30 @@ pub(crate) trait RegisterBlockExt: Name {
280
277
} ) ?;
281
278
}
282
279
283
- match self . get_mut_reg ( rname) {
284
- Some ( register) => register. modify_from ( info, VAL_LVL ) ?,
285
- None => {
286
- let register = info. name ( rname. into ( ) ) . build ( VAL_LVL ) ?. single ( ) ;
287
- self . add_child ( RegisterCluster :: Register ( register) ) ;
288
- }
280
+ let mut found = Vec :: new ( ) ;
281
+ for register in self . iter_registers ( rspec) {
282
+ found. push ( register. name . to_string ( ) ) ;
283
+ register. modify_from ( info. clone ( ) , VAL_LVL ) ?;
284
+ }
285
+ if found. is_empty ( ) {
286
+ super :: check_dimable_name ( rspec) ?;
287
+ let register = info. name ( rspec. into ( ) ) . build ( VAL_LVL ) ?. single ( ) ;
288
+ self . add_child ( RegisterCluster :: Register ( register) ) ;
289
289
}
290
- for r in self
291
- . regs_mut ( )
292
- . filter ( |r| r. derived_from . as_deref ( ) == Some ( rname) )
293
- {
294
- r. derived_from = Some ( rderive. into ( ) ) ;
290
+ for rname in found {
291
+ for r in self
292
+ . regs_mut ( )
293
+ . filter ( |r| r. derived_from . as_deref ( ) == Some ( & rname) )
294
+ {
295
+ r. derived_from = Some ( rderive. into ( ) ) ;
296
+ }
295
297
}
296
298
Ok ( ( ) )
297
299
}
298
300
299
301
/// Remove fields from rname and mark it as derivedFrom rderive.
300
302
/// Update all derivedFrom referencing rname
301
- fn derive_cluster ( & mut self , _cname : & str , _cderive : & Yaml , _bpath : & BlockPath ) -> PatchResult {
303
+ fn derive_cluster ( & mut self , _cspec : & str , _cderive : & Yaml , _bpath : & BlockPath ) -> PatchResult {
302
304
todo ! ( )
303
305
}
304
306
@@ -881,9 +883,6 @@ impl RegisterBlockExt for Peripheral {
881
883
fn get_reg ( & self , name : & str ) -> Option < & Register > {
882
884
self . get_register ( name)
883
885
}
884
- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
885
- self . get_mut_register ( name)
886
- }
887
886
fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
888
887
self . registers . as_ref ( )
889
888
}
@@ -919,9 +918,6 @@ impl RegisterBlockExt for Cluster {
919
918
fn get_reg ( & self , name : & str ) -> Option < & Register > {
920
919
self . get_register ( name)
921
920
}
922
- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
923
- self . get_mut_register ( name)
924
- }
925
921
fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
926
922
Some ( & self . children )
927
923
}
@@ -1128,29 +1124,29 @@ impl PeripheralExt for Peripheral {
1128
1124
}
1129
1125
}
1130
1126
1131
- for ( rname , rderive) in pmod. hash_iter ( "_derive" ) {
1132
- let rname = rname . str ( ) ?;
1133
- match rname {
1127
+ for ( rspec , rderive) in pmod. hash_iter ( "_derive" ) {
1128
+ let rspec = rspec . str ( ) ?;
1129
+ match rspec {
1134
1130
"_registers" => {
1135
- for ( rname , val) in rderive. hash ( ) ? {
1136
- let rname = rname . str ( ) ?;
1137
- self . derive_register ( rname , val, & ppath) . with_context ( || {
1138
- format ! ( "Deriving register `{rname }` from `{val:?}`" )
1131
+ for ( rspec , val) in rderive. hash ( ) ? {
1132
+ let rspec = rspec . str ( ) ?;
1133
+ self . derive_register ( rspec , val, & ppath) . with_context ( || {
1134
+ format ! ( "Deriving register `{rspec }` from `{val:?}`" )
1139
1135
} ) ?;
1140
1136
}
1141
1137
}
1142
1138
"_clusters" => {
1143
- for ( cname , val) in rderive. hash ( ) ? {
1144
- let cname = cname . str ( ) ?;
1145
- self . derive_cluster ( rname , val, & ppath) . with_context ( || {
1146
- format ! ( "Deriving cluster `{cname }` from `{val:?}`" )
1139
+ for ( cspec , val) in rderive. hash ( ) ? {
1140
+ let cspec = cspec . str ( ) ?;
1141
+ self . derive_cluster ( cspec , val, & ppath) . with_context ( || {
1142
+ format ! ( "Deriving cluster `{cspec }` from `{val:?}`" )
1147
1143
} ) ?;
1148
1144
}
1149
1145
}
1150
1146
_ => {
1151
- self . derive_register ( rname , rderive, & ppath)
1147
+ self . derive_register ( rspec , rderive, & ppath)
1152
1148
. with_context ( || {
1153
- format ! ( "Deriving register `{rname }` from `{rderive:?}`" )
1149
+ format ! ( "Deriving register `{rspec }` from `{rderive:?}`" )
1154
1150
} ) ?;
1155
1151
}
1156
1152
}
@@ -1421,29 +1417,29 @@ impl ClusterExt for Cluster {
1421
1417
}
1422
1418
}
1423
1419
1424
- for ( rname , rderive) in cmod. hash_iter ( "_derive" ) {
1425
- let rname = rname . str ( ) ?;
1426
- match rname {
1420
+ for ( rspec , rderive) in cmod. hash_iter ( "_derive" ) {
1421
+ let rspec = rspec . str ( ) ?;
1422
+ match rspec {
1427
1423
"_registers" => {
1428
- for ( rname , val) in rderive. hash ( ) ? {
1429
- let rname = rname . str ( ) ?;
1430
- self . derive_register ( rname , val, & cpath) . with_context ( || {
1431
- format ! ( "Deriving register `{rname }` from `{val:?}`" )
1424
+ for ( rspec , val) in rderive. hash ( ) ? {
1425
+ let rspec = rspec . str ( ) ?;
1426
+ self . derive_register ( rspec , val, & cpath) . with_context ( || {
1427
+ format ! ( "Deriving register `{rspec }` from `{val:?}`" )
1432
1428
} ) ?;
1433
1429
}
1434
1430
}
1435
1431
"_clusters" => {
1436
- for ( cname , val) in rderive. hash ( ) ? {
1437
- let cname = cname . str ( ) ?;
1438
- self . derive_cluster ( rname , val, & cpath) . with_context ( || {
1439
- format ! ( "Deriving cluster `{cname }` from `{val:?}`" )
1432
+ for ( cspec , val) in rderive. hash ( ) ? {
1433
+ let cspec = cspec . str ( ) ?;
1434
+ self . derive_cluster ( cspec , val, & cpath) . with_context ( || {
1435
+ format ! ( "Deriving cluster `{cspec }` from `{val:?}`" )
1440
1436
} ) ?;
1441
1437
}
1442
1438
}
1443
1439
_ => {
1444
- self . derive_register ( rname , rderive, & cpath)
1440
+ self . derive_register ( rspec , rderive, & cpath)
1445
1441
. with_context ( || {
1446
- format ! ( "Deriving register `{rname }` from `{rderive:?}`" )
1442
+ format ! ( "Deriving register `{rspec }` from `{rderive:?}`" )
1447
1443
} ) ?;
1448
1444
}
1449
1445
}
0 commit comments