From 1ed3843508772d0ce1eb2f079b3230f1abe20e72 Mon Sep 17 00:00:00 2001 From: Wataru Otsubo Date: Sat, 1 Feb 2025 20:13:48 +0900 Subject: [PATCH] finish: impl CodeGen for Register --- src/generator.rs | 32 +++---------------- src/generator/codegen_registerspec_impl.rs | 36 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 src/generator/codegen_registerspec_impl.rs diff --git a/src/generator.rs b/src/generator.rs index 791285a..d9bc458 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -212,6 +212,7 @@ impl CodeGen for Block { } mod codegen_register; +mod codegen_registerspec_impl; impl CodeGen for Register { fn generate_register_interface(self) -> Result { @@ -226,7 +227,8 @@ impl CodeGen for Register { proc_macro2::Ident, ) = codegen_register::reg_type_def(&self, &upper_camel_name)?; - let code_reg_def: proc_macro2::TokenStream = todo!(); + let code_reg_def: proc_macro2::TokenStream = + codegen_registerspec_impl::gen_registerspec_impl(reg_name.clone(), self.modf, type_t, type_ux); Ok(quote! { pub mod #snake_case_name { @@ -250,33 +252,9 @@ impl CodeGen for Register { } } - impl RegisterSpec for #reg_name<'_> { - type Ux = u32; - type T = SlId; + #code_reg_def - fn as_ptr(&self) -> *mut Self::Ux { - self.mem_ptr - } - } - impl Readable for #reg_name<'_> {} - impl Writable for #reg_name<'_> {} - impl Modifiable for #reg_name<'_> {} - - #[derive(Debug, Clone, Copy, Default)] - pub struct SlId(pub u32); - impl TryFrom for SlId { - type Error = DataConversionError; - - fn try_from(value: u32) -> Result { - let mask = 0x0000003f; - Ok(SlId(value & mask)) - } - } - impl From for u32 { - fn from(val: SlId) -> Self { - val.0 - } - } + #code_t_def } }) } diff --git a/src/generator/codegen_registerspec_impl.rs b/src/generator/codegen_registerspec_impl.rs new file mode 100644 index 0000000..a1b0edc --- /dev/null +++ b/src/generator/codegen_registerspec_impl.rs @@ -0,0 +1,36 @@ +use proc_macro2::{Ident, TokenStream}; +use quote::quote; + +use crate::types::RwSpecifier; + +pub(super) fn gen_registerspec_impl( + reg_name: Ident, + modf: RwSpecifier, + type_t: Ident, + type_ux: Ident, +) -> TokenStream { + let impl_rw = match modf { + RwSpecifier::R => quote! { + impl Readable for #reg_name<'_> {} + }, + RwSpecifier::W => quote! { + impl Writable for #reg_name<'_> {} + }, + RwSpecifier::RW => quote! { + impl Readable for #reg_name<'_> {} + impl Writable for #reg_name<'_> {} + impl Modifiable for #reg_name<'_> {} + }, + }; + quote! { + impl RegisterSpec for #reg_name<'_> { + type Ux = #type_ux; + type T = #type_t; + + fn as_ptr(&self) -> *mut Self::Ux { + self.mem_ptr + } + } + #impl_rw + } +}