From 3044a54a0976aa71fb3befb20519df30a911d729 Mon Sep 17 00:00:00 2001 From: supersurviveur Date: Wed, 12 Nov 2025 23:51:16 +0100 Subject: [PATCH] Add registers in rust --- .gitignore | 11 ++++-- Makefile | 5 +-- bench/programs_rust/Cargo.toml | 2 +- .../programs_rust/fpga-lib-macros/Cargo.toml | 12 +++++++ .../programs_rust/fpga-lib-macros/src/lib.rs | 34 +++++++++++++++++++ bench/programs_rust/fpga-lib/Cargo.toml | 7 ++++ .../{fpga_lib => fpga-lib}/src/lib.rs | 2 ++ bench/programs_rust/fpga-lib/src/register.rs | 3 ++ .../{fpga_lib => hello-rust}/Cargo.toml | 3 +- bench/programs_rust/hello-rust/src/main.rs | 26 ++++++++++++++ bench/programs_rust/hello_rust/Cargo.toml | 7 ---- bench/programs_rust/hello_rust/src/main.rs | 18 ---------- 12 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 bench/programs_rust/fpga-lib-macros/Cargo.toml create mode 100644 bench/programs_rust/fpga-lib-macros/src/lib.rs create mode 100644 bench/programs_rust/fpga-lib/Cargo.toml rename bench/programs_rust/{fpga_lib => fpga-lib}/src/lib.rs (90%) create mode 100644 bench/programs_rust/fpga-lib/src/register.rs rename bench/programs_rust/{fpga_lib => hello-rust}/Cargo.toml (52%) create mode 100644 bench/programs_rust/hello-rust/src/main.rs delete mode 100644 bench/programs_rust/hello_rust/Cargo.toml delete mode 100644 bench/programs_rust/hello_rust/src/main.rs diff --git a/.gitignore b/.gitignore index 49b663d..4596550 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,12 @@ mill* bench/mem .metals .bloop -.rpt -.Xil +*.rpt +*.jou +*.log +*.mmi +*.Xil clockInfo.txt -.csv +*.csv +*.bit +*.dcp diff --git a/Makefile b/Makefile index 6aa2bd0..5984107 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,8 @@ TEST_MAX_PROCS := $$(($$(nproc) - 2)) ## Garde un processeur libre .PRECIOUS: $(MEM_DIR)/%.elf -.PHONY: synthese fpga clean compile autotest simulation +.PHONY: synthese fpga clean compile autotest simulation force +force: compile: $(MEM) $(MEM_DIR): @@ -69,7 +70,7 @@ $(MEM_DIR): @mkdir -p $@/programs @mkdir -p $@/programs_rust -$(MEM_DIR)/programs_rust/%.elf: bench/programs_rust/% |$(MEM_DIR) +$(MEM_DIR)/programs_rust/%.elf: bench/programs_rust/% force |$(MEM_DIR) cd bench/programs_rust && cargo build --release --bin=$(basename $(notdir $@)) cp -f bench/programs_rust/target/riscv64i/release/$(basename $(notdir $@)) $@ $(MEM_DIR)/crt.o: $(BENCH_DIR)/crt.S |$(MEM_DIR) diff --git a/bench/programs_rust/Cargo.toml b/bench/programs_rust/Cargo.toml index 8ced107..a22a47c 100644 --- a/bench/programs_rust/Cargo.toml +++ b/bench/programs_rust/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "3" -members = ["fpga_lib", "hello_rust"] +members = ["fpga-lib", "fpga-lib-macros", "hello-rust"] [profile.release] panic = "abort" diff --git a/bench/programs_rust/fpga-lib-macros/Cargo.toml b/bench/programs_rust/fpga-lib-macros/Cargo.toml new file mode 100644 index 0000000..e793a03 --- /dev/null +++ b/bench/programs_rust/fpga-lib-macros/Cargo.toml @@ -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"] } diff --git a/bench/programs_rust/fpga-lib-macros/src/lib.rs b/bench/programs_rust/fpga-lib-macros/src/lib.rs new file mode 100644 index 0000000..470238d --- /dev/null +++ b/bench/programs_rust/fpga-lib-macros/src/lib.rs @@ -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() { + 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() +} diff --git a/bench/programs_rust/fpga-lib/Cargo.toml b/bench/programs_rust/fpga-lib/Cargo.toml new file mode 100644 index 0000000..c2ec95d --- /dev/null +++ b/bench/programs_rust/fpga-lib/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "fpga-lib" +version = "0.1.0" +edition = "2024" + +[dependencies] +fpga-lib-macros = { path = "../fpga-lib-macros" } diff --git a/bench/programs_rust/fpga_lib/src/lib.rs b/bench/programs_rust/fpga-lib/src/lib.rs similarity index 90% rename from bench/programs_rust/fpga_lib/src/lib.rs rename to bench/programs_rust/fpga-lib/src/lib.rs index 95815de..9622770 100644 --- a/bench/programs_rust/fpga_lib/src/lib.rs +++ b/bench/programs_rust/fpga-lib/src/lib.rs @@ -1,5 +1,7 @@ #![no_std] +pub mod register; + #[macro_export] macro_rules! panic_handler { () => { diff --git a/bench/programs_rust/fpga-lib/src/register.rs b/bench/programs_rust/fpga-lib/src/register.rs new file mode 100644 index 0000000..6077fc8 --- /dev/null +++ b/bench/programs_rust/fpga-lib/src/register.rs @@ -0,0 +1,3 @@ +pub struct Reg {} + +fpga_lib_macros::define_regs! {} diff --git a/bench/programs_rust/fpga_lib/Cargo.toml b/bench/programs_rust/hello-rust/Cargo.toml similarity index 52% rename from bench/programs_rust/fpga_lib/Cargo.toml rename to bench/programs_rust/hello-rust/Cargo.toml index 38ed478..5e7e4cf 100644 --- a/bench/programs_rust/fpga_lib/Cargo.toml +++ b/bench/programs_rust/hello-rust/Cargo.toml @@ -1,6 +1,7 @@ [package] -name = "fpga_lib" +name = "hello-rust" version = "0.1.0" edition = "2024" [dependencies] +fpga-lib = { path = "../fpga-lib" } diff --git a/bench/programs_rust/hello-rust/src/main.rs b/bench/programs_rust/hello-rust/src/main.rs new file mode 100644 index 0000000..3e21312 --- /dev/null +++ b/bench/programs_rust/hello-rust/src/main.rs @@ -0,0 +1,26 @@ +#![no_std] +#![no_main] + +use core::arch::asm; + +use fpga_lib::{panic_handler, register::X31}; + +panic_handler! {} + +#[unsafe(no_mangle)] +pub extern "C" fn _start() -> ! { + X31::write_const::<0xdead1ffffffff>(); + let test = X31::read() + 10; + unsafe { + asm!( + "add x31, x0, x0", + "add x31, x0, {}", in(reg) test + ); + + const VGA: *mut u8 = 0x80000000 as *mut u8; + VGA.write_volatile(255); + // VGA.add(1).write_volatile(255); + } + + loop {} +} diff --git a/bench/programs_rust/hello_rust/Cargo.toml b/bench/programs_rust/hello_rust/Cargo.toml deleted file mode 100644 index 5541fe6..0000000 --- a/bench/programs_rust/hello_rust/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "hello_rust" -version = "0.1.0" -edition = "2024" - -[dependencies] -fpga_lib = { path = "../fpga_lib" } diff --git a/bench/programs_rust/hello_rust/src/main.rs b/bench/programs_rust/hello_rust/src/main.rs deleted file mode 100644 index 8b4ed3c..0000000 --- a/bench/programs_rust/hello_rust/src/main.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![no_std] -#![no_main] - -use core::arch::asm; - -use fpga_lib::panic_handler; - -panic_handler! {} - -#[unsafe(no_mangle)] -pub extern "C" fn _start() -> ! { - unsafe { - asm! { - "li x31, 0xdead0" - } - } - loop {} -}