CIRCT 22.0.0git
Loading...
Searching...
No Matches
SynthesisPipeline.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the default synthesis pipeline from core dialect to AIG.
10//
11//===----------------------------------------------------------------------===//
12
25#include "mlir/Pass/PassManager.h"
26#include "mlir/Transforms/Passes.h"
27#include "llvm/ADT/SmallVector.h"
28
29using namespace mlir;
30using namespace circt;
31using namespace circt::synth;
32
33//===----------------------------------------------------------------------===//
34// Pipeline Implementation
35//===----------------------------------------------------------------------===//
36
37/// Helper function to populate additional legal ops for partial legalization.
38template <typename... AllowedOpTy>
39static void partiallyLegalizeCombToSynth(SmallVectorImpl<std::string> &ops) {
40 (ops.push_back(AllowedOpTy::getOperationName().str()), ...);
41}
42
44 OpPassManager &pm, const CombLoweringPipelineOptions &options) {
45 {
46 if (!options.disableDatapath) {
47 pm.addPass(createConvertCombToDatapath());
50 pm.addPass(datapath::createDatapathReduceDelay());
51 circt::ConvertDatapathToCombOptions datapathOptions;
52 datapathOptions.timingAware = options.timingAware;
53 pm.addPass(createConvertDatapathToComb(datapathOptions));
55 }
56 // Partially legalize Comb, then run CSE and canonicalization.
57 circt::ConvertCombToSynthOptions convOptions;
59 comb::MuxOp, comb::ICmpOp, hw::ArrayGetOp,
61 hw::ArrayConcatOp, hw::AggregateConstantOp>(
62 convOptions.additionalLegalOps);
63 pm.addPass(circt::createConvertCombToSynth(convOptions));
64 }
65 pm.addPass(createCSEPass());
67 // Balance mux chains. For area oriented flow, we want to keep the mux chains
68 // unless they are very deep.
69 comb::BalanceMuxOptions balanceOptions{OptimizationStrategyTiming ? 16 : 64};
70 pm.addPass(comb::createBalanceMux(balanceOptions));
71
72 pm.addPass(circt::hw::createHWAggregateToComb());
73 circt::ConvertCombToSynthOptions convOptions;
74 convOptions.targetIR = options.targetIR.getValue() == TargetIR::AIG
75 ? CombToSynthTargetIR::AIG
76 : CombToSynthTargetIR::MIG;
77 pm.addPass(circt::createConvertCombToSynth(convOptions));
78 pm.addPass(createCSEPass());
80 pm.addPass(createCSEPass());
81}
82
84 OpPassManager &pm, const SynthOptimizationPipelineOptions &options) {
85
86 pm.addPass(synth::createLowerVariadic());
87
88 // LowerWordToBits may not be scalable for large designs so conditionally
89 // disable it. It's also worth considering keeping word-level representation
90 // for faster synthesis.
91 if (!options.disableWordToBits)
92 pm.addPass(synth::createLowerWordToBits());
93 pm.addPass(createCSEPass());
94 pm.addPass(createStructuralHash());
96 pm.addPass(createStructuralHash());
97
98 if (!options.abcCommands.empty()) {
99 synth::ABCRunnerOptions abcOptions;
100 abcOptions.abcPath = options.abcPath;
101 abcOptions.abcCommands.assign(options.abcCommands.begin(),
102 options.abcCommands.end());
103 abcOptions.continueOnFailure = options.ignoreAbcFailures;
104 pm.addPass(synth::createABCRunner(abcOptions));
105 }
106 // TODO: Add balancing, rewriting, FRAIG conversion, etc.
107}
108
109//===----------------------------------------------------------------------===//
110// Pipeline Registration
111//===----------------------------------------------------------------------===//
112
114 PassPipelineRegistration<CombLoweringPipelineOptions>(
115 "synth-comb-lowering-pipeline",
116 "The default pipeline for until Comb lowering",
118 PassPipelineRegistration<SynthOptimizationPipelineOptions>(
119 "synth-optimization-pipeline",
120 "The default pipeline for AIG optimization pipeline",
122}
static void partiallyLegalizeCombToSynth(SmallVectorImpl< std::string > &ops)
Helper function to populate additional legal ops for partial legalization.
@ OptimizationStrategyTiming
Optimize for minimal critical path delay.
Definition SynthPasses.h:26
void buildSynthOptimizationPipeline(mlir::OpPassManager &pm, const SynthOptimizationPipelineOptions &options)
void buildCombLoweringPipeline(mlir::OpPassManager &pm, const CombLoweringPipelineOptions &options)
Populate the synthesis pipelines.
void registerSynthesisPipeline()
Register the synthesis pipelines.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
std::unique_ptr< Pass > createSimpleCanonicalizerPass()
Create a simple canonicalizer pass.
Definition Passes.cpp:15
Options for the aig lowering pipeline.
PassOptions::Option< TargetIR > targetIR
PassOptions::Option< bool > disableDatapath
PassOptions::Option< OptimizationStrategy > synthesisStrategy
Options for the synth optimization pipeline.
PassOptions::ListOption< std::string > abcCommands
PassOptions::Option< std::string > abcPath