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 pm.register_pass::<ExternalToRef>()?;
48
49 pm.register_pass::<StaticInliner>()?;
51 pm.register_pass::<StaticFSMAllocation>()?;
52 pm.register_pass::<StaticRepeatFSMAllocation>()?;
53 pm.register_pass::<StaticFSMOpts>()?;
54 pm.register_pass::<CompileStatic>()?;
55 pm.register_pass::<CompileInvoke>()?;
56 pm.register_pass::<CompileRepeat>()?;
57 pm.register_pass::<SimplifyWithControl>()?;
58 pm.register_pass::<TopDownCompileControl>()?;
59 pm.register_pass::<CompileSync>()?;
60 pm.register_pass::<CompileSyncWithoutSyncReg>()?;
61 pm.register_pass::<AddGuard>()?;
62 pm.register_pass::<FSMAnnotator>()?;
63 pm.register_pass::<FSMBuilder>()?;
64 pm.register_pass::<PropagateProtected>()?;
65
66 pm.register_pass::<GoInsertion>()?;
68 pm.register_pass::<WireInliner>()?;
69 pm.register_pass::<ClkInsertion>()?;
70 pm.register_pass::<ResetInsertion>()?;
71 pm.register_pass::<MergeAssign>()?;
72 pm.register_pass::<WrapMain>()?;
73 pm.register_pass::<DefaultAssigns>()?;
74
75 pm.register_diagnostic::<SynthesisPapercut>()?;
77 pm.register_pass::<Externalize>()?;
78
79 pm.register_pass::<DiscoverExternal>()?;
81 pm.register_pass::<UnrollBounded>()?;
82 pm.register_pass::<RegisterUnsharing>()?;
83 pm.register_pass::<GroupToInvoke>()?;
84 pm.register_pass::<ParToSeq>()?;
85 pm.register_pass::<LowerGuards>()?;
86 pm.register_pass::<HoleInliner>()?;
87 pm.register_pass::<RemoveIds>()?;
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 ExternalToRef,
121 CompileRepeat,
122 DeadGroupRemoval, CollapseControl,
124 ]
125 );
126
127 register_alias!(
128 pm,
129 "fsm-opt",
130 [
131 DataPathInfer,
132 CollapseControl,
133 CompileSyncWithoutSyncReg,
134 GroupToSeq, DeadAssignmentRemoval,
136 GroupToInvoke,
137 ComponentInliner,
138 CombProp,
139 DeadCellRemoval,
140 CellShare,
141 SimplifyWithControl,
142 CompileInvoke,
143 StaticInference,
144 StaticPromotion,
145 ExternalToRef,
146 DeadGroupRemoval,
147 CollapseControl,
148 StaticRepeatFSMAllocation,
149 StaticFSMAllocation,
150 DeadGroupRemoval,
151 MergeAssign,
152 CompileRepeat,
153 TopDownCompileControl,
154 ]
155 );
156
157 register_alias!(
158 pm,
159 "med-fsm",
160 [
161 DataPathInfer,
162 CollapseControl,
163 CompileSyncWithoutSyncReg,
164 GroupToSeq, DeadAssignmentRemoval,
166 GroupToInvoke,
167 ComponentInliner,
168 CombProp,
169 CellShare,
171 SimplifyWithControl,
172 CompileInvoke,
173 StaticInference,
174 StaticPromotion,
175 ExternalToRef,
176 DeadGroupRemoval,
177 CollapseControl,
178 FSMAnnotator,
179 FSMBuilder,
180 DeadGroupRemoval,
181 MergeAssign,
182 CompileRepeat,
183 TopDownCompileControl,
184 ]
185 );
186
187 register_alias!(
188 pm,
189 "compile-fsm",
190 [
191 DataPathInfer,
192 CollapseControl,
193 CompileSyncWithoutSyncReg,
194 GroupToSeq,
195 DeadAssignmentRemoval,
196 GroupToInvoke,
197 ComponentInliner,
198 CombProp,
199 DeadCellRemoval,
200 CellShare,
201 SimplifyWithControl,
202 CompileInvoke,
203 StaticInference,
204 StaticPromotion,
205 ExternalToRef,
206 DeadGroupRemoval,
207 CollapseControl,
208 FSMAnnotator,
209 ]
210 );
211
212 register_alias!(
213 pm,
214 "compile",
215 [
216 StaticInliner,
217 MergeAssign, DeadGroupRemoval, AddGuard,
220 SimplifyStaticGuards,
221 StaticFSMOpts,
222 CompileStatic,
223 DeadGroupRemoval,
224 TopDownCompileControl,
225 ]
226 );
227 register_alias!(
228 pm,
229 "post-opt",
230 [
231 DeadGroupRemoval,
232 CombProp,
233 DeadAssignmentRemoval,
234 DeadCellRemoval
235 ]
236 );
237 register_alias!(
238 pm,
239 "lower",
240 [
241 WrapMain,
242 GoInsertion,
243 WireInliner,
244 ClkInsertion,
245 ResetInsertion,
246 MergeAssign,
247 DefaultAssigns,
248 ]
249 );
250
251 register_alias!(
253 pm,
254 "all",
255 ["validate", "pre-opt", "compile", "post-opt", "lower",]
256 );
257
258 register_alias!(
260 pm,
261 "profiler",
262 [
263 "validate",
264 UniquefyEnables,
265 DeadGroupRemoval,
266 ProfilerInstrumentation,
267 "pre-opt",
268 "compile",
269 "post-opt",
270 "lower"
271 ]
272 );
273
274 register_alias!(
276 pm,
277 "no-opt",
278 [
279 "validate",
280 CompileSync,
281 SimplifyWithControl,
282 CompileInvoke,
283 "compile",
284 "lower"
285 ]
286 );
287
288 register_alias!(
289 pm,
290 "external",
291 [
292 "validate",
293 SynthesisPapercut,
294 "pre-opt",
295 "compile",
296 "post-opt",
297 "lower",
298 Externalize,
299 ]
300 );
301
302 register_alias!(pm, "none", []);
303
304 Ok(pm)
305 }
306}