From dd119ccdb8edf84fcdc85c9d4abcfe2994dbf75b Mon Sep 17 00:00:00 2001 From: Wataru Otsubo Date: Thu, 20 Feb 2025 13:01:02 +0000 Subject: [PATCH] Multiple backends --- src/generator.rs | 23 ++++++++++++---------- src/generator/codegen_registerspec_impl.rs | 12 +++++------ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/generator.rs b/src/generator.rs index 4ab08eb..9c8385d 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -287,7 +287,7 @@ impl CodeGen for Block { ModuleBlockElements::Block(_) => { let child_upper_camel_name = util::parse_to_ident(&child_name.to_upper_camel_case())?; Ok(quote! { - pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name { + pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name { #snake_case_name::#child_upper_camel_name::new(self.mem_ptr) } }) @@ -297,7 +297,7 @@ impl CodeGen for Block { match ®ister.multiple { None => { Ok(quote! { - pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name { + pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name { #snake_case_name::#child_upper_camel_name::new(self.mem_ptr) } }) @@ -311,7 +311,7 @@ impl CodeGen for Block { } }); Ok(quote! { - pub fn #snake_case_name(&self) -> [#snake_case_name::#child_upper_camel_name; #num_multiple] { + pub fn #snake_case_name(&self) -> [#snake_case_name::#child_upper_camel_name; #num_multiple] { [ #(#elements),* ] } }) @@ -324,9 +324,9 @@ impl CodeGen for Block { }).collect::, CodeGenError>>()?; let parent_struct = if parent_name == util::parse_to_ident("RegisterInterface").unwrap() { - quote! {#parent_name} + quote! {#parent_name} } else { - quote! {#parent_name<'a>} + quote! {#parent_name<'a, T>} }; let child_mods = self @@ -346,18 +346,20 @@ impl CodeGen for Block { use std::marker::PhantomData; + use crate::axic2c1::spec::AxiC2c1Spec; + use super::#parent_name; #(#child_mods)* const OFFSET: usize = #addr; - pub struct #upper_camel_name<'a> { + pub struct #upper_camel_name<'a, T: AxiC2c1Spec> { mem_ptr: *mut u32, _marker: PhantomData<&'a mut #parent_struct>, } - impl #upper_camel_name<'_> { + impl #upper_camel_name<'_, T> { pub(crate) fn new(parent_ptr: *mut u32) -> Self { #upper_camel_name { mem_ptr: unsafe { parent_ptr.add(OFFSET) }, @@ -441,16 +443,17 @@ impl CodeGen for Register { use std::marker::PhantomData; + use crate::axic2c1::spec::AxiC2c1Spec; use crate::register_spec::{DataConversionError, Modifiable, Readable, RegisterSpec, Writable}; const OFFSET: usize = #addr; - pub struct #reg_name<'a> { + pub struct #reg_name<'a, T: AxiC2c1Spec> { mem_ptr: *mut u32, - _marker: PhantomData<&'a mut super::#parent_name<'a>>, + _marker: PhantomData<&'a mut super::#parent_name<'a, T>>, } - impl #reg_name<'_> { + impl #reg_name<'_, T> { pub(crate) fn new(parent_ptr: *mut u32) -> Self { #reg_name { mem_ptr: unsafe { parent_ptr.add(OFFSET) }, diff --git a/src/generator/codegen_registerspec_impl.rs b/src/generator/codegen_registerspec_impl.rs index a1b0edc..32604a0 100644 --- a/src/generator/codegen_registerspec_impl.rs +++ b/src/generator/codegen_registerspec_impl.rs @@ -11,19 +11,19 @@ pub(super) fn gen_registerspec_impl( ) -> TokenStream { let impl_rw = match modf { RwSpecifier::R => quote! { - impl Readable for #reg_name<'_> {} + impl Readable for #reg_name<'_, T> {} }, RwSpecifier::W => quote! { - impl Writable for #reg_name<'_> {} + impl Writable for #reg_name<'_, T> {} }, RwSpecifier::RW => quote! { - impl Readable for #reg_name<'_> {} - impl Writable for #reg_name<'_> {} - impl Modifiable for #reg_name<'_> {} + impl Readable for #reg_name<'_, T> {} + impl Writable for #reg_name<'_, T> {} + impl Modifiable for #reg_name<'_, T> {} }, }; quote! { - impl RegisterSpec for #reg_name<'_> { + impl RegisterSpec for #reg_name<'_, T> { type Ux = #type_ux; type T = #type_t;