@@ -247,12 +247,24 @@ pub(crate) trait RegisterBlockExt: Name {
247247 /// Remove fields from rname and mark it as derivedFrom rderive.
248248 /// Update all derivedFrom referencing rname
249249 fn derive_register ( & mut self , rspec : & str , rderive : & Yaml , bpath : & BlockPath ) -> PatchResult {
250+ fn make_path ( dpath : & str , bpath : & BlockPath ) -> String {
251+ let mut parts = dpath. split ( "." ) ;
252+ match ( parts. next ( ) , parts. next ( ) , parts. next ( ) ) {
253+ ( Some ( cname) , Some ( rname) , None ) if !bpath. path . is_empty ( ) => bpath
254+ . parent ( )
255+ . unwrap ( )
256+ . new_cluster ( cname)
257+ . new_register ( rname)
258+ . to_string ( ) ,
259+ _ => dpath. into ( ) ,
260+ }
261+ }
250262 let ( rspec, ignore) = rspec. spec ( ) ;
251263 let ( rderive, dim, info) = if let Some ( rderive) = rderive. as_str ( ) {
252264 (
253265 rderive,
254266 None ,
255- RegisterInfo :: builder ( ) . derived_from ( Some ( rderive . into ( ) ) ) ,
267+ RegisterInfo :: builder ( ) . derived_from ( Some ( make_path ( rderive , bpath ) ) ) ,
256268 )
257269 } else if let Some ( hash) = rderive. as_hash ( ) {
258270 let rderive = hash. get_str ( "_from" ) ?. ok_or_else ( || {
@@ -261,7 +273,7 @@ pub(crate) trait RegisterBlockExt: Name {
261273 (
262274 rderive,
263275 make_dim_element ( hash) ?,
264- make_register ( hash, Some ( bpath) ) ?. derived_from ( Some ( rderive . into ( ) ) ) ,
276+ make_register ( hash, Some ( bpath) ) ?. derived_from ( Some ( make_path ( rderive , bpath ) ) ) ,
265277 )
266278 } else {
267279 return Err ( anyhow ! ( "derive: incorrect syntax for {rspec}" ) ) ;
@@ -1783,11 +1795,12 @@ fn collect_in_cluster(
17831795 . address_offset ( address_offset) ;
17841796 let mut config = config. clone ( ) ;
17851797 config. update_fields = true ;
1798+ let cpath = path. new_cluster ( cname) ;
17861799 let mut cluster = if single {
17871800 for ( _, ( rmod, mut registers) ) in rdict. into_iter ( ) {
17881801 let mut reg = registers. swap_remove ( 0 ) ;
17891802 let rmod = rmod. hash ( ) ?;
1790- reg. process ( rmod, & path . new_cluster ( cname ) , & config)
1803+ reg. process ( rmod, & cpath , & config)
17911804 . with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
17921805 if let Some ( name) = rmod. get_str ( "name" ) ? {
17931806 reg. name = name. into ( ) ;
@@ -1801,7 +1814,6 @@ fn collect_in_cluster(
18011814 for ( rspec, ( rmod, mut registers) ) in rdict. into_iter ( ) {
18021815 let mut reg = registers. swap_remove ( 0 ) ;
18031816 let rmod = rmod. hash ( ) ?;
1804- let cpath = path. new_cluster ( cname) ;
18051817 reg. process ( rmod, & cpath, & config)
18061818 . with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
18071819 reg. name = if let Some ( name) = rmod. get_str ( "name" ) ? {
0 commit comments