@@ -247,12 +247,24 @@ pub(crate) trait RegisterBlockExt: Name {
247
247
/// Remove fields from rname and mark it as derivedFrom rderive.
248
248
/// Update all derivedFrom referencing rname
249
249
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
+ }
250
262
let ( rspec, ignore) = rspec. spec ( ) ;
251
263
let ( rderive, dim, info) = if let Some ( rderive) = rderive. as_str ( ) {
252
264
(
253
265
rderive,
254
266
None ,
255
- RegisterInfo :: builder ( ) . derived_from ( Some ( rderive . into ( ) ) ) ,
267
+ RegisterInfo :: builder ( ) . derived_from ( Some ( make_path ( rderive , bpath ) ) ) ,
256
268
)
257
269
} else if let Some ( hash) = rderive. as_hash ( ) {
258
270
let rderive = hash. get_str ( "_from" ) ?. ok_or_else ( || {
@@ -261,7 +273,7 @@ pub(crate) trait RegisterBlockExt: Name {
261
273
(
262
274
rderive,
263
275
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 ) ) ) ,
265
277
)
266
278
} else {
267
279
return Err ( anyhow ! ( "derive: incorrect syntax for {rspec}" ) ) ;
@@ -1783,11 +1795,12 @@ fn collect_in_cluster(
1783
1795
. address_offset ( address_offset) ;
1784
1796
let mut config = config. clone ( ) ;
1785
1797
config. update_fields = true ;
1798
+ let cpath = path. new_cluster ( cname) ;
1786
1799
let mut cluster = if single {
1787
1800
for ( _, ( rmod, mut registers) ) in rdict. into_iter ( ) {
1788
1801
let mut reg = registers. swap_remove ( 0 ) ;
1789
1802
let rmod = rmod. hash ( ) ?;
1790
- reg. process ( rmod, & path . new_cluster ( cname ) , & config)
1803
+ reg. process ( rmod, & cpath , & config)
1791
1804
. with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
1792
1805
if let Some ( name) = rmod. get_str ( "name" ) ? {
1793
1806
reg. name = name. into ( ) ;
@@ -1801,7 +1814,6 @@ fn collect_in_cluster(
1801
1814
for ( rspec, ( rmod, mut registers) ) in rdict. into_iter ( ) {
1802
1815
let mut reg = registers. swap_remove ( 0 ) ;
1803
1816
let rmod = rmod. hash ( ) ?;
1804
- let cpath = path. new_cluster ( cname) ;
1805
1817
reg. process ( rmod, & cpath, & config)
1806
1818
. with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
1807
1819
reg. name = if let Some ( name) = rmod. get_str ( "name" ) ? {
0 commit comments