Skip to content

Instantly share code, notes, and snippets.

@djg
Created May 27, 2019 00:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save djg/c19da832e89622c3ee2c06fe4b3f2619 to your computer and use it in GitHub Desktop.
Save djg/c19da832e89622c3ee2c06fe4b3f2619 to your computer and use it in GitHub Desktop.
Simulating named parameters with rust macros
#[macro_export]
macro_rules! signal_build {
($name:expr, $shape:expr, $reset:expr, $reset_less:expr) => {
Signal::signal($name, Shape::from($shape), $reset, $reset_less)
};
}
#[macro_export(local_inner_macros)]
macro_rules! signal_collect {
(($_:expr, $shape:expr, $reset:expr, $reset_less:expr) name: $name:expr, $($k:ident: $v:expr,)*) => {
signal_collect!(($name, $shape, $reset, $reset_less) $($k: $v,)*)
};
(($name:expr, $_:expr, $reset:expr, $reset_less:expr) shape: $shape:expr, $($k:ident: $v:expr,)*) => {
signal_collect!(($name, $shape, $reset, $reset_less) $($k: $v,)*)
};
(($name:expr, $shape:expr, $_:expr, $reset_less:expr) reset: $reset:expr, $($k:ident: $v:expr,)*) => {
signal_collect!(($name, $shape, $reset, $reset_less) $($k: $v,)*)
};
(($name:expr, $shape:expr, $reset:expr, $_:expr) reset_less: $reset_less:expr, $($k:ident: $v:expr,)*) => {
signal_collect!(($name, $shape, $reset, $reset_less) $($k: $v,)*)
};
(($name:expr, $shape:expr, $reset:expr, $reset_less:expr)) => {
signal_build!($name, $shape, $reset, $reset_less)
};
}
// use like:
// signal!(0);
// signal!(8, true);
// signal!(name: "s1", shape: -10..10);
// signal!(name: "s1", shape: 8, reset: 0xFF, reset_less: true);
#[macro_export(local_inner_macros)]
macro_rules! signal {
($($k:ident: $v:expr,)*) => {
signal_collect!(("$signal", Shape::default(), 0, false) $($k: $v,)*)
};
($($k:ident: $v:expr),*) => {
signal!($($k: $v,)*)
};
($bits:expr) => {
signal!(shape: $bits,)
};
($bits:expr, $($k:ident: $v:expr),*) => {
signal!(shape: $bits, $($k: $v,)*)
};
($bits:expr, $signed:expr) => {
signal!(shape: Shape { bits: $bits, signed: $signed },)
};
($bits:expr, $signed:expr, $($k:ident: $v:expr),*) => {
signal!(shape: Shape { bits: $bits, signed: $signed }, $($k: $v,)*)
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment