Skip to content

Commit d47a9d2

Browse files
committed
[SeqToSV] Put fragments on hw.module.generated
When generating modules as part of the SeqToSV conversion, put appropriate memory generation fragments onto the created `hw.module.generated`. No longer put memory randomization fragments onto the original module. Fixes #8164. Signed-off-by: Schuyler Eldridge <[email protected]>
1 parent 3cee475 commit d47a9d2

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

lib/Conversion/SeqToSV/SeqToSV.cpp

+23-10
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ struct ModuleLoweringState {
8181

8282
struct FragmentInfo {
8383
bool needsRegFragment = false;
84-
bool needsMemFragment = false;
8584
} fragment;
8685

8786
HWModuleOp module;
@@ -591,9 +590,11 @@ void SeqToSVPass::runOnOperation() {
591590
// Identify memories and group them by module.
592591
auto uniqueMems = memLowering.collectMemories(modules);
593592
MapVector<HWModuleOp, SmallVector<FirMemLowering::MemoryConfig>> memsByModule;
593+
SmallVector<HWModuleGeneratedOp> generatedModules;
594594
for (auto &[config, memOps] : uniqueMems) {
595595
// Create the `HWModuleGeneratedOp`s for each unique configuration.
596596
auto genOp = memLowering.createMemoryModule(config, memOps);
597+
generatedModules.push_back(genOp);
597598

598599
// Group memories by their parent module for parallelism.
599600
for (auto memOp : memOps) {
@@ -630,10 +631,10 @@ void SeqToSVPass::runOnOperation() {
630631

631632
if (auto *it = memsByModule.find(module); it != memsByModule.end()) {
632633
memLowering.lowerMemoriesInModule(module, it->second);
633-
if (!disableMemRandomization) {
634-
state.fragment.needsMemFragment = true;
635-
}
634+
// Generated memories need register randomization since `HWMemSimImpl`
635+
// may add registers.
636636
needsMemRandomization = true;
637+
needsRegRandomization = true;
637638
}
638639
return state.immutableValueLowering.lower();
639640
});
@@ -650,8 +651,8 @@ void SeqToSVPass::runOnOperation() {
650651

651652
for (auto &[_, state] : moduleLoweringStates) {
652653
const auto &info = state.fragment;
653-
if (!info.needsRegFragment && !info.needsMemFragment) {
654-
// If neither is emitted, just skip it.
654+
// Do not add fragments if not needed.
655+
if (!info.needsRegFragment) {
655656
continue;
656657
}
657658

@@ -661,16 +662,28 @@ void SeqToSVPass::runOnOperation() {
661662
module->getAttrOfType<ArrayAttr>(emit::getFragmentsAttrName()))
662663
fragmentAttrs = llvm::to_vector(others);
663664

664-
if (info.needsRegFragment)
665+
if (info.needsRegFragment) {
665666
fragmentAttrs.push_back(randomInitRegFragmentName);
666-
if (info.needsMemFragment)
667-
fragmentAttrs.push_back(randomInitMemFragmentName);
668-
fragmentAttrs.push_back(randomInitFragmentName);
667+
fragmentAttrs.push_back(randomInitFragmentName);
668+
}
669669

670670
module->setAttr(emit::getFragmentsAttrName(),
671671
ArrayAttr::get(context, fragmentAttrs));
672672
}
673673

674+
// Set fragments for generated modules.
675+
SmallVector<Attribute> genModFragments;
676+
if (!disableRegRandomization)
677+
genModFragments.push_back(randomInitRegFragmentName);
678+
if (!disableMemRandomization)
679+
genModFragments.push_back(randomInitMemFragmentName);
680+
if (!genModFragments.empty()) {
681+
genModFragments.push_back(randomInitFragmentName);
682+
auto fragmentAttr = ArrayAttr::get(context, genModFragments);
683+
for (auto genOp : generatedModules)
684+
genOp->setAttr(emit::getFragmentsAttrName(), fragmentAttr);
685+
}
686+
674687
// Mark all ops which can have clock types as illegal.
675688
SeqToSVTypeConverter typeConverter;
676689
ConversionTarget target(*context);

test/Conversion/SeqToSV/header.mlir

+4-1
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,11 @@
6868

6969
emit.fragment @SomeFragment {}
7070

71+
// CHECK-LABEL: hw.module.generated
72+
// CHECK-SAME: emit.fragments = [@RANDOM_INIT_REG_FRAGMENT, @RANDOM_INIT_MEM_FRAGMENT, @RANDOM_INIT_FRAGMENT]
73+
7174
// CHECK-LABEL: hw.module @fragment_ref(in %clk : i1)
72-
// CHECK-SAME: emit.fragments = [@SomeFragment, @RANDOM_INIT_REG_FRAGMENT, @RANDOM_INIT_MEM_FRAGMENT, @RANDOM_INIT_FRAGMENT]
75+
// CHECK-SAME: emit.fragments = [@SomeFragment, @RANDOM_INIT_REG_FRAGMENT, @RANDOM_INIT_FRAGMENT]
7376
hw.module @fragment_ref(in %clk : !seq.clock) attributes {emit.fragments = [@SomeFragment]} {
7477
%cst0_i32 = hw.constant 0 : i32
7578
%rA = seq.firreg %cst0_i32 clock %clk sym @regA : i32

0 commit comments

Comments
 (0)