From 209d9fb80e8763a53725f95596fe20064ad7b061 Mon Sep 17 00:00:00 2001 From: Schuyler Eldridge Date: Fri, 16 Aug 2024 19:23:40 -0400 Subject: [PATCH] [firrtl] Fix bug in sibling layer specialization Fix a bug in the `SpecializeLayers` pass where sibling layers would not be enabled/disabled correctly if an earlier sibling layer was also enabled/disabled. Fixes #7525. Signed-off-by: Schuyler Eldridge --- .../FIRRTL/Transforms/SpecializeLayers.cpp | 2 ++ test/Dialect/FIRRTL/specialize-layers.mlir | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/Dialect/FIRRTL/Transforms/SpecializeLayers.cpp b/lib/Dialect/FIRRTL/Transforms/SpecializeLayers.cpp index 6b629bf968..07e2dc0bf8 100644 --- a/lib/Dialect/FIRRTL/Transforms/SpecializeLayers.cpp +++ b/lib/Dialect/FIRRTL/Transforms/SpecializeLayers.cpp @@ -605,6 +605,7 @@ struct SpecializeLayers { llvm::make_early_inc_range(block->getOps())) { nestedRefs.push_back(SymbolRefAttr::get(nested)); handleLayer(nested, Block::iterator(nested), ""); + nestedRefs.pop_back(); } return; } @@ -617,6 +618,7 @@ struct SpecializeLayers { nestedRefs.push_back(SymbolRefAttr::get(nested)); handleLayer(nested, insertionPoint, prefix + layer.getSymName() + "_"); + nestedRefs.pop_back(); } // Erase the now empty layer. layer->erase(); diff --git a/test/Dialect/FIRRTL/specialize-layers.mlir b/test/Dialect/FIRRTL/specialize-layers.mlir index 00e53a87c1..c6f0a042a0 100644 --- a/test/Dialect/FIRRTL/specialize-layers.mlir +++ b/test/Dialect/FIRRTL/specialize-layers.mlir @@ -115,6 +115,21 @@ firrtl.circuit "LayerDisableInARow" attributes { firrtl.extmodule @LayerDisableInARow() } +// CHECK: firrtl.circuit "LayerblockEnableNestedChildren" +// CHECK-NOT: firrtl.layer +firrtl.circuit "LayerblockEnableNestedChildren" attributes { + enable_layers = [@A, @A::@B, @A::@C] +} { + firrtl.layer @A bind { + firrtl.layer @B bind { + } + firrtl.layer @C bind { + } + } + firrtl.module @LayerblockEnableNestedChildren() { + } +} + //===----------------------------------------------------------------------===// // LayerBlock Specialization //===----------------------------------------------------------------------===//