Skip to main content

veryl_metadata/
lint.rs

1use regex::Regex;
2use serde::{Deserialize, Serialize};
3use std::fmt;
4
5#[derive(Clone, Debug, Default, Serialize, Deserialize)]
6#[serde(deny_unknown_fields)]
7pub struct Lint {
8    #[serde(default)]
9    pub naming: LintNaming,
10    #[serde(default)]
11    pub portability: LintPortability,
12}
13
14#[derive(Clone, Debug, Default, Serialize, Deserialize)]
15#[serde(deny_unknown_fields)]
16pub struct LintPortability {
17    /// `#[allow]` in the project's own code is always honored; a dependency
18    /// needs the consumer's permission, so an ASIC project can't absorb an
19    /// FPGA-only library without noticing.
20    #[serde(default)]
21    pub allow_in_dependencies: Vec<NonPortableItem>,
22}
23
24#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
25pub enum NonPortableItem {
26    #[serde(rename = "initial_assign")]
27    InitialAssign,
28    #[serde(rename = "multiple_assign")]
29    MultipleAssign,
30}
31
32impl fmt::Display for NonPortableItem {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        let text = match self {
35            NonPortableItem::InitialAssign => "initial_assign",
36            NonPortableItem::MultipleAssign => "multiple_assign",
37        };
38        text.fmt(f)
39    }
40}
41
42#[derive(Clone, Debug, Default, Serialize, Deserialize)]
43#[serde(deny_unknown_fields)]
44pub struct LintNaming {
45    #[serde(default)]
46    pub case_clock_domain: Option<Case>,
47    #[serde(default)]
48    pub case_enum: Option<Case>,
49    #[serde(default)]
50    pub case_function: Option<Case>,
51    #[serde(default)]
52    pub case_function_inout: Option<Case>,
53    #[serde(default)]
54    pub case_function_input: Option<Case>,
55    #[serde(default)]
56    pub case_function_output: Option<Case>,
57    #[serde(default)]
58    pub case_instance: Option<Case>,
59    #[serde(default)]
60    pub case_interface: Option<Case>,
61    #[serde(default)]
62    pub case_modport: Option<Case>,
63    #[serde(default)]
64    pub case_module: Option<Case>,
65    #[serde(default)]
66    pub case_package: Option<Case>,
67    #[serde(default)]
68    pub case_parameter: Option<Case>,
69    #[serde(default)]
70    pub case_port_inout: Option<Case>,
71    #[serde(default)]
72    pub case_port_input: Option<Case>,
73    #[serde(default)]
74    pub case_port_modport: Option<Case>,
75    #[serde(default)]
76    pub case_port_output: Option<Case>,
77    #[serde(default)]
78    pub case_reg: Option<Case>,
79    #[serde(default)]
80    pub case_struct: Option<Case>,
81    #[serde(default)]
82    pub case_union: Option<Case>,
83    #[serde(default)]
84    pub case_var: Option<Case>,
85    #[serde(default)]
86    pub case_wire: Option<Case>,
87    #[serde(default)]
88    pub prefix_clock_domain: Option<String>,
89    #[serde(default)]
90    pub prefix_enum: Option<String>,
91    #[serde(default)]
92    pub prefix_function: Option<String>,
93    #[serde(default)]
94    pub prefix_function_inout: Option<String>,
95    #[serde(default)]
96    pub prefix_function_input: Option<String>,
97    #[serde(default)]
98    pub prefix_function_output: Option<String>,
99    #[serde(default)]
100    pub prefix_instance: Option<String>,
101    #[serde(default)]
102    pub prefix_interface: Option<String>,
103    #[serde(default)]
104    pub prefix_modport: Option<String>,
105    #[serde(default)]
106    pub prefix_module: Option<String>,
107    #[serde(default)]
108    pub prefix_package: Option<String>,
109    #[serde(default)]
110    pub prefix_parameter: Option<String>,
111    #[serde(default)]
112    pub prefix_port_inout: Option<String>,
113    #[serde(default)]
114    pub prefix_port_input: Option<String>,
115    #[serde(default)]
116    pub prefix_port_modport: Option<String>,
117    #[serde(default)]
118    pub prefix_port_output: Option<String>,
119    #[serde(default)]
120    pub prefix_reg: Option<String>,
121    #[serde(default)]
122    pub prefix_struct: Option<String>,
123    #[serde(default)]
124    pub prefix_union: Option<String>,
125    #[serde(default)]
126    pub prefix_var: Option<String>,
127    #[serde(default)]
128    pub prefix_wire: Option<String>,
129    #[serde(default)]
130    pub suffix_clock_domain: Option<String>,
131    #[serde(default)]
132    pub suffix_enum: Option<String>,
133    #[serde(default)]
134    pub suffix_function: Option<String>,
135    #[serde(default)]
136    pub suffix_function_inout: Option<String>,
137    #[serde(default)]
138    pub suffix_function_input: Option<String>,
139    #[serde(default)]
140    pub suffix_function_output: Option<String>,
141    #[serde(default)]
142    pub suffix_instance: Option<String>,
143    #[serde(default)]
144    pub suffix_interface: Option<String>,
145    #[serde(default)]
146    pub suffix_modport: Option<String>,
147    #[serde(default)]
148    pub suffix_module: Option<String>,
149    #[serde(default)]
150    pub suffix_package: Option<String>,
151    #[serde(default)]
152    pub suffix_parameter: Option<String>,
153    #[serde(default)]
154    pub suffix_port_inout: Option<String>,
155    #[serde(default)]
156    pub suffix_port_input: Option<String>,
157    #[serde(default)]
158    pub suffix_port_modport: Option<String>,
159    #[serde(default)]
160    pub suffix_port_output: Option<String>,
161    #[serde(default)]
162    pub suffix_reg: Option<String>,
163    #[serde(default)]
164    pub suffix_struct: Option<String>,
165    #[serde(default)]
166    pub suffix_union: Option<String>,
167    #[serde(default)]
168    pub suffix_var: Option<String>,
169    #[serde(default)]
170    pub suffix_wire: Option<String>,
171    #[serde(default, with = "serde_regex")]
172    pub re_forbidden_clock_domain: Option<Regex>,
173    #[serde(default, with = "serde_regex")]
174    pub re_forbidden_enum: Option<Regex>,
175    #[serde(default, with = "serde_regex")]
176    pub re_forbidden_function: Option<Regex>,
177    #[serde(default, with = "serde_regex")]
178    pub re_forbidden_function_inout: Option<Regex>,
179    #[serde(default, with = "serde_regex")]
180    pub re_forbidden_function_input: Option<Regex>,
181    #[serde(default, with = "serde_regex")]
182    pub re_forbidden_function_output: Option<Regex>,
183    #[serde(default, with = "serde_regex")]
184    pub re_forbidden_instance: Option<Regex>,
185    #[serde(default, with = "serde_regex")]
186    pub re_forbidden_interface: Option<Regex>,
187    #[serde(default, with = "serde_regex")]
188    pub re_forbidden_modport: Option<Regex>,
189    #[serde(default, with = "serde_regex")]
190    pub re_forbidden_module: Option<Regex>,
191    #[serde(default, with = "serde_regex")]
192    pub re_forbidden_package: Option<Regex>,
193    #[serde(default, with = "serde_regex")]
194    pub re_forbidden_parameter: Option<Regex>,
195    #[serde(default, with = "serde_regex")]
196    pub re_forbidden_port_inout: Option<Regex>,
197    #[serde(default, with = "serde_regex")]
198    pub re_forbidden_port_input: Option<Regex>,
199    #[serde(default, with = "serde_regex")]
200    pub re_forbidden_port_modport: Option<Regex>,
201    #[serde(default, with = "serde_regex")]
202    pub re_forbidden_port_output: Option<Regex>,
203    #[serde(default, with = "serde_regex")]
204    pub re_forbidden_reg: Option<Regex>,
205    #[serde(default, with = "serde_regex")]
206    pub re_forbidden_struct: Option<Regex>,
207    #[serde(default, with = "serde_regex")]
208    pub re_forbidden_union: Option<Regex>,
209    #[serde(default, with = "serde_regex")]
210    pub re_forbidden_var: Option<Regex>,
211    #[serde(default, with = "serde_regex")]
212    pub re_forbidden_wire: Option<Regex>,
213    #[serde(default, with = "serde_regex")]
214    pub re_required_clock_domain: Option<Regex>,
215    #[serde(default, with = "serde_regex")]
216    pub re_required_enum: Option<Regex>,
217    #[serde(default, with = "serde_regex")]
218    pub re_required_function: Option<Regex>,
219    #[serde(default, with = "serde_regex")]
220    pub re_required_function_inout: Option<Regex>,
221    #[serde(default, with = "serde_regex")]
222    pub re_required_function_input: Option<Regex>,
223    #[serde(default, with = "serde_regex")]
224    pub re_required_function_output: Option<Regex>,
225    #[serde(default, with = "serde_regex")]
226    pub re_required_instance: Option<Regex>,
227    #[serde(default, with = "serde_regex")]
228    pub re_required_interface: Option<Regex>,
229    #[serde(default, with = "serde_regex")]
230    pub re_required_modport: Option<Regex>,
231    #[serde(default, with = "serde_regex")]
232    pub re_required_module: Option<Regex>,
233    #[serde(default, with = "serde_regex")]
234    pub re_required_package: Option<Regex>,
235    #[serde(default, with = "serde_regex")]
236    pub re_required_parameter: Option<Regex>,
237    #[serde(default, with = "serde_regex")]
238    pub re_required_port_inout: Option<Regex>,
239    #[serde(default, with = "serde_regex")]
240    pub re_required_port_input: Option<Regex>,
241    #[serde(default, with = "serde_regex")]
242    pub re_required_port_modport: Option<Regex>,
243    #[serde(default, with = "serde_regex")]
244    pub re_required_port_output: Option<Regex>,
245    #[serde(default, with = "serde_regex")]
246    pub re_required_reg: Option<Regex>,
247    #[serde(default, with = "serde_regex")]
248    pub re_required_struct: Option<Regex>,
249    #[serde(default, with = "serde_regex")]
250    pub re_required_union: Option<Regex>,
251    #[serde(default, with = "serde_regex")]
252    pub re_required_var: Option<Regex>,
253    #[serde(default, with = "serde_regex")]
254    pub re_required_wire: Option<Regex>,
255}
256
257#[derive(Clone, Debug, Default, Serialize, Deserialize)]
258pub enum Case {
259    #[default]
260    #[serde(rename = "snake")]
261    Snake,
262    #[serde(rename = "screaming_snake")]
263    ScreamingSnake,
264    #[serde(rename = "upper_camel")]
265    UpperCamel,
266    #[serde(rename = "lower_camel")]
267    LowerCamel,
268}
269
270impl fmt::Display for Case {
271    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
272        let text = match self {
273            Case::Snake => "snake_case".to_string(),
274            Case::ScreamingSnake => "SCREAMING_SNAKE_CASE".to_string(),
275            Case::UpperCamel => "UpperCamelCase".to_string(),
276            Case::LowerCamel => "lowerCamelCase".to_string(),
277        };
278        text.fmt(f)
279    }
280}