@@ -128,9 +128,6 @@ pub(crate) trait RegisterBlockExt: Name {
128128 /// Get register by name
129129 fn get_reg ( & self , name : & str ) -> Option < & Register > ;
130130
131- /// Get mutable register by name
132- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > ;
133-
134131 /// Register/cluster block
135132 #[ allow( unused) ]
136133 fn children ( & self ) -> Option < & Vec < RegisterCluster > > ;
@@ -249,22 +246,22 @@ pub(crate) trait RegisterBlockExt: Name {
249246
250247 /// Remove fields from rname and mark it as derivedFrom rderive.
251248 /// 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 {
253250 let ( rderive, info) = if let Some ( rderive) = rderive. as_str ( ) {
254251 (
255252 rderive,
256253 RegisterInfo :: builder ( ) . derived_from ( Some ( rderive. into ( ) ) ) ,
257254 )
258255 } else if let Some ( hash) = rderive. as_hash ( ) {
259256 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 }" )
261258 } ) ?;
262259 (
263260 rderive,
264261 make_register ( hash, Some ( bpath) ) ?. derived_from ( Some ( rderive. into ( ) ) ) ,
265262 )
266263 } else {
267- return Err ( anyhow ! ( "derive: incorrect syntax for {rname }" ) ) ;
264+ return Err ( anyhow ! ( "derive: incorrect syntax for {rspec }" ) ) ;
268265 } ;
269266
270267 // Attempt to verify that the destination register name is correct.
@@ -280,25 +277,30 @@ pub(crate) trait RegisterBlockExt: Name {
280277 } ) ?;
281278 }
282279
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) ) ;
289289 }
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+ }
295297 }
296298 Ok ( ( ) )
297299 }
298300
299301 /// Remove fields from rname and mark it as derivedFrom rderive.
300302 /// 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 {
302304 todo ! ( )
303305 }
304306
@@ -881,9 +883,6 @@ impl RegisterBlockExt for Peripheral {
881883 fn get_reg ( & self , name : & str ) -> Option < & Register > {
882884 self . get_register ( name)
883885 }
884- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
885- self . get_mut_register ( name)
886- }
887886 fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
888887 self . registers . as_ref ( )
889888 }
@@ -919,9 +918,6 @@ impl RegisterBlockExt for Cluster {
919918 fn get_reg ( & self , name : & str ) -> Option < & Register > {
920919 self . get_register ( name)
921920 }
922- fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
923- self . get_mut_register ( name)
924- }
925921 fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
926922 Some ( & self . children )
927923 }
@@ -1128,29 +1124,29 @@ impl PeripheralExt for Peripheral {
11281124 }
11291125 }
11301126
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 {
11341130 "_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:?}`" )
11391135 } ) ?;
11401136 }
11411137 }
11421138 "_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:?}`" )
11471143 } ) ?;
11481144 }
11491145 }
11501146 _ => {
1151- self . derive_register ( rname , rderive, & ppath)
1147+ self . derive_register ( rspec , rderive, & ppath)
11521148 . with_context ( || {
1153- format ! ( "Deriving register `{rname }` from `{rderive:?}`" )
1149+ format ! ( "Deriving register `{rspec }` from `{rderive:?}`" )
11541150 } ) ?;
11551151 }
11561152 }
@@ -1421,29 +1417,29 @@ impl ClusterExt for Cluster {
14211417 }
14221418 }
14231419
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 {
14271423 "_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:?}`" )
14321428 } ) ?;
14331429 }
14341430 }
14351431 "_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:?}`" )
14401436 } ) ?;
14411437 }
14421438 }
14431439 _ => {
1444- self . derive_register ( rname , rderive, & cpath)
1440+ self . derive_register ( rspec , rderive, & cpath)
14451441 . with_context ( || {
1446- format ! ( "Deriving register `{rname }` from `{rderive:?}`" )
1442+ format ! ( "Deriving register `{rspec }` from `{rderive:?}`" )
14471443 } ) ?;
14481444 }
14491445 }
0 commit comments