CIRCT 22.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
23#include "mlir/Pass/PassManager.h"
24#include "mlir/Transforms/Passes.h"
25#include "llvm/ADT/SmallVector.h"
26
27using namespace mlir;
28using namespace circt;
29using namespace circt::synth;
30
31//===----------------------------------------------------------------------===//
32// Pipeline Implementation
33//===----------------------------------------------------------------------===//
34
35/// Helper function to populate additional legal ops for partial legalization.
36template <typename... AllowedOpTy>
37static void partiallyLegalizeCombToSynth(SmallVectorImpl<std::string> &ops) {
38 (ops.push_back(AllowedOpTy::getOperationName().str()), ...);
39}
40
42 OpPassManager &pm, const CombLoweringPipelineOptions &options) {
43 {
44 if (!options.disableDatapath) {
45 pm.addPass(createConvertCombToDatapath());
47 circt::ConvertDatapathToCombOptions datapathOptions;
48 datapathOptions.timingAware = options.timingAware;
49 pm.addPass(createConvertDatapathToComb(datapathOptions));
51 }
52 // Partially legalize Comb, then run CSE and canonicalization.
53 circt::ConvertCombToSynthOptions convOptions;
55 comb::MuxOp, comb::ICmpOp, hw::ArrayGetOp,
57 hw::ArrayConcatOp, hw::AggregateConstantOp>(
58 convOptions.additionalLegalOps);
59 pm.addPass(circt::createConvertCombToSynth(convOptions));
60 }
61 pm.addPass(createCSEPass());
63
64 pm.addPass(circt::hw::createHWAggregateToComb());
65 circt::ConvertCombToSynthOptions convOptions;
66 convOptions.targetIR = options.targetIR.getValue() == TargetIR::AIG
67 ? CombToSynthTargetIR::AIG
68 : CombToSynthTargetIR::MIG;
69 pm.addPass(circt::createConvertCombToSynth(convOptions));
70 pm.addPass(createCSEPass());
72 pm.addPass(createCSEPass());
73}
74
76 OpPassManager &pm, const SynthOptimizationPipelineOptions &options) {
77
78 pm.addPass(synth::createLowerVariadic());
79
80 // LowerWordToBits may not be scalable for large designs so conditionally
81 // disable it. It's also worth considering keeping word-level representation
82 // for faster synthesis.
83 if (!options.disableWordToBits)
84 pm.addPass(synth::createLowerWordToBits());
85 pm.addPass(createCSEPass());
86 pm.addPass(createStructuralHash());
88 pm.addPass(createStructuralHash());
89
90 if (!options.abcCommands.empty()) {
91 synth::ABCRunnerOptions abcOptions;
92 abcOptions.abcPath = options.abcPath;
93 abcOptions.abcCommands.assign(options.abcCommands.begin(),
94 options.abcCommands.end());
95 abcOptions.continueOnFailure = options.ignoreAbcFailures;
96 pm.addPass(synth::createABCRunner(abcOptions));
97 }
98 // TODO: Add balancing, rewriting, FRAIG conversion, etc.
99}
100
101//===----------------------------------------------------------------------===//
102// Pipeline Registration
103//===----------------------------------------------------------------------===//
104
106 PassPipelineRegistration<CombLoweringPipelineOptions>(
107 "synth-comb-lowering-pipeline",
108 "The default pipeline for until Comb lowering",
110 PassPipelineRegistration<SynthOptimizationPipelineOptions>(
111 "synth-optimization-pipeline",
112 "The default pipeline for AIG optimization pipeline",
114}
static void partiallyLegalizeCombToSynth(SmallVectorImpl< std::string > &ops)
Helper function to populate additional legal ops for partial legalization.
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
Options for the synth optimization pipeline.
PassOptions::ListOption< std::string > abcCommands
PassOptions::Option< std::string > abcPath