1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
use crate::linter::{TextRule, SyntaxRule};
use crate::rules::*;
use regex::Regex;
use serde_derive::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Config {
    #[serde(default)]
    pub option: ConfigOption,

    #[serde(default)]
    pub textrules: ConfigTextRules,

    // Pre-v0.7.2, svlint supports only syntaxrules, so they're just called
    // "rules" (instead of "syntaxrules").
    // The serde alias allows either "rules" or "syntaxrules" to be used in
    // the configuration files, usually `.svlint.toml`.
    #[serde(default, alias = "rules")]
    pub syntaxrules: ConfigSyntaxRules,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ConfigOption {
    #[serde(with = "serde_regex", default)]
    pub exclude_paths: Vec<Regex>,

    #[serde(default = "default_textwidth")]
    pub textwidth: usize,

    #[serde(default = "default_copyright_linenum")]
    pub copyright_linenum: usize,
    #[serde(default = "default_copyright_year")]
    pub copyright_year: String,
    #[serde(default = "default_copyright_holder")]
    pub copyright_holder: String,

    #[serde(default = "default_indent")]
    pub indent: usize,
    #[serde(default = "default_prefix_inout")]
    pub prefix_inout: String,
    #[serde(default = "default_prefix_input")]
    pub prefix_input: String,
    #[serde(default = "default_prefix_output")]
    pub prefix_output: String,
    #[serde(default = "default_prefix_label")]
    pub prefix_label: String,
    #[serde(default = "default_prefix_instance")]
    pub prefix_instance: String,
    #[serde(default = "default_prefix_module")]
    pub prefix_module: String,
    #[serde(default = "default_prefix_package")]
    pub prefix_package: String,
    #[serde(default = "default_prefix_interface")]
    pub prefix_interface: String,

    #[serde(default = "default_re_lowercase")]
    pub re_required_assert: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_assert_property: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_checker: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_class: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_function: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_generateblock: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_genvar: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_instance: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_interface: String,
    #[serde(default = "default_re_uppercase")]
    pub re_required_localparam: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_modport: String,
    #[serde(default = "default_re_mixedcase")]
    pub re_required_module_ansi: String,
    #[serde(default = "default_re_uppercase")]
    pub re_required_module_nonansi: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_package: String,
    #[serde(default = "default_re_uppercase")]
    pub re_required_parameter: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_port_inout: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_port_input: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_port_output: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_port_ref: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_port_interface: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_program: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_property: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_sequence: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_task: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_var_class: String,
    #[serde(default = "default_re_lowercase")]
    pub re_required_var_classmethod: String,

    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_assert: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_assert_property: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_checker: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_class: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_function: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_generateblock: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_genvar: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_instance: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_interface: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_localparam: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_modport: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_module_ansi: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_module_nonansi: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_package: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_parameter: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_port_inout: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_port_input: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_port_output: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_port_ref: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_port_interface: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_program: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_property: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_sequence: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_task: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_var_class: String,
    #[serde(default = "default_re_unconfigured")]
    pub re_forbidden_var_classmethod: String,
}

include!(concat!(env!("OUT_DIR"), "/config_rules.rs"));

impl Default for ConfigOption {
    fn default() -> Self {
        toml::from_str("").unwrap()
    }
}

impl Default for ConfigTextRules {
    fn default() -> Self {
        toml::from_str("").unwrap()
    }
}

impl Default for ConfigSyntaxRules {
    fn default() -> Self {
        toml::from_str("").unwrap()
    }
}

#[allow(dead_code)]
fn default_as_true() -> bool {
    true
}

#[allow(dead_code)]
fn default_as_false() -> bool {
    false
}

fn default_textwidth() -> usize {
    80
}

fn default_indent() -> usize {
    2
}

fn default_prefix_inout() -> String {
    String::from("b_")
}

fn default_prefix_input() -> String {
    String::from("i_")
}

fn default_prefix_output() -> String {
    String::from("o_")
}

fn default_prefix_label() -> String {
    String::from("l_")
}

fn default_prefix_instance() -> String {
    String::from("u_")
}

fn default_prefix_module() -> String {
    String::from("mod_")
}

fn default_prefix_package() -> String {
    String::from("pkg_")
}

fn default_prefix_interface() -> String {
    String::from("ifc_")
}

fn default_re_lowercase() -> String {
    String::from(r"^[a-z]+[a-z0-9_]*$")
}

fn default_re_mixedcase() -> String {
    String::from(r"^[a-z]+[a-zA-Z0-9_]*$")
}

fn default_re_uppercase() -> String {
    String::from(r"^[A-Z]+[A-Z0-9_]*$")
}

fn default_re_unconfigured() -> String {
    // Match all strings which don't begin with "X".
    // The "UNCONFIGURED" portion is an informative message, but functionally
    // redundant.
    // A special prefix "X" is required only for the testcases.
    String::from(r"^[^X](UNCONFIGURED|.*)$")
}

fn default_copyright_linenum() -> usize {
    1
}

fn default_copyright_year() -> String {
    String::from("1234")
}

fn default_copyright_holder() -> String {
    String::from(r"HOLDER")
}

include!(concat!(env!("OUT_DIR"), "/impl_config.rs"));