forked from libre-chip/fayalite
add get_state_part_kinds! macro
This commit is contained in:
parent
6d36698adf
commit
f0e3aef061
2 changed files with 172 additions and 0 deletions
|
@ -23,6 +23,8 @@ use std::{
|
||||||
};
|
};
|
||||||
use vec_map::VecMap;
|
use vec_map::VecMap;
|
||||||
|
|
||||||
|
pub(crate) mod parts;
|
||||||
|
|
||||||
pub(crate) type SmallUInt = u64;
|
pub(crate) type SmallUInt = u64;
|
||||||
pub(crate) type SmallSInt = i64;
|
pub(crate) type SmallSInt = i64;
|
||||||
pub(crate) const MIN_BITS_FOR_NEEDING_BIG: usize = SmallUInt::BITS as usize + 1;
|
pub(crate) const MIN_BITS_FOR_NEEDING_BIG: usize = SmallUInt::BITS as usize + 1;
|
||||||
|
|
170
crates/fayalite/src/sim/interpreter/parts.rs
Normal file
170
crates/fayalite/src/sim/interpreter/parts.rs
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
// See Notices.txt for copyright information
|
||||||
|
|
||||||
|
use crate::util::const_str_cmp;
|
||||||
|
|
||||||
|
#[rustfmt::skip]
|
||||||
|
macro_rules! make_get_state_part_kinds {
|
||||||
|
(
|
||||||
|
#![dollar = $d:tt]
|
||||||
|
$(state_part! {
|
||||||
|
singular_field = $state_singular_fields:ident;
|
||||||
|
plural_field = $state_plural_fields:ident;
|
||||||
|
kind = $state_kinds:ident;
|
||||||
|
singular_variant = $state_singular_variants:ident;
|
||||||
|
plural_variant = $state_plural_variants:ident;
|
||||||
|
})*
|
||||||
|
$(type_part! {
|
||||||
|
singular_field = $type_singular_fields:ident;
|
||||||
|
plural_field = $type_plural_fields:ident;
|
||||||
|
kind = $type_kinds:ident;
|
||||||
|
singular_variant = $type_singular_variants:ident;
|
||||||
|
plural_variant = $type_plural_variants:ident;
|
||||||
|
copy_insn = $copy_insn:ident;
|
||||||
|
})*
|
||||||
|
) => {
|
||||||
|
make_get_state_part_kinds! {
|
||||||
|
#![dollar = $d]
|
||||||
|
parts! {
|
||||||
|
[$(state_singular_fields = (#[state] $state_singular_fields),)* $(state_singular_fields = (#[type] $type_singular_fields),)*];
|
||||||
|
[$(type_singular_fields = ($type_singular_fields),)*];
|
||||||
|
[$(state_plural_fields = (#[state] $state_plural_fields),)* $(state_plural_fields = (#[type] $type_plural_fields),)*];
|
||||||
|
[$(type_plural_fields = ($type_plural_fields),)*];
|
||||||
|
[$(state_kinds = (#[state] $state_kinds),)* $(state_kinds = (#[type] $type_kinds),)*];
|
||||||
|
[$(type_kinds = ($type_kinds),)*];
|
||||||
|
[$(state_singular_variants = (#[state] $state_singular_variants),)* $(state_singular_variants = (#[type] $type_singular_variants),)*];
|
||||||
|
[$(type_singular_variants = ($type_singular_variants),)*];
|
||||||
|
[$(state_plural_variants = (#[state] $state_plural_variants),)* $(state_plural_variants = (#[type] $type_plural_variants),)*];
|
||||||
|
[$(type_plural_variants = ($type_plural_variants),)*];
|
||||||
|
[$(copy_insns = ($copy_insn),)*];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
(
|
||||||
|
#![dollar = $d:tt]
|
||||||
|
parts! {
|
||||||
|
$([
|
||||||
|
$first_name:ident = ($($first_value:tt)*),
|
||||||
|
$($name:ident = ($($value:tt)*),)*
|
||||||
|
];)*
|
||||||
|
}
|
||||||
|
) => {
|
||||||
|
const _: () = {
|
||||||
|
$($(assert!(const_str_cmp(stringify!($first_name), stringify!($name)).is_eq());)*)*
|
||||||
|
};
|
||||||
|
macro_rules! get_state_part_kinds {
|
||||||
|
($d macro_ident:ident! {$d ($d args:tt)*}) => {
|
||||||
|
get_state_part_kinds! {
|
||||||
|
@expand
|
||||||
|
$d macro_ident! {}
|
||||||
|
($d ($d args)*)
|
||||||
|
()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($d macro_ident:ident!($d ($d args:tt)*)) => {
|
||||||
|
get_state_part_kinds! {
|
||||||
|
@expand
|
||||||
|
$d macro_ident!()
|
||||||
|
($d ($d args)*)
|
||||||
|
()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
(
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident! {}
|
||||||
|
()
|
||||||
|
($d ($d args:tt)*)
|
||||||
|
) => {
|
||||||
|
$d macro_ident! {
|
||||||
|
$d ($d args)*
|
||||||
|
}
|
||||||
|
};
|
||||||
|
(
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident!()
|
||||||
|
()
|
||||||
|
($d ($d args:tt)*)
|
||||||
|
) => {
|
||||||
|
$d macro_ident!(
|
||||||
|
$d ($d args)*
|
||||||
|
)
|
||||||
|
};
|
||||||
|
(
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident! $d group:tt
|
||||||
|
(, $d ($d rest:tt)*)
|
||||||
|
($d ($d prev_args:tt)*)
|
||||||
|
) => {
|
||||||
|
get_state_part_kinds! {
|
||||||
|
@expand
|
||||||
|
$d macro_ident! $d group
|
||||||
|
($d ($d rest)*)
|
||||||
|
($d ($d prev_args)*,)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
(
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident! $d group:tt
|
||||||
|
(custom = $d custom:tt $d ($d rest:tt)*)
|
||||||
|
($d ($d prev_args:tt)*)
|
||||||
|
) => {
|
||||||
|
get_state_part_kinds! {
|
||||||
|
@expand
|
||||||
|
$d macro_ident! $d group
|
||||||
|
($d ($d rest)*)
|
||||||
|
($d ($d prev_args)* custom = $d custom)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
$((
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident! $d group:tt
|
||||||
|
($first_name $d ($d rest:tt)*)
|
||||||
|
($d ($d prev_args:tt)*)
|
||||||
|
) => {
|
||||||
|
get_state_part_kinds! {
|
||||||
|
@expand
|
||||||
|
$d macro_ident! $d group
|
||||||
|
($d ($d rest)*)
|
||||||
|
($d ($d prev_args)* $first_name = [$($first_value)*, $($($value)*,)*])
|
||||||
|
}
|
||||||
|
};)*
|
||||||
|
(
|
||||||
|
@expand
|
||||||
|
$d macro_ident:ident! $d group:tt
|
||||||
|
($d unexpected:tt $d ($d rest:tt)*)
|
||||||
|
($d ($d prev_args:tt)*)
|
||||||
|
) => {
|
||||||
|
compile_error! {concat!("Unexpected token: ", stringify!($d unexpected))}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) use get_state_part_kinds;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
make_get_state_part_kinds! {
|
||||||
|
#![dollar = $]
|
||||||
|
state_part! {
|
||||||
|
singular_field = memory;
|
||||||
|
plural_field = memories;
|
||||||
|
kind = StatePartKindMemories;
|
||||||
|
singular_variant = Memory;
|
||||||
|
plural_variant = Memories;
|
||||||
|
}
|
||||||
|
type_part! {
|
||||||
|
singular_field = small_slot;
|
||||||
|
plural_field = small_slots;
|
||||||
|
kind = StatePartKindSmallSlots;
|
||||||
|
singular_variant = SmallSlot;
|
||||||
|
plural_variant = SmallSlots;
|
||||||
|
copy_insn = CopySmall;
|
||||||
|
}
|
||||||
|
type_part! {
|
||||||
|
singular_field = big_slot;
|
||||||
|
plural_field = big_slots;
|
||||||
|
kind = StatePartKindBigSlots;
|
||||||
|
singular_variant = BigSlot;
|
||||||
|
plural_variant = BigSlots;
|
||||||
|
copy_insn = Copy;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue