25#include "mlir/Pass/PassManager.h"
26#include "mlir/Transforms/Passes.h"
27#include "llvm/ADT/SmallVector.h"
38template <
typename... AllowedOpTy>
39static void addOpName(SmallVectorImpl<std::string> &ops) {
40 (ops.push_back(AllowedOpTy::getOperationName().str()), ...);
42template <
typename... OpToLowerTy>
43static std::unique_ptr<Pass>
45 LowerVariadicOptions options;
46 addOpName<OpToLowerTy...>(options.opNames);
47 options.timingAware = timingAware;
48 options.reuseSubsets = reuseSubsets;
49 return createLowerVariadic(options);
56 pm.addPass(createLowerVariadicPass<comb::MulOp>(options.
timingAware));
57 pm.addPass(createConvertCombToDatapath());
60 pm.addPass(datapath::createDatapathReduceDelay());
61 circt::ConvertDatapathToCombOptions datapathOptions;
63 pm.addPass(createConvertDatapathToComb(datapathOptions));
65 pm.addPass(createCSEPass());
68 circt::ConvertCombToSynthOptions convOptions;
72 convOptions.additionalLegalOps);
73 pm.addPass(circt::createConvertCombToSynth(convOptions));
75 pm.addPass(createCSEPass());
80 pm.addPass(comb::createBalanceMux(balanceOptions));
83 if (options.
targetIR.getValue() == TargetIR::AIG) {
86 pm.addPass(createLowerVariadicPass<comb::XorOp>(
89 }
else if (options.
targetIR.getValue() == TargetIR::MIG) {
92 pm.addPass(createLowerVariadicPass<comb::AndOp, comb::OrOp, comb::XorOp>(
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());
104 pm.addPass(createCSEPass());
113 pm.addPass(synth::createLowerWordToBits());
114 pm.addPass(createCSEPass());
117 pm.addPass(createStructuralHash());
119 pm.addPass(synth::createMaximumAndCover());
121 pm.addPass(createStructuralHash());
125 SOPBalancingOptions sopOptions;
129 sopOptions.maxCutInputSize = 4;
130 sopOptions.maxCutsPerRoot = 4;
131 pm.addPass(synth::createSOPBalancing(sopOptions));
132 pm.addPass(createStructuralHash());
136 synth::ABCRunnerOptions abcOptions;
137 abcOptions.abcPath = options.
abcPath;
138 abcOptions.abcCommands.assign(options.
abcCommands.begin(),
141 pm.addPass(synth::createABCRunner(abcOptions));
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",
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.
@ OptimizationStrategyTiming
Optimize for minimal critical path delay.
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.
Options for the aig lowering pipeline.
PassOptions::Option< TargetIR > targetIR
PassOptions::Option< bool > disableDatapath
PassOptions::Option< bool > timingAware
PassOptions::Option< OptimizationStrategy > synthesisStrategy
Options for the synth optimization pipeline.
PassOptions::Option< bool > timingAware
PassOptions::Option< bool > disableWordToBits
PassOptions::ListOption< std::string > abcCommands
PassOptions::Option< std::string > abcPath
PassOptions::Option< bool > disableSOPBalancing
PassOptions::Option< bool > ignoreAbcFailures