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
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 addOpName(SmallVectorImpl<std::string> &ops) {
40 (ops.push_back(AllowedOpTy::getOperationName().str()), ...);
41}
42template <typename... OpToLowerTy>
43static std::unique_ptr<Pass>
44createLowerVariadicPass(bool timingAware, bool reuseSubsets = false) {
45 LowerVariadicOptions options;
46 addOpName<OpToLowerTy...>(options.opNames);
47 options.timingAware = timingAware;
48 options.reuseSubsets = reuseSubsets;
49 return createLowerVariadic(options);
50}
52 OpPassManager &pm, const CombLoweringPipelineOptions &options) {
53 {
54 if (!options.disableDatapath) {
55 // Lower variadic Mul into a binary op to enable datapath lowering.
56 pm.addPass(createLowerVariadicPass<comb::MulOp>(options.timingAware));
57 pm.addPass(createConvertCombToDatapath());
60 pm.addPass(datapath::createDatapathReduceDelay());
61 circt::ConvertDatapathToCombOptions datapathOptions;
62 datapathOptions.timingAware = options.timingAware;
63 pm.addPass(createConvertDatapathToComb(datapathOptions));
64 }
65 pm.addPass(createCSEPass());
67 // Partially legalize Comb, then run CSE and canonicalization.
68 circt::ConvertCombToSynthOptions convOptions;
71 hw::ArrayConcatOp, hw::AggregateConstantOp>(
72 convOptions.additionalLegalOps);
73 pm.addPass(circt::createConvertCombToSynth(convOptions));
74 }
75 pm.addPass(createCSEPass());
77 // Balance mux chains. For area oriented flow, we want to keep the mux chains
78 // unless they are very deep.
79 comb::BalanceMuxOptions balanceOptions{OptimizationStrategyTiming ? 16 : 64};
80 pm.addPass(comb::createBalanceMux(balanceOptions));
81
82 // Lower variadic ops before running full lowering to target IR.
83 if (options.targetIR.getValue() == TargetIR::AIG) {
84 // For AIG, lower variadic XoR since AIG cannot keep variadic
85 // representation.
86 pm.addPass(createLowerVariadicPass<comb::XorOp>(
87 options.timingAware,
89 } else if (options.targetIR.getValue() == TargetIR::MIG) {
90 // For MIG, lower variadic And, Or, and Xor since MIG cannot keep variadic
91 // representation.
92 pm.addPass(createLowerVariadicPass<comb::AndOp, comb::OrOp, comb::XorOp>(
93 options.timingAware));
94 }
95
96 pm.addPass(circt::hw::createHWAggregateToComb());
97 circt::ConvertCombToSynthOptions convOptions;
98 convOptions.targetIR = options.targetIR.getValue() == TargetIR::AIG
99 ? CombToSynthTargetIR::AIG
100 : CombToSynthTargetIR::MIG;
101 pm.addPass(circt::createConvertCombToSynth(convOptions));
102 pm.addPass(createCSEPass());
103 pm.addPass(createSimpleCanonicalizerPass());
104 pm.addPass(createCSEPass());
105}
106
108 OpPassManager &pm, const SynthOptimizationPipelineOptions &options) {
109 // LowerWordToBits may not be scalable for large designs so conditionally
110 // disable it. It's also worth considering keeping word-level representation
111 // for faster synthesis.
112 if (!options.disableWordToBits)
113 pm.addPass(synth::createLowerWordToBits());
114 pm.addPass(createCSEPass());
115 // Run after LowerWordToBits for more precise timing-info & scalability.
116 pm.addPass(createLowerVariadicPass(options.timingAware));
117 pm.addPass(createStructuralHash());
118 pm.addPass(createSimpleCanonicalizerPass());
119 pm.addPass(synth::createMaximumAndCover());
120 pm.addPass(createLowerVariadicPass(options.timingAware));
121 pm.addPass(createStructuralHash());
122
123 // SOP balancing.
124 if (!options.disableSOPBalancing) {
125 SOPBalancingOptions sopOptions;
126 // FIXME: The following is very small compared to the default value of ABC
127 // (6/8) and mockturtle(4/25) due to inefficient implementation of
128 // CutRewriter.
129 sopOptions.maxCutInputSize = 4;
130 sopOptions.maxCutsPerRoot = 4;
131 pm.addPass(synth::createSOPBalancing(sopOptions));
132 pm.addPass(createStructuralHash());
133 }
134
135 if (!options.abcCommands.empty()) {
136 synth::ABCRunnerOptions abcOptions;
137 abcOptions.abcPath = options.abcPath;
138 abcOptions.abcCommands.assign(options.abcCommands.begin(),
139 options.abcCommands.end());
140 abcOptions.continueOnFailure = options.ignoreAbcFailures;
141 pm.addPass(synth::createABCRunner(abcOptions));
142 }
143 // TODO: Add balancing, rewriting, FRAIG conversion, etc.
144}
145
146//===----------------------------------------------------------------------===//
147// Pipeline Registration
148//===----------------------------------------------------------------------===//
149
151 PassPipelineRegistration<CombLoweringPipelineOptions>(
152 "synth-comb-lowering-pipeline",
153 "The default pipeline for until Comb lowering",
155 PassPipelineRegistration<SynthOptimizationPipelineOptions>(
156 "synth-optimization-pipeline",
157 "The default pipeline for AIG optimization pipeline",
159}
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.
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