CIRCT  18.0.0git
Firtool.cpp
Go to the documentation of this file.
1 //===- Firtool.cpp - Definitions for the firtool pipeline setup -*- C++ -*-===//
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 
17 #include "circt/Support/Passes.h"
19 #include "mlir/Transforms/Passes.h"
20 #include "llvm/Support/FileSystem.h"
21 #include "llvm/Support/Path.h"
22 
23 using namespace llvm;
24 using namespace circt;
25 
26 LogicalResult firtool::populatePreprocessTransforms(mlir::PassManager &pm,
27  const FirtoolOptions &opt) {
28  // Legalize away "open" aggregates to hw-only versions.
29  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerOpenAggsPass());
30 
31  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createResolvePathsPass());
32 
33  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerFIRRTLAnnotationsPass(
36 
37  return success();
38 }
39 
40 LogicalResult firtool::populateCHIRRTLToLowFIRRTL(mlir::PassManager &pm,
41  const FirtoolOptions &opt,
42  ModuleOp module,
43  StringRef inputFilename) {
44  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerIntrinsicsPass());
45 
46  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createInjectDUTHierarchyPass());
47 
48  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
50 
51  if (!opt.disableOptimization)
52  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
53  mlir::createCSEPass());
54 
55  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
57 
58  // Run LowerMatches before InferWidths, as the latter does not support the
59  // match statement, but it does support what they lower to.
60  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
62 
63  // Width inference creates canonicalization opportunities.
64  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createInferWidthsPass());
65 
66  pm.nest<firrtl::CircuitOp>().addPass(
68 
69  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createInferResetsPass());
70 
71  if (opt.exportChiselInterface) {
72  if (opt.chiselInterfaceOutDirectory.empty()) {
73  pm.nest<firrtl::CircuitOp>().addPass(createExportChiselInterfacePass());
74  } else {
75  pm.nest<firrtl::CircuitOp>().addPass(createExportSplitChiselInterfacePass(
77  }
78  }
79 
80  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createDropConstPass());
81 
82  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createHoistPassthroughPass(
83  /*hoistHWDrivers=*/!opt.disableOptimization &&
85 
86  if (opt.dedup)
87  emitWarning(UnknownLoc::get(pm.getContext()),
88  "option -dedup is deprecated since firtool 1.57.0, has no "
89  "effect (deduplication is always enabled), and will be removed "
90  "in firtool 1.58.0");
91 
92  if (!opt.noDedup)
93  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createDedupPass());
94 
95  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createWireDFTPass());
96 
97  if (opt.vbToBV) {
98  pm.addNestedPass<firrtl::CircuitOp>(firrtl::createLowerFIRRTLTypesPass(
100  pm.addNestedPass<firrtl::CircuitOp>(firrtl::createVBToBVPass());
101  }
102 
103  if (!opt.lowerMemories)
104  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
106 
107  // The input mlir file could be firrtl dialect so we might need to clean
108  // things up.
109  pm.addNestedPass<firrtl::CircuitOp>(firrtl::createLowerFIRRTLTypesPass(
110  opt.preserveAggregate, firrtl::PreserveAggregate::None));
111  // Only enable expand whens if lower types is also enabled.
112  auto &modulePM = pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>();
113  modulePM.addPass(firrtl::createExpandWhensPass());
114  modulePM.addPass(firrtl::createSFCCompatPass());
115 
116  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerGroupsPass());
117 
118  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createInlinerPass());
119 
120  // Preset the random initialization parameters for each module. The current
121  // implementation assumes it can run at a time where every register is
122  // currently in the final module it will be emitted in, all registers have
123  // been created, and no registers have yet been removed.
124  if (opt.isRandomEnabled(FirtoolOptions::RandomKind::Reg))
125  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
127 
128  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createCheckCombLoopsPass());
129 
130  // If we parsed a FIRRTL file and have optimizations enabled, clean it up.
131  if (!opt.disableOptimization)
132  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
134 
135  // Run the infer-rw pass, which merges read and write ports of a memory with
136  // mutually exclusive enables.
137  if (!opt.disableOptimization)
138  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
140 
141  if (opt.replSeqMem)
142  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerMemoryPass());
143 
144  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createPrefixModulesPass());
145 
146  if (!opt.disableOptimization) {
147  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createIMConstPropPass());
148 
149  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createHoistPassthroughPass(
150  /*hoistHWDrivers=*/!opt.disableOptimization &&
152  // Cleanup after hoisting passthroughs, for separation-of-concerns.
153  pm.addPass(firrtl::createIMDeadCodeElimPass());
154  }
155 
156  pm.addNestedPass<firrtl::CircuitOp>(firrtl::createAddSeqMemPortsPass());
157 
159  opt.replSeqMemFile));
160 
161  pm.addNestedPass<firrtl::CircuitOp>(firrtl::createExtractInstancesPass());
162 
163  // Run passes to resolve Grand Central features. This should run before
164  // BlackBoxReader because Grand Central needs to inform BlackBoxReader where
165  // certain black boxes should be placed. Note: all Grand Central Taps related
166  // collateral is resolved entirely by LowerAnnotations.
167  pm.addNestedPass<firrtl::CircuitOp>(
169 
170  // Read black box source files into the IR.
171  StringRef blackBoxRoot = opt.blackBoxRootPath.empty()
172  ? llvm::sys::path::parent_path(inputFilename)
173  : opt.blackBoxRootPath;
174  pm.nest<firrtl::CircuitOp>().addPass(
175  firrtl::createBlackBoxReaderPass(blackBoxRoot));
176 
177  // Run SymbolDCE as late as possible, but before InnerSymbolDCE. This is for
178  // hierpathop's and just for general cleanup.
179  pm.addNestedPass<firrtl::CircuitOp>(mlir::createSymbolDCEPass());
180 
181  // Run InnerSymbolDCE as late as possible, but before IMDCE.
182  pm.addPass(firrtl::createInnerSymbolDCEPass());
183 
184  // The above passes, IMConstProp in particular, introduce additional
185  // canonicalization opportunities that we should pick up here before we
186  // proceed to output-specific pipelines.
187  if (!opt.disableOptimization) {
188  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
190  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
192  pm.addPass(firrtl::createIMDeadCodeElimPass());
193  }
194 
195  if (opt.emitOMIR)
196  pm.nest<firrtl::CircuitOp>().addPass(
198 
199  // Always run this, required for legalization.
200  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
202  !opt.disableAggressiveMergeConnections.getValue()));
203 
204  if (!opt.disableOptimization)
205  pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
207 
208  return success();
209 }
210 
211 LogicalResult firtool::populateLowFIRRTLToHW(mlir::PassManager &pm,
212  const FirtoolOptions &opt) {
213  // Remove TraceAnnotations and write their updated paths to an output
214  // annotation file.
215  if (opt.outputAnnotationFilename.empty())
216  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createResolveTracesPass());
217  else
218  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createResolveTracesPass(
219  opt.outputAnnotationFilename.getValue()));
220 
221  // Lower the ref.resolve and ref.send ops and remove the RefType ports.
222  // LowerToHW cannot handle RefType so, this pass must be run to remove all
223  // RefType ports and ops.
224  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerXMRPass());
225 
226  pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerClassesPass());
227 
228  pm.addPass(createLowerFIRRTLToHWPass(
229  opt.enableAnnotationWarning.getValue(),
230  opt.emitChiselAssertsAsSVA.getValue(),
231  !opt.isRandomEnabled(FirtoolOptions::RandomKind::Mem),
232  !opt.isRandomEnabled(FirtoolOptions::RandomKind::Reg)));
233 
234  if (!opt.disableOptimization) {
235  auto &modulePM = pm.nest<hw::HWModuleOp>();
236  modulePM.addPass(mlir::createCSEPass());
237  modulePM.addPass(createSimpleCanonicalizerPass());
238  }
239 
240  // Check inner symbols and inner refs.
242 
243  return success();
244 }
245 
246 LogicalResult firtool::populateHWToSV(mlir::PassManager &pm,
247  const FirtoolOptions &opt) {
248  if (opt.extractTestCode)
252 
255  {/*disableRandomization=*/!opt.isRandomEnabled(
256  FirtoolOptions::RandomKind::Reg),
257  /*emitSeparateAlwaysBlocks=*/
259  pm.addNestedPass<hw::HWModuleOp>(createLowerVerifToSVPass());
260  pm.addPass(sv::createHWMemSimImplPass(
262  !opt.isRandomEnabled(FirtoolOptions::RandomKind::Mem),
263  !opt.isRandomEnabled(FirtoolOptions::RandomKind::Reg),
265 
266  // If enabled, run the optimizer.
267  if (!opt.disableOptimization) {
268  auto &modulePM = pm.nest<hw::HWModuleOp>();
269  modulePM.addPass(mlir::createCSEPass());
270  modulePM.addPass(createSimpleCanonicalizerPass());
271  modulePM.addPass(mlir::createCSEPass());
272  modulePM.addPass(sv::createHWCleanupPass(
273  /*mergeAlwaysBlocks=*/!opt.emitSeparateAlwaysBlocks));
274  }
275 
276  // Check inner symbols and inner refs.
278 
279  return success();
280 }
281 
282 namespace detail {
283 LogicalResult
284 populatePrepareForExportVerilog(mlir::PassManager &pm,
285  const firtool::FirtoolOptions &opt) {
286 
287  // Legalize unsupported operations within the modules.
288  pm.nest<hw::HWModuleOp>().addPass(sv::createHWLegalizeModulesPass());
289 
290  // Tidy up the IR to improve verilog emission quality.
291  if (!opt.disableOptimization)
292  pm.nest<hw::HWModuleOp>().addPass(sv::createPrettifyVerilogPass());
293 
294  if (opt.stripFirDebugInfo)
295  pm.addPass(circt::createStripDebugInfoWithPredPass([](mlir::Location loc) {
296  if (auto fileLoc = loc.dyn_cast<FileLineColLoc>())
297  return fileLoc.getFilename().getValue().endswith(".fir");
298  return false;
299  }));
300 
301  if (opt.stripDebugInfo)
303  [](mlir::Location loc) { return true; }));
304 
305  // Emit module and testbench hierarchy JSON files.
306  if (opt.exportModuleHierarchy)
308 
309  // Check inner symbols and inner refs.
311 
312  return success();
313 }
314 } // namespace detail
315 
316 LogicalResult firtool::populateExportVerilog(mlir::PassManager &pm,
317  const FirtoolOptions &opt,
318  llvm::raw_ostream &os) {
319  if (failed(::detail::populatePrepareForExportVerilog(pm, opt)))
320  return failure();
321 
322  pm.addPass(createExportVerilogPass(os));
323  return success();
324 }
325 
326 LogicalResult firtool::populateExportSplitVerilog(mlir::PassManager &pm,
327  const FirtoolOptions &opt,
328  llvm::StringRef directory) {
329  if (failed(::detail::populatePrepareForExportVerilog(pm, opt)))
330  return failure();
331 
332  pm.addPass(createExportSplitVerilogPass(directory));
333  return success();
334 }
335 
336 LogicalResult firtool::populateFinalizeIR(mlir::PassManager &pm,
337  const FirtoolOptions &opt) {
338  pm.addPass(firrtl::createFinalizeIRPass());
339  pm.addPass(om::createFreezePathsPass());
340 
341  return success();
342 }
static std::unique_ptr< Pass > createSimpleCanonicalizerPass()
std::unique_ptr< mlir::Pass > createDedupPass()
Definition: Dedup.cpp:738
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
Definition: CalyxOps.cpp:53
@ All
Preserve all aggregate values.
Definition: Passes.h:51
std::unique_ptr< mlir::Pass > createInferReadWritePass()
std::unique_ptr< mlir::Pass > createCheckCombLoopsPass()
std::unique_ptr< mlir::Pass > createFinalizeIRPass()
Definition: FinalizeIR.cpp:38
std::unique_ptr< mlir::Pass > createLowerFIRRTLTypesPass(PreserveAggregate::PreserveMode mode=PreserveAggregate::None, PreserveAggregate::PreserveMode memoryMode=PreserveAggregate::None)
This is the pass constructor.
std::unique_ptr< mlir::Pass > createResolveTracesPass(mlir::StringRef outputAnnotationFilename="")
std::unique_ptr< mlir::Pass > createEmitOMIRPass(mlir::StringRef outputFilename="")
std::unique_ptr< mlir::Pass > createResolvePathsPass()
std::unique_ptr< mlir::Pass > createVBToBVPass()
Definition: VBToBV.cpp:986
std::unique_ptr< mlir::Pass > createIMConstPropPass()
std::unique_ptr< mlir::Pass > createBlackBoxReaderPass(std::optional< mlir::StringRef > inputPrefix={})
std::unique_ptr< mlir::Pass > createCreateSiFiveMetadataPass(bool replSeqMem=false, mlir::StringRef replSeqMemFile="")
std::unique_ptr< mlir::Pass > createInlinerPass()
std::unique_ptr< mlir::Pass > createVectorizationPass()
std::unique_ptr< mlir::Pass > createLowerMemoryPass()
std::unique_ptr< mlir::Pass > createDropNamesPass(PreserveValues::PreserveMode mode=PreserveValues::None)
Definition: DropName.cpp:87
std::unique_ptr< mlir::Pass > createIMDeadCodeElimPass()
std::unique_ptr< mlir::Pass > createExtractInstancesPass()
std::unique_ptr< mlir::Pass > createHoistPassthroughPass(bool hoistHWDrivers=true)
This is the pass constructor.
std::unique_ptr< mlir::Pass > createLowerCHIRRTLPass()
std::unique_ptr< mlir::Pass > createInnerSymbolDCEPass()
std::unique_ptr< mlir::Pass > createExpandWhensPass()
std::unique_ptr< mlir::Pass > createLowerXMRPass()
Definition: LowerXMR.cpp:843
std::unique_ptr< mlir::Pass > createLowerIntrinsicsPass()
This is the pass constructor.
std::unique_ptr< mlir::Pass > createInferWidthsPass()
std::unique_ptr< mlir::Pass > createMemToRegOfVecPass(bool replSeqMem=false, bool ignoreReadEnable=false)
std::unique_ptr< mlir::Pass > createLowerOpenAggsPass()
This is the pass constructor.
std::unique_ptr< mlir::Pass > createLowerGroupsPass()
std::unique_ptr< mlir::Pass > createGrandCentralPass(bool instantiateCompanionOnly=false)
std::unique_ptr< mlir::Pass > createDropConstPass()
Definition: DropConst.cpp:95
std::unique_ptr< mlir::Pass > createSFCCompatPass()
Definition: SFCCompat.cpp:141
std::unique_ptr< mlir::Pass > createWireDFTPass()
Definition: WireDFT.cpp:499
std::unique_ptr< mlir::Pass > createPrefixModulesPass()
std::unique_ptr< mlir::Pass > createInjectDUTHierarchyPass()
std::unique_ptr< mlir::Pass > createRandomizeRegisterInitPass()
std::unique_ptr< mlir::Pass > createLowerClassesPass()
std::unique_ptr< mlir::Pass > createAddSeqMemPortsPass()
std::unique_ptr< mlir::Pass > createLowerFIRRTLAnnotationsPass(bool ignoreUnhandledAnnotations=false, bool ignoreClasslessAnnotations=false, bool noRefTypePorts=false)
This is the pass constructor.
std::unique_ptr< mlir::Pass > createRegisterOptimizerPass()
std::unique_ptr< mlir::Pass > createLowerMatchesPass()
std::unique_ptr< mlir::Pass > createMergeConnectionsPass(bool enableAggressiveMerging=false)
std::unique_ptr< mlir::Pass > createInferResetsPass()
std::unique_ptr< mlir::Pass > createFlattenMemoryPass()
LogicalResult populateExportSplitVerilog(mlir::PassManager &pm, const FirtoolOptions &opt, llvm::StringRef directory)
Definition: Firtool.cpp:326
LogicalResult populateCHIRRTLToLowFIRRTL(mlir::PassManager &pm, const FirtoolOptions &opt, ModuleOp module, StringRef inputFilename)
Definition: Firtool.cpp:40
LogicalResult populateHWToSV(mlir::PassManager &pm, const FirtoolOptions &opt)
Definition: Firtool.cpp:246
LogicalResult populateLowFIRRTLToHW(mlir::PassManager &pm, const FirtoolOptions &opt)
Definition: Firtool.cpp:211
LogicalResult populatePreprocessTransforms(mlir::PassManager &pm, const FirtoolOptions &opt)
Definition: Firtool.cpp:26
LogicalResult populateExportVerilog(mlir::PassManager &pm, const FirtoolOptions &opt, llvm::raw_ostream &os)
Definition: Firtool.cpp:316
LogicalResult populateFinalizeIR(mlir::PassManager &pm, const FirtoolOptions &opt)
Definition: Firtool.cpp:336
std::unique_ptr< mlir::Pass > createVerifyInnerRefNamespacePass()
std::unique_ptr< mlir::Pass > createFreezePathsPass()
std::unique_ptr< mlir::Pass > createExternalizeClockGatePass(const ExternalizeClockGateOptions &options={})
std::unique_ptr< mlir::Pass > createSVExtractTestCodePass(bool disableInstanceExtraction=false, bool disableRegisterExtraction=false, bool disableModuleInlining=false)
std::unique_ptr< mlir::Pass > createHWLegalizeModulesPass()
std::unique_ptr< mlir::Pass > createHWExportModuleHierarchyPass(std::optional< std::string > directory={})
std::unique_ptr< mlir::Pass > createHWMemSimImplPass(bool replSeqMem=false, bool ignoreReadEnable=false, bool addMuxPragmas=false, bool disableMemRandomization=false, bool disableRegRandomization=false, bool addVivadoRAMAddressConflictSynthesisBugWorkaround=false)
std::unique_ptr< mlir::Pass > createPrettifyVerilogPass()
std::unique_ptr< mlir::Pass > createHWCleanupPass(bool mergeAlwaysBlocks=true)
Definition: HWCleanup.cpp:245
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
std::unique_ptr< mlir::Pass > createExportSplitChiselInterfacePass(mlir::StringRef outputDirectory="./")
std::unique_ptr< mlir::Pass > createExportChiselInterfacePass(llvm::raw_ostream &os)
std::unique_ptr< mlir::Pass > createExportSplitVerilogPass(llvm::StringRef directory="./")
std::unique_ptr< OperationPass< hw::HWModuleOp > > createLowerVerifToSVPass()
Create the Verif to SV conversion pass.
Definition: VerifToSV.cpp:153
std::unique_ptr< mlir::Pass > createLowerSeqToSVPass(const LowerSeqToSVOptions &options={})
Definition: SeqToSV.cpp:425
std::unique_ptr< mlir::Pass > createExportVerilogPass(llvm::raw_ostream &os)
std::unique_ptr< mlir::Pass > createStripDebugInfoWithPredPass(const std::function< bool(mlir::Location)> &pred)
Creates a pass to strip debug information from a function.
std::unique_ptr< mlir::Pass > createLowerFIRRTLToHWPass(bool enableAnnotationWarning=false, bool emitChiselAssertsAsSVA=false, bool disableMemRandomization=false, bool disableRegRandomization=false)
This is the pass constructor.
Definition: LowerToHW.cpp:522
LogicalResult populatePrepareForExportVerilog(mlir::PassManager &pm, const firtool::FirtoolOptions &opt)
Definition: Firtool.cpp:284
llvm::cl::opt< bool > extractTestCode
Definition: Firtool.h:167
llvm::cl::opt< bool > emitChiselAssertsAsSVA
Definition: Firtool.h:208
llvm::cl::opt< bool > etcDisableRegisterExtraction
Definition: Firtool.h:225
llvm::cl::opt< bool > stripFirDebugInfo
Definition: Firtool.h:281
llvm::cl::opt< bool > emitOMIR
Definition: Firtool.h:136
llvm::cl::opt< bool > etcDisableModuleInlining
Definition: Firtool.h:230
llvm::cl::opt< bool > exportModuleHierarchy
Definition: Firtool.h:276
llvm::cl::opt< std::string > outputAnnotationFilename
Definition: Firtool.h:191
llvm::cl::opt< bool > enableAnnotationWarning
Definition: Firtool.h:197
llvm::cl::opt< bool > emitSeparateAlwaysBlocks
Definition: Firtool.h:213
llvm::cl::opt< bool > disableOptimization
Definition: Firtool.h:85
firrtl::PreserveValues::PreserveMode getPreserveMode() const
Definition: Firtool.h:296
llvm::cl::opt< bool > disableAnnotationsUnknown
Definition: Firtool.h:32
llvm::cl::opt< std::string > chiselInterfaceOutDirectory
Definition: Firtool.h:95
llvm::cl::opt< bool > addMuxPragmas
Definition: Firtool.h:203
llvm::cl::opt< bool > noDedup
Definition: Firtool.h:110
llvm::cl::opt< bool > disableAggressiveMergeConnections
Definition: Firtool.h:124
llvm::cl::opt< bool > dedup
Definition: Firtool.h:106
bool isRandomEnabled(RandomKind kind) const
Definition: Firtool.h:292
llvm::cl::opt< bool > grandCentralInstantiateCompanionOnly
Definition: Firtool.h:115
llvm::cl::opt< bool > disableAnnotationsClassless
Definition: Firtool.h:37
llvm::cl::opt< std::string > omirOutFile
Definition: Firtool.h:140
llvm::cl::opt< bool > disableHoistingHWPassthrough
Definition: Firtool.h:131
llvm::cl::opt< std::string > outputFilename
Definition: Firtool.h:27
llvm::cl::opt< bool > vbToBV
Definition: Firtool.h:101
llvm::cl::opt< bool > replSeqMem
Definition: Firtool.h:157
llvm::cl::opt< std::string > blackBoxRootPath
Definition: Firtool.h:150
llvm::cl::opt< bool > lowerMemories
Definition: Firtool.h:144
llvm::cl::opt< bool > stripDebugInfo
Definition: Firtool.h:287
llvm::cl::opt< bool > addVivadoRAMAddressConflictSynthesisBugWorkaround
Definition: Firtool.h:235
seq::ExternalizeClockGateOptions clockGateOpts
Definition: Firtool.h:248
llvm::cl::opt< bool > etcDisableInstanceExtraction
Definition: Firtool.h:220
llvm::cl::opt< bool > lowerAnnotationsNoRefTypePorts
Definition: Firtool.h:42
llvm::cl::opt< std::string > replSeqMemFile
Definition: Firtool.h:163
llvm::cl::opt< bool > ignoreReadEnableMem
Definition: Firtool.h:171
llvm::cl::opt< bool > exportChiselInterface
Definition: Firtool.h:89
llvm::cl::opt< circt::firrtl::PreserveAggregate::PreserveMode > preserveAggregate
Definition: Firtool.h:50