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        pm.register_pass::<ExternalToRef>()?;
48
49        // Compilation passes
50        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        // Lowering passes
67        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        // Enabled in the synthesis compilation flow
76        pm.register_diagnostic::<SynthesisPapercut>()?;
77        pm.register_pass::<Externalize>()?;
78
79        // Disabled by default
80        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        // 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                ExternalToRef,
121                CompileRepeat,
122                DeadGroupRemoval, // Since previous passes potentially create dead groups
123                CollapseControl,
124            ]
125        );
126
127        register_alias!(
128            pm,
129            "fsm-opt",
130            [
131                DataPathInfer,
132                CollapseControl,
133                CompileSyncWithoutSyncReg,
134                GroupToSeq, // FIXME: may make programs *slower*
135                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, // FIXME: may make programs *slower*
165                DeadAssignmentRemoval,
166                GroupToInvoke,
167                ComponentInliner,
168                CombProp,
169                // DeadCellRemoval,
170                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, // Static inliner generates lots of assigns
218                DeadGroupRemoval, // Static inliner generates lots of dead groups
219                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        // Default flow
252        register_alias!(
253            pm,
254            "all",
255            ["validate", "pre-opt", "compile", "post-opt", "lower",]
256        );
257
258        // profiler flow for pass explorer access
259        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        // Compilation flow with no optimizations enables
275        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}