From ca524749c82db5f973b7270d919ae8fce788d969 Mon Sep 17 00:00:00 2001 From: Andrey Vyazovtsev Date: Fri, 24 Jan 2025 14:04:06 +0300 Subject: [PATCH] [MooreToCore] Add nested moore.conditional support This code adds correct lowering for nested ternary operators like this: ```verilog module Mod(input a, input b, output logic [1:0] c); always_comb c = a ? b ? 2'd0 : 2'd1 : 2'd2; endmodule ``` --- lib/Conversion/MooreToCore/MooreToCore.cpp | 3 +++ test/Conversion/MooreToCore/basic.mlir | 25 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/Conversion/MooreToCore/MooreToCore.cpp b/lib/Conversion/MooreToCore/MooreToCore.cpp index 87c2ea2b9670..8df46fb395a0 100644 --- a/lib/Conversion/MooreToCore/MooreToCore.cpp +++ b/lib/Conversion/MooreToCore/MooreToCore.cpp @@ -1346,6 +1346,9 @@ struct ConditionalOpConversion : public OpConversionPattern { !memOp.hasEffect()) return WalkResult::advance(); + if (operation->hasTrait()) + return WalkResult::advance(); + return WalkResult::interrupt(); }); return !result.wasInterrupted(); diff --git a/test/Conversion/MooreToCore/basic.mlir b/test/Conversion/MooreToCore/basic.mlir index ea07d361a788..60fdac4f6694 100644 --- a/test/Conversion/MooreToCore/basic.mlir +++ b/test/Conversion/MooreToCore/basic.mlir @@ -982,6 +982,31 @@ moore.module @StringConstant() { } } +// CHECK-LABEL: func.func @RecurciveConditional +func.func @RecurciveConditional(%arg0 : !moore.l1, %arg1 : !moore.l1) { + // CHECK: [[C_2:%.+]] = hw.constant -2 : i2 + // CHECK: [[C_1:%.+]] = hw.constant 1 : i2 + // CHECK: [[C_0:%.+]] = hw.constant 0 : i2 + %c_2 = moore.constant -2 : l2 + %c_1 = moore.constant 1 : l2 + %c_0 = moore.constant 0 : l2 + + // CHECK: [[MUX0:%.+]] = comb.mux %arg1, [[C_0]], [[C_1]] : i2 + // CHECK: [[MUX1:%.+]] = comb.mux %arg0, [[MUX0]], [[C_2]] : i2 + %0 = moore.conditional %arg0 : l1 -> l2 { + %1 = moore.conditional %arg1 : l1 -> l2 { + moore.yield %c_0 : l2 + } { + moore.yield %c_1 : l2 + } + moore.yield %1 : l2 + } { + moore.yield %c_2 : l2 + } + + return +} + // CHECK-LABEL: func.func @Conversions func.func @Conversions(%arg0: !moore.i16, %arg1: !moore.l16) { // CHECK: [[TMP:%.+]] = comb.extract %arg0 from 0 : (i16) -> i8