1
1
use crate :: {
2
2
svd:: { Peripheral , Riscv } ,
3
- util,
3
+ util, Config ,
4
4
} ;
5
5
use anyhow:: Result ;
6
6
use log:: debug;
@@ -16,7 +16,8 @@ pub fn is_riscv_peripheral(p: &Peripheral) -> bool {
16
16
pub fn render (
17
17
r : Option < & Riscv > ,
18
18
peripherals : & [ Peripheral ] ,
19
- device_x : & mut String , // TODO
19
+ device_x : & mut String ,
20
+ config : & Config ,
20
21
) -> Result < TokenStream > {
21
22
let mut mod_items = TokenStream :: new ( ) ;
22
23
@@ -236,74 +237,81 @@ pub fn render(
236
237
} ) ;
237
238
}
238
239
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
-
252
240
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
+ } ;
269
271
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
+ } ;
301
308
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
+ _ => { }
305
314
}
306
- _ => { }
307
315
}
308
316
}
309
317
0 commit comments