@@ -11,7 +11,7 @@ use super::register::{RegisterExt, RegisterInfoExt};
1111use super :: yaml_ext:: { AsType , GetVal , ToYaml } ;
1212use super :: {
1313 check_offsets, common_description, make_dim_element, matchname, matchsubspec,
14- modify_dim_element, spec_ind, Config , PatchResult , VAL_LVL ,
14+ modify_dim_element, spec_ind, Config , PatchResult , Spec , VAL_LVL ,
1515} ;
1616use super :: { make_cluster, make_interrupt, make_register} ;
1717
@@ -407,6 +407,7 @@ impl RegisterBlockExt for Peripheral {
407407 }
408408
409409 fn modify_register ( & mut self , rspec : & str , rmod : & Hash ) -> PatchResult {
410+ // TODO: empty error
410411 let rtags = self . iter_registers ( rspec) . collect :: < Vec < _ > > ( ) ;
411412 if !rtags. is_empty ( ) {
412413 let register_builder = make_register ( rmod) ?;
@@ -557,6 +558,7 @@ impl RegisterBlockExt for Peripheral {
557558 }
558559
559560 fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash ) -> PatchResult {
561+ // TODO: empty error
560562 let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
561563 if !ctags. is_empty ( ) {
562564 let cluster_builder = make_cluster ( cmod) ?;
@@ -646,12 +648,13 @@ impl RegisterBlockExt for Peripheral {
646648 // Find all registers that match the spec
647649 let mut rcount = 0 ;
648650 let pname = self . name . clone ( ) ;
651+ let ( rspec, ignore) = rspec. spec ( ) ;
649652 for rtag in self . iter_registers ( rspec) {
650653 rcount += 1 ;
651654 rtag. process ( rmod, & pname, config)
652655 . with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
653656 }
654- if rcount == 0 {
657+ if !ignore && rcount == 0 {
655658 Err ( anyhow ! (
656659 "Could not find `{pname}:{rspec}. Present registers: {}.`" ,
657660 self . registers( ) . map( |r| r. name. as_str( ) ) . join( ", " )
@@ -665,12 +668,13 @@ impl RegisterBlockExt for Peripheral {
665668 // Find all clusters that match the spec
666669 let mut ccount = 0 ;
667670 let pname = self . name . clone ( ) ;
671+ let ( cspec, ignore) = cspec. spec ( ) ;
668672 for ctag in self . iter_clusters ( cspec) {
669673 ccount += 1 ;
670674 ctag. process ( cmod, & pname, config)
671675 . with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
672676 }
673- if ccount == 0 {
677+ if !ignore && ccount == 0 {
674678 Err ( anyhow ! (
675679 "Could not find `{pname}:{cspec}. Present clusters: {}.`" ,
676680 self . clusters( ) . map( |c| c. name. as_str( ) ) . join( ", " )
@@ -1112,12 +1116,13 @@ impl RegisterBlockExt for Cluster {
11121116 // Find all registers that match the spec
11131117 let mut rcount = 0 ;
11141118 let pname = self . name . clone ( ) ;
1119+ let ( rspec, ignore) = rspec. spec ( ) ;
11151120 for rtag in self . iter_registers ( rspec) {
11161121 rcount += 1 ;
11171122 rtag. process ( rmod, & pname, config)
11181123 . with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
11191124 }
1120- if rcount == 0 {
1125+ if !ignore && rcount == 0 {
11211126 Err ( anyhow ! (
11221127 "Could not find `{pname}:{}:{rspec}. Present registers: {}.`" ,
11231128 self . name,
@@ -1132,12 +1137,13 @@ impl RegisterBlockExt for Cluster {
11321137 // Find all clusters that match the spec
11331138 let mut ccount = 0 ;
11341139 let pname = self . name . clone ( ) ;
1140+ let ( cspec, ignore) = cspec. spec ( ) ;
11351141 for ctag in self . iter_clusters ( cspec) {
11361142 ccount += 1 ;
11371143 ctag. process ( cmod, & pname, config)
11381144 . with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
11391145 }
1140- if ccount == 0 {
1146+ if !ignore && ccount == 0 {
11411147 Err ( anyhow ! (
11421148 "Could not find `{pname}:{}:{cspec}. Present clusters: {}.`" ,
11431149 self . name,
@@ -1159,6 +1165,7 @@ fn collect_in_array(
11591165 let mut registers = Vec :: new ( ) ;
11601166 let mut place = usize:: MAX ;
11611167 let mut i = 0 ;
1168+ let ( rspec, ignore) = rspec. spec ( ) ;
11621169 while i < regs. len ( ) {
11631170 match & regs[ i] {
11641171 RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1171,6 +1178,9 @@ fn collect_in_array(
11711178 }
11721179 }
11731180 if registers. is_empty ( ) {
1181+ if ignore {
1182+ return Ok ( ( ) ) ;
1183+ }
11741184 return Err ( anyhow ! (
11751185 "{path}: registers {rspec} not found. Present registers: {}.`" ,
11761186 regs. iter( )
@@ -1299,9 +1309,9 @@ fn collect_in_cluster(
12991309 if rspec == "description" {
13001310 continue ;
13011311 }
1302- rspecs. push ( rspec. to_string ( ) ) ;
13031312 let mut registers = Vec :: new ( ) ;
13041313 let mut i = 0 ;
1314+ let ( rspec, ignore) = rspec. spec ( ) ;
13051315 while i < regs. len ( ) {
13061316 match & regs[ i] {
13071317 RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1314,6 +1324,9 @@ fn collect_in_cluster(
13141324 }
13151325 }
13161326 if registers. is_empty ( ) {
1327+ if ignore {
1328+ continue ;
1329+ }
13171330 return Err ( anyhow ! (
13181331 "{path}: registers {rspec} not found. Present registers: {}.`" ,
13191332 regs. iter( )
@@ -1324,6 +1337,7 @@ fn collect_in_cluster(
13241337 . join( ", " )
13251338 ) ) ;
13261339 }
1340+ rspecs. push ( rspec. to_string ( ) ) ;
13271341 if single {
13281342 if registers. len ( ) > 1 {
13291343 return Err ( anyhow ! ( "{path}: more than one registers {rspec} found" ) ) ;
@@ -1384,6 +1398,11 @@ fn collect_in_cluster(
13841398 }
13851399 rdict. insert ( rspec. to_string ( ) , registers) ;
13861400 }
1401+ if rdict. is_empty ( ) {
1402+ return Err ( anyhow ! (
1403+ "{path}: registers cannot be collected into {cname} cluster. No matches found"
1404+ ) ) ;
1405+ }
13871406 let address_offset = rdict
13881407 . values ( )
13891408 . min_by_key ( |rs| rs[ 0 ] . address_offset )
0 commit comments