11use crate :: {
22 svd:: { Peripheral , Riscv } ,
3- util,
3+ util, Config ,
44} ;
55use anyhow:: Result ;
66use log:: debug;
@@ -16,7 +16,8 @@ pub fn is_riscv_peripheral(p: &Peripheral) -> bool {
1616pub fn render (
1717 r : Option < & Riscv > ,
1818 peripherals : & [ Peripheral ] ,
19- device_x : & mut String , // TODO
19+ device_x : & mut String ,
20+ config : & Config ,
2021) -> Result < TokenStream > {
2122 let mut mod_items = TokenStream :: new ( ) ;
2223
@@ -236,74 +237,81 @@ pub fn render(
236237 } ) ;
237238 }
238239
239- let harts = match r {
240- Some ( r) => r
241- . harts
242- . iter ( )
243- . map ( |h| {
244- let name = TokenStream :: from_str ( & h. name ) . unwrap ( ) ;
245- let value = h. value ;
246- ( name, value)
247- } )
248- . collect :: < Vec < _ > > ( ) ,
249- None => vec ! [ ] ,
250- } ;
251-
252240 let mut riscv_peripherals = TokenStream :: new ( ) ;
253- for p in peripherals. iter ( ) {
254- match p. name . to_uppercase ( ) . as_ref ( ) {
255- "PLIC" => {
256- let base = TokenStream :: from_str ( & format ! ( "0x{:X}" , p. base_address) ) . unwrap ( ) ;
257- let ctxs = harts
258- . iter ( )
259- . map ( |( name, value) | {
260- let ctx_name = TokenStream :: from_str ( & format ! ( "ctx{value}" ) ) . unwrap ( ) ;
261- let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
262- quote ! { #ctx_name = ( crate :: interrupt:: Hart :: #name, #doc) }
263- } )
264- . collect :: < Vec < _ > > ( ) ;
265- let ctxs = match ctxs. len ( ) {
266- 0 => quote ! { } ,
267- _ => quote ! { ctxs [ #( #ctxs) , * ] , } ,
268- } ;
241+ if config. use_riscv_peripheral {
242+ let harts = match r {
243+ Some ( r) => r
244+ . harts
245+ . iter ( )
246+ . map ( |h| {
247+ let name = TokenStream :: from_str ( & h. name ) . unwrap ( ) ;
248+ let value = h. value ;
249+ ( name, value)
250+ } )
251+ . collect :: < Vec < _ > > ( ) ,
252+ None => vec ! [ ] ,
253+ } ;
254+ for p in peripherals. iter ( ) {
255+ match p. name . to_uppercase ( ) . as_ref ( ) {
256+ "PLIC" => {
257+ let base =
258+ TokenStream :: from_str ( & format ! ( "base 0x{:X}," , p. base_address) ) . unwrap ( ) ;
259+ let ctxs = harts
260+ . iter ( )
261+ . map ( |( name, value) | {
262+ let ctx_name = TokenStream :: from_str ( & format ! ( "ctx{value}" ) ) . unwrap ( ) ;
263+ let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
264+ quote ! { #ctx_name = ( crate :: interrupt:: Hart :: #name, #doc) }
265+ } )
266+ . collect :: < Vec < _ > > ( ) ;
267+ let ctxs = match ctxs. len ( ) {
268+ 0 => quote ! { } ,
269+ _ => quote ! { ctxs [ #( #ctxs) , * ] , } ,
270+ } ;
269271
270- riscv_peripherals. extend ( quote ! {
271- riscv_peripheral:: plic_codegen!( base #base, #ctxs) ;
272- } ) ;
273- }
274- "CLINT" => {
275- let base = TokenStream :: from_str ( & format ! ( "0x{:X}" , p. base_address) ) . unwrap ( ) ;
276- let mtimecmps = harts
277- . iter ( )
278- . map ( |( name, value) | {
279- let mtimecmp_name =
280- TokenStream :: from_str ( & format ! ( "mtimecmp{value}" ) ) . unwrap ( ) ;
281- let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
282- quote ! { #mtimecmp_name = ( crate :: interrupt:: Hart :: #name, #doc) }
283- } )
284- . collect :: < Vec < _ > > ( ) ;
285- let mtimecmps = match mtimecmps. len ( ) {
286- 0 => quote ! { } ,
287- _ => quote ! { mtimecmps [ #( #mtimecmps) , * ] , } ,
288- } ;
289- let msips = harts
290- . iter ( )
291- . map ( |( name, value) | {
292- let msip_name = TokenStream :: from_str ( & format ! ( "msip{value}" ) ) . unwrap ( ) ;
293- let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
294- quote ! { #msip_name = ( crate :: interrupt:: Hart :: #name, #doc) }
295- } )
296- . collect :: < Vec < _ > > ( ) ;
297- let msips = match msips. len ( ) {
298- 0 => quote ! { } ,
299- _ => quote ! { msips [ #( #msips) , * ] , } ,
300- } ;
272+ riscv_peripherals. extend ( quote ! {
273+ riscv_peripheral:: plic_codegen!( #base #ctxs) ;
274+ } ) ;
275+ }
276+ "CLINT" => {
277+ let base =
278+ TokenStream :: from_str ( & format ! ( "base 0x{:X}," , p. base_address) ) . unwrap ( ) ;
279+ let freq = match config. riscv_clint_freq {
280+ Some ( clk) => TokenStream :: from_str ( & format ! ( "freq {clk}," ) ) . unwrap ( ) ,
281+ None => quote ! { } ,
282+ } ;
283+ let mtimecmps = harts
284+ . iter ( )
285+ . map ( |( name, value) | {
286+ let mtimecmp_name =
287+ TokenStream :: from_str ( & format ! ( "mtimecmp{value}" ) ) . unwrap ( ) ;
288+ let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
289+ quote ! { #mtimecmp_name = ( crate :: interrupt:: Hart :: #name, #doc) }
290+ } )
291+ . collect :: < Vec < _ > > ( ) ;
292+ let mtimecmps = match mtimecmps. len ( ) {
293+ 0 => quote ! { } ,
294+ _ => quote ! { mtimecmps [ #( #mtimecmps) , * ] , } ,
295+ } ;
296+ let msips = harts
297+ . iter ( )
298+ . map ( |( name, value) | {
299+ let msip_name = TokenStream :: from_str ( & format ! ( "msip{value}" ) ) . unwrap ( ) ;
300+ let doc = format ! ( "[{value}](crate::interrupt::Hart::{name})" ) ;
301+ quote ! { #msip_name = ( crate :: interrupt:: Hart :: #name, #doc) }
302+ } )
303+ . collect :: < Vec < _ > > ( ) ;
304+ let msips = match msips. len ( ) {
305+ 0 => quote ! { } ,
306+ _ => quote ! { msips [ #( #msips) , * ] , } ,
307+ } ;
301308
302- riscv_peripherals. extend ( quote ! {
303- riscv_peripheral:: clint_codegen!( base #base, #mtimecmps #msips) ;
304- } ) ;
309+ riscv_peripherals. extend ( quote ! {
310+ riscv_peripheral:: clint_codegen!( #base #freq #mtimecmps #msips) ;
311+ } ) ;
312+ }
313+ _ => { }
305314 }
306- _ => { }
307315 }
308316 }
309317
0 commit comments