|
13 | 13 | //===----------------------------------------------------------------------===// |
14 | 14 |
|
15 | 15 | #include "circt/Conversion/ImportVerilog.h" |
16 | | -#include "circt/Conversion/MooreToCore.h" |
17 | 16 | #include "circt/Dialect/Comb/CombDialect.h" |
18 | 17 | #include "circt/Dialect/Debug/DebugDialect.h" |
19 | 18 | #include "circt/Dialect/HW/HWDialect.h" |
|
23 | 22 | #include "circt/Dialect/Moore/MooreDialect.h" |
24 | 23 | #include "circt/Dialect/Moore/MoorePasses.h" |
25 | 24 | #include "circt/Dialect/Seq/SeqDialect.h" |
26 | | -#include "circt/Dialect/Seq/SeqPasses.h" |
27 | 25 | #include "circt/Dialect/Verif/VerifDialect.h" |
28 | 26 | #include "circt/Support/Passes.h" |
29 | 27 | #include "circt/Support/Version.h" |
30 | | -#include "circt/Transforms/Passes.h" |
31 | | -#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h" |
32 | 28 | #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" |
33 | 29 | #include "mlir/Dialect/Func/Extensions/InlinerExtension.h" |
34 | 30 | #include "mlir/Dialect/Func/IR/FuncOps.h" |
|
40 | 36 | #include "mlir/Parser/Parser.h" |
41 | 37 | #include "mlir/Pass/PassManager.h" |
42 | 38 | #include "mlir/Support/FileUtilities.h" |
43 | | -#include "mlir/Transforms/Passes.h" |
44 | 39 | #include "llvm/Support/CommandLine.h" |
45 | 40 | #include "llvm/Support/InitLLVM.h" |
46 | 41 | #include "llvm/Support/SourceMgr.h" |
@@ -281,115 +276,18 @@ struct CLOptions { |
281 | 276 |
|
282 | 277 | static CLOptions opts; |
283 | 278 |
|
284 | | -//===----------------------------------------------------------------------===// |
285 | | -// Pass Pipeline |
286 | | -//===----------------------------------------------------------------------===// |
287 | | - |
288 | | -/// Optimize and simplify the Moore dialect IR. |
289 | | -static void populateMooreTransforms(PassManager &pm) { |
290 | | - { |
291 | | - // Perform an initial cleanup and preprocessing across all |
292 | | - // modules/functions. |
293 | | - auto &anyPM = pm.nestAny(); |
294 | | - anyPM.addPass(mlir::createCSEPass()); |
295 | | - anyPM.addPass(mlir::createCanonicalizerPass()); |
296 | | - } |
297 | | - |
298 | | - // Remove unused symbols. |
299 | | - pm.addPass(mlir::createSymbolDCEPass()); |
300 | | - |
301 | | - { |
302 | | - // Perform module-specific transformations. |
303 | | - auto &modulePM = pm.nest<moore::SVModuleOp>(); |
304 | | - modulePM.addPass(moore::createLowerConcatRefPass()); |
305 | | - // TODO: Enable the following once it not longer interferes with @(...) |
306 | | - // event control checks. The introduced dummy variables make the event |
307 | | - // control observe a static local variable that never changes, instead of |
308 | | - // observing a module-wide signal. |
309 | | - // modulePM.addPass(moore::createSimplifyProceduresPass()); |
310 | | - modulePM.addPass(mlir::createSROA()); |
311 | | - } |
312 | | - |
313 | | - { |
314 | | - // Perform a final cleanup across all modules/functions. |
315 | | - auto &anyPM = pm.nestAny(); |
316 | | - anyPM.addPass(mlir::createMem2Reg()); |
317 | | - anyPM.addPass(mlir::createCSEPass()); |
318 | | - anyPM.addPass(mlir::createCanonicalizerPass()); |
319 | | - } |
320 | | -} |
321 | | - |
322 | | -/// Convert Moore dialect IR into core dialect IR |
323 | | -static void populateMooreToCoreLowering(PassManager &pm) { |
324 | | - // Perform the conversion. |
325 | | - pm.addPass(createConvertMooreToCorePass()); |
326 | | - |
327 | | - { |
328 | | - // Conversion to the core dialects likely uncovers new canonicalization |
329 | | - // opportunities. |
330 | | - auto &anyPM = pm.nestAny(); |
331 | | - anyPM.addPass(mlir::createCSEPass()); |
332 | | - anyPM.addPass(mlir::createCanonicalizerPass()); |
333 | | - } |
334 | | -} |
335 | | - |
336 | | -/// Convert LLHD dialect IR into core dialect IR |
337 | | -static void populateLLHDLowering(PassManager &pm) { |
338 | | - // Inline function calls and lower SCF to CF. |
339 | | - pm.addNestedPass<hw::HWModuleOp>(llhd::createWrapProceduralOpsPass()); |
340 | | - pm.addPass(mlir::createSCFToControlFlowPass()); |
341 | | - pm.addPass(llhd::createInlineCallsPass()); |
342 | | - pm.addPass(mlir::createSymbolDCEPass()); |
343 | | - |
344 | | - // Simplify processes, replace signals with process results, and detect |
345 | | - // registers. |
346 | | - auto &modulePM = pm.nest<hw::HWModuleOp>(); |
347 | | - // See https://github.com/llvm/circt/issues/8804. |
348 | | - // modulePM.addPass(mlir::createSROA()); |
349 | | - modulePM.addPass(llhd::createMem2RegPass()); |
350 | | - modulePM.addPass(llhd::createHoistSignalsPass()); |
351 | | - modulePM.addPass(llhd::createDeseqPass()); |
352 | | - modulePM.addPass(llhd::createLowerProcessesPass()); |
353 | | - modulePM.addPass(mlir::createCSEPass()); |
354 | | - modulePM.addPass(mlir::createCanonicalizerPass()); |
355 | | - |
356 | | - // Unroll loops and remove control flow. |
357 | | - modulePM.addPass(llhd::createUnrollLoopsPass()); |
358 | | - modulePM.addPass(mlir::createCSEPass()); |
359 | | - modulePM.addPass(mlir::createCanonicalizerPass()); |
360 | | - modulePM.addPass(llhd::createRemoveControlFlowPass()); |
361 | | - modulePM.addPass(mlir::createCSEPass()); |
362 | | - modulePM.addPass(mlir::createCanonicalizerPass()); |
363 | | - |
364 | | - // Convert `arith.select` generated by some of the control flow canonicalizers |
365 | | - // to `comb.mux`. |
366 | | - modulePM.addPass(createMapArithToCombPass()); |
367 | | - |
368 | | - // Simplify module-level signals. |
369 | | - modulePM.addPass(llhd::createCombineDrivesPass()); |
370 | | - modulePM.addPass(llhd::createSig2Reg()); |
371 | | - modulePM.addPass(mlir::createCSEPass()); |
372 | | - modulePM.addPass(mlir::createCanonicalizerPass()); |
373 | | - |
374 | | - // Map `seq.firreg` with array type and `hw.array_inject` self-feedback to |
375 | | - // `seq.firmem` ops. |
376 | | - if (opts.detectMemories) { |
377 | | - modulePM.addPass(seq::createRegOfVecToMem()); |
378 | | - modulePM.addPass(mlir::createCSEPass()); |
379 | | - modulePM.addPass(mlir::createCanonicalizerPass()); |
380 | | - } |
381 | | -} |
382 | | - |
383 | 279 | /// Populate the given pass manager with transformations as configured by the |
384 | 280 | /// command line options. |
385 | 281 | static void populatePasses(PassManager &pm) { |
386 | | - populateMooreTransforms(pm); |
| 282 | + populateVerilogToMoorePipeline(pm); |
387 | 283 | if (opts.loweringMode == LoweringMode::OutputIRMoore) |
388 | 284 | return; |
389 | | - populateMooreToCoreLowering(pm); |
| 285 | + mooreToCorePipeline(pm); |
390 | 286 | if (opts.loweringMode == LoweringMode::OutputIRLLHD) |
391 | 287 | return; |
392 | | - populateLLHDLowering(pm); |
| 288 | + LlhdToCorePipelineOptions options; |
| 289 | + options.detectMemories = opts.detectMemories; |
| 290 | + llhdToCorePipeline(pm, options); |
393 | 291 | } |
394 | 292 |
|
395 | 293 | //===----------------------------------------------------------------------===// |
|
0 commit comments