forked from libre-chip/fayalite
		
	change SimValue to contain and deref to a value and not just contain bits
This commit is contained in:
		
							parent
							
								
									e0f978fbb6
								
							
						
					
					
						commit
						5028401a5a
					
				
					 19 changed files with 2065 additions and 820 deletions
				
			
		|  | @ -30,7 +30,9 @@ pub(crate) struct ParsedBundle { | |||
|     pub(crate) field_flips: Vec<Option<HdlAttr<kw::flip, kw::hdl>>>, | ||||
|     pub(crate) mask_type_ident: Ident, | ||||
|     pub(crate) mask_type_match_variant_ident: Ident, | ||||
|     pub(crate) mask_type_sim_value_ident: Ident, | ||||
|     pub(crate) match_variant_ident: Ident, | ||||
|     pub(crate) sim_value_ident: Ident, | ||||
|     pub(crate) builder_ident: Ident, | ||||
|     pub(crate) mask_type_builder_ident: Ident, | ||||
| } | ||||
|  | @ -125,7 +127,9 @@ impl ParsedBundle { | |||
|             field_flips, | ||||
|             mask_type_ident: format_ident!("__{}__MaskType", ident), | ||||
|             mask_type_match_variant_ident: format_ident!("__{}__MaskType__MatchVariant", ident), | ||||
|             mask_type_sim_value_ident: format_ident!("__{}__MaskType__SimValue", ident), | ||||
|             match_variant_ident: format_ident!("__{}__MatchVariant", ident), | ||||
|             sim_value_ident: format_ident!("__{}__SimValue", ident), | ||||
|             mask_type_builder_ident: format_ident!("__{}__MaskType__Builder", ident), | ||||
|             builder_ident: format_ident!("__{}__Builder", ident), | ||||
|             ident, | ||||
|  | @ -427,7 +431,9 @@ impl ToTokens for ParsedBundle { | |||
|             field_flips, | ||||
|             mask_type_ident, | ||||
|             mask_type_match_variant_ident, | ||||
|             mask_type_sim_value_ident, | ||||
|             match_variant_ident, | ||||
|             sim_value_ident, | ||||
|             builder_ident, | ||||
|             mask_type_builder_ident, | ||||
|         } = self; | ||||
|  | @ -523,7 +529,7 @@ impl ToTokens for ParsedBundle { | |||
|             semi_token: None, | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let mut mask_type_match_variant_fields = mask_type_fields; | ||||
|         let mut mask_type_match_variant_fields = mask_type_fields.clone(); | ||||
|         for Field { ty, .. } in &mut mask_type_match_variant_fields.named { | ||||
|             *ty = parse_quote_spanned! {span=> | ||||
|                 ::fayalite::expr::Expr<#ty> | ||||
|  | @ -565,6 +571,58 @@ impl ToTokens for ParsedBundle { | |||
|             semi_token: None, | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let mut mask_type_sim_value_fields = mask_type_fields; | ||||
|         for Field { ty, .. } in &mut mask_type_sim_value_fields.named { | ||||
|             *ty = parse_quote_spanned! {span=> | ||||
|                 ::fayalite::sim::value::SimValue<#ty> | ||||
|             }; | ||||
|         } | ||||
|         ItemStruct { | ||||
|             attrs: vec![ | ||||
|                 parse_quote_spanned! {span=> | ||||
|                     #[::fayalite::__std::prelude::v1::derive(
 | ||||
|                         ::fayalite::__std::fmt::Debug, | ||||
|                         ::fayalite::__std::clone::Clone, | ||||
|                     )] | ||||
|                 }, | ||||
|                 parse_quote_spanned! {span=> | ||||
|                     #[allow(non_camel_case_types, dead_code)] | ||||
|                 }, | ||||
|             ], | ||||
|             vis: vis.clone(), | ||||
|             struct_token: *struct_token, | ||||
|             ident: mask_type_sim_value_ident.clone(), | ||||
|             generics: generics.into(), | ||||
|             fields: Fields::Named(mask_type_sim_value_fields), | ||||
|             semi_token: None, | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let mut sim_value_fields = FieldsNamed::from(fields.clone()); | ||||
|         for Field { ty, .. } in &mut sim_value_fields.named { | ||||
|             *ty = parse_quote_spanned! {span=> | ||||
|                 ::fayalite::sim::value::SimValue<#ty> | ||||
|             }; | ||||
|         } | ||||
|         ItemStruct { | ||||
|             attrs: vec![ | ||||
|                 parse_quote_spanned! {span=> | ||||
|                     #[::fayalite::__std::prelude::v1::derive(
 | ||||
|                         ::fayalite::__std::fmt::Debug, | ||||
|                         ::fayalite::__std::clone::Clone, | ||||
|                     )] | ||||
|                 }, | ||||
|                 parse_quote_spanned! {span=> | ||||
|                     #[allow(non_camel_case_types, dead_code)] | ||||
|                 }, | ||||
|             ], | ||||
|             vis: vis.clone(), | ||||
|             struct_token: *struct_token, | ||||
|             ident: sim_value_ident.clone(), | ||||
|             generics: generics.into(), | ||||
|             fields: Fields::Named(sim_value_fields), | ||||
|             semi_token: None, | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let this_token = Ident::new("__this", span); | ||||
|         let fields_token = Ident::new("__fields", span); | ||||
|         let self_token = Token; | ||||
|  | @ -615,6 +673,25 @@ impl ToTokens for ParsedBundle { | |||
|                 } | ||||
|             }, | ||||
|         )); | ||||
|         let sim_value_from_bits_fields = Vec::from_iter(fields.named().into_iter().map(|field| { | ||||
|             let ident: &Ident = field.ident().as_ref().unwrap(); | ||||
|             quote_spanned! {span=> | ||||
|                 #ident: v.field_from_bits(), | ||||
|             } | ||||
|         })); | ||||
|         let sim_value_clone_from_bits_fields = | ||||
|             Vec::from_iter(fields.named().into_iter().map(|field| { | ||||
|                 let ident: &Ident = field.ident().as_ref().unwrap(); | ||||
|                 quote_spanned! {span=> | ||||
|                     v.field_clone_from_bits(&mut value.#ident); | ||||
|                 } | ||||
|             })); | ||||
|         let sim_value_to_bits_fields = Vec::from_iter(fields.named().into_iter().map(|field| { | ||||
|             let ident: &Ident = field.ident().as_ref().unwrap(); | ||||
|             quote_spanned! {span=> | ||||
|                 v.field_to_bits(&value.#ident); | ||||
|             } | ||||
|         })); | ||||
|         let fields_len = fields.named().into_iter().len(); | ||||
|         quote_spanned! {span=> | ||||
|             #[automatically_derived] | ||||
|  | @ -623,6 +700,7 @@ impl ToTokens for ParsedBundle { | |||
|             { | ||||
|                 type BaseType = ::fayalite::bundle::Bundle; | ||||
|                 type MaskType = #mask_type_ident #type_generics; | ||||
|                 type SimValue = #mask_type_sim_value_ident #type_generics; | ||||
|                 type MatchVariant = #mask_type_match_variant_ident #type_generics; | ||||
|                 type MatchActiveScope = (); | ||||
|                 type MatchVariantAndInactiveScope = ::fayalite::ty::MatchVariantWithoutScope< | ||||
|  | @ -660,6 +738,34 @@ impl ToTokens for ParsedBundle { | |||
|                 fn source_location() -> ::fayalite::source_location::SourceLocation { | ||||
|                     ::fayalite::source_location::SourceLocation::caller() | ||||
|                 } | ||||
|                 fn sim_value_from_bits( | ||||
|                     &self, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) -> <Self as ::fayalite::ty::Type>::SimValue { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueFromBits::new(*self, bits); | ||||
|                     #mask_type_sim_value_ident { | ||||
|                         #(#sim_value_from_bits_fields)* | ||||
|                     } | ||||
|                 } | ||||
|                 fn sim_value_clone_from_bits( | ||||
|                     &self, | ||||
|                     value: &mut <Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueFromBits::new(*self, bits); | ||||
|                     #(#sim_value_clone_from_bits_fields)* | ||||
|                 } | ||||
|                 fn sim_value_to_bits( | ||||
|                     &self, | ||||
|                     value: &<Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &mut ::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueToBits::new(*self, bits); | ||||
|                     #(#sim_value_to_bits_fields)* | ||||
|                 } | ||||
|             } | ||||
|             #[automatically_derived] | ||||
|             impl #impl_generics ::fayalite::bundle::BundleType for #mask_type_ident #type_generics | ||||
|  | @ -696,6 +802,7 @@ impl ToTokens for ParsedBundle { | |||
|             { | ||||
|                 type BaseType = ::fayalite::bundle::Bundle; | ||||
|                 type MaskType = #mask_type_ident #type_generics; | ||||
|                 type SimValue = #sim_value_ident #type_generics; | ||||
|                 type MatchVariant = #match_variant_ident #type_generics; | ||||
|                 type MatchActiveScope = (); | ||||
|                 type MatchVariantAndInactiveScope = ::fayalite::ty::MatchVariantWithoutScope< | ||||
|  | @ -735,6 +842,34 @@ impl ToTokens for ParsedBundle { | |||
|                 fn source_location() -> ::fayalite::source_location::SourceLocation { | ||||
|                     ::fayalite::source_location::SourceLocation::caller() | ||||
|                 } | ||||
|                 fn sim_value_from_bits( | ||||
|                     &self, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) -> <Self as ::fayalite::ty::Type>::SimValue { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueFromBits::new(*self, bits); | ||||
|                     #sim_value_ident { | ||||
|                         #(#sim_value_from_bits_fields)* | ||||
|                     } | ||||
|                 } | ||||
|                 fn sim_value_clone_from_bits( | ||||
|                     &self, | ||||
|                     value: &mut <Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueFromBits::new(*self, bits); | ||||
|                     #(#sim_value_clone_from_bits_fields)* | ||||
|                 } | ||||
|                 fn sim_value_to_bits( | ||||
|                     &self, | ||||
|                     value: &<Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &mut ::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     #![allow(unused_mut, unused_variables)] | ||||
|                     let mut v = ::fayalite::bundle::BundleSimValueToBits::new(*self, bits); | ||||
|                     #(#sim_value_to_bits_fields)* | ||||
|                 } | ||||
|             } | ||||
|             #[automatically_derived] | ||||
|             impl #impl_generics ::fayalite::bundle::BundleType for #target #type_generics | ||||
|  | @ -768,23 +903,33 @@ impl ToTokens for ParsedBundle { | |||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         if let Some((cmp_eq,)) = cmp_eq { | ||||
|             let mut where_clause = | ||||
|             let mut expr_where_clause = | ||||
|                 Generics::from(generics) | ||||
|                     .where_clause | ||||
|                     .unwrap_or_else(|| syn::WhereClause { | ||||
|                         where_token: Token, | ||||
|                         predicates: Punctuated::new(), | ||||
|                     }); | ||||
|             let mut sim_value_where_clause = expr_where_clause.clone(); | ||||
|             let mut fields_sim_value_eq = vec![]; | ||||
|             let mut fields_cmp_eq = vec![]; | ||||
|             let mut fields_cmp_ne = vec![]; | ||||
|             for field in fields.named() { | ||||
|                 let field_ident = field.ident(); | ||||
|                 let field_ty = field.ty(); | ||||
|                 where_clause | ||||
|                 expr_where_clause | ||||
|                     .predicates | ||||
|                     .push(parse_quote_spanned! {cmp_eq.span=> | ||||
|                         #field_ty: ::fayalite::expr::ops::ExprPartialEq<#field_ty> | ||||
|                     }); | ||||
|                 sim_value_where_clause | ||||
|                     .predicates | ||||
|                     .push(parse_quote_spanned! {cmp_eq.span=> | ||||
|                         #field_ty: ::fayalite::sim::value::SimValuePartialEq<#field_ty> | ||||
|                     }); | ||||
|                 fields_sim_value_eq.push(quote_spanned! {span=> | ||||
|                     ::fayalite::sim::value::SimValuePartialEq::sim_value_eq(&__lhs.#field_ident, &__rhs.#field_ident) | ||||
|                 }); | ||||
|                 fields_cmp_eq.push(quote_spanned! {span=> | ||||
|                     ::fayalite::expr::ops::ExprPartialEq::cmp_eq(__lhs.#field_ident, __rhs.#field_ident) | ||||
|                 }); | ||||
|  | @ -792,9 +937,13 @@ impl ToTokens for ParsedBundle { | |||
|                     ::fayalite::expr::ops::ExprPartialEq::cmp_ne(__lhs.#field_ident, __rhs.#field_ident) | ||||
|                 }); | ||||
|             } | ||||
|             let sim_value_eq_body; | ||||
|             let cmp_eq_body; | ||||
|             let cmp_ne_body; | ||||
|             if fields_len == 0 { | ||||
|                 sim_value_eq_body = quote_spanned! {span=> | ||||
|                     true | ||||
|                 }; | ||||
|                 cmp_eq_body = quote_spanned! {span=> | ||||
|                     ::fayalite::expr::ToExpr::to_expr(&true) | ||||
|                 }; | ||||
|  | @ -802,6 +951,9 @@ impl ToTokens for ParsedBundle { | |||
|                     ::fayalite::expr::ToExpr::to_expr(&false) | ||||
|                 }; | ||||
|             } else { | ||||
|                 sim_value_eq_body = quote_spanned! {span=> | ||||
|                     #(#fields_sim_value_eq)&&* | ||||
|                 }; | ||||
|                 cmp_eq_body = quote_spanned! {span=> | ||||
|                     #(#fields_cmp_eq)&* | ||||
|                 }; | ||||
|  | @ -812,7 +964,7 @@ impl ToTokens for ParsedBundle { | |||
|             quote_spanned! {span=> | ||||
|                 #[automatically_derived] | ||||
|                 impl #impl_generics ::fayalite::expr::ops::ExprPartialEq<Self> for #target #type_generics | ||||
|                 #where_clause | ||||
|                 #expr_where_clause | ||||
|                 { | ||||
|                     fn cmp_eq( | ||||
|                         __lhs: ::fayalite::expr::Expr<Self>, | ||||
|  | @ -827,6 +979,17 @@ impl ToTokens for ParsedBundle { | |||
|                         #cmp_ne_body | ||||
|                     } | ||||
|                 } | ||||
|                 #[automatically_derived] | ||||
|                 impl #impl_generics ::fayalite::sim::value::SimValuePartialEq<Self> for #target #type_generics | ||||
|                 #sim_value_where_clause | ||||
|                 { | ||||
|                     fn sim_value_eq( | ||||
|                         __lhs: &::fayalite::sim::value::SimValue<Self>, | ||||
|                         __rhs: &::fayalite::sim::value::SimValue<Self>, | ||||
|                     ) -> bool { | ||||
|                         #sim_value_eq_body | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             .to_tokens(tokens); | ||||
|         } | ||||
|  |  | |||
|  | @ -129,6 +129,7 @@ pub(crate) struct ParsedEnum { | |||
|     pub(crate) brace_token: Brace, | ||||
|     pub(crate) variants: Punctuated<ParsedVariant, Token![,]>, | ||||
|     pub(crate) match_variant_ident: Ident, | ||||
|     pub(crate) sim_value_ident: Ident, | ||||
| } | ||||
| 
 | ||||
| impl ParsedEnum { | ||||
|  | @ -190,6 +191,7 @@ impl ParsedEnum { | |||
|             brace_token, | ||||
|             variants, | ||||
|             match_variant_ident: format_ident!("__{}__MatchVariant", ident), | ||||
|             sim_value_ident: format_ident!("__{}__SimValue", ident), | ||||
|             ident, | ||||
|         }) | ||||
|     } | ||||
|  | @ -207,6 +209,7 @@ impl ToTokens for ParsedEnum { | |||
|             brace_token, | ||||
|             variants, | ||||
|             match_variant_ident, | ||||
|             sim_value_ident, | ||||
|         } = self; | ||||
|         let span = ident.span(); | ||||
|         let ItemOptions { | ||||
|  | @ -409,6 +412,106 @@ impl ToTokens for ParsedEnum { | |||
|             )), | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let mut enum_attrs = attrs.clone(); | ||||
|         enum_attrs.push(parse_quote_spanned! {span=> | ||||
|             #[::fayalite::__std::prelude::v1::derive(
 | ||||
|                 ::fayalite::__std::fmt::Debug, | ||||
|                 ::fayalite::__std::clone::Clone, | ||||
|             )] | ||||
|         }); | ||||
|         enum_attrs.push(parse_quote_spanned! {span=> | ||||
|             #[allow(dead_code, non_camel_case_types)] | ||||
|         }); | ||||
|         let sim_value_has_unknown_variant = !variants.len().is_power_of_two(); | ||||
|         let sim_value_unknown_variant_name = sim_value_has_unknown_variant.then(|| { | ||||
|             let mut name = String::new(); | ||||
|             let unknown = "Unknown"; | ||||
|             loop { | ||||
|                 let orig_len = name.len(); | ||||
|                 name.push_str(unknown); | ||||
|                 if variants.iter().all(|v| v.ident != name) { | ||||
|                     break Ident::new(&name, span); | ||||
|                 } | ||||
|                 name.truncate(orig_len); | ||||
|                 name.push('_'); | ||||
|             } | ||||
|         }); | ||||
|         let sim_value_unknown_variant = | ||||
|             sim_value_unknown_variant_name | ||||
|                 .as_ref() | ||||
|                 .map(|unknown_variant_name| { | ||||
|                     Pair::End(parse_quote_spanned! {span=> | ||||
|                         #unknown_variant_name(::fayalite::enum_::UnknownVariantSimValue) | ||||
|                     }) | ||||
|                 }); | ||||
|         ItemEnum { | ||||
|             attrs: enum_attrs, | ||||
|             vis: vis.clone(), | ||||
|             enum_token: *enum_token, | ||||
|             ident: sim_value_ident.clone(), | ||||
|             generics: generics.into(), | ||||
|             brace_token: *brace_token, | ||||
|             variants: Punctuated::from_iter( | ||||
|                 variants | ||||
|                     .pairs() | ||||
|                     .map_pair_value_ref( | ||||
|                         |ParsedVariant { | ||||
|                              attrs, | ||||
|                              options: _, | ||||
|                              ident, | ||||
|                              field, | ||||
|                          }| Variant { | ||||
|                             attrs: attrs.clone(), | ||||
|                             ident: ident.clone(), | ||||
|                             fields: match field { | ||||
|                                 Some(ParsedVariantField { | ||||
|                                     paren_token, | ||||
|                                     attrs, | ||||
|                                     options: _, | ||||
|                                     ty, | ||||
|                                     comma_token, | ||||
|                                 }) => Fields::Unnamed(FieldsUnnamed { | ||||
|                                     paren_token: *paren_token, | ||||
|                                     unnamed: Punctuated::from_iter([ | ||||
|                                         Pair::new( | ||||
|                                             Field { | ||||
|                                                 attrs: attrs.clone(), | ||||
|                                                 vis: Visibility::Inherited, | ||||
|                                                 mutability: FieldMutability::None, | ||||
|                                                 ident: None, | ||||
|                                                 colon_token: None, | ||||
|                                                 ty: parse_quote_spanned! {span=> | ||||
|                                                     ::fayalite::sim::value::SimValue<#ty> | ||||
|                                                 }, | ||||
|                                             }, | ||||
|                                             Some(comma_token.unwrap_or(Token))), | ||||
|                                         ), | ||||
|                                         Pair::new( | ||||
|                                             Field { | ||||
|                                                 attrs: vec![], | ||||
|                                                 vis: Visibility::Inherited, | ||||
|                                                 mutability: FieldMutability::None, | ||||
|                                                 ident: None, | ||||
|                                                 colon_token: None, | ||||
|                                                 ty: parse_quote_spanned! {span=> | ||||
|                                                     ::fayalite::enum_::EnumPaddingSimValue | ||||
|                                                 }, | ||||
|                                             }, | ||||
|                                             None, | ||||
|                                         ), | ||||
|                                     ]), | ||||
|                                 }), | ||||
|                                 None => Fields::Unnamed(parse_quote_spanned! {span=> | ||||
|                                     (::fayalite::enum_::EnumPaddingSimValue) | ||||
|                                 }), | ||||
|                             }, | ||||
|                             discriminant: None, | ||||
|                         }, | ||||
|                     ) | ||||
|                     .chain(sim_value_unknown_variant), | ||||
|             ), | ||||
|         } | ||||
|         .to_tokens(tokens); | ||||
|         let self_token = Token; | ||||
|         for (index, ParsedVariant { ident, field, .. }) in variants.iter().enumerate() { | ||||
|             if let Some(ParsedVariantField { ty, .. }) = field { | ||||
|  | @ -534,6 +637,142 @@ impl ToTokens for ParsedEnum { | |||
|                 } | ||||
|             }, | ||||
|         )); | ||||
|         let sim_value_from_bits_unknown_match_arm = if let Some(sim_value_unknown_variant_name) = | ||||
|             &sim_value_unknown_variant_name | ||||
|         { | ||||
|             quote_spanned! {span=> | ||||
|                 _ => #sim_value_ident::#sim_value_unknown_variant_name(v.unknown_variant_from_bits()), | ||||
|             } | ||||
|         } else { | ||||
|             quote_spanned! {span=> | ||||
|                 _ => ::fayalite::__std::unreachable!(), | ||||
|             } | ||||
|         }; | ||||
|         let sim_value_from_bits_match_arms = Vec::from_iter( | ||||
|             variants | ||||
|                 .iter() | ||||
|                 .enumerate() | ||||
|                 .map( | ||||
|                     |( | ||||
|                         index, | ||||
|                         ParsedVariant { | ||||
|                             attrs: _, | ||||
|                             options: _, | ||||
|                             ident, | ||||
|                             field, | ||||
|                         }, | ||||
|                     )| { | ||||
|                         if let Some(_) = field { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #index => { | ||||
|                                     let (field, padding) = v.variant_with_field_from_bits(); | ||||
|                                     #sim_value_ident::#ident(field, padding) | ||||
|                                 } | ||||
|                             } | ||||
|                         } else { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #index => #sim_value_ident::#ident( | ||||
|                                     v.variant_no_field_from_bits(), | ||||
|                                 ), | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
|                 ) | ||||
|                 .chain([sim_value_from_bits_unknown_match_arm]), | ||||
|         ); | ||||
|         let sim_value_clone_from_bits_unknown_match_arm = | ||||
|             if let Some(sim_value_unknown_variant_name) = &sim_value_unknown_variant_name { | ||||
|                 quote_spanned! {span=> | ||||
|                     _ => if let #sim_value_ident::#sim_value_unknown_variant_name(value) = value { | ||||
|                         v.unknown_variant_clone_from_bits(value); | ||||
|                     } else { | ||||
|                         *value = #sim_value_ident::#sim_value_unknown_variant_name( | ||||
|                             v.unknown_variant_from_bits(), | ||||
|                         ); | ||||
|                     }, | ||||
|                 } | ||||
|             } else { | ||||
|                 quote_spanned! {span=> | ||||
|                     _ => ::fayalite::__std::unreachable!(), | ||||
|                 } | ||||
|             }; | ||||
|         let sim_value_clone_from_bits_match_arms = Vec::from_iter( | ||||
|             variants | ||||
|                 .iter() | ||||
|                 .enumerate() | ||||
|                 .map( | ||||
|                     |( | ||||
|                         index, | ||||
|                         ParsedVariant { | ||||
|                             attrs: _, | ||||
|                             options: _, | ||||
|                             ident, | ||||
|                             field, | ||||
|                         }, | ||||
|                     )| { | ||||
|                         if let Some(_) = field { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #index => if let #sim_value_ident::#ident(field, padding) = value { | ||||
|                                     v.variant_with_field_clone_from_bits(field, padding); | ||||
|                                 } else { | ||||
|                                     let (field, padding) = v.variant_with_field_from_bits(); | ||||
|                                     *value = #sim_value_ident::#ident(field, padding); | ||||
|                                 }, | ||||
|                             } | ||||
|                         } else { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #index => if let #sim_value_ident::#ident(padding) = value { | ||||
|                                     v.variant_no_field_clone_from_bits(padding); | ||||
|                                 } else { | ||||
|                                     *value = #sim_value_ident::#ident( | ||||
|                                         v.variant_no_field_from_bits(), | ||||
|                                     ); | ||||
|                                 }, | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
|                 ) | ||||
|                 .chain([sim_value_clone_from_bits_unknown_match_arm]), | ||||
|         ); | ||||
|         let sim_value_to_bits_match_arms = Vec::from_iter( | ||||
|             variants | ||||
|                 .iter() | ||||
|                 .enumerate() | ||||
|                 .map( | ||||
|                     |( | ||||
|                         index, | ||||
|                         ParsedVariant { | ||||
|                             attrs: _, | ||||
|                             options: _, | ||||
|                             ident, | ||||
|                             field, | ||||
|                         }, | ||||
|                     )| { | ||||
|                         if let Some(_) = field { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #sim_value_ident::#ident(field, padding) => { | ||||
|                                     v.variant_with_field_to_bits(#index, field, padding); | ||||
|                                 } | ||||
|                             } | ||||
|                         } else { | ||||
|                             quote_spanned! {span=> | ||||
|                                 #sim_value_ident::#ident(padding) => { | ||||
|                                     v.variant_no_field_to_bits(#index, padding); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
|                 ) | ||||
|                 .chain(sim_value_unknown_variant_name.as_ref().map( | ||||
|                     |sim_value_unknown_variant_name| { | ||||
|                         quote_spanned! {span=> | ||||
|                             #sim_value_ident::#sim_value_unknown_variant_name(value) => { | ||||
|                                 v.unknown_variant_to_bits(value); | ||||
|                             } | ||||
|                         } | ||||
|                     }, | ||||
|                 )), | ||||
|         ); | ||||
|         let variants_len = variants.len(); | ||||
|         quote_spanned! {span=> | ||||
|             #[automatically_derived] | ||||
|  | @ -542,6 +781,7 @@ impl ToTokens for ParsedEnum { | |||
|             { | ||||
|                 type BaseType = ::fayalite::enum_::Enum; | ||||
|                 type MaskType = ::fayalite::int::Bool; | ||||
|                 type SimValue = #sim_value_ident #type_generics; | ||||
|                 type MatchVariant = #match_variant_ident #type_generics; | ||||
|                 type MatchActiveScope = ::fayalite::module::Scope; | ||||
|                 type MatchVariantAndInactiveScope = ::fayalite::enum_::EnumMatchVariantAndInactiveScope<Self>; | ||||
|  | @ -574,6 +814,35 @@ impl ToTokens for ParsedEnum { | |||
|                 fn source_location() -> ::fayalite::source_location::SourceLocation { | ||||
|                     ::fayalite::source_location::SourceLocation::caller() | ||||
|                 } | ||||
|                 fn sim_value_from_bits( | ||||
|                     &self, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) -> <Self as ::fayalite::ty::Type>::SimValue { | ||||
|                     let v = ::fayalite::enum_::EnumSimValueFromBits::new(*self, bits); | ||||
|                     match v.discriminant() { | ||||
|                         #(#sim_value_from_bits_match_arms)* | ||||
|                     } | ||||
|                 } | ||||
|                 fn sim_value_clone_from_bits( | ||||
|                     &self, | ||||
|                     value: &mut <Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     let v = ::fayalite::enum_::EnumSimValueFromBits::new(*self, bits); | ||||
|                     match v.discriminant() { | ||||
|                         #(#sim_value_clone_from_bits_match_arms)* | ||||
|                     } | ||||
|                 } | ||||
|                 fn sim_value_to_bits( | ||||
|                     &self, | ||||
|                     value: &<Self as ::fayalite::ty::Type>::SimValue, | ||||
|                     bits: &mut ::fayalite::__bitvec::slice::BitSlice, | ||||
|                 ) { | ||||
|                     let v = ::fayalite::enum_::EnumSimValueToBits::new(*self, bits); | ||||
|                     match value { | ||||
|                         #(#sim_value_to_bits_match_arms)* | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             #[automatically_derived] | ||||
|             impl #impl_generics ::fayalite::enum_::EnumType for #target #type_generics | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue