diff --git a/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td b/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td index 99f30bc7cf0..8e0976cbf4d 100644 --- a/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td +++ b/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td @@ -1946,6 +1946,23 @@ def CIR_ShapeOp: CIR_Op<"shape", [ let hasFolder = 1; } +def CIR_SignOp: CIR_Op<"sign", [ + Pure, + SameOperandsAndResultType]> { + let summary = "Sign operation"; + let description = [{ + Returns NaN if x is NaN, 0 if x is 0, -1 if x < 0 and 1 if x > 0. + }]; + + let arguments = (ins + CIR_TensorOf<[F32, F64, I32]>:$x + ); + + let results = (outs + CIR_TensorOf<[F32, F64, I32]>:$output + ); +} + def CIR_SinOp: CIR_Op<"sin", [ Pure, /*TF_SameOperandsAndResultTypeResolveRef*/ diff --git a/circle-mlir/circle-mlir/lib/pass/src/ConvertONNXToCirclePass.cpp b/circle-mlir/circle-mlir/lib/pass/src/ConvertONNXToCirclePass.cpp index 7fa691f0d11..4b1e2698264 100644 --- a/circle-mlir/circle-mlir/lib/pass/src/ConvertONNXToCirclePass.cpp +++ b/circle-mlir/circle-mlir/lib/pass/src/ConvertONNXToCirclePass.cpp @@ -75,6 +75,7 @@ #include "ops/ResizeOp.h" #include "ops/ShapeOp.h" #include "ops/SigmoidOp.h" +#include "ops/SignOp.h" #include "ops/SinOp.h" #include "ops/SliceOp.h" #include "ops/SoftmaxOp.h" @@ -263,6 +264,7 @@ void ConvertONNXToCirclePass::runOnOperation() patterns.insert(typeConverter, context); patterns.insert(typeConverter, context); patterns.insert(typeConverter, context); + patterns.insert(typeConverter, context); patterns.insert(typeConverter, context); patterns.insert(typeConverter, context); patterns.insert(typeConverter, context); diff --git a/circle-mlir/circle-mlir/lib/pass/src/ops/SignOp.h b/circle-mlir/circle-mlir/lib/pass/src/ops/SignOp.h new file mode 100644 index 00000000000..6c9e3de9782 --- /dev/null +++ b/circle-mlir/circle-mlir/lib/pass/src/ops/SignOp.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2026 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_MLIR_PASS_OPS_SIGN_OP_H__ +#define __CIRCLE_MLIR_PASS_OPS_SIGN_OP_H__ + +#include + +#include "ConvertHelper.h" + +#include + +#include + +namespace mlir +{ +namespace Circle +{ + +class ConvSign : public mlir::OpConversionPattern +{ +public: + using mlir::OpConversionPattern::OpConversionPattern; + using OpAdaptor = typename mlir::ONNXSignOp::Adaptor; + + mlir::LogicalResult matchAndRewrite(mlir::ONNXSignOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override + { + mlir::Value input = adaptor.getInput(); + + rewriter.replaceOpWithNewOp(op, op.getType(), input); + + return mlir::success(); + } +}; + +} // namespace Circle +} // namespace mlir + +#endif // __CIRCLE_MLIR_PASS_OPS_SIGN_OP_H__ diff --git a/circle-mlir/circle-mlir/tools-test/circle-impexp-test/test.lst b/circle-mlir/circle-mlir/tools-test/circle-impexp-test/test.lst index e37456c4e97..7f2cc8eb24f 100644 --- a/circle-mlir/circle-mlir/tools-test/circle-impexp-test/test.lst +++ b/circle-mlir/circle-mlir/tools-test/circle-impexp-test/test.lst @@ -129,6 +129,7 @@ AddModel(Pow_F32_R2) AddModel(Pow_F32_R2_3) AddModel(Pow_F32_R4) AddModel(PReLU_F32_R4) +AddModel(Range_F32_R0_1) AddModel(Reciprocal_F32_R4) AddModel(ReduceMax_F32_R2) AddModel(ReduceMax_F32_R2_d0) @@ -166,6 +167,7 @@ AddModel(Resize_F32_R4_nearest) AddModel(Shape_F32_R4) AddModel(Sigmoid_F32_R2) AddModel(Sigmoid_F32_R4) +AddModel(Sign_F32_R4) AddModel(Sin_F32_R4) AddModel(Slice_F32_R2_4) # Rank2 of Slice_F32_R4_4 AddModel(Slice_F32_R3_4) # Rank3 of Slice_F32_R4_4 diff --git a/circle-mlir/circle-mlir/tools-test/onnx2circle-models/test.lst b/circle-mlir/circle-mlir/tools-test/onnx2circle-models/test.lst index 6f48bb927ad..3ef8bc3ab30 100644 --- a/circle-mlir/circle-mlir/tools-test/onnx2circle-models/test.lst +++ b/circle-mlir/circle-mlir/tools-test/onnx2circle-models/test.lst @@ -137,6 +137,7 @@ AddModel(QuantizeLinear_F32_R3_ui8) AddModel(QuantizeLinear_F32_R3_ui8_fq) AddModel(QuantizeLinear_F32_R4_i16_cw) AddModel(QuantizeLinear_F32_R4_ui8_cw) +AddModel(Range_F32_R0_1) AddModel(Reciprocal_F32_R4) AddModel(ReduceMax_F32_R2) AddModel(ReduceMax_F32_R2_d0) @@ -175,6 +176,7 @@ AddModel(Rsqrt_F32_R4) AddModel(Shape_F32_R4) AddModel(Sigmoid_F32_R2) AddModel(Sigmoid_F32_R4) +AddModel(Sign_F32_R4) AddModel(Sin_F32_R4) AddModel(Slice_F32_R2_4) # Rank2 of Slice_F32_R4_4 AddModel(Slice_F32_R3_4) # Rank3 of Slice_F32_R4_4 diff --git a/circle-mlir/circle-mlir/tools-test/onnx2circle-value-test/test.lst b/circle-mlir/circle-mlir/tools-test/onnx2circle-value-test/test.lst index 87c1aa9171b..9d9065fb6c3 100644 --- a/circle-mlir/circle-mlir/tools-test/onnx2circle-value-test/test.lst +++ b/circle-mlir/circle-mlir/tools-test/onnx2circle-value-test/test.lst @@ -137,6 +137,7 @@ AddModel(PReLU_F32_R4) # AddModel(QuantizeLinear_F32_R3_ui8_fq) # AddModel(QuantizeLinear_F32_R4_i16_cw) # AddModel(QuantizeLinear_F32_R4_ui8_cw) +AddModel(Range_F32_R0_1) AddModel(Reciprocal_F32_R4) AddModel(ReduceMax_F32_R2) AddModel(ReduceMax_F32_R2_d0) @@ -175,6 +176,7 @@ AddModel(Rsqrt_F32_R4) AddModel(Shape_F32_R4) AddModel(Sigmoid_F32_R2) AddModel(Sigmoid_F32_R4) +AddModel(Sign_F32_R4) AddModel(Sin_F32_R4) AddModel(Slice_F32_R2_4) # Rank2 of Slice_F32_R4_4 AddModel(Slice_F32_R3_4) # Rank3 of Slice_F32_R4_4 diff --git a/circle-mlir/models/unit/Range_F32_R0_1/__init__.py b/circle-mlir/models/unit/Range_F32_R0_1/__init__.py new file mode 100644 index 00000000000..fe14b3c8f96 --- /dev/null +++ b/circle-mlir/models/unit/Range_F32_R0_1/__init__.py @@ -0,0 +1,20 @@ +import torch + + +# Generate Range operator with Float32, scalar +class net_Range(torch.nn.Module): + def __init__(self): + super().__init__() + + def forward(self, input): + limit = input + return torch.arange(0, limit, 1, dtype=torch.float32) + + def onnx_opset_version(self): + return 11 + + +_model_ = net_Range() + +# produce float32 scalar with fixed number +_inputs_ = torch.tensor(10, dtype=torch.float32) diff --git a/circle-mlir/models/unit/Range_F32_R0_2/__init__.py b/circle-mlir/models/unit/Range_F32_R0_2/__init__.py new file mode 100644 index 00000000000..00a3ea63f31 --- /dev/null +++ b/circle-mlir/models/unit/Range_F32_R0_2/__init__.py @@ -0,0 +1,19 @@ +import torch + + +# Generate Range operator with Float32, scalar +class net_Range(torch.nn.Module): + def __init__(self): + super().__init__() + + def forward(self, limit, delta): + return torch.arange(0, limit, delta, dtype=torch.float32) + + def onnx_opset_version(self): + return 11 + + +_model_ = net_Range() + +# produce float32 scalar with fixed number +_inputs_ = (torch.tensor(10, dtype=torch.float32), torch.tensor(1, dtype=torch.float32)) diff --git a/circle-mlir/models/unit/Range_F32_R0_3/__init__.py b/circle-mlir/models/unit/Range_F32_R0_3/__init__.py new file mode 100644 index 00000000000..2404ba94e0c --- /dev/null +++ b/circle-mlir/models/unit/Range_F32_R0_3/__init__.py @@ -0,0 +1,19 @@ +import torch + + +# Generate Range operator with Float32, scalar +class net_Range(torch.nn.Module): + def __init__(self): + super().__init__() + + def forward(self, start, limit, delta): + return torch.arange(start, limit, delta, dtype=torch.float32) + + def onnx_opset_version(self): + return 11 + + +_model_ = net_Range() + +# produce float32 scalar with fixed number +_inputs_ = (torch.tensor(0, dtype=torch.float32), torch.tensor(10, dtype=torch.float32), torch.tensor(1, dtype=torch.float32)) diff --git a/circle-mlir/models/unit/Sign_F32_R4/__init__.py b/circle-mlir/models/unit/Sign_F32_R4/__init__.py new file mode 100644 index 00000000000..7b9154bff5e --- /dev/null +++ b/circle-mlir/models/unit/Sign_F32_R4/__init__.py @@ -0,0 +1,19 @@ +import torch + + +# Generate Sign operator with Float32, Rank-4 +class net_Sign(torch.nn.Module): + def __init__(self): + super().__init__() + + def forward(self, input): + return torch.sign(input) + + def onnx_opset_version(self): + # TODO set to appropriate value + return 14 + + +_model_ = net_Sign() + +_inputs_ = torch.randn(1, 2, 3, 3) diff --git a/circle-mlir/models/unit/Unsqueeze_F32_R0/__init__.py b/circle-mlir/models/unit/Unsqueeze_F32_R0/__init__.py index 8c62b64a2e5..84034ed5469 100644 --- a/circle-mlir/models/unit/Unsqueeze_F32_R0/__init__.py +++ b/circle-mlir/models/unit/Unsqueeze_F32_R0/__init__.py @@ -16,5 +16,5 @@ def onnx_opset_version(self): _model_ = net_Unsqueeze() -# produuce float32 scalar +# produce float32 scalar _inputs_ = torch.randn(1)[0] diff --git a/circle-mlir/models/unit/Unsqueeze_F32_R0_v11/__init__.py b/circle-mlir/models/unit/Unsqueeze_F32_R0_v11/__init__.py index 28aa8aae68a..c2a78d5d846 100644 --- a/circle-mlir/models/unit/Unsqueeze_F32_R0_v11/__init__.py +++ b/circle-mlir/models/unit/Unsqueeze_F32_R0_v11/__init__.py @@ -15,5 +15,5 @@ def onnx_opset_version(self): _model_ = net_Unsqueeze() -# produuce float32 scalar +# produce float32 scalar _inputs_ = torch.randn(1)[0]