1use crate::pass_manager::PassResult;
3use crate::passes::{
4 AddGuard, Canonicalize, CellShare, ClkInsertion, CollapseControl, CombProp,
5 CompileInvoke, CompileRepeat, CompileStatic, ComponentInliner,
6 ConstantPortProp, DataPathInfer, DeadAssignmentRemoval, DeadCellRemoval,
7 DeadGroupRemoval, DefaultAssigns, Externalize, GoInsertion, GroupToInvoke,
8 GroupToSeq, InferShare, LowerGuards, MergeAssign, Papercut,
9 ProfilerInstrumentation, PropagateProtected, RemoveIds, ResetInsertion,
10 SimplifyStaticGuards, SimplifyWithControl, StaticFSMAllocation,
11 StaticFSMOpts, StaticInference, StaticInliner, StaticPromotion,
12 StaticRepeatFSMAllocation, SynthesisPapercut, TopDownCompileControl,
13 UniquefyEnables, UnrollBounded, WellFormed, WireInliner, WrapMain,
14};
15use crate::passes_experimental::{
16 CompileSync, CompileSyncWithoutSyncReg, DiscoverExternal, ExternalToRef,
17 FSMAnnotator, FSMBuilder, HoleInliner, Metadata, ParToSeq,
18 RegisterUnsharing,
19};
20use crate::traversal::Named;
21use crate::{pass_manager::PassManager, register_alias};
22
23impl PassManager {
24 pub fn default_passes() -> PassResult<Self> {
25 let mut pm = PassManager::default();
27
28 pm.register_diagnostic::<WellFormed>()?;
30 pm.register_diagnostic::<Papercut>()?;
31 pm.register_pass::<Canonicalize>()?;
32
33 pm.register_pass::<CombProp>()?;
35 pm.register_pass::<ComponentInliner>()?;
36 pm.register_pass::<CollapseControl>()?;
37 pm.register_pass::<DeadAssignmentRemoval>()?;
38 pm.register_pass::<DeadCellRemoval>()?;
39 pm.register_pass::<DeadGroupRemoval>()?;
40 pm.register_pass::<GroupToSeq>()?;
41 pm.register_pass::<InferShare>()?;
42 pm.register_pass::<CellShare>()?;
43 pm.register_pass::<StaticInference>()?;
44 pm.register_pass::<StaticPromotion>()?;
45 pm.register_pass::<SimplifyStaticGuards>()?;
46 pm.register_pass::<DataPathInfer>()?;
47
48 pm.register_pass::<StaticInliner>()?;
50 pm.register_pass::<StaticFSMAllocation>()?;
51 pm.register_pass::<StaticRepeatFSMAllocation>()?;
52 pm.register_pass::<StaticFSMOpts>()?;
53 pm.register_pass::<CompileStatic>()?;
54 pm.register_pass::<CompileInvoke>()?;
55 pm.register_pass::<CompileRepeat>()?;
56 pm.register_pass::<SimplifyWithControl>()?;
57 pm.register_pass::<TopDownCompileControl>()?;
58 pm.register_pass::<CompileSync>()?;
59 pm.register_pass::<CompileSyncWithoutSyncReg>()?;
60 pm.register_pass::<AddGuard>()?;
61 pm.register_pass::<FSMAnnotator>()?;
62 pm.register_pass::<FSMBuilder>()?;
63 pm.register_pass::<PropagateProtected>()?;
64
65 pm.register_pass::<GoInsertion>()?;
67 pm.register_pass::<WireInliner>()?;
68 pm.register_pass::<ClkInsertion>()?;
69 pm.register_pass::<ResetInsertion>()?;
70 pm.register_pass::<MergeAssign>()?;
71 pm.register_pass::<WrapMain>()?;
72 pm.register_pass::<DefaultAssigns>()?;
73
74 pm.register_diagnostic::<SynthesisPapercut>()?;
76 pm.register_pass::<Externalize>()?;
77
78 pm.register_pass::<DiscoverExternal>()?;
80 pm.register_pass::<UnrollBounded>()?;
81 pm.register_pass::<RegisterUnsharing>()?;
82 pm.register_pass::<GroupToInvoke>()?;
83 pm.register_pass::<ParToSeq>()?;
84 pm.register_pass::<LowerGuards>()?;
85 pm.register_pass::<HoleInliner>()?;
86 pm.register_pass::<RemoveIds>()?;
87 pm.register_pass::<ExternalToRef>()?;
88 pm.register_pass::<ConstantPortProp>()?;
89
90 pm.register_pass::<ProfilerInstrumentation>()?;
92 pm.register_pass::<UniquefyEnables>()?;
93
94 pm.register_pass::<Metadata>()?;
96
97 register_alias!(pm, "validate", [WellFormed, Papercut, Canonicalize]);
98 register_alias!(
99 pm,
100 "pre-opt",
101 [
102 PropagateProtected,
103 DataPathInfer,
104 CollapseControl, CompileSyncWithoutSyncReg,
106 GroupToSeq, DeadAssignmentRemoval,
108 GroupToInvoke, InferShare,
110 ComponentInliner,
111 CombProp,
112 ConstantPortProp,
113 DeadCellRemoval, CellShare, SimplifyWithControl, CompileInvoke, StaticInference,
118 StaticPromotion,
119 CompileRepeat,
120 DeadGroupRemoval, CollapseControl,
122 ]
123 );
124
125 register_alias!(
126 pm,
127 "fsm-opt",
128 [
129 DataPathInfer,
130 CollapseControl,
131 CompileSyncWithoutSyncReg,
132 GroupToSeq, DeadAssignmentRemoval,
134 GroupToInvoke,
135 ComponentInliner,
136 CombProp,
137 DeadCellRemoval,
138 CellShare,
139 SimplifyWithControl,
140 CompileInvoke,
141 StaticInference,
142 StaticPromotion,
143 DeadGroupRemoval,
144 CollapseControl,
145 StaticRepeatFSMAllocation,
146 StaticFSMAllocation,
147 DeadGroupRemoval,
148 MergeAssign,
149 CompileRepeat,
150 TopDownCompileControl,
151 ]
152 );
153
154 register_alias!(
155 pm,
156 "med-fsm",
157 [
158 DataPathInfer,
159 CollapseControl,
160 CompileSyncWithoutSyncReg,
161 GroupToSeq, DeadAssignmentRemoval,
163 GroupToInvoke,
164 ComponentInliner,
165 CombProp,
166 CellShare,
168 SimplifyWithControl,
169 CompileInvoke,
170 StaticInference,
171 StaticPromotion,
172 DeadGroupRemoval,
173 CollapseControl,
174 FSMAnnotator,
175 FSMBuilder,
176 DeadGroupRemoval,
177 MergeAssign,
178 CompileRepeat,
179 TopDownCompileControl,
180 ]
181 );
182
183 register_alias!(
184 pm,
185 "compile-fsm",
186 [
187 DataPathInfer,
188 CollapseControl,
189 CompileSyncWithoutSyncReg,
190 GroupToSeq,
191 DeadAssignmentRemoval,
192 GroupToInvoke,
193 ComponentInliner,
194 CombProp,
195 DeadCellRemoval,
196 CellShare,
197 SimplifyWithControl,
198 CompileInvoke,
199 StaticInference,
200 StaticPromotion,
201 DeadGroupRemoval,
202 CollapseControl,
203 FSMAnnotator,
204 ]
205 );
206
207 register_alias!(
208 pm,
209 "compile",
210 [
211 StaticInliner,
212 MergeAssign, DeadGroupRemoval, AddGuard,
215 SimplifyStaticGuards,
216 StaticFSMOpts,
217 CompileStatic,
218 DeadGroupRemoval,
219 TopDownCompileControl,
220 ]
221 );
222 register_alias!(
223 pm,
224 "post-opt",
225 [
226 DeadGroupRemoval,
227 CombProp,
228 DeadAssignmentRemoval,
229 DeadCellRemoval
230 ]
231 );
232 register_alias!(
233 pm,
234 "lower",
235 [
236 WrapMain,
237 GoInsertion,
238 WireInliner,
239 ClkInsertion,
240 ResetInsertion,
241 MergeAssign,
242 DefaultAssigns,
243 ]
244 );
245
246 register_alias!(
248 pm,
249 "all",
250 ["validate", "pre-opt", "compile", "post-opt", "lower",]
251 );
252
253 register_alias!(
255 pm,
256 "profiler",
257 [
258 "validate",
259 CompileInvoke,
260 UniquefyEnables,
261 ProfilerInstrumentation,
262 DeadGroupRemoval,
263 DataPathInfer,
265 CollapseControl, CompileSyncWithoutSyncReg,
267 DeadAssignmentRemoval,
268 GroupToInvoke, InferShare,
270 ComponentInliner,
271 CombProp,
272 ConstantPortProp,
273 DeadCellRemoval, CellShare, SimplifyWithControl, CompileInvoke, StaticInference,
278 StaticPromotion,
279 CompileRepeat,
280 DeadGroupRemoval, CollapseControl,
282 "compile",
283 "post-opt",
284 "lower"
285 ]
286 );
287
288 register_alias!(
290 pm,
291 "no-opt",
292 [
293 "validate",
294 CompileSync,
295 SimplifyWithControl,
296 CompileInvoke,
297 "compile",
298 "lower"
299 ]
300 );
301
302 register_alias!(
303 pm,
304 "external",
305 [
306 "validate",
307 SynthesisPapercut,
308 "pre-opt",
309 "compile",
310 "post-opt",
311 "lower",
312 Externalize,
313 ]
314 );
315
316 register_alias!(pm, "none", []);
317
318 Ok(pm)
319 }
320}