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}