Add registers in rust
This commit is contained in:
34
bench/programs_rust/fpga-lib-macros/src/lib.rs
Normal file
34
bench/programs_rust/fpga-lib-macros/src/lib.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
extern crate proc_macro;
|
||||
use proc_macro::TokenStream;
|
||||
use quote::{format_ident, quote};
|
||||
|
||||
#[proc_macro]
|
||||
pub fn define_regs(_input: TokenStream) -> TokenStream {
|
||||
let mut tokens = proc_macro2::TokenStream::new();
|
||||
|
||||
for n in 0..32usize {
|
||||
let load = format!("li x{}, {{}}", n);
|
||||
let store = format!("mv {{}}, x{}", n);
|
||||
let ident = format_ident!("X{}", n);
|
||||
let t = quote! {
|
||||
impl Reg<#n> {
|
||||
pub fn write_const<const X: u64>() {
|
||||
unsafe {
|
||||
core::arch::asm!(#load, const X)
|
||||
}
|
||||
}
|
||||
pub fn read() -> u64 {
|
||||
let out: u64;
|
||||
unsafe {
|
||||
core::arch::asm!(#store, out(reg) out)
|
||||
}
|
||||
out
|
||||
}
|
||||
}
|
||||
pub type #ident = Reg<#n>;
|
||||
};
|
||||
tokens.extend(t);
|
||||
}
|
||||
|
||||
tokens.into()
|
||||
}
|
||||
Reference in New Issue
Block a user