CIRCT 23.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());
61 pm.addPass(datapath::createDatapathReduceDelay());
62 circt::ConvertDatapathToCombOptions datapathOptions;
63 datapathOptions.timingAware = options.timingAware;
64 datapathOptions.lowerCompress = false;
65 // Incrementally lower - first lower partial product operations
66 pm.addPass(createConvertDatapathToComb(datapathOptions));
68 datapathOptions.lowerCompress = true;
69 // Then lower compress operations after canononicalization to reduce the
70 // number of compress operations.
71 pm.addPass(createConvertDatapathToComb(datapathOptions));
72 }
73 pm.addPass(createCSEPass());
75 // Partially legalize Comb, then run CSE and canonicalization.
76 circt::ConvertCombToSynthOptions convOptions;
79 hw::ArrayConcatOp, hw::AggregateConstantOp>(
80 convOptions.additionalLegalOps);
81 pm.addPass(circt::createConvertCombToSynth(convOptions));
82 }
83 pm.addPass(createCSEPass());
85 // Balance mux chains. For area oriented flow, we want to keep the mux chains
86 // unless they are very deep.
87 comb::BalanceMuxOptions balanceOptions{OptimizationStrategyTiming ? 16 : 64};
88 pm.addPass(comb::createBalanceMux(balanceOptions));
89
90 // Lower variadic ops before running full lowering to target IR.
91 // For AIG, lower variadic XoR since AIG cannot keep variadic
92 // representation.
93 pm.addPass(createLowerVariadicPass<comb::XorOp>(
94 options.timingAware,
96
97 pm.addPass(circt::hw::createHWAggregateToComb());
98 pm.addPass(circt::createConvertCombToSynth());
99 pm.addPass(createCSEPass());
100 pm.addPass(createSimpleCanonicalizerPass());
101 pm.addPass(createCSEPass());
102}
103
105 OpPassManager &pm, const SynthOptimizationPipelineOptions &options) {
106 // LowerWordToBits may not be scalable for large designs so conditionally
107 // disable it. It's also worth considering keeping word-level representation
108 // for faster synthesis.
109 if (!options.disableWordToBits)
110 pm.addPass(synth::createLowerWordToBits());
111 pm.addPass(createCSEPass());
112 // Run after LowerWordToBits for more precise timing-info & scalability.
113 pm.addPass(createLowerVariadicPass(options.timingAware));
114 pm.addPass(createStructuralHash());
115 pm.addPass(createSimpleCanonicalizerPass());
116 pm.addPass(synth::createMaximumAndCover());
117 pm.addPass(createLowerVariadicPass(options.timingAware));
118 pm.addPass(createStructuralHash());
119
120 // SOP balancing.
121 if (!options.disableSOPBalancing) {
122 SOPBalancingOptions sopOptions;
123 // FIXME: The following is very small compared to the default value of ABC
124 // (6/8) and mockturtle(4/25) due to inefficient implementation of
125 // CutRewriter.
126 sopOptions.maxCutInputSize = 4;
127 sopOptions.maxCutsPerRoot = 4;
128 pm.addPass(synth::createSOPBalancing(sopOptions));
129 pm.addPass(createStructuralHash());
130 }
131
133 FunctionalReductionOptions functionalReductionOptions;
134 functionalReductionOptions.conflictLimit =
136 pm.addPass(createFunctionalReduction(functionalReductionOptions));
137 }
138
139 if (!options.abcCommands.empty()) {
140 synth::ABCRunnerOptions abcOptions;
141 abcOptions.abcPath = options.abcPath;
142 abcOptions.abcCommands.assign(options.abcCommands.begin(),
143 options.abcCommands.end());
144 abcOptions.continueOnFailure = options.ignoreAbcFailures;
145 pm.addPass(synth::createABCRunner(abcOptions));
146 }
147 // TODO: Add more balancing and rewriting passes.
148}
149
150//===----------------------------------------------------------------------===//
151// Pipeline Registration
152//===----------------------------------------------------------------------===//
153
155 PassPipelineRegistration<CombLoweringPipelineOptions>(
156 "synth-comb-lowering-pipeline",
157 "The default pipeline for until Comb lowering",
159 PassPipelineRegistration<SynthOptimizationPipelineOptions>(
160 "synth-optimization-pipeline",
161 "The default pipeline for AIG optimization pipeline",
163}
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