calyx_opt/
default_passes.rs

1//! Defines the default passes available to [PassManager].
2use 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        // Construct the pass manager and register all passes.
26        let mut pm = PassManager::default();
27
28        // Validation passes
29        pm.register_diagnostic::<WellFormed>()?;
30        pm.register_diagnostic::<Papercut>()?;
31        pm.register_pass::<Canonicalize>()?;
32
33        // Optimization passes
34        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        // Compilation passes
49        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        // Lowering passes
66        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        // Enabled in the synthesis compilation flow
75        pm.register_diagnostic::<SynthesisPapercut>()?;
76        pm.register_pass::<Externalize>()?;
77
78        // Disabled by default
79        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        // instrumentation pass to collect profiling information
92        pm.register_pass::<ProfilerInstrumentation>()?;
93        pm.register_pass::<UniquefyEnables>()?;
94
95        //add metadata
96        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, // Run it twice: once at beginning of pre-opt, once at end.
106                CompileSyncWithoutSyncReg,
107                GroupToSeq, // FIXME: may make programs *slower*
108                DeadAssignmentRemoval,
109                GroupToInvoke, // Creates Dead Groups potentially
110                InferShare,
111                ComponentInliner,
112                CombProp,
113                ConstantPortProp,
114                DeadCellRemoval, // Clean up dead wires left by CombProp
115                CellShare,       // LiveRangeAnalaysis should handle comb groups
116                SimplifyWithControl, // Must run before compile-invoke
117                CompileInvoke,   // creates dead comb groups
118                StaticInference,
119                StaticPromotion,
120                CompileRepeat,
121                DeadGroupRemoval, // Since previous passes potentially create dead groups
122                CollapseControl,
123            ]
124        );
125
126        register_alias!(
127            pm,
128            "fsm-opt",
129            [
130                DataPathInfer,
131                CollapseControl,
132                CompileSyncWithoutSyncReg,
133                GroupToSeq, // FIXME: may make programs *slower*
134                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, // FIXME: may make programs *slower*
163                DeadAssignmentRemoval,
164                GroupToInvoke,
165                ComponentInliner,
166                CombProp,
167                // DeadCellRemoval,
168                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, // Static inliner generates lots of assigns
214                DeadGroupRemoval, // Static inliner generates lots of dead groups
215                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        // Default flow
248        register_alias!(
249            pm,
250            "all",
251            ["validate", "pre-opt", "compile", "post-opt", "lower",]
252        );
253
254        // profiler flow for pass explorer access
255        register_alias!(
256            pm,
257            "profiler",
258            [
259                "validate",
260                CompileInvoke,
261                UniquefyEnables,
262                ProfilerInstrumentation,
263                DeadGroupRemoval,
264                // "pre-opt" without GroupToSeq
265                DataPathInfer,
266                CollapseControl, // Run it twice: once at beginning of pre-opt, once at end.
267                CompileSyncWithoutSyncReg,
268                DeadAssignmentRemoval,
269                GroupToInvoke, // Creates Dead Groups potentially
270                InferShare,
271                ComponentInliner,
272                CombProp,
273                ConstantPortProp,
274                DeadCellRemoval, // Clean up dead wires left by CombProp
275                CellShare,       // LiveRangeAnalaysis should handle comb groups
276                SimplifyWithControl, // Must run before compile-invoke
277                CompileInvoke,   // creates dead comb groups
278                StaticInference,
279                StaticPromotion,
280                CompileRepeat,
281                DeadGroupRemoval, // Since previous passes potentially create dead groups
282                CollapseControl,
283                "compile",
284                "post-opt",
285                "lower"
286            ]
287        );
288
289        // Compilation flow with no optimizations enables
290        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}