1+ use std:: collections:: HashMap ;
2+
13use anyhow:: Result ;
2- use proc_macro2:: { Ident , Span , TokenStream } ;
4+ use proc_macro2:: { Ident , Literal , Span , TokenStream } ;
35use quote:: quote;
46
57use crate :: ir:: * ;
@@ -16,6 +18,7 @@ pub fn render(_opts: &super::Options, ir: &IR, d: &Device, path: &str) -> Result
1618 let mut peripherals = TokenStream :: new ( ) ;
1719 let mut vectors = TokenStream :: new ( ) ;
1820 let mut names = vec ! [ ] ;
21+ let mut addrs: HashMap < _ , Vec < ( _ , _ ) > > = HashMap :: new ( ) ;
1922
2023 let mut pos = 0 ;
2124 for i in & interrupts_sorted {
@@ -54,6 +57,12 @@ pub fn render(_opts: &super::Options, ir: &IR, d: &Device, path: &str) -> Result
5457
5558 if let Some ( block_name) = & p. block {
5659 let _b = ir. blocks . get ( block_name) ;
60+
61+ addrs
62+ . entry ( ( block_name, path) )
63+ . or_default ( )
64+ . push ( ( address. clone ( ) , name. clone ( ) ) ) ;
65+
5766 let path = util:: relative_path ( block_name, path) ;
5867
5968 peripherals. extend ( quote ! {
@@ -68,6 +77,29 @@ pub fn render(_opts: &super::Options, ir: &IR, d: &Device, path: &str) -> Result
6877 }
6978 }
7079
80+ for ( ( block_name, path) , addrs) in addrs {
81+ let unknown = Literal :: string ( & format ! ( "Unknown {}" , block_name) ) ;
82+
83+ let path = util:: relative_path ( block_name, path) ;
84+
85+ let addrs = addrs
86+ . iter ( )
87+ . map ( |( addr, block_name) | quote ! ( #addr => f. write_str( #block_name) , ) ) ;
88+
89+ peripherals. extend ( quote ! {
90+ impl core:: fmt:: Display for #path {
91+ fn fmt( & self , f: & mut Formatter <' _>) -> Result <( ) , core:: fmt:: Error > {
92+ match self . 0 {
93+ #(
94+ #addrs
95+ ) *
96+ _ => f. write_str( #unknown) ,
97+ }
98+ }
99+ }
100+ } ) ;
101+ }
102+
71103 let n = util:: unsuffixed ( pos as u64 ) ;
72104 out. extend ( quote ! (
73105 #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
0 commit comments