calyx_opt/
default_passes.rs

1//! Defines the default passes available to [PassManager].
2use crate::passes::{
3    AddGuard, Canonicalize, CellShare, ClkInsertion, CollapseControl, CombProp,
4    CompileInvoke, CompileRepeat, CompileStatic, CompileStaticInterface,
5    CompileSync, CompileSyncWithoutSyncReg, ComponentInliner, DataPathInfer,
6    DeadAssignmentRemoval, DeadCellRemoval, DeadGroupRemoval, DefaultAssigns,
7    DiscoverExternal, Externalize, GoInsertion, GroupToInvoke, GroupToSeq,
8    HoleInliner, InferShare, LowerGuards, MergeAssign, Papercut, ParToSeq,
9    RegisterUnsharing, RemoveIds, ResetInsertion, SimplifyStaticGuards,
10    SimplifyWithControl, StaticInference, StaticInliner, StaticPromotion,
11    SynthesisPapercut, TopDownCompileControl, UnrollBounded, WellFormed,
12    WireInliner, WrapMain,
13};
14use crate::traversal::Named;
15use crate::{pass_manager::PassManager, register_alias};
16use calyx_utils::CalyxResult;
17
18impl PassManager {
19    pub fn default_passes() -> CalyxResult<Self> {
20        // Construct the pass manager and register all passes.
21        let mut pm = PassManager::default();
22
23        // Validation passes
24        pm.register_pass::<WellFormed>()?;
25        pm.register_pass::<Papercut>()?;
26        pm.register_pass::<Canonicalize>()?;
27
28        // Optimization passes
29        pm.register_pass::<CombProp>()?;
30        pm.register_pass::<ComponentInliner>()?;
31        pm.register_pass::<CollapseControl>()?;
32        pm.register_pass::<DeadAssignmentRemoval>()?;
33        pm.register_pass::<DeadCellRemoval>()?;
34        pm.register_pass::<DeadGroupRemoval>()?;
35        pm.register_pass::<GroupToSeq>()?;
36        pm.register_pass::<InferShare>()?;
37        pm.register_pass::<CellShare>()?;
38        pm.register_pass::<StaticInference>()?;
39        pm.register_pass::<StaticPromotion>()?;
40        pm.register_pass::<SimplifyStaticGuards>()?;
41        pm.register_pass::<DataPathInfer>()?;
42
43        // Compilation passes
44        pm.register_pass::<StaticInliner>()?;
45        pm.register_pass::<CompileStatic>()?;
46        pm.register_pass::<CompileInvoke>()?;
47        pm.register_pass::<CompileRepeat>()?;
48        pm.register_pass::<SimplifyWithControl>()?;
49        pm.register_pass::<TopDownCompileControl>()?;
50        pm.register_pass::<CompileSync>()?;
51        pm.register_pass::<CompileSyncWithoutSyncReg>()?;
52        pm.register_pass::<AddGuard>()?;
53        pm.register_pass::<CompileStaticInterface>()?;
54
55        // Lowering passes
56        pm.register_pass::<GoInsertion>()?;
57        pm.register_pass::<WireInliner>()?;
58        pm.register_pass::<ClkInsertion>()?;
59        pm.register_pass::<ResetInsertion>()?;
60        pm.register_pass::<MergeAssign>()?;
61        pm.register_pass::<WrapMain>()?;
62        pm.register_pass::<DefaultAssigns>()?;
63
64        // Enabled in the synthesis compilation flow
65        pm.register_pass::<SynthesisPapercut>()?;
66        pm.register_pass::<Externalize>()?;
67
68        // Disabled by default
69        pm.register_pass::<DiscoverExternal>()?;
70        pm.register_pass::<UnrollBounded>()?;
71        pm.register_pass::<RegisterUnsharing>()?;
72        pm.register_pass::<GroupToInvoke>()?;
73        pm.register_pass::<ParToSeq>()?;
74        pm.register_pass::<LowerGuards>()?;
75        pm.register_pass::<HoleInliner>()?;
76        pm.register_pass::<RemoveIds>()?;
77
78        register_alias!(pm, "validate", [WellFormed, Papercut, Canonicalize]);
79        register_alias!(
80            pm,
81            "pre-opt",
82            [
83                DataPathInfer,
84                CollapseControl, // Run it twice: once at beginning of pre-opt, once at end.
85                CompileSyncWithoutSyncReg,
86                GroupToSeq,
87                DeadAssignmentRemoval,
88                GroupToInvoke, // Creates Dead Groups potentially
89                InferShare,
90                ComponentInliner,
91                CombProp,
92                DeadCellRemoval, // Clean up dead wires left by CombProp
93                CellShare,       // LiveRangeAnalaysis should handle comb groups
94                SimplifyWithControl, // Must run before compile-invoke
95                CompileInvoke,   // creates dead comb groups
96                StaticInference,
97                StaticPromotion,
98                CompileRepeat,
99                DeadGroupRemoval, // Since previous passes potentially create dead groups
100                CollapseControl,
101            ]
102        );
103        register_alias!(
104            pm,
105            "compile",
106            [
107                StaticInliner,
108                MergeAssign, // Static inliner generates lots of assigns
109                DeadGroupRemoval, // Static inliner generates lots of dead groups
110                SimplifyStaticGuards,
111                AddGuard,
112                CompileStaticInterface,
113                DeadGroupRemoval,
114                CompileStatic,
115                TopDownCompileControl
116            ]
117        );
118        register_alias!(
119            pm,
120            "post-opt",
121            [
122                DeadGroupRemoval,
123                CombProp,
124                DeadAssignmentRemoval,
125                DeadCellRemoval
126            ]
127        );
128        register_alias!(
129            pm,
130            "lower",
131            [
132                WrapMain,
133                GoInsertion,
134                WireInliner,
135                ClkInsertion,
136                ResetInsertion,
137                MergeAssign,
138                DefaultAssigns,
139            ]
140        );
141
142        // Default flow
143        register_alias!(
144            pm,
145            "all",
146            ["validate", "pre-opt", "compile", "post-opt", "lower",]
147        );
148
149        // Compilation flow with no optimizations enables
150        register_alias!(
151            pm,
152            "no-opt",
153            [
154                "validate",
155                CompileSync,
156                SimplifyWithControl,
157                CompileInvoke,
158                "compile",
159                "lower"
160            ]
161        );
162
163        register_alias!(
164            pm,
165            "external",
166            [
167                "validate",
168                SynthesisPapercut,
169                "pre-opt",
170                "compile",
171                "post-opt",
172                "lower",
173                Externalize,
174            ]
175        );
176
177        register_alias!(pm, "none", []);
178
179        Ok(pm)
180    }
181}