Add registers in rust

This commit is contained in:
2025-11-12 23:51:16 +01:00
parent 8326c1f169
commit 3044a54a09
12 changed files with 98 additions and 32 deletions

View File

@@ -0,0 +1,12 @@
[package]
name = "fpga-lib-macros"
version = "0.1.0"
edition = "2024"
[lib]
proc-macro = true
[dependencies]
proc-macro2 = "1.0"
quote = "1.0"
syn = { version = "2.0", features = ["full"] }

View 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()
}