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