rust_hdl_macros/
lib.rs

1mod common;
2mod connect_gen;
3mod hdl_gen;
4mod logic_block;
5mod logic_interface;
6mod logic_state;
7mod logic_struct;
8
9use syn::parse_macro_input;
10use syn::DeriveInput;
11
12use crate::common::TS;
13use crate::connect_gen::connect_gen;
14use crate::hdl_gen::hdl_gen_process;
15use crate::logic_block::get_impl_for_logic_block;
16use crate::logic_interface::get_impl_for_logic_interface;
17use crate::logic_state::get_logic_state_impls;
18use crate::logic_struct::get_impl_for_logic_struct;
19use proc_macro::TokenStream;
20use quote::quote;
21
22#[proc_macro_derive(LogicBlock)]
23pub fn logic_block(input: TokenStream) -> TokenStream {
24    let input = parse_macro_input!(input as DeriveInput);
25
26    match get_impl_for_logic_block(&input) {
27        Err(e) => e.to_compile_error().into(),
28        Ok(x) => x.into(),
29    }
30}
31
32#[proc_macro_derive(LogicInterface, attributes(join))]
33pub fn logic_interface(input: TokenStream) -> TokenStream {
34    let input = parse_macro_input!(input as DeriveInput);
35
36    match get_impl_for_logic_interface(&input) {
37        Err(e) => e.to_compile_error().into(),
38        Ok(x) => x.into(),
39    }
40}
41
42#[proc_macro_derive(LogicState)]
43pub fn logic_state(input: TokenStream) -> TokenStream {
44    let input = parse_macro_input!(input as DeriveInput);
45
46    match get_logic_state_impls(&input) {
47        Err(e) => e.to_compile_error().into(),
48        Ok(x) => x.into(),
49    }
50}
51
52#[proc_macro_derive(LogicStruct)]
53pub fn logic_struct(input: TokenStream) -> TokenStream {
54    let input = parse_macro_input!(input as DeriveInput);
55
56    match get_impl_for_logic_struct(&input) {
57        Err(e) => e.to_compile_error().into(),
58        Ok(x) => x.into(),
59    }
60}
61
62#[proc_macro_attribute]
63pub fn hdl_gen(_attr: TokenStream, item: TokenStream) -> TokenStream {
64    let orig = TS::from(item.clone());
65    let parse = parse_macro_input!(item as syn::ItemFn);
66    let connects = match connect_gen(&parse) {
67        Err(e) => return e.to_compile_error().into(),
68        Ok(t) => t,
69    };
70    match hdl_gen_process(parse) {
71        Err(e) => e.to_compile_error().into(),
72        Ok(hdl_code) => TokenStream::from(quote! {
73        #[allow(unreachable_patterns)]
74            #orig
75
76        #[allow(dead_code)]
77        #[allow(unused_variables)]
78        #[automatically_derived]
79            #connects
80
81        #[allow(dead_code)]
82        #[allow(unused_variables)]
83        #[automatically_derived]
84            #hdl_code
85        }),
86    }
87}