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, SimplifyIfComb,
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 pm.register_pass::<SimplifyIfComb>()?;
90
91 pm.register_pass::<ProfilerInstrumentation>()?;
93 pm.register_pass::<UniquefyEnables>()?;
94
95 pm.register_pass::<Metadata>()?;
97
98 register_alias!(pm, "validate", [WellFormed, Papercut, Canonicalize]);
99 register_alias!(
100 pm,
101 "pre-opt",
102 [
103 PropagateProtected,
104 DataPathInfer,
105 CollapseControl, CompileSyncWithoutSyncReg,
107 GroupToSeq, DeadAssignmentRemoval,
109 GroupToInvoke, InferShare,
111 ComponentInliner,
112 CombProp,
113 ConstantPortProp,
114 DeadCellRemoval, CellShare, SimplifyWithControl, CompileInvoke, StaticInference,
119 StaticPromotion,
120 CompileRepeat,
121 DeadGroupRemoval, CollapseControl,
123 ]
124 );
125
126 register_alias!(
127 pm,
128 "fsm-opt",
129 [
130 DataPathInfer,
131 CollapseControl,
132 CompileSyncWithoutSyncReg,
133 GroupToSeq, DeadAssignmentRemoval,
135 GroupToInvoke,
136 ComponentInliner,
137 CombProp,
138 DeadCellRemoval,
139 CellShare,
140 SimplifyWithControl,
141 CompileInvoke,
142 StaticInference,
143 StaticPromotion,
144 DeadGroupRemoval,
145 CollapseControl,
146 StaticRepeatFSMAllocation,
147 StaticFSMAllocation,
148 DeadGroupRemoval,
149 MergeAssign,
150 CompileRepeat,
151 TopDownCompileControl,
152 ]
153 );
154
155 register_alias!(
156 pm,
157 "med-fsm",
158 [
159 DataPathInfer,
160 CollapseControl,
161 CompileSyncWithoutSyncReg,
162 GroupToSeq, DeadAssignmentRemoval,
164 GroupToInvoke,
165 ComponentInliner,
166 CombProp,
167 CellShare,
169 SimplifyWithControl,
170 CompileInvoke,
171 StaticInference,
172 StaticPromotion,
173 DeadGroupRemoval,
174 CollapseControl,
175 FSMAnnotator,
176 FSMBuilder,
177 DeadGroupRemoval,
178 MergeAssign,
179 CompileRepeat,
180 TopDownCompileControl,
181 ]
182 );
183
184 register_alias!(
185 pm,
186 "compile-fsm",
187 [
188 DataPathInfer,
189 CollapseControl,
190 CompileSyncWithoutSyncReg,
191 GroupToSeq,
192 DeadAssignmentRemoval,
193 GroupToInvoke,
194 ComponentInliner,
195 CombProp,
196 DeadCellRemoval,
197 CellShare,
198 SimplifyWithControl,
199 CompileInvoke,
200 StaticInference,
201 StaticPromotion,
202 DeadGroupRemoval,
203 CollapseControl,
204 FSMAnnotator,
205 ]
206 );
207
208 register_alias!(
209 pm,
210 "compile",
211 [
212 StaticInliner,
213 MergeAssign, DeadGroupRemoval, AddGuard,
216 SimplifyStaticGuards,
217 StaticFSMOpts,
218 CompileStatic,
219 DeadGroupRemoval,
220 TopDownCompileControl,
221 ]
222 );
223 register_alias!(
224 pm,
225 "post-opt",
226 [
227 DeadGroupRemoval,
228 CombProp,
229 DeadAssignmentRemoval,
230 DeadCellRemoval
231 ]
232 );
233 register_alias!(
234 pm,
235 "lower",
236 [
237 WrapMain,
238 GoInsertion,
239 WireInliner,
240 ClkInsertion,
241 ResetInsertion,
242 MergeAssign,
243 DefaultAssigns,
244 ]
245 );
246
247 register_alias!(
249 pm,
250 "all",
251 ["validate", "pre-opt", "compile", "post-opt", "lower",]
252 );
253
254 register_alias!(
256 pm,
257 "profiler",
258 [
259 "validate",
260 CompileInvoke,
261 UniquefyEnables,
262 ProfilerInstrumentation,
263 DeadGroupRemoval,
264 DataPathInfer,
266 CollapseControl, CompileSyncWithoutSyncReg,
268 DeadAssignmentRemoval,
269 GroupToInvoke, InferShare,
271 ComponentInliner,
272 CombProp,
273 ConstantPortProp,
274 DeadCellRemoval, CellShare, SimplifyWithControl, CompileInvoke, StaticInference,
279 StaticPromotion,
280 CompileRepeat,
281 DeadGroupRemoval, CollapseControl,
283 "compile",
284 "post-opt",
285 "lower"
286 ]
287 );
288
289 register_alias!(
291 pm,
292 "no-opt",
293 [
294 "validate",
295 CompileSync,
296 SimplifyWithControl,
297 CompileInvoke,
298 "compile",
299 "lower"
300 ]
301 );
302
303 register_alias!(
304 pm,
305 "external",
306 [
307 "validate",
308 SynthesisPapercut,
309 "pre-opt",
310 "compile",
311 "post-opt",
312 "lower",
313 Externalize,
314 ]
315 );
316
317 register_alias!(pm, "none", []);
318
319 Ok(pm)
320 }
321}