1
1
use std:: borrow:: Cow ;
2
+ use std:: collections:: BTreeMap ;
2
3
use std:: fs:: File ;
3
4
use std:: io:: { Read , Write } ;
4
5
#[ cfg( target_os = "linux" ) ]
@@ -23,6 +24,7 @@ use svd_parser::{
23
24
expand:: { derive_peripheral, Index } ,
24
25
svd:: { Access , Cluster , Register , RegisterInfo , WriteConstraint } ,
25
26
} ;
27
+ use svd_rs:: { EnumeratedValue , EnumeratedValues } ;
26
28
27
29
fn sanitize ( input : & str ) -> String {
28
30
use once_cell:: sync:: Lazy ;
@@ -261,9 +263,19 @@ fn parse_register(
261
263
} ;
262
264
263
265
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
+
264
277
doc += & format ! (
265
- "<strong>{}: {}</strong>: {}<br>" ,
266
- value. value. unwrap( ) ,
278
+ "<strong>{val}: {}</strong>: {}<br>" ,
267
279
value. name,
268
280
sanitize( value. description. as_deref( ) . unwrap_or( "" ) )
269
281
) ;
@@ -272,7 +284,7 @@ fn parse_register(
272
284
} else if let Some ( WriteConstraint :: Range ( wcrange) ) = wc. as_ref ( ) {
273
285
let mn = hex ( wcrange. min ) ;
274
286
let mx = hex ( wcrange. max ) ;
275
- fdoc = Some ( format ! ( "Allowed values: {mn}-{mx}" ) ) ;
287
+ fdoc = Some ( format ! ( "Allowed values: <strong> {mn}-{mx}</strong> " ) ) ;
276
288
}
277
289
}
278
290
fields. push ( object ! ( {
@@ -514,3 +526,17 @@ pub fn svd2html(htmldir: &Path, svdfiles: &[PathBuf]) -> anyhow::Result<()> {
514
526
generate_index_page ( & devices, & mut file) ?;
515
527
Ok ( ( ) )
516
528
}
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