From 266b59e1006201cdaef287aa2570d102d16130ec Mon Sep 17 00:00:00 2001 From: Martin Erhart Date: Mon, 3 Feb 2025 09:51:40 +0000 Subject: [PATCH] [MooreToCore] Convert SCF ops inside llhd.process to CF --- include/circt/Transforms/Passes.h | 3 ++ lib/Conversion/MooreToCore/CMakeLists.txt | 2 ++ lib/Conversion/MooreToCore/MooreToCore.cpp | 15 ++++++-- lib/Transforms/MapArithToComb.cpp | 42 ++++++++++++---------- test/Conversion/MooreToCore/basic.mlir | 12 +++++++ 5 files changed, 52 insertions(+), 22 deletions(-) diff --git a/include/circt/Transforms/Passes.h b/include/circt/Transforms/Passes.h index ddc9615ca0e3..1f1e80a3ab68 100644 --- a/include/circt/Transforms/Passes.h +++ b/include/circt/Transforms/Passes.h @@ -36,6 +36,9 @@ enum class OpCountEmissionFormat { #include "circt/Transforms/Passes.h.inc" +void populateArithToCombPatterns(mlir::RewritePatternSet &patterns, + TypeConverter &typeConverter); + std::unique_ptr createMapArithToCombPass(); std::unique_ptr createFlattenMemRefPass(); std::unique_ptr createFlattenMemRefCallsPass(); diff --git a/lib/Conversion/MooreToCore/CMakeLists.txt b/lib/Conversion/MooreToCore/CMakeLists.txt index fb2f1ed29524..b80201b60de4 100644 --- a/lib/Conversion/MooreToCore/CMakeLists.txt +++ b/lib/Conversion/MooreToCore/CMakeLists.txt @@ -15,9 +15,11 @@ add_circt_conversion_library(CIRCTMooreToCore CIRCTMoore CIRCTSim CIRCTVerif + CIRCTTransforms MLIRControlFlowDialect MLIRFuncDialect MLIRSCFDialect + MLIRSCFToControlFlow MLIRSideEffectInterfaces MLIRTransforms ) diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index 87c2ea2b9670..5a14e0a04828 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -18,6 +18,8 @@ #include "circt/Dialect/Moore/MooreOps.h" #include "circt/Dialect/Sim/SimOps.h" #include "circt/Dialect/Verif/VerifOps.h" +#include "circt/Transforms/Passes.h" +#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h" #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/SCF/IR/SCF.h" @@ -1508,11 +1510,16 @@ static void populateLegality(ConversionTarget &target, target.addLegalOp(); target.addDynamicallyLegalOp< - cf::CondBranchOp, cf::BranchOp, scf::IfOp, scf::ForOp, scf::YieldOp, - func::CallOp, func::ReturnOp, UnrealizedConversionCastOp, hw::OutputOp, - hw::InstanceOp, debug::ArrayOp, debug::StructOp, debug::VariableOp>( + cf::CondBranchOp, cf::BranchOp, scf::YieldOp, func::CallOp, + func::ReturnOp, UnrealizedConversionCastOp, hw::OutputOp, hw::InstanceOp, + debug::ArrayOp, debug::StructOp, debug::VariableOp>( [&](Operation *op) { return converter.isLegal(op); }); + target.addDynamicallyLegalOp([&](Operation *op) { + return converter.isLegal(op) && !op->getParentOfType(); + }); + target.addDynamicallyLegalOp([&](func::FuncOp op) { return converter.isSignatureLegal(op.getFunctionType()) && converter.isLegal(&op.getFunctionBody()); @@ -1738,6 +1745,8 @@ static void populateOpConversion(RewritePatternSet &patterns, typeConverter); hw::populateHWModuleLikeTypeConversionPattern( hw::HWModuleOp::getOperationName(), patterns, typeConverter); + populateSCFToControlFlowConversionPatterns(patterns); + populateArithToCombPatterns(patterns, typeConverter); } //===----------------------------------------------------------------------===// diff --git a/lib/Transforms/MapArithToComb.cpp b/lib/Transforms/MapArithToComb.cpp index c087d989f073..fb792dd64fc7 100644 --- a/lib/Transforms/MapArithToComb.cpp +++ b/lib/Transforms/MapArithToComb.cpp @@ -163,25 +163,7 @@ struct MapArithToCombPass target.addIllegalDialect(); MapArithTypeConverter typeConverter; RewritePatternSet patterns(ctx); - - patterns.insert, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - OneToOnePattern, - ExtSConversionPattern, ExtZConversionPattern, - TruncateConversionPattern, CompConversionPattern>( - typeConverter, ctx); + populateArithToCombPatterns(patterns, typeConverter); if (failed(applyPartialConversion(getOperation(), target, std::move(patterns)))) @@ -191,6 +173,28 @@ struct MapArithToCombPass } // namespace +void circt::populateArithToCombPatterns(mlir::RewritePatternSet &patterns, + TypeConverter &typeConverter) { + patterns.insert, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + OneToOnePattern, + ExtSConversionPattern, ExtZConversionPattern, + TruncateConversionPattern, CompConversionPattern>( + typeConverter, patterns.getContext()); +} + std::unique_ptr circt::createMapArithToCombPass() { return std::make_unique(); } diff --git a/test/Conversion/MooreToCore/basic.mlir b/test/Conversion/MooreToCore/basic.mlir index ea07d361a788..854c5f77d8bc 100644 --- a/test/Conversion/MooreToCore/basic.mlir +++ b/test/Conversion/MooreToCore/basic.mlir @@ -1034,3 +1034,15 @@ func.func @PowSOp(%arg0: !moore.i32, %arg1: !moore.i32) { %0 = moore.pows %arg0, %arg1 : i32 return } + +// CHECK-LABEL: @scfInsideProcess +moore.module @scfInsideProcess(in %in0: !moore.i32, in %in1: !moore.i32) { + %var = moore.variable : + // CHECK: llhd.process + // CHECK-NOT: scf.for + moore.procedure initial { + %0 = moore.pows %in0, %in1 : !moore.i32 + moore.blocking_assign %var, %0 : !moore.i32 + moore.return + } +}