CIRCT 24.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
26#include "mlir/Pass/PassManager.h"
27#include "mlir/Transforms/Passes.h"
28#include "llvm/ADT/SmallVector.h"
29
30using namespace mlir;
31using namespace circt;
32using namespace circt::synth;
33
34//===----------------------------------------------------------------------===//
35// Pipeline Implementation
36//===----------------------------------------------------------------------===//
37
38/// Helper function to populate additional legal ops for partial legalization.
39template <typename... AllowedOpTy>
40static void addOpName(SmallVectorImpl<std::string> &ops) {
41 (ops.push_back(AllowedOpTy::getOperationName().str()), ...);
42}
43template <typename... OpToLowerTy>
44static std::unique_ptr<Pass>
45createLowerVariadicPass(bool timingAware, bool reuseSubsets = false) {
46 LowerVariadicOptions options;
47 addOpName<OpToLowerTy...>(options.opNames);
48 options.timingAware = timingAware;
49 options.reuseSubsets = reuseSubsets;
50 return createLowerVariadic(options);
51}
53 OpPassManager &pm, const CombLoweringPipelineOptions &options) {
54 {
55 if (!options.disableDatapath) {
56 // Lower variadic Mul into a binary op to enable datapath lowering.
57 pm.addPass(createLowerVariadicPass<comb::MulOp>(options.timingAware));
58 pm.addPass(createConvertCombToDatapath());
60 pm.addPass(createCSEPass());
62 pm.addPass(datapath::createDatapathReduceDelay());
63 circt::ConvertDatapathToCombOptions datapathOptions;
64 datapathOptions.timingAware = options.timingAware;
65 datapathOptions.lowerCompress = false;
66 // Incrementally lower - first lower partial product operations
67 pm.addPass(createConvertDatapathToComb(datapathOptions));
69 datapathOptions.lowerCompress = true;
70 // Then lower compress operations after canononicalization to reduce the
71 // number of compress operations.
72 pm.addPass(createConvertDatapathToComb(datapathOptions));
73 }
74 pm.addPass(createCSEPass());
76 // Partially legalize Comb, then run CSE and canonicalization.
77 circt::ConvertCombToSynthOptions convOptions;
80 hw::ArrayConcatOp, hw::AggregateConstantOp>(
81 convOptions.additionalLegalOps);
82 pm.addPass(circt::createConvertCombToSynth(convOptions));
83 }
84 pm.addPass(createCSEPass());
86 // Balance mux chains. For area oriented flow, we want to keep the mux chains
87 // unless they are very deep.
88 comb::BalanceMuxOptions balanceOptions{OptimizationStrategyTiming ? 16 : 64};
89 pm.addPass(comb::createBalanceMux(balanceOptions));
90
91 // Lower variadic ops before running full lowering to target IR.
92 // For AIG, lower variadic XoR since AIG cannot keep variadic
93 // representation.
94 pm.addPass(createLowerVariadicPass<comb::XorOp>(
95 options.timingAware,
97
98 pm.addPass(circt::hw::createHWAggregateToComb());
99 pm.addPass(circt::createConvertCombToSynth());
100 pm.addPass(createCSEPass());
101 pm.addPass(createSimpleCanonicalizerPass());
102 pm.addPass(createCSEPass());
103}
104
106 OpPassManager &pm, const SynthOptimizationPipelineOptions &options) {
107 // LowerWordToBits may not be scalable for large designs so conditionally
108 // disable it. It's also worth considering keeping word-level representation
109 // for faster synthesis.
110 if (!options.disableWordToBits)
111 pm.addPass(synth::createLowerWordToBits());
112 pm.addPass(createCSEPass());
113 // Run after LowerWordToBits for more precise timing-info & scalability.
114 pm.addPass(createLowerVariadicPass(options.timingAware));
115 pm.addPass(createStructuralHash());
116 pm.addPass(createSimpleCanonicalizerPass());
117 pm.addPass(synth::createMaximumAndCover());
118 pm.addPass(createLowerVariadicPass(options.timingAware));
119 pm.addPass(createStructuralHash());
120
121 // SOP balancing.
122 if (!options.disableSOPBalancing) {
123 SOPBalancingOptions sopOptions;
124 // FIXME: The following is very small compared to the default value of ABC
125 // (6/8) and mockturtle(4/25) due to inefficient implementation of
126 // CutRewriter.
127 sopOptions.maxCutInputSize = 4;
128 sopOptions.maxCutsPerRoot = 4;
129 pm.addPass(synth::createSOPBalancing(sopOptions));
130 pm.addPass(createStructuralHash());
131 }
132
134 FunctionalReductionOptions functionalReductionOptions;
135 functionalReductionOptions.conflictLimit =
137 pm.addPass(createFunctionalReduction(functionalReductionOptions));
138 }
139
140 if (!options.abcCommands.empty()) {
141 synth::ABCRunnerOptions abcOptions;
142 abcOptions.abcPath = options.abcPath;
143 abcOptions.abcCommands.assign(options.abcCommands.begin(),
144 options.abcCommands.end());
145 abcOptions.continueOnFailure = options.ignoreAbcFailures;
146 pm.addPass(synth::createABCRunner(abcOptions));
147 }
148 // TODO: Add more balancing and rewriting passes.
149}
150
151//===----------------------------------------------------------------------===//
152// Pipeline Registration
153//===----------------------------------------------------------------------===//
154
156 PassPipelineRegistration<CombLoweringPipelineOptions>(
157 "synth-comb-lowering-pipeline",
158 "The default pipeline for until Comb lowering",
160 PassPipelineRegistration<SynthOptimizationPipelineOptions>(
161 "synth-optimization-pipeline",
162 "The default pipeline for AIG optimization pipeline",
164}
static std::unique_ptr< Pass > createLowerVariadicPass(bool timingAware, bool reuseSubsets=false)
static void addOpName(SmallVectorImpl< std::string > &ops)
Helper function to populate additional legal ops for partial legalization.
@ OptimizationStrategyArea
Optimize for minimal area.
Definition SynthPasses.h:25
@ 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.
bool hasIncrementalSATSolverBackend()
Return true when at least one incremental SAT backend is available.
std::unique_ptr< Pass > createSimpleCanonicalizerPass()
Create a simple canonicalizer pass.
Definition Passes.cpp:15
Options for the aig lowering pipeline.
PassOptions::Option< bool > disableDatapath
PassOptions::Option< OptimizationStrategy > synthesisStrategy
Options for the synth optimization pipeline.
PassOptions::ListOption< std::string > abcCommands
PassOptions::Option< std::string > abcPath
PassOptions::Option< bool > disableFunctionalReduction
PassOptions::Option< int64_t > functionalReductionConflictLimit