Skip to content

Commit 9fd8601

Browse files
authored
[FIRRTL] Firtool: Add option to emit bind files for private modules (#8853)
Add option to emit bindfiles for private modules.
1 parent 68e7e82 commit 9fd8601

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

include/circt/Dialect/FIRRTL/Passes.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,10 @@ def LowerLayers : Pass<"firrtl-lower-layers", "firrtl::CircuitOp"> {
734734
pass, all layer blocks and layers are removed.
735735
}];
736736
let dependentDialects = ["sv::SVDialect", "emit::EmitDialect"];
737+
let options = [
738+
Option<"emitAllBindFiles", "emit-all-bind-files", "bool", "false",
739+
"Emit bind files for private modules.">
740+
];
737741
}
738742

739743
def LayerMerge : Pass<"firrtl-layer-merge", "firrtl::FModuleOp"> {

include/circt/Firtool/Firtool.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class FirtoolOptions {
145145

146146
bool getLintXmrsInDesign() const { return lintXmrsInDesign; }
147147

148+
bool getEmitAllBindFiles() const { return emitAllBindFiles; }
149+
148150
// Setters, used by the CAPI
149151
FirtoolOptions &setOutputFilename(StringRef name) {
150152
outputFilename = name;
@@ -394,6 +396,11 @@ class FirtoolOptions {
394396
return *this;
395397
}
396398

399+
FirtoolOptions &setEmitAllBindFiles(bool value) {
400+
emitAllBindFiles = value;
401+
return *this;
402+
}
403+
397404
private:
398405
std::string outputFilename;
399406

@@ -448,6 +455,7 @@ class FirtoolOptions {
448455
bool disableWireElimination;
449456
bool lintStaticAsserts;
450457
bool lintXmrsInDesign;
458+
bool emitAllBindFiles;
451459
};
452460

453461
void registerFirtoolCLOptions();

lib/Dialect/FIRRTL/Transforms/LowerLayers.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ struct BindFileInfo {
199199

200200
class LowerLayersPass
201201
: public circt::firrtl::impl::LowerLayersBase<LowerLayersPass> {
202+
using Base::Base;
203+
202204
hw::OutputFileAttr getOutputFile(SymbolRefAttr layerName) {
203205
auto layer = symbolToLayer.lookup(layerName);
204206
if (!layer)
@@ -917,7 +919,7 @@ void LowerLayersPass::preprocessModule(CircuitNamespace &ns,
917919
llvm::SmallDenseSet<LayerOp> layersRequiringBindFiles;
918920

919921
// If the module is public, create a bind file for all layers.
920-
if (module.isPublic())
922+
if (module.isPublic() || emitAllBindFiles)
921923
for (auto [_, layer] : symbolToLayer)
922924
if (layer.getConvention() == LayerConvention::Bind)
923925
layersRequiringBindFiles.insert(layer);

lib/Firtool/Firtool.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,8 @@ LogicalResult firtool::populateLowFIRRTLToHW(mlir::PassManager &pm,
250250
// TODO: Improve LowerLayers to avoid the need for canonicalization. See:
251251
// https://github.com/llvm/circt/issues/7896
252252

253-
pm.nest<firrtl::CircuitOp>().addPass(firrtl::createLowerLayers());
253+
pm.nest<firrtl::CircuitOp>().addPass(
254+
firrtl::createLowerLayers({opt.getEmitAllBindFiles()}));
254255
if (!opt.shouldDisableOptimization())
255256
pm.nest<firrtl::CircuitOp>().nest<firrtl::FModuleOp>().addPass(
256257
createSimpleCanonicalizerPass());
@@ -766,6 +767,11 @@ struct FirtoolCmdOptions {
766767
"disable-wire-elimination", llvm::cl::desc("Disable wire elimination"),
767768
llvm::cl::init(false)};
768769

770+
llvm::cl::opt<bool> emitAllBindFiles{
771+
"emit-all-bind-files",
772+
llvm::cl::desc("Emit bindfiles for private modules"),
773+
llvm::cl::init(false)};
774+
769775
//===----------------------------------------------------------------------===
770776
// Lint options
771777
//===----------------------------------------------------------------------===
@@ -818,7 +824,7 @@ circt::firtool::FirtoolOptions::FirtoolOptions()
818824
disableCSEinClasses(false), selectDefaultInstanceChoice(false),
819825
symbolicValueLowering(verif::SymbolicValueLowering::ExtModule),
820826
disableWireElimination(false), lintStaticAsserts(true),
821-
lintXmrsInDesign(true) {
827+
lintXmrsInDesign(true), emitAllBindFiles(false) {
822828
if (!clOptions.isConstructed())
823829
return;
824830
outputFilename = clOptions->outputFilename;
@@ -871,4 +877,5 @@ circt::firtool::FirtoolOptions::FirtoolOptions()
871877
disableWireElimination = clOptions->disableWireElimination;
872878
lintStaticAsserts = clOptions->lintStaticAsserts;
873879
lintXmrsInDesign = clOptions->lintXmrsInDesign;
880+
emitAllBindFiles = clOptions->emitAllBindFiles;
874881
}

0 commit comments

Comments
 (0)