1use 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 let mut pm = PassManager::default();
22
23 pm.register_pass::<WellFormed>()?;
25 pm.register_pass::<Papercut>()?;
26 pm.register_pass::<Canonicalize>()?;
27
28 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 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 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 pm.register_pass::<SynthesisPapercut>()?;
66 pm.register_pass::<Externalize>()?;
67
68 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, CompileSyncWithoutSyncReg,
86 GroupToSeq,
87 DeadAssignmentRemoval,
88 GroupToInvoke, InferShare,
90 ComponentInliner,
91 CombProp,
92 DeadCellRemoval, CellShare, SimplifyWithControl, CompileInvoke, StaticInference,
97 StaticPromotion,
98 CompileRepeat,
99 DeadGroupRemoval, CollapseControl,
101 ]
102 );
103 register_alias!(
104 pm,
105 "compile",
106 [
107 StaticInliner,
108 MergeAssign, DeadGroupRemoval, 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 register_alias!(
144 pm,
145 "all",
146 ["validate", "pre-opt", "compile", "post-opt", "lower",]
147 );
148
149 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}