From be6275540145ee5eb9258def80d75d2f326d8fab Mon Sep 17 00:00:00 2001 From: Quentin Bourgerie Date: Tue, 20 Jul 2021 15:04:46 +0200 Subject: [PATCH] fix(compiler): Fixing MidLFHE Dialect for the compiler v0 --- .../zamalang/Dialect/MidLFHE/IR/MidLFHEOps.td | 88 ++--- .../Dialect/MidLFHE/IR/MidLFHETypes.td | 46 +-- .../lib/Dialect/MidLFHE/IR/MidLFHEDialect.cpp | 74 +--- .../lib/Dialect/MidLFHE/IR/MidLFHEOps.cpp | 348 +++++------------- .../Dialect/MidLFHE/op_add_glwe.invalid.mlir | 54 +++ .../tests/Dialect/MidLFHE/op_add_glwe.mlir | 10 + .../MidLFHE/op_add_glwe_int.invalid.mlir | 39 ++ .../Dialect/MidLFHE/op_add_glwe_int.mlir | 12 + .../tests/Dialect/MidLFHE/op_add_plain.mlir | 23 -- .../MidLFHE/op_add_plain_err_bits.mlir | 8 - .../MidLFHE/op_add_plain_err_dimension.mlir | 8 - .../MidLFHE/op_add_plain_err_log2StdDev.mlir | 8 - .../Dialect/MidLFHE/op_add_plain_err_p.mlir | 8 - .../MidLFHE/op_add_plain_err_padding1.mlir | 8 - .../MidLFHE/op_add_plain_err_padding2.mlir | 8 - .../MidLFHE/op_add_plain_err_phantomBits.mlir | 8 - .../op_add_plain_err_polynomialSize.mlir | 8 - .../op_add_plain_err_scalingFactor.mlir | 8 - .../op_apply_lookup_table.invalid.mlir | 17 + .../MidLFHE/op_apply_lookup_table.mlir | 10 + compiler/tests/Dialect/MidLFHE/op_h_add.mlir | 10 - .../MidLFHE/op_h_add_err_dimension.mlir | 7 - .../MidLFHE/op_h_add_err_log2StdDev.mlir | 7 - .../tests/Dialect/MidLFHE/op_h_add_err_p.mlir | 7 - .../MidLFHE/op_h_add_err_padding1.mlir | 7 - .../MidLFHE/op_h_add_err_padding2.mlir | 7 - .../MidLFHE/op_h_add_err_padding3.mlir | 7 - .../MidLFHE/op_h_add_err_phantomBits.mlir | 7 - .../MidLFHE/op_h_add_err_polynomialSize.mlir | 7 - .../MidLFHE/op_h_add_err_scalingFactor.mlir | 7 - compiler/tests/Dialect/MidLFHE/op_h_mul.mlir | 11 - .../MidLFHE/op_mul_glwe_int.invalid.mlir | 39 ++ .../Dialect/MidLFHE/op_mul_glwe_int.mlir | 12 + .../tests/Dialect/MidLFHE/op_mul_plain.mlir | 23 -- .../MidLFHE/op_mul_plain_err_bits.mlir | 8 - .../MidLFHE/op_mul_plain_err_dimension.mlir | 8 - .../MidLFHE/op_mul_plain_err_log2StdDev.mlir | 8 - .../Dialect/MidLFHE/op_mul_plain_err_p.mlir | 8 - .../MidLFHE/op_mul_plain_err_padding1.mlir | 8 - .../MidLFHE/op_mul_plain_err_padding2.mlir | 8 - .../MidLFHE/op_mul_plain_err_padding3.mlir | 8 - .../MidLFHE/op_mul_plain_err_phantomBits.mlir | 8 - .../op_mul_plain_err_polynomialSize.mlir | 8 - .../op_mul_plain_err_scalingFactor.mlir | 8 - compiler/tests/Dialect/MidLFHE/op_pbs.mlir | 18 - .../MidLFHE/op_sub_int_glwe.invalid.mlir | 40 ++ .../Dialect/MidLFHE/op_sub_int_glwe.mlir | 12 + .../tests/Dialect/MidLFHE/types_glwe.mlir | 14 +- .../MidLFHE/types_glwe_err_error_2.mlir | 6 - ...types_glwe_err_error_overlap_message1.mlir | 6 - 50 files changed, 395 insertions(+), 732 deletions(-) create mode 100644 compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_bits.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_dimension.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_log2StdDev.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_p.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding1.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding2.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_phantomBits.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_polynomialSize.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_add_plain_err_scalingFactor.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.invalid.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_dimension.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_log2StdDev.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_p.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_padding1.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_padding2.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_padding3.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_phantomBits.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_polynomialSize.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_add_err_scalingFactor.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_h_mul.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_bits.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_dimension.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_log2StdDev.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_p.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding1.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding2.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding3.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_phantomBits.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_polynomialSize.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_mul_plain_err_scalingFactor.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/op_pbs.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir create mode 100644 compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/types_glwe_err_error_2.mlir delete mode 100644 compiler/tests/Dialect/MidLFHE/types_glwe_err_error_overlap_message1.mlir diff --git a/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHEOps.td b/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHEOps.td index be0ac6b25..f757ea786 100644 --- a/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHEOps.td +++ b/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHEOps.td @@ -18,78 +18,56 @@ include "zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td" class MidLFHE_Op traits = []> : Op; -def AddPlainOp : MidLFHE_Op<"add_plain"> { +def AddGLWEInt : MidLFHE_Op<"add_glwe_int"> { let arguments = (ins GLWECipherTextType:$a, AnyInteger:$b); let results = (outs GLWECipherTextType); - let builders = [ - OpBuilder<(ins "Value":$a, "Value":$b), [{ - build($_builder, $_state, a.getType(), a, b); - }]> - ]; - let verifier = [{ - return ::mlir::zamalang::verifyAddPlainOp(*this); + return mlir::zamalang::MidLFHE::verifyGLWEIntegerOperator(*this); }]; } -def MulPlainOp : MidLFHE_Op<"mul_plain"> { +def AddGLWEOp : MidLFHE_Op<"add_glwe"> { + let arguments = (ins GLWECipherTextType:$a, GLWECipherTextType:$b); + let results = (outs GLWECipherTextType); + + let verifier = [{ + return ::mlir::zamalang::MidLFHE::verifyBinaryGLWEOperator(*this); + }]; +} + +def SubIntGLWEOp : MidLFHE_Op<"sub_int_glwe"> { + let arguments = (ins AnyInteger:$a, GLWECipherTextType:$b); + let results = (outs GLWECipherTextType); + + let verifier = [{ + return ::mlir::zamalang::MidLFHE::verifyIntegerGLWEOperator(*this); + }]; +} + + +def MulGLWEInt : MidLFHE_Op<"mul_glwe_int"> { let arguments = (ins GLWECipherTextType:$a, AnyInteger:$b); let results = (outs GLWECipherTextType); - let builders = [ - OpBuilder<(ins "Value":$a, "Value":$b), [{ - build($_builder, $_state, a.getType(), a, b); - }]> - ]; - let verifier = [{ - return ::mlir::zamalang::verifyMulPlainOp(*this); - }]; -} - -def HAddOp : MidLFHE_Op<"h_add"> { - let arguments = (ins GLWECipherTextType:$a, GLWECipherTextType:$b); - let results = (outs GLWECipherTextType); - - let builders = [ - OpBuilder<(ins "Value":$a, "Value":$b), [{ - build($_builder, $_state, a.getType(), a, b); - }]> - ]; - - let verifier = [{ - return ::mlir::zamalang::verifyHAddOp(*this); + return mlir::zamalang::MidLFHE::verifyGLWEIntegerOperator(*this); }]; } -def HMulOp : MidLFHE_Op<"h_mul"> { - let arguments = (ins GLWECipherTextType:$a, GLWECipherTextType:$b); + +def ApplyLookupTable : MidLFHE_Op<"apply_lookup_table"> { + let arguments = (ins GLWECipherTextType:$ct, + MemRefOf<[AnyInteger]>:$l_cst, + I32Attr:$k, I32Attr:$polynomialSize, + I32Attr:$levelKS, I32Attr:$baseLogKS, + I32Attr:$levelBS, I32Attr:$baseLogBS); let results = (outs GLWECipherTextType); - let builders = [ - OpBuilder<(ins "Value":$a, "Value":$b), [{ - build($_builder, $_state, a.getType(), a, b); - }]> - ]; -} - - -def PBSRegion : Region< - CPred<"::mlir::zamalang::predPBSRegion($_self)">, - "pbs region needs one block with one any integer argument">; - -def PBSOp : MidLFHE_Op<"pbs"> { - let arguments = (ins GLWECipherTextType:$x, I32Attr:$big_n, I32Attr:$log_noise, I32Attr:$base_log, I32Attr:$level); - let results = (outs GLWECipherTextType:$result); - let regions = (region PBSRegion:$region); -} - -def ReturnOp : MidLFHE_Op<"pbs_return", [NoSideEffect, ReturnLike, Terminator]> { - let summary = "terminator of pbs block"; - let arguments = (ins AnyInteger); - let builders = [OpBuilder<(ins), [{ /* nothing to do */ }]>]; + let verifier = [{ + return ::mlir::zamalang::MidLFHE::verifyApplyLookupTable(*this); + }]; } #endif diff --git a/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td b/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td index 756d00a40..309bd25f5 100644 --- a/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td +++ b/compiler/include/zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td @@ -23,16 +23,8 @@ def GLWECipherTextType : MidLFHE_Type<"GLWECipherText"> { "signed":$polynomialSize, // Number of bits of the ciphertext "signed":$bits, - // Number of bits for padding - "signed":$paddingBits, - // The precision of the encrypted value - "signed":$p, - // Number of 'phantom' bits on the right of the message - "signed":$phantomBits, - // The scaling factor - "signed":$scalingFactor, - // Log2 of the standard derivation - "signed":$log2StdDev + // Number of bits of the plain text representation + "signed":$p ); // We define the printer inline. @@ -49,20 +41,8 @@ def GLWECipherTextType : MidLFHE_Type<"GLWECipherText"> { else $_printer << getImpl()->bits; $_printer << "}"; $_printer << "{"; - if (getImpl()->paddingBits == -1) $_printer << "_"; - else $_printer << getImpl()->paddingBits; - $_printer << ","; if (getImpl()->p == -1) $_printer << "_"; else $_printer << getImpl()->p; - $_printer << ","; - if (getImpl()->phantomBits == -1) $_printer << "_"; - else $_printer << getImpl()->phantomBits; - $_printer << ","; - if (getImpl()->scalingFactor == -1) $_printer << "_"; - else $_printer << getImpl()->scalingFactor; - $_printer << ","; - if (getImpl()->log2StdDev == -1) $_printer << "_"; - else $_printer << getImpl()->log2StdDev; $_printer << "}>"; }]; @@ -93,36 +73,16 @@ def GLWECipherTextType : MidLFHE_Type<"GLWECipherText"> { // Next parameters block if ($_parser.parseLBrace()) return Type(); - int paddingBits = -1; - if ($_parser.parseOptionalKeyword("_") && $_parser.parseInteger(paddingBits)) - return Type(); - if ($_parser.parseComma()) - return Type(); int p = -1; if ($_parser.parseInteger(p)) return Type(); - if ($_parser.parseComma()) - return Type(); - int phantomBits = -1; - if ($_parser.parseOptionalKeyword("_") && $_parser.parseInteger(phantomBits)) - return Type(); - if ($_parser.parseComma()) - return Type(); - int scalingFactor = -1; - if ($_parser.parseOptionalKeyword("_") && $_parser.parseInteger(scalingFactor)) - return Type(); - if ($_parser.parseComma()) - return Type(); - int log2StdDev = -1; - if ($_parser.parseOptionalKeyword("_") && $_parser.parseInteger(log2StdDev)) - return Type(); if ($_parser.parseRBrace()) return Type(); if ($_parser.parseGreater()) return Type(); Location loc = $_parser.getEncodedSourceLoc($_parser.getNameLoc()); - return getChecked(loc, loc.getContext(), dimension, polynomialSize, bits, paddingBits, p, phantomBits, scalingFactor, log2StdDev); + return getChecked(loc, loc.getContext(), dimension, polynomialSize, bits, p); }]; let genVerifyDecl = true; diff --git a/compiler/lib/Dialect/MidLFHE/IR/MidLFHEDialect.cpp b/compiler/lib/Dialect/MidLFHE/IR/MidLFHEDialect.cpp index 0811392a5..008c537d9 100644 --- a/compiler/lib/Dialect/MidLFHE/IR/MidLFHEDialect.cpp +++ b/compiler/lib/Dialect/MidLFHE/IR/MidLFHEDialect.cpp @@ -40,75 +40,19 @@ void MidLFHEDialect::printType(::mlir::Type type, printer << "unknwontype"; } -/* - * Returns the nubmer of bits from the log2StdDev parameter of a GLWE. - * This is widely inspired by the rust version on concrete: - * - * pub fn nb_bit_from_variance_99(var: f64, torus_bit: usize) -> usize { - * // compute sigma - * let sigma: f64 = f64::sqrt(var); - * - * // the constant to get 99% of the normal distribution - * let z: f64 = 3.; - * let tmp = torus_bit as f64 + f64::log2(sigma * z); - * if tmp < 0. { - * // means no bits are affected by the noise in the integer - * representation (discrete space) 0usize } else { tmp.ceil() as usize - * } - * } - */ -unsigned nbBitsFromLog2StdDev(signed log2StdDev, signed bits) { - long double sigma = std::pow(2, log2StdDev); - long double z = 3; - long double tmp = bits + std::log2(sigma * z); - if (tmp < 0.) { - return 0; - } - return std::ceil(tmp); -} - -/** - * Verify that GLWE parameter are consistant, the layout of the ciphertext is - * organized like that. - * - * [0 0 0 0 0 0 0 0 X X X X X X X M M M M M M M X X X X X X X X 0 0 0 0 0 0 0 E - * E E E E E E E E E E E E] ^ paddingBits ^ ^ p ^ ^ - * phantomBits ^ ^ nb_bits of log2StdDev ^ ^ scalingFactor We - * verify : - * - The bits parameter is 32 or 64 (we support only this value for now) - * - The message is not overlaped by the error - * - The message is still in the ciphertext - */ +/// Verify that GLWE parameter are consistant +/// - The bits parameter is 64 (we support only this for v0) +/// - The p parameter is ]0;7] ::mlir::LogicalResult GLWECipherTextType::verify( ::llvm::function_ref<::mlir::InFlightDiagnostic()> emitError, - signed dimension, signed polynomialSize, signed bits, signed paddingBits, - signed p, signed phantomBits, signed scalingFactor, signed log2StdDev) { - if (bits != -1 && bits != 32 && bits != 64) { - emitError() << "GLWE bits parameter can only be 32 or 64"; + signed dimension, signed polynomialSize, signed bits, signed p) { + if (bits != -1 && bits != 64) { + emitError() << "GLWE bits parameter can only be 64"; return ::mlir::failure(); } - if (bits != -1 && log2StdDev != -1 && scalingFactor != -1 && - phantomBits != -1) { - unsigned errBits = nbBitsFromLog2StdDev(log2StdDev, bits); - if (errBits > scalingFactor + phantomBits) { - emitError() << "GLWE error overlap message, errBits(" << errBits - << ") > scalingFactor(" << scalingFactor << ") + phantomBits(" - << phantomBits << ")"; - return ::mlir::failure(); - } - } - if (bits != -1 && paddingBits != -1 && p != -1 && phantomBits != -1 && - scalingFactor != -1) { - signed int phantomLeft = - (bits - scalingFactor) - phantomBits - p - paddingBits; - if (phantomLeft < 0) { - emitError() << "GLWE padding + message + phantom = " - << phantomBits + p + paddingBits - << " cannot be represented in bits - " - "scalingFactor = " - << (bits - scalingFactor); - return ::mlir::failure(); - } + if (p == 0 || p > 7) { + emitError() << "GLWE p parameter can only be in ]0;7]"; + return mlir::failure(); } return ::mlir::success(); } diff --git a/compiler/lib/Dialect/MidLFHE/IR/MidLFHEOps.cpp b/compiler/lib/Dialect/MidLFHE/IR/MidLFHEOps.cpp index f15c466b4..3c960d1d0 100644 --- a/compiler/lib/Dialect/MidLFHE/IR/MidLFHEOps.cpp +++ b/compiler/lib/Dialect/MidLFHE/IR/MidLFHEOps.cpp @@ -5,292 +5,134 @@ namespace mlir { namespace zamalang { -using ::mlir::zamalang::MidLFHE::AddPlainOp; -using ::mlir::zamalang::MidLFHE::GLWECipherTextType; -using ::mlir::zamalang::MidLFHE::HAddOp; -using ::mlir::zamalang::MidLFHE::MulPlainOp; +namespace MidLFHE { -bool predPBSRegion(::mlir::Region ®ion) { - if (region.getBlocks().size() != 1) { - return false; - } - auto args = region.getBlocks().front().getArguments(); - if (args.size() != 1) { - return false; - } - return args.front().getType().isa(); +void emitOpErrorForIncompatibleGLWEParameter(mlir::OpState &op, + llvm::Twine parameter) { + op.emitOpError() << "should have the same GLWE '" << parameter + << "' parameter"; } -void emitOpErrorForIncompatibleGLWEParameter(::mlir::OpState &op, - ::llvm::Twine parameter) { - ::llvm::Twine msg("should have the same GLWE "); - op.emitError(msg.concat(parameter).concat(" parameter")); -} - -bool verifyAddResultPadding(::mlir::OpState &op, GLWECipherTextType &in, - GLWECipherTextType &out) { - // If the input has no value of paddingBits that doesn't constraint output. - if (in.getPaddingBits() == -1) { - return true; - } - // If the input has 0 paddingBits the ouput should have 0 paddingBits - if (in.getPaddingBits() == 0) { - if (out.getPaddingBits() != 0) { - op.emitError( - "the result shoud have 0 paddingBits has input has 0 paddingBits"); - return false; - } - return true; - } - if (in.getPaddingBits() != out.getPaddingBits() + 1) { - op.emitError("the result should have one less padding bit than the input"); - return false; - } - return true; -} - -bool verifyAddResultHasSameParameters(::mlir::OpState &op, - GLWECipherTextType &in, - GLWECipherTextType &out) { - if (in.getDimension() != out.getDimension()) { +mlir::LogicalResult _verifyGLWEIntegerOperator(mlir::OpState &op, + GLWECipherTextType &a, + IntegerType &b, + GLWECipherTextType &result) { + // verify consistency of a and result GLWE parameter + if (a.getDimension() != result.getDimension()) { emitOpErrorForIncompatibleGLWEParameter(op, "dimension"); - return false; + return mlir::failure(); } - if (in.getPolynomialSize() != out.getPolynomialSize()) { + if (a.getPolynomialSize() != result.getPolynomialSize()) { emitOpErrorForIncompatibleGLWEParameter(op, "polynomialSize"); - return false; + return mlir::failure(); } - if (in.getBits() != out.getBits()) { + if (a.getBits() != result.getBits()) { emitOpErrorForIncompatibleGLWEParameter(op, "bits"); - return false; + return mlir::failure(); } - if (in.getP() != out.getP()) { + if (a.getP() != result.getP()) { emitOpErrorForIncompatibleGLWEParameter(op, "p"); - return false; + return mlir::failure(); } - if (in.getPhantomBits() != out.getPhantomBits()) { - emitOpErrorForIncompatibleGLWEParameter(op, "phantomBits"); - return false; + + // verify consistency of width of inputs + if (a.getP() + 1 != b.getWidth()) { + op.emitOpError() << "should have the width of `b` equals to 'p'+1"; + return mlir::failure(); } - if (in.getScalingFactor() != out.getScalingFactor()) { - emitOpErrorForIncompatibleGLWEParameter(op, "scalingFactor"); - return false; - } - if (in.getLog2StdDev() != out.getLog2StdDev()) { - emitOpErrorForIncompatibleGLWEParameter(op, "log2StdDev"); - return false; - } - return true; + return mlir::success(); } -/** - * veriffyAddPlainOp verify for AddPlainOp(a, x) if the GLWE parameters of the - * output follow the rules: - * - paddingBits: - * - if a.paddingBits == 0 then result.paddingBits == 0 - * - if a.paddingBits > 0 then result.paddingBits == a.paddingBits -1 - * - every other parameters of a and the result should be equals - */ -::mlir::LogicalResult verifyAddPlainOp(AddPlainOp &op) { - GLWECipherTextType in = op.a().getType().cast(); - GLWECipherTextType out = op.getResult().getType().cast(); - if (!verifyAddResultPadding(op, in, out)) { - return ::mlir::failure(); - } - if (!verifyAddResultHasSameParameters(op, in, out)) { - return ::mlir::failure(); - } - return ::mlir::success(); +// verifyGLWEIntegerOperator verify parameters of operators that has the +// following signature (!MidLFHE.glwe<{dim,poly,bits}{p}>, ip+1) -> +// (!MidLFHE.glwe<{dim,poly,bits}{p}>)) +template +mlir::LogicalResult verifyGLWEIntegerOperator(Operator &op) { + auto a = ((mlir::Type)(op.a().getType())).cast(); + auto b = ((mlir::Type)(op.b().getType())).cast(); + auto result = + ((mlir::Type)(op.getResult().getType())).cast(); + + return _verifyGLWEIntegerOperator(op, a, b, result); } -bool verifyHAddResultPadding(::mlir::OpState &op, GLWECipherTextType &inA, - GLWECipherTextType &inB, GLWECipherTextType &out) { - // If the inputs has no value of paddingBits that doesn't constraint output. - if (inA.getPaddingBits() == -1 && inB.getPaddingBits() == -1) { - return true; - } - if (inA.getPaddingBits() != inB.getPaddingBits()) { - emitOpErrorForIncompatibleGLWEParameter(op, "padding"); - return false; - } - return verifyAddResultPadding(op, inA, out); +// verifyIntegerGLWEOperator verify parameters of operators that has the +// following signature (ip+1, !MidLFHE.glwe<{dim,poly,bits}{p}>) -> +// (!MidLFHE.glwe<{dim,poly,bits}{p}>)) +template +mlir::LogicalResult verifyIntegerGLWEOperator(Operator &op) { + auto a = ((mlir::Type)(op.a().getType())).cast(); + auto b = ((mlir::Type)(op.b().getType())).cast(); + auto result = + ((mlir::Type)(op.getResult().getType())).cast(); + + return _verifyGLWEIntegerOperator(op, b, a, result); } -int hAddLog2StdDevOfResult(int a, int b) { - long double va = std::pow(std::pow(2, a), 2); - long double vb = std::pow(std::pow(2, b), 2); - long double vr = va + vb; - return std::log2(::sqrt(vr)); -} +// verifyIntegerOperator verify parameters of operators that has the following +// signature (!MidLFHE.glwe<{dim,poly,bits}{p}>, +// !MidLFHE.glwe<{dim,poly,bits}{p}>) -> +// (!MidLFHE.glwe<{dim,poly,bits}{p}>)) +template +mlir::LogicalResult verifyBinaryGLWEOperator(Operator &op) { + auto a = ((mlir::Type)(op.a().getType())).cast(); + auto b = ((mlir::Type)(op.b().getType())).cast(); + auto result = + ((mlir::Type)(op.getResult().getType())).cast(); -bool verifyHAddResultLog2StdDev(::mlir::OpState &op, GLWECipherTextType &inA, - GLWECipherTextType &inB, - GLWECipherTextType &out) { - // If the inputs has no value of log2StdDev that doesn't constraint output. - if (inA.getLog2StdDev() == -1 && inB.getLog2StdDev() == -1) { - return true; - } - int expectedLog2StdDev = - hAddLog2StdDevOfResult(inA.getLog2StdDev(), inB.getLog2StdDev()); - if (out.getLog2StdDev() != expectedLog2StdDev) { - ::llvm::Twine msg( - "has unexpected log2StdDev parameter of its GLWE result, expected:"); - op.emitOpError(msg.concat(::llvm::Twine(expectedLog2StdDev))); - return false; - } - return true; -} - -bool verifyHAddSameGLWEParameter(::mlir::OpState &op, GLWECipherTextType &inA, - GLWECipherTextType &inB, - GLWECipherTextType &out) { - if (inA.getDimension() != inB.getDimension() || - inA.getDimension() != out.getDimension()) { + // verify consistency of a and result GLWE parameter + if (a.getDimension() != b.getDimension() || + a.getDimension() != result.getDimension()) { emitOpErrorForIncompatibleGLWEParameter(op, "dimension"); - return false; + return mlir::failure(); } - if (inA.getPolynomialSize() != inB.getPolynomialSize() || - inA.getPolynomialSize() != out.getPolynomialSize()) { + if (a.getPolynomialSize() != b.getPolynomialSize() || + a.getPolynomialSize() != result.getPolynomialSize()) { emitOpErrorForIncompatibleGLWEParameter(op, "polynomialSize"); - return false; + return mlir::failure(); } - if (inA.getBits() != inB.getBits() || inA.getBits() != out.getBits()) { + if (a.getBits() != b.getBits() || a.getBits() != result.getBits()) { emitOpErrorForIncompatibleGLWEParameter(op, "bits"); - return false; + return mlir::failure(); } - if (inA.getP() != inB.getP() || inA.getP() != out.getP()) { + if (a.getP() != b.getP() || a.getP() != result.getP()) { emitOpErrorForIncompatibleGLWEParameter(op, "p"); - return false; + return mlir::failure(); } - if (inA.getPhantomBits() != inB.getPhantomBits() || - inA.getPhantomBits() != out.getPhantomBits()) { - emitOpErrorForIncompatibleGLWEParameter(op, "phantomBits"); - return false; - } - if (inA.getScalingFactor() != inB.getScalingFactor() || - inA.getScalingFactor() != out.getScalingFactor()) { - emitOpErrorForIncompatibleGLWEParameter(op, "scalingFactor"); - return false; - } - return true; + + return mlir::success(); } -/** - * verifyHAddOp verify for HAddOp(a, b) if the GLWE parameters of the - * output follow the rules: - * - paddingBits: - * - if a.paddingBits == 0 then result.paddingBits == 0 - * - if a.paddingBits > 0 then result.paddingBits == a.paddingBits -1 - * - a.paddingBits == b.paddingBits - * - log2StdDev: - * - result.log2StdDev should be equals of the result of the noise - * propagation formula for homomorphic addition, i.e. (variance of result == - * variance of a + variance of b) - * - every other parameter should be equals - */ -::mlir::LogicalResult verifyHAddOp(HAddOp &op) { - GLWECipherTextType inA = op.a().getType().cast(); - GLWECipherTextType inB = op.b().getType().cast(); - GLWECipherTextType out = op.getResult().getType().cast(); - if (!verifyHAddSameGLWEParameter(op, inA, inB, out)) { - return ::mlir::failure(); +/// verifyApplyLookupTable verify the GLWE parameters follow the rules: +/// - The l_cst argument must be a memref of one dimension of size 2^p +/// - The lookup table contains integer values of the same width of the output +mlir::LogicalResult verifyApplyLookupTable(ApplyLookupTable &op) { + auto ct = op.ct().getType().cast(); + auto l_cst = op.l_cst().getType().cast(); + auto result = op.getResult().getType().cast(); + + // Check the shape of l_cst argument + auto width = ct.getP(); + auto lCstShape = l_cst.getShape(); + mlir::SmallVector expectedShape{1 << width}; + if (!l_cst.hasStaticShape(expectedShape)) { + op.emitOpError() << "should have as `l_cst` argument a shape of one " + "dimension equals to 2^p, where p is the width of the " + "`ct` argument."; + return mlir::failure(); } - if (!verifyHAddResultPadding(op, inA, inB, out)) { - return ::mlir::failure(); + // Check the witdh of the encrypted integer and the integer of the tabulated + // lambda are equals + if (result.getP() != l_cst.getElementType().cast().getWidth()) { + op.emitOpError() + << "should have equals width beetwen the encrypted integer result and " + "integers of the `tabulated_lambda` argument"; + return mlir::failure(); } - if (!verifyHAddResultLog2StdDev(op, inA, inB, out)) { - return ::mlir::failure(); - } - return ::mlir::success(); -} - -bool verifyMulPlainOpPadding(::mlir::OpState &op, GLWECipherTextType &inA, - ::mlir::Value &inB, GLWECipherTextType &out) { - if (inA.getPaddingBits() == -1) { - return true; - } - if (inA.getPaddingBits() == 0) { - if (out.getPaddingBits() != 0) { - op.emitError( - "the result shoud have 0 paddingBits has input has 0 paddingBits"); - return false; - } - return true; - } - unsigned int additionalBits = 0; - ::mlir::ConstantIntOp constantOp = inB.getDefiningOp<::mlir::ConstantIntOp>(); - if (constantOp != nullptr) { - int64_t value = constantOp.getValue(); - additionalBits = std::ceil(std::log2(value)) + 1; - } else { - ::mlir::IntegerType tyB = inB.getType().cast<::mlir::IntegerType>(); - additionalBits = tyB.getIntOrFloatBitWidth(); - } - unsigned int expectedPadding = inA.getPaddingBits() - additionalBits; - if (out.getPaddingBits() != expectedPadding) { - ::llvm::Twine msg( - "has unexpected padding parameter of its GLWE result, expected:"); - op.emitOpError(msg.concat(::llvm::Twine(expectedPadding))); - return false; - } - return true; -} - -bool verifyMulPlainResultHasSameParameters(::mlir::OpState &op, - GLWECipherTextType &in, - GLWECipherTextType &out) { - if (in.getDimension() != out.getDimension()) { - emitOpErrorForIncompatibleGLWEParameter(op, "dimension"); - return false; - } - if (in.getPolynomialSize() != out.getPolynomialSize()) { - emitOpErrorForIncompatibleGLWEParameter(op, "polynomialSize"); - return false; - } - if (in.getBits() != out.getBits()) { - emitOpErrorForIncompatibleGLWEParameter(op, "bits"); - return false; - } - if (in.getP() != out.getP()) { - emitOpErrorForIncompatibleGLWEParameter(op, "p"); - return false; - } - if (in.getPhantomBits() != out.getPhantomBits()) { - emitOpErrorForIncompatibleGLWEParameter(op, "phantomBits"); - return false; - } - if (in.getScalingFactor() != out.getScalingFactor()) { - emitOpErrorForIncompatibleGLWEParameter(op, "scalingFactor"); - return false; - } - if (in.getLog2StdDev() != out.getLog2StdDev()) { - emitOpErrorForIncompatibleGLWEParameter(op, "log2StdDev"); - return false; - } - return true; -} - -/** - * verifyMulPlainOp verify for MulPlainOp(a, b) if the GLWE parameters of the - * output follow the rules: - * - paddingBits: - * - if a.paddingBits == 0 then result.paddingBits == 0 - * - if a.paddingBits > 0 then result.paddingBits == a.paddingBits - log2(b) - * - every other parameter of a and result should be equals - */ -::mlir::LogicalResult verifyMulPlainOp(MulPlainOp &op) { - GLWECipherTextType inA = op.a().getType().cast(); - ::mlir::Value inB = op.b(); - GLWECipherTextType out = op.getResult().getType().cast(); - if (!verifyMulPlainOpPadding(op, inA, inB, out)) { - return ::mlir::failure(); - } - if (!verifyMulPlainResultHasSameParameters(op, inA, out)) { - return ::mlir::failure(); - } - return ::mlir::success(); + return mlir::success(); } +} // namespace MidLFHE } // namespace zamalang } // namespace mlir diff --git a/compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir b/compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir new file mode 100644 index 000000000..18cb9f48f --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir @@ -0,0 +1,54 @@ +// RUN: zamacompiler --split-input-file --verify-diagnostics %s + +// GLWE p parameter result +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{6}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'p' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{6}>) + return %1: !MidLFHE.glwe<{1024,12,64}{6}> +} + +// ----- + +// GLWE p parameter inputs +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{6}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'p' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{6}>) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} + +// ----- + +// GLWE dimension parameter result +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{512,12,64}{7}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'dimension' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{512,12,64}{7}>) + return %1: !MidLFHE.glwe<{512,12,64}{7}> +} + +// ----- + +// GLWE dimension parameter inputs +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{512,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'dimension' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{512,12,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} + +// ----- + +// GLWE polynomialSize parameter result +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,11,64}{7}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,11,64}{7}>) + return %1: !MidLFHE.glwe<{1024,11,64}{7}> +} + +// ----- + +// GLWE polynomialSize parameter inputs +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,11,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // expected-error @+1 {{'MidLFHE.add_glwe' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,11,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} + diff --git a/compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir b/compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir new file mode 100644 index 000000000..41d5b66e1 --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir @@ -0,0 +1,10 @@ +// RUN: zamacompiler %s 2>&1| FileCheck %s + +// CHECK-LABEL: func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> +func @add_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // CHECK-NEXT: %[[V1:.*]] = "MidLFHE.add_glwe"(%arg0, %arg1) : (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> + // CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<{1024,12,64}{7}> + + %0 = "MidLFHE.add_glwe"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{7}>, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %0: !MidLFHE.glwe<{1024,12,64}{7}> +} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir b/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir new file mode 100644 index 000000000..1f073f22f --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir @@ -0,0 +1,39 @@ +// RUN: zamacompiler --split-input-file --verify-diagnostics %s + +// GLWE p parameter +func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{6}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.add_glwe_int' op should have the same GLWE 'p' parameter}} + %1 = "MidLFHE.add_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,12,64}{6}>) + return %1: !MidLFHE.glwe<{1024,12,64}{6}> +} + +// ----- + +// GLWE dimension parameter +func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{512,12,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.add_glwe_int' op should have the same GLWE 'dimension' parameter}} + %1 = "MidLFHE.add_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{512,12,64}{7}>) + return %1: !MidLFHE.glwe<{512,12,64}{7}> +} + +// ----- + +// GLWE polynomialSize parameter +func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,11,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.add_glwe_int' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.add_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,11,64}{7}>) + return %1: !MidLFHE.glwe<{1024,11,64}{7}> +} + +// ----- + +// integer width doesn't match GLWE parameter +func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + %0 = constant 1 : i6 + // expected-error @+1 {{'MidLFHE.add_glwe_int' op should have the width of `b` equals to 'p'+1}} + %1 = "MidLFHE.add_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i6) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir b/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir new file mode 100644 index 000000000..cbd8e1f61 --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir @@ -0,0 +1,12 @@ +// RUN: zamacompiler %s 2>&1| FileCheck %s + +// CHECK-LABEL: func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> +func @add_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // CHECK-NEXT: %[[V1:.*]] = constant 1 : i8 + // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_glwe_int"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> !MidLFHE.glwe<{1024,12,64}{7}> + // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{7}> + + %0 = constant 1 : i8 + %1 = "MidLFHE.add_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain.mlir deleted file mode 100644 index 2501b1478..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain.mlir +++ /dev/null @@ -1,23 +0,0 @@ -// RUN: zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: func @add_plain_no_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> -func @add_plain_no_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> { - // CHECK-NEXT: %[[V1:.*]] = constant 1 : i32 - // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>, i32) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> - // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> - - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> -} - -// CHECK-LABEL: func @add_plain_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}> -func @add_plain_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}> { - // CHECK-NEXT: %[[V1:.*]] = constant 1 : i32 - // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{2,7,0,41,-25}>, i32) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}> - // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}> - - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{2,7,0,41,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{1,7,0,41,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_bits.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_bits.mlir deleted file mode 100644 index a8a9a5269..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_bits.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE bits parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,32}{0,7,0,25,-82}>) - return %1: !MidLFHE.glwe<{1024,12,32}{0,7,0,25,-82}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_dimension.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_dimension.mlir deleted file mode 100644 index 9fe56cecf..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_dimension.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: should have the same GLWE dimension parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}>) - return %1: !MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_log2StdDev.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_log2StdDev.mlir deleted file mode 100644 index 01fbe252f..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_log2StdDev.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE log2StdDev parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_p.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_p.mlir deleted file mode 100644 index a991338bf..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_p.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE p parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding1.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding1.mlir deleted file mode 100644 index a354677c4..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding1.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: the result shoud have 0 paddingBits has input has 0 paddingBits -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding2.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding2.mlir deleted file mode 100644 index 9d78e1feb..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_padding2.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: the result should have one less padding bit than the input -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>) -> !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_phantomBits.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_phantomBits.mlir deleted file mode 100644 index 441107e06..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_phantomBits.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE phantomBits parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,51,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,51,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_polynomialSize.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_polynomialSize.mlir deleted file mode 100644 index c279f4ae7..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_polynomialSize.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE polynomialSize parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}>) - return %1: !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_scalingFactor.mlir b/compiler/tests/Dialect/MidLFHE/op_add_plain_err_scalingFactor.mlir deleted file mode 100644 index a21a5d960..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_add_plain_err_scalingFactor.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE scalingFactor parameter -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.invalid.mlir b/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.invalid.mlir new file mode 100644 index 000000000..7710c692c --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.invalid.mlir @@ -0,0 +1,17 @@ +// RUN: zamacompiler --split-input-file --verify-diagnostics %s + +// Bad dimension of the lookup table +func @apply_lookup_table(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: memref<4xi2>) -> !MidLFHE.glwe<{512,10,64}{2}> { + // expected-error @+1 {{'MidLFHE.apply_lookup_table' op should have as `l_cst` argument a shape of one dimension equals to 2^p, where p is the width of the `ct` argument}} + %1 = "MidLFHE.apply_lookup_table"(%arg0, %arg1) {k = 1 : i32, polynomialSize = 1024 : i32, levelKS = 2 : i32, baseLogKS = -82 : i32, levelBS = 3 : i32, baseLogBS = -83 : i32}: (!MidLFHE.glwe<{1024,12,64}{7}>, memref<4xi2>) -> (!MidLFHE.glwe<{512,10,64}{2}>) + return %1: !MidLFHE.glwe<{512,10,64}{2}> +} + +// ----- + +// Bad dimension of integer in the lookup table +func @apply_lookup_table(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: memref<128xi3>) -> !MidLFHE.glwe<{512,10,64}{2}> { + // expected-error @+1 {{'MidLFHE.apply_lookup_table' op should have equals width beetwen the encrypted integer result and integers of the `tabulated_lambda` argument}} + %1 = "MidLFHE.apply_lookup_table"(%arg0, %arg1) {k = 1 : i32, polynomialSize = 1024 : i32, levelKS = 2 : i32, baseLogKS = -82 : i32, levelBS = 3 : i32, baseLogBS = -83 : i32}: (!MidLFHE.glwe<{1024,12,64}{7}>, memref<128xi3>) -> (!MidLFHE.glwe<{512,10,64}{2}>) + return %1: !MidLFHE.glwe<{512,10,64}{2}> +} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir b/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir new file mode 100644 index 000000000..209c0b33d --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir @@ -0,0 +1,10 @@ +// RUN: zamacompiler %s 2>&1| FileCheck %s + +// CHECK-LABEL: func @apply_lookup_table(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: memref<128xi2>) -> !MidLFHE.glwe<{512,10,64}{2}> +func @apply_lookup_table(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>, %arg1: memref<128xi2>) -> !MidLFHE.glwe<{512,10,64}{2}> { + // CHECK-NEXT: %[[V1:.*]] = "MidLFHE.apply_lookup_table"(%arg0, %arg1) {baseLogBS = -83 : i32, baseLogKS = -82 : i32, k = 1 : i32, levelBS = 3 : i32, levelKS = 2 : i32, polynomialSize = 1024 : i32} : (!MidLFHE.glwe<{1024,12,64}{7}>, memref<128xi2>) -> !MidLFHE.glwe<{512,10,64}{2}> + // CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<{512,10,64}{2}> + + %1 = "MidLFHE.apply_lookup_table"(%arg0, %arg1) {k = 1 : i32, polynomialSize = 1024 : i32, levelKS = 2 : i32, baseLogKS = -82 : i32, levelBS = 3 : i32, baseLogBS = -83 : i32} : (!MidLFHE.glwe<{1024,12,64}{7}>, memref<128xi2>) -> (!MidLFHE.glwe<{512,10,64}{2}>) + return %1: !MidLFHE.glwe<{512,10,64}{2}> +} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add.mlir deleted file mode 100644 index de224b32a..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add.mlir +++ /dev/null @@ -1,10 +0,0 @@ -// RUN: zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: func @add_plain_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -func @add_plain_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - // CHECK-NEXT: %[[V1:.*]] = "MidLFHE.h_add"(%arg0, %arg1) : (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> - // CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> - - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_dimension.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_dimension.mlir deleted file mode 100644 index ce7001b2d..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_dimension.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: should have the same GLWE dimension parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{2048,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{2048,12,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_log2StdDev.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_log2StdDev.mlir deleted file mode 100644 index 1018ab9a9..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_log2StdDev.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: 'MidLFHE.h_add' op has unexpected log2StdDev parameter of its GLWE result, expected:-22 -func @add_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-23}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> { - %1 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-23}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_p.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_p.mlir deleted file mode 100644 index 9ec49f0a6..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_p.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: should have the same GLWE p parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,8,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,8,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding1.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding1.mlir deleted file mode 100644 index 4a07f3720..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding1.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: should have the same GLWE padding parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding2.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding2.mlir deleted file mode 100644 index cbf0b47e7..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding2.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: the result should have one less padding bit than the input -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{2,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{2,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{2,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding3.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding3.mlir deleted file mode 100644 index f4d9772e9..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_padding3.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: the result shoud have 0 paddingBits has input has 0 paddingBits -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{1,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_phantomBits.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_phantomBits.mlir deleted file mode 100644 index 227aba61e..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_phantomBits.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE phantomBits parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,1,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,1,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_polynomialSize.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_polynomialSize.mlir deleted file mode 100644 index 202dd2fe9..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_polynomialSize.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE polynomialSize parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> { - %0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-24}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_h_add_err_scalingFactor.mlir b/compiler/tests/Dialect/MidLFHE/op_h_add_err_scalingFactor.mlir deleted file mode 100644 index 10b9418cf..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_add_err_scalingFactor.mlir +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE scalingFactor parameter -func @add(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> { - %1 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_h_mul.mlir b/compiler/tests/Dialect/MidLFHE/op_h_mul.mlir deleted file mode 100644 index 27d647b1e..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_h_mul.mlir +++ /dev/null @@ -1,11 +0,0 @@ -// RUN: zamacompiler %s 2>&1| FileCheck %s - - -// CHECK-LABEL: func @mul_plain_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}> -func @mul_plain_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, %arg1: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}> { - // CHECK-NEXT: %[[V1:.*]] = "MidLFHE.h_mul"(%arg0, %arg1) : (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}> - // CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}> - - %0 = "MidLFHE.h_mul"(%arg0, %arg1): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) - return %0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir new file mode 100644 index 000000000..0948db10f --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir @@ -0,0 +1,39 @@ +// RUN: zamacompiler --split-input-file --verify-diagnostics %s + +// GLWE p parameter +func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{6}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.mul_glwe_int' op should have the same GLWE 'p' parameter}} + %1 = "MidLFHE.mul_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,12,64}{6}>) + return %1: !MidLFHE.glwe<{1024,12,64}{6}> +} + +// ----- + +// GLWE dimension parameter +func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{512,12,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.mul_glwe_int' op should have the same GLWE 'dimension' parameter}} + %1 = "MidLFHE.mul_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{512,12,64}{7}>) + return %1: !MidLFHE.glwe<{512,12,64}{7}> +} + +// ----- + +// GLWE polynomialSize parameter +func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,11,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.mul_glwe_int' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.mul_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,11,64}{7}>) + return %1: !MidLFHE.glwe<{1024,11,64}{7}> +} + +// ----- + +// integer width doesn't match GLWE parameter +func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + %0 = constant 1 : i6 + // expected-error @+1 {{'MidLFHE.mul_glwe_int' op should have the width of `b` equals to 'p'+1}} + %1 = "MidLFHE.mul_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i6) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir new file mode 100644 index 000000000..8c99fcd8c --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir @@ -0,0 +1,12 @@ +// RUN: zamacompiler %s 2>&1| FileCheck %s + +// CHECK-LABEL: func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> +func @mul_glwe_int(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // CHECK-NEXT: %[[V1:.*]] = constant 1 : i8 + // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_glwe_int"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> !MidLFHE.glwe<{1024,12,64}{7}> + // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{7}> + + %0 = constant 1 : i8 + %1 = "MidLFHE.mul_glwe_int"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{7}>, i8) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain.mlir deleted file mode 100644 index f37771b39..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain.mlir +++ /dev/null @@ -1,23 +0,0 @@ -// RUN: zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: func @mul_plain_no_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> -func @mul_plain_no_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> { - // CHECK-NEXT: %[[V1:.*]] = constant 1 : i32 - // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> - // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> - - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> -} - -// CHECK-LABEL: func @mul_plain_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,55,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}> -func @mul_plain_padding(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,55,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}> { - // CHECK-NEXT: %[[V1:.*]] = constant 1 : i32 - // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<{1024,12,64}{2,7,0,55,-25}>, i32) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}> - // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}> - - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{2,7,0,55,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{1,7,0,55,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_bits.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_bits.mlir deleted file mode 100644 index 33d5f4d8d..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_bits.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE bits parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,41,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,32}{0,7,0,25,-82}>) - return %1: !MidLFHE.glwe<{1024,12,32}{0,7,0,25,-82}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_dimension.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_dimension.mlir deleted file mode 100644 index e72e66d5a..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_dimension.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: should have the same GLWE dimension parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}>) - return %1: !MidLFHE.glwe<{1023,12,64}{0,7,0,57,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_log2StdDev.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_log2StdDev.mlir deleted file mode 100644 index 6c2465ee5..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_log2StdDev.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE log2StdDev parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-29}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_p.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_p.mlir deleted file mode 100644 index 691da4354..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_p.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE p parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,6,0,57,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding1.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding1.mlir deleted file mode 100644 index f4175c295..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding1.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: the result shoud have 0 paddingBits has input has 0 paddingBits -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{1,7,0,50,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding2.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding2.mlir deleted file mode 100644 index 5138b8b09..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding2.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: 'MidLFHE.mul_plain' op has unexpected padding parameter of its GLWE result, expected:1 -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>) -> !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{2,7,0,51,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding3.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding3.mlir deleted file mode 100644 index 42d7dc51e..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_padding3.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: 'MidLFHE.mul_plain' op has unexpected padding parameter of its GLWE result, expected:1 -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{3,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{3,7,0,50,-25}> { - %0 = constant 2 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{3,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{3,7,0,50,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{3,7,0,50,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_phantomBits.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_phantomBits.mlir deleted file mode 100644 index 829677ad8..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_phantomBits.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE phantomBits parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,51,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,51,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,1,51,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_polynomialSize.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_polynomialSize.mlir deleted file mode 100644 index 3e9673789..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_polynomialSize.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE polynomialSize parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}>) - return %1: !MidLFHE.glwe<{1024,10,64}{0,7,0,50,-25}> -} diff --git a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_scalingFactor.mlir b/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_scalingFactor.mlir deleted file mode 100644 index a6edb0aa5..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_mul_plain_err_scalingFactor.mlir +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: should have the same GLWE scalingFactor parameter -func @mul_plain(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> { - %0 = constant 1 : i32 - %1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<{1024,12,64}{0,7,0,50,-25}>, i32) -> (!MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}>) - return %1: !MidLFHE.glwe<{1024,12,64}{0,7,0,49,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_pbs.mlir b/compiler/tests/Dialect/MidLFHE/op_pbs.mlir deleted file mode 100644 index 64b0f962b..000000000 --- a/compiler/tests/Dialect/MidLFHE/op_pbs.mlir +++ /dev/null @@ -1,18 +0,0 @@ -// RUN: zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: func @pbs_ciphertext(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, %arg1: i32) -> !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> { -func @pbs_ciphertext(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>, %arg1: i32) -> !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> { - // CHECK-NEXT: %[[V1:.*]] = "MidLFHE.pbs"(%arg0) ( { - // CHECK-NEXT: ^bb0(%[[V2:.*]]: i32): // no predecessors - // CHECK-NEXT: %[[V4:.*]] = divi_unsigned %[[V2]], %arg1 : i32 - // CHECK-NEXT: "MidLFHE.pbs_return"(%[[V4]]) : (i32) -> () - // CHECK-NEXT: }) {base_log = 8 : i32, big_n = 1024 : i32, level = 2 : i32, log_noise = -82 : i32} : (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> - // CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> - %0 = "MidLFHE.pbs"(%arg0)({ - ^bb0(%a:i32): - %1 = std.divi_unsigned %a, %arg1 : i32 - "MidLFHE.pbs_return"(%1) : (i32) -> () - }){big_n=1024: i32, log_noise=-82: i32, base_log=8 : i32, level=2 : i32} : (!MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> - - return %0 : !MidLFHE.glwe<{2048,10,64}{0,7,0,2,-82}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir b/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir new file mode 100644 index 000000000..29099bf7e --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir @@ -0,0 +1,40 @@ +// RUN: zamacompiler --split-input-file --verify-diagnostics %s + +// GLWE p parameter +func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{6}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.sub_int_glwe' op should have the same GLWE 'p' parameter}} + %1 = "MidLFHE.sub_int_glwe"(%0, %arg0): (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{6}>) + return %1: !MidLFHE.glwe<{1024,12,64}{6}> +} + +// ----- + +// GLWE dimension parameter +func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{512,12,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.sub_int_glwe' op should have the same GLWE 'dimension' parameter}} + %1 = "MidLFHE.sub_int_glwe"(%0, %arg0): (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{512,12,64}{7}>) + return %1: !MidLFHE.glwe<{512,12,64}{7}> +} + +// ----- + +// GLWE polynomialSize parameter +func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,11,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.sub_int_glwe' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.sub_int_glwe"(%0, %arg0): (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,11,64}{7}>) + return %1: !MidLFHE.glwe<{1024,11,64}{7}> +} + +// ----- + +// integer width doesn't match GLWE parameter +func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,11,64}{7}> { + %0 = constant 1 : i8 + // expected-error @+1 {{'MidLFHE.sub_int_glwe' op should have the same GLWE 'polynomialSize' parameter}} + %1 = "MidLFHE.sub_int_glwe"(%0, %arg0): (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,11,64}{7}>) + return %1: !MidLFHE.glwe<{1024,11,64}{7}> +} + diff --git a/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir b/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir new file mode 100644 index 000000000..80ac750b5 --- /dev/null +++ b/compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir @@ -0,0 +1,12 @@ +// RUN: zamacompiler %s 2>&1| FileCheck %s + +// CHECK-LABEL: func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> +func @sub_int_glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // CHECK-NEXT: %[[V1:.*]] = constant 1 : i8 + // CHECK-NEXT: %[[V2:.*]] = "MidLFHE.sub_int_glwe"(%[[V1]], %arg0) : (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> + // CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<{1024,12,64}{7}> + + %0 = constant 1 : i8 + %1 = "MidLFHE.sub_int_glwe"(%0, %arg0): (i8, !MidLFHE.glwe<{1024,12,64}{7}>) -> (!MidLFHE.glwe<{1024,12,64}{7}>) + return %1: !MidLFHE.glwe<{1024,12,64}{7}> +} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/types_glwe.mlir b/compiler/tests/Dialect/MidLFHE/types_glwe.mlir index 19afca182..2c83ba27f 100644 --- a/compiler/tests/Dialect/MidLFHE/types_glwe.mlir +++ b/compiler/tests/Dialect/MidLFHE/types_glwe.mlir @@ -1,7 +1,13 @@ // RUN: zamacompiler %s 2>&1| FileCheck %s -// CHECK-LABEL: func @glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> -func @glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> { - // CHECK-LABEL: return %arg0 : !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> - return %arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,57,-25}> +// CHECK-LABEL: func @glwe_0(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> +func @glwe_0(%arg0: !MidLFHE.glwe<{1024,12,64}{7}>) -> !MidLFHE.glwe<{1024,12,64}{7}> { + // CHECK-LABEL: return %arg0 : !MidLFHE.glwe<{1024,12,64}{7}> + return %arg0: !MidLFHE.glwe<{1024,12,64}{7}> +} + +// CHECK-LABEL: func @glwe_1(%arg0: !MidLFHE.glwe<{_,_,_}{7}>) -> !MidLFHE.glwe<{_,_,_}{7}> +func @glwe_1(%arg0: !MidLFHE.glwe<{_,_,_}{7}>) -> !MidLFHE.glwe<{_,_,_}{7}> { + // CHECK-LABEL: return %arg0 : !MidLFHE.glwe<{_,_,_}{7}> + return %arg0: !MidLFHE.glwe<{_,_,_}{7}> } \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_2.mlir b/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_2.mlir deleted file mode 100644 index 8620f63c2..000000000 --- a/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_2.mlir +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: GLWE padding + message + phantom = 25 cannot be represented in bits - scalingFactor = 24 -func @glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{15,7,3,40,-25}>) -> !MidLFHE.glwe<{1024,12,64}{15,7,3,40,-25}> { - return %arg0: !MidLFHE.glwe<{1024,12,64}{15,7,3,40,-25}> -} \ No newline at end of file diff --git a/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_overlap_message1.mlir b/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_overlap_message1.mlir deleted file mode 100644 index a6fc1499e..000000000 --- a/compiler/tests/Dialect/MidLFHE/types_glwe_err_error_overlap_message1.mlir +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: not zamacompiler %s 2>&1| FileCheck %s - -// CHECK-LABEL: error: GLWE error overlap message, errBits(41) > scalingFactor(40) + phantomBits(0) -func @glwe(%arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,40,-25}>) -> !MidLFHE.glwe<{1024,12,64}{0,7,0,40,-25}> { - return %arg0: !MidLFHE.glwe<{1024,12,64}{0,7,0,40,-25}> -} \ No newline at end of file