11use std:: borrow:: Cow ;
2+ use std:: collections:: BTreeMap ;
23use std:: fs:: File ;
34use std:: io:: { Read , Write } ;
45#[ cfg( target_os = "linux" ) ]
@@ -23,6 +24,7 @@ use svd_parser::{
2324 expand:: { derive_peripheral, Index } ,
2425 svd:: { Access , Cluster , Register , RegisterInfo , WriteConstraint } ,
2526} ;
27+ use svd_rs:: { EnumeratedValue , EnumeratedValues } ;
2628
2729fn sanitize ( input : & str ) -> String {
2830 use once_cell:: sync:: Lazy ;
@@ -261,9 +263,19 @@ fn parse_register(
261263 } ;
262264
263265 for value in & enums. values {
266+ let val = if let Some ( value) = value. value {
267+ value. to_string ( )
268+ } else {
269+ let val = value
270+ . is_default ( )
271+ . then ( || enums_to_map ( & enums) )
272+ . and_then ( |map| minimal_hole ( & map, fwidth) )
273+ . ok_or_else ( || anyhow ! ( "Value is missing from {value:?}" ) ) ?;
274+ format ! ( "{val} (+)" )
275+ } ;
276+
264277 doc += & format ! (
265- "<strong>{}: {}</strong>: {}<br>" ,
266- value. value. unwrap( ) ,
278+ "<strong>{val}: {}</strong>: {}<br>" ,
267279 value. name,
268280 sanitize( value. description. as_deref( ) . unwrap_or( "" ) )
269281 ) ;
@@ -272,7 +284,7 @@ fn parse_register(
272284 } else if let Some ( WriteConstraint :: Range ( wcrange) ) = wc. as_ref ( ) {
273285 let mn = hex ( wcrange. min ) ;
274286 let mx = hex ( wcrange. max ) ;
275- fdoc = Some ( format ! ( "Allowed values: {mn}-{mx}" ) ) ;
287+ fdoc = Some ( format ! ( "Allowed values: <strong> {mn}-{mx}</strong> " ) ) ;
276288 }
277289 }
278290 fields. push ( object ! ( {
@@ -514,3 +526,17 @@ pub fn svd2html(htmldir: &Path, svdfiles: &[PathBuf]) -> anyhow::Result<()> {
514526 generate_index_page ( & devices, & mut file) ?;
515527 Ok ( ( ) )
516528}
529+
530+ fn enums_to_map ( evs : & EnumeratedValues ) -> BTreeMap < u64 , & EnumeratedValue > {
531+ let mut map = BTreeMap :: new ( ) ;
532+ for ev in & evs. values {
533+ if let Some ( v) = ev. value {
534+ map. insert ( v, ev) ;
535+ }
536+ }
537+ map
538+ }
539+
540+ fn minimal_hole ( map : & BTreeMap < u64 , & EnumeratedValue > , width : u32 ) -> Option < u64 > {
541+ ( 0 ..( 1u64 << width) ) . find ( |& v| !map. contains_key ( & v) )
542+ }
0 commit comments