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,
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
90        // instrumentation pass to collect profiling information
91        pm.register_pass::<ProfilerInstrumentation>()?;
92        pm.register_pass::<UniquefyEnables>()?;
93
94        //add metadata
95        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, // Run it twice: once at beginning of pre-opt, once at end.
105                CompileSyncWithoutSyncReg,
106                GroupToSeq, // FIXME: may make programs *slower*
107                DeadAssignmentRemoval,
108                GroupToInvoke, // Creates Dead Groups potentially
109                InferShare,
110                ComponentInliner,
111                CombProp,
112                ConstantPortProp,
113                DeadCellRemoval, // Clean up dead wires left by CombProp
114                CellShare,       // LiveRangeAnalaysis should handle comb groups
115                SimplifyWithControl, // Must run before compile-invoke
116                CompileInvoke,   // creates dead comb groups
117                StaticInference,
118                StaticPromotion,
119                CompileRepeat,
120                DeadGroupRemoval, // Since previous passes potentially create dead groups
121                CollapseControl,
122            ]
123        );
124
125        register_alias!(
126            pm,
127            "fsm-opt",
128            [
129                DataPathInfer,
130                CollapseControl,
131                CompileSyncWithoutSyncReg,
132                GroupToSeq, // FIXME: may make programs *slower*
133                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, // FIXME: may make programs *slower*
162                DeadAssignmentRemoval,
163                GroupToInvoke,
164                ComponentInliner,
165                CombProp,
166                // DeadCellRemoval,
167                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, // Static inliner generates lots of assigns
213                DeadGroupRemoval, // Static inliner generates lots of dead groups
214                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        // Default flow
247        register_alias!(
248            pm,
249            "all",
250            ["validate", "pre-opt", "compile", "post-opt", "lower",]
251        );
252
253        // profiler flow for pass explorer access
254        register_alias!(
255            pm,
256            "profiler",
257            [
258                "validate",
259                CompileInvoke,
260                UniquefyEnables,
261                ProfilerInstrumentation,
262                DeadGroupRemoval,
263                // "pre-opt" without GroupToSeq
264                DataPathInfer,
265                CollapseControl, // Run it twice: once at beginning of pre-opt, once at end.
266                CompileSyncWithoutSyncReg,
267                DeadAssignmentRemoval,
268                GroupToInvoke, // Creates Dead Groups potentially
269                InferShare,
270                ComponentInliner,
271                CombProp,
272                ConstantPortProp,
273                DeadCellRemoval, // Clean up dead wires left by CombProp
274                CellShare,       // LiveRangeAnalaysis should handle comb groups
275                SimplifyWithControl, // Must run before compile-invoke
276                CompileInvoke,   // creates dead comb groups
277                StaticInference,
278                StaticPromotion,
279                CompileRepeat,
280                DeadGroupRemoval, // Since previous passes potentially create dead groups
281                CollapseControl,
282                "compile",
283                "post-opt",
284                "lower"
285            ]
286        );
287
288        // Compilation flow with no optimizations enables
289        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}