mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-09 12:15:09 -05:00
fix(compiler): Fixing MidLFHE Dialect for the compiler v0
This commit is contained in:
@@ -18,78 +18,56 @@ include "zamalang/Dialect/MidLFHE/IR/MidLFHETypes.td"
|
||||
class MidLFHE_Op<string mnemonic, list<OpTrait> traits = []> :
|
||||
Op<MidLFHE_Dialect, mnemonic, traits>;
|
||||
|
||||
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<AddGLWEInt>(*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<AddGLWEOp>(*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<MulGLWEInt>(*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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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<mlir::IntegerType>();
|
||||
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>();
|
||||
GLWECipherTextType out = op.getResult().getType().cast<GLWECipherTextType>();
|
||||
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 <class Operator>
|
||||
mlir::LogicalResult verifyGLWEIntegerOperator(Operator &op) {
|
||||
auto a = ((mlir::Type)(op.a().getType())).cast<GLWECipherTextType>();
|
||||
auto b = ((mlir::Type)(op.b().getType())).cast<IntegerType>();
|
||||
auto result =
|
||||
((mlir::Type)(op.getResult().getType())).cast<GLWECipherTextType>();
|
||||
|
||||
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 <class Operator>
|
||||
mlir::LogicalResult verifyIntegerGLWEOperator(Operator &op) {
|
||||
auto a = ((mlir::Type)(op.a().getType())).cast<IntegerType>();
|
||||
auto b = ((mlir::Type)(op.b().getType())).cast<GLWECipherTextType>();
|
||||
auto result =
|
||||
((mlir::Type)(op.getResult().getType())).cast<GLWECipherTextType>();
|
||||
|
||||
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 <class Operator>
|
||||
mlir::LogicalResult verifyBinaryGLWEOperator(Operator &op) {
|
||||
auto a = ((mlir::Type)(op.a().getType())).cast<GLWECipherTextType>();
|
||||
auto b = ((mlir::Type)(op.b().getType())).cast<GLWECipherTextType>();
|
||||
auto result =
|
||||
((mlir::Type)(op.getResult().getType())).cast<GLWECipherTextType>();
|
||||
|
||||
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>();
|
||||
GLWECipherTextType inB = op.b().getType().cast<GLWECipherTextType>();
|
||||
GLWECipherTextType out = op.getResult().getType().cast<GLWECipherTextType>();
|
||||
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<GLWECipherTextType>();
|
||||
auto l_cst = op.l_cst().getType().cast<MemRefType>();
|
||||
auto result = op.getResult().getType().cast<GLWECipherTextType>();
|
||||
|
||||
// Check the shape of l_cst argument
|
||||
auto width = ct.getP();
|
||||
auto lCstShape = l_cst.getShape();
|
||||
mlir::SmallVector<int64_t, 1> 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<IntegerType>().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<GLWECipherTextType>();
|
||||
::mlir::Value inB = op.b();
|
||||
GLWECipherTextType out = op.getResult().getType().cast<GLWECipherTextType>();
|
||||
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
|
||||
|
||||
|
||||
54
compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir
Normal file
54
compiler/tests/Dialect/MidLFHE/op_add_glwe.invalid.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
|
||||
10
compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir
Normal file
10
compiler/tests/Dialect/MidLFHE/op_add_glwe.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
39
compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir
Normal file
39
compiler/tests/Dialect/MidLFHE/op_add_glwe_int.invalid.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
12
compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir
Normal file
12
compiler/tests/Dialect/MidLFHE/op_add_glwe_int.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
10
compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir
Normal file
10
compiler/tests/Dialect/MidLFHE/op_apply_lookup_table.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
39
compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir
Normal file
39
compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.invalid.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
12
compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir
Normal file
12
compiler/tests/Dialect/MidLFHE/op_mul_glwe_int.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
40
compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir
Normal file
40
compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.invalid.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
|
||||
12
compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir
Normal file
12
compiler/tests/Dialect/MidLFHE/op_sub_int_glwe.mlir
Normal file
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
@@ -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}>
|
||||
}
|
||||
Reference in New Issue
Block a user