diff --git a/lib/Conversion/ArcToLLVM/CMakeLists.txt b/lib/Conversion/ArcToLLVM/CMakeLists.txt index 213b31f38883..4544210ea80e 100644 --- a/lib/Conversion/ArcToLLVM/CMakeLists.txt +++ b/lib/Conversion/ArcToLLVM/CMakeLists.txt @@ -11,6 +11,7 @@ add_circt_conversion_library(CIRCTArcToLLVM CIRCTArc CIRCTComb CIRCTSeq + CIRCTCombToArith CIRCTCombToLLVM CIRCTHWToLLVM MLIRArithToLLVM diff --git a/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp b/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp index 66a1592361be..8d8f80c17941 100644 --- a/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp +++ b/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "circt/Conversion/ArcToLLVM.h" +#include "circt/Conversion/CombToArith.h" #include "circt/Conversion/CombToLLVM.h" #include "circt/Conversion/HWToLLVM.h" #include "circt/Dialect/Arc/ArcOps.h" @@ -259,8 +260,8 @@ struct ClockGateOpLowering : public OpConversionPattern { LogicalResult matchAndRewrite(seq::ClockGateOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const final { - rewriter.replaceOpWithNewOp(op, adaptor.getInput(), - adaptor.getEnable(), true); + rewriter.replaceOpWithNewOp(op, adaptor.getInput(), + adaptor.getEnable()); return success(); } }; @@ -648,6 +649,7 @@ void LowerArcToLLVMPass::runOnOperation() { populateHWToLLVMConversionPatterns(converter, patterns, globals, constAggregateGlobalsMap); populateHWToLLVMTypeConversions(converter); + populateCombToArithConversionPatterns(converter, patterns); populateCombToLLVMConversionPatterns(converter, patterns); // Arc patterns. diff --git a/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir b/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir index faa372e64411..7ad14ed5e0d8 100644 --- a/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir +++ b/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir @@ -180,14 +180,16 @@ func.func @seqClocks(%clk1: !seq.clock, %clk2: !seq.clock) -> !seq.clock { %2 = arith.xori %0, %1 : i1 %3 = seq.to_clock %2 %4 = seq.clock_inv %3 - return %4 : !seq.clock + %5 = seq.clock_gate %4, %0 + return %5 : !seq.clock } // CHECK-LABEL: llvm.func @seqClocks // CHECK-SAME: ([[CLK1:%.+]]: i1, [[CLK2:%.+]]: i1) // CHECK: [[RES:%.+]] = llvm.xor [[CLK1]], [[CLK2]] // CHECK: [[TRUE:%.+]] = llvm.mlir.constant(true) : i1 // CHECK: [[RES1:%.+]] = llvm.xor [[RES]], [[TRUE]] : i1 -// CHECK: llvm.return [[RES1]] : i1 +// CHECK: [[RES2:%.+]] = llvm.and [[RES1]], [[CLK1]] : i1 +// CHECK: llvm.return [[RES2]] : i1 // CHECK-LABEL: llvm.func @ReadAggregates( // CHECK-SAME: %arg0: !llvm.ptr diff --git a/tools/arcilator/arcilator.cpp b/tools/arcilator/arcilator.cpp index 9f092e800a86..47b1918bb0fe 100644 --- a/tools/arcilator/arcilator.cpp +++ b/tools/arcilator/arcilator.cpp @@ -355,7 +355,6 @@ static void populateArcToLLVMPipeline(PassManager &pm) { // Lower the arcs and update functions to LLVM. if (untilReached(UntilLLVMLowering)) return; - pm.addPass(createConvertCombToArithPass()); pm.addPass(createLowerArcToLLVMPass()); pm.addPass(createCSEPass()); pm.addPass(arc::createArcCanonicalizerPass());