diff --git a/include/Dialect/LWE/IR/LWEOps.td b/include/Dialect/LWE/IR/LWEOps.td index cd75a89b3e..f49389c27d 100644 --- a/include/Dialect/LWE/IR/LWEOps.td +++ b/include/Dialect/LWE/IR/LWEOps.td @@ -41,7 +41,10 @@ def LWE_EncodeOp : LWE_Op<"encode", [Pure]> { let hasVerifier = 1; } -def LWE_TrivialEncryptOp: LWE_Op<"trivial_encrypt", [Pure]> { +def LWE_TrivialEncryptOp: LWE_Op<"trivial_encrypt", [ + Pure, + DeclareOpInterfaceMethods +]> { let summary = "Create a trivial encryption of a plaintext."; let arguments = (ins diff --git a/include/Interfaces/NoiseInterfaces.td b/include/Interfaces/NoiseInterfaces.td index 308135299a..461ef3a85d 100644 --- a/include/Interfaces/NoiseInterfaces.td +++ b/include/Interfaces/NoiseInterfaces.td @@ -34,6 +34,14 @@ def NoisePropagationInterface : OpInterface<"NoisePropagationInterface"> { "void", "inferResultNoise", (ins "::llvm::ArrayRef":$argNoises, "::mlir::heir::SetNoiseFn":$setValueNoise) + + >, + InterfaceMethod<[{ + Returns true if the noise in the result op is independent of the noise in + its inputs. This is suitable for ops like bootstrap and initial + encryption. + }], + "bool", "hasDeterministicResultNoise", (ins) >]; } diff --git a/lib/Dialect/CGGI/IR/CGGIOps.cpp b/lib/Dialect/CGGI/IR/CGGIOps.cpp index 358b52dc1f..184a3996f2 100644 --- a/lib/Dialect/CGGI/IR/CGGIOps.cpp +++ b/lib/Dialect/CGGI/IR/CGGIOps.cpp @@ -132,6 +132,13 @@ void NotOp::inferResultNoise(llvm::ArrayRef argNoises, setValueNoise(getInput(), argNoises[0]); } +bool AndOp::hasDeterministicResultNoise() { return true; } +bool OrOp::hasDeterministicResultNoise() { return true; } +bool XorOp::hasDeterministicResultNoise() { return true; } +bool Lut3Op::hasDeterministicResultNoise() { return true; } +bool Lut2Op::hasDeterministicResultNoise() { return true; } +bool NotOp::hasDeterministicResultNoise() { return false; } + } // namespace cggi } // namespace heir } // namespace mlir diff --git a/lib/Dialect/LWE/IR/LWEDialect.cpp b/lib/Dialect/LWE/IR/LWEDialect.cpp index 0fb99bdf6c..4671ca1d37 100644 --- a/lib/Dialect/LWE/IR/LWEDialect.cpp +++ b/lib/Dialect/LWE/IR/LWEDialect.cpp @@ -185,6 +185,14 @@ void AddOp::inferResultNoise(llvm::ArrayRef argNoises, return setValueNoise(getResult(), result); } +void TrivialEncryptOp::inferResultNoise(llvm::ArrayRef argNoises, + SetNoiseFn setValueNoise) { + return setValueNoise(getResult(), Variance(0)); +} + +bool AddOp::hasDeterministicResultNoise() { return false; } +bool TrivialEncryptOp::hasDeterministicResultNoise() { return true; } + } // namespace lwe } // namespace heir } // namespace mlir