# HEIR tools
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")

package(
    default_applicable_licenses = ["@heir//:license"],
    default_visibility = ["//visibility:public"],
)

# https://bazel.build/remote/output-directories#layout-diagram
WORKSPACE_PATH = ""

# Custom `mlir-opt` replacement that links our dialect and passes
cc_binary(
    name = "heir-opt",
    srcs = ["heir-opt.cpp"],
    data = select({
        "@heir//:config_enable_yosys": [
            "@abc//:abc_bin",
            "@heir//lib/Transforms/YosysOptimizer/yosys:techmap_lut3.v",
            "@heir//lib/Transforms/YosysOptimizer/yosys:techmap_lut4.v",
        ],
        "//conditions:default": [],
    }),
    # The strings in these defines are passed through various pre-processors,
    # including the materializing of quoted strings as done in bash, so to
    # ensure that the #define'd variables stay quoted strings in the generated
    # C++, we need to enclose them in `\\\"` (an escaped backslash followed by
    # an escaped quote).
    defines = select({
        "@heir//:config_enable_yosys": [
            "HEIR_ABC_BINARY=\\\"$(rootpath @abc//:abc_bin)\\\"",
            "HEIR_YOSYS_SCRIPTS_DIR=\\\"" + WORKSPACE_PATH + "lib/Transforms/YosysOptimizer/yosys\\\"",
        ],
        "//conditions:default": ["HEIR_NO_YOSYS=1"],
    }),
    includes = ["include"],
    deps = select({
        "@heir//:config_enable_yosys": [
            "@heir//lib/Transforms/YosysOptimizer",
        ],
        "//conditions:default": [],
    }) + [
        "@heir//lib/Analysis/NoiseAnalysis",  # buildcleaner: keep
        "@heir//lib/Analysis/NoiseAnalysis/BFV:NoiseAnalysis",  # buildcleaner: keep
        "@heir//lib/Analysis/NoiseAnalysis/BGV:NoiseAnalysis",  # buildcleaner: keep
        "@heir//lib/Dialect:HEIRInterfaces",
        "@heir//lib/Dialect/Arith/Conversions/ArithToCGGI",
        "@heir//lib/Dialect/Arith/Conversions/ArithToCGGIQuart",
        "@heir//lib/Dialect/Arith/Conversions/ArithToModArith",
        "@heir//lib/Dialect/BGV/Conversions/BGVToLWE",
        "@heir//lib/Dialect/BGV/IR:Dialect",
        "@heir//lib/Dialect/CGGI/Conversions/CGGIToJaxite",
        "@heir//lib/Dialect/CGGI/Conversions/CGGIToSCIFRBool",
        "@heir//lib/Dialect/CGGI/Conversions/CGGIToTfheRust",
        "@heir//lib/Dialect/CGGI/Conversions/CGGIToTfheRustBool",
        "@heir//lib/Dialect/CGGI/IR:Dialect",
        "@heir//lib/Dialect/CGGI/Transforms",
        "@heir//lib/Dialect/CKKS/IR:Dialect",
        "@heir//lib/Dialect/CKKS/Transforms",
        "@heir//lib/Dialect/Comb/IR:Dialect",
        "@heir//lib/Dialect/Debug/IR:Dialect",
        "@heir//lib/Dialect/Debug/Transforms",
        "@heir//lib/Dialect/Jaxite/IR:Dialect",
        "@heir//lib/Dialect/JaxiteWord/IR:Dialect",
        "@heir//lib/Dialect/LWE/Conversions/LWEToLattigo",
        "@heir//lib/Dialect/LWE/Conversions/LWEToOpenfhe",
        "@heir//lib/Dialect/LWE/Conversions/LWEToPolynomial",
        "@heir//lib/Dialect/LWE/IR:Dialect",
        "@heir//lib/Dialect/LWE/Transforms",
        "@heir//lib/Dialect/Lattigo/IR:Dialect",
        "@heir//lib/Dialect/Lattigo/Transforms",
        "@heir//lib/Dialect/Lattigo/Transforms:AllocToInPlace",
        "@heir//lib/Dialect/Lattigo/Transforms:ConfigureCryptoContext",
        "@heir//lib/Dialect/MathExt/IR:Dialect",
        "@heir//lib/Dialect/Mgmt/IR:Dialect",
        "@heir//lib/Dialect/Mgmt/Transforms",
        "@heir//lib/Dialect/ModArith/Conversions/ModArithToArith",
        "@heir//lib/Dialect/ModArith/IR:Dialect",
        "@heir//lib/Dialect/ModArith/Transforms",
        "@heir//lib/Dialect/ModArith/Transforms:ConvertToMac",
        "@heir//lib/Dialect/Openfhe/IR:Dialect",
        "@heir//lib/Dialect/Openfhe/Transforms",
        "@heir//lib/Dialect/Openfhe/Transforms:ConfigureCryptoContext",
        "@heir//lib/Dialect/Openfhe/Transforms:CountAddAndKeySwitch",
        "@heir//lib/Dialect/Orion/IR:Dialect",
        "@heir//lib/Dialect/Polynomial/Conversions/PolynomialToModArith",
        "@heir//lib/Dialect/Polynomial/IR:Dialect",
        "@heir//lib/Dialect/Polynomial/Transforms",
        "@heir//lib/Dialect/RNS/IR:Dialect",
        "@heir//lib/Dialect/RNS/IR:RNSTypeInterfaces",
        "@heir//lib/Dialect/Random/IR:Dialect",
        "@heir//lib/Dialect/SCIFRBool/IR:Dialect",
        "@heir//lib/Dialect/SCIFRBool/Transforms:CGGIEstimator",
        "@heir//lib/Dialect/SCIFRBool/Transforms:EstimationAnalysis",
        "@heir//lib/Dialect/SCIFRBool/Transforms:ReplaceOpWithSection",
        "@heir//lib/Dialect/SCIFRCkks/Transforms",
        "@heir//lib/Dialect/SCIFRCkks/Transforms:CKKSEstimator",
        "@heir//lib/Dialect/SCIFRCkks/Transforms:OpenfheEstimator",
        "@heir//lib/Dialect/Secret/Conversions/SecretToBGV",
        "@heir//lib/Dialect/Secret/Conversions/SecretToCGGI",
        "@heir//lib/Dialect/Secret/Conversions/SecretToCKKS",
        "@heir//lib/Dialect/Secret/Conversions/SecretToModArith",
        "@heir//lib/Dialect/Secret/IR:Dialect",
        "@heir//lib/Dialect/Secret/Transforms",
        "@heir//lib/Dialect/Secret/Transforms:BufferizableOpInterface",
        "@heir//lib/Dialect/Secret/Transforms:DistributeGeneric",
        "@heir//lib/Dialect/TensorExt/Conversions/TensorExtToTensor",
        "@heir//lib/Dialect/TensorExt/IR:Dialect",
        "@heir//lib/Dialect/TensorExt/Transforms",
        "@heir//lib/Dialect/TensorExt/Transforms:CollapseInsertionChains",
        "@heir//lib/Dialect/TensorExt/Transforms:ImplementShiftNetwork",
        "@heir//lib/Dialect/TensorExt/Transforms:InsertRotate",
        "@heir//lib/Dialect/TensorExt/Transforms:RotateAndReduce",
        "@heir//lib/Dialect/TfheRust/IR:Dialect",
        "@heir//lib/Dialect/TfheRustBool/IR:Dialect",
        "@heir//lib/Pipelines:ArithmeticPipelineRegistration",
        "@heir//lib/Pipelines:BooleanPipelineRegistration",
        "@heir//lib/Pipelines:PipelineRegistration",
        "@heir//lib/Target/SCIFRBool:SCIFRBoolEmitter",
        "@heir//lib/Transforms/ActivationCanonicalizations",
        "@heir//lib/Transforms/AddClientInterface",
        "@heir//lib/Transforms/AnnotateModule",
        "@heir//lib/Transforms/AnnotateMulDepth",
        "@heir//lib/Transforms/AnnotateSecretness",
        "@heir//lib/Transforms/ApplyFolders",
        "@heir//lib/Transforms/BooleanVectorizer",
        "@heir//lib/Transforms/CompareToSignRewrite",
        "@heir//lib/Transforms/ConvertIfToSelect",
        "@heir//lib/Transforms/ConvertSecretExtractToStaticExtract",
        "@heir//lib/Transforms/ConvertSecretForToStaticFor",
        "@heir//lib/Transforms/ConvertSecretInsertToStaticInsert",
        "@heir//lib/Transforms/ConvertSecretWhileToStaticFor",
        "@heir//lib/Transforms/ConvertToCiphertextSemantics",
        "@heir//lib/Transforms/DropUnitDims",
        "@heir//lib/Transforms/ElementwiseToAffine",
        "@heir//lib/Transforms/EmitCInterface",
        "@heir//lib/Transforms/FoldConstantTensors",
        "@heir//lib/Transforms/FoldPlaintextMasks",
        "@heir//lib/Transforms/ForwardInsertSliceToExtractSlice",
        "@heir//lib/Transforms/ForwardInsertToExtract",
        "@heir//lib/Transforms/ForwardStoreToLoad",
        "@heir//lib/Transforms/FullLoopUnroll",
        "@heir//lib/Transforms/GenerateParam",
        "@heir//lib/Transforms/Halo:Transforms",
        "@heir//lib/Transforms/ILPBootstrapPlacement",
        "@heir//lib/Transforms/InlineActivations",
        "@heir//lib/Transforms/LayoutOptimization",
        "@heir//lib/Transforms/LayoutOptimization:InterfaceImpl",
        "@heir//lib/Transforms/LayoutPropagation",
        "@heir//lib/Transforms/LayoutPropagation:InterfaceImpl",
        "@heir//lib/Transforms/LinalgCanonicalizations",
        "@heir//lib/Transforms/LowerPolynomialEval",
        "@heir//lib/Transforms/LowerUnpack",
        "@heir//lib/Transforms/MemrefToArith:ExpandCopy",
        "@heir//lib/Transforms/MemrefToArith:MemrefToArithRegistration",
        "@heir//lib/Transforms/OperationBalancer",
        "@heir//lib/Transforms/OptimizeRelinearization",
        "@heir//lib/Transforms/PolynomialApproximation",
        "@heir//lib/Transforms/PopulateScale",
        "@heir//lib/Transforms/PropagateAnnotation",
        "@heir//lib/Transforms/RemoveUnusedPureCall",
        "@heir//lib/Transforms/RotationAnalysis",
        "@heir//lib/Transforms/SecretInsertMgmt",
        "@heir//lib/Transforms/Secretize",
        "@heir//lib/Transforms/SelectRewrite",
        "@heir//lib/Transforms/ShapeInference",
        "@heir//lib/Transforms/SplitPreprocessing",
        "@heir//lib/Transforms/StraightLineVectorizer",
        "@heir//lib/Transforms/TensorLinalgToAffineLoops",
        "@heir//lib/Transforms/TensorToScalars",
        "@heir//lib/Transforms/UnusedMemRef",
        "@heir//lib/Transforms/ValidateNoise",
        "@llvm-project//llvm:Support",
        "@llvm-project//mlir:AffineDialect",
        "@llvm-project//mlir:AffineToStandard",
        "@llvm-project//mlir:AffineTransforms",
        "@llvm-project//mlir:ArithDialect",
        "@llvm-project//mlir:ArithToLLVM",
        "@llvm-project//mlir:ArithTransforms",
        "@llvm-project//mlir:ArithValueBoundsOpInterfaceImpl",
        "@llvm-project//mlir:BufferizationDialect",
        "@llvm-project//mlir:BufferizationToMemRef",
        "@llvm-project//mlir:BufferizationTransforms",
        "@llvm-project//mlir:ComplexToLLVM",
        "@llvm-project//mlir:ControlFlowToLLVM",
        "@llvm-project//mlir:ControlFlowTransforms",
        "@llvm-project//mlir:ConvertToLLVM",
        "@llvm-project//mlir:EmitCDialect",
        "@llvm-project//mlir:FuncDialect",
        "@llvm-project//mlir:FuncExtensions",
        "@llvm-project//mlir:FuncToLLVM",
        "@llvm-project//mlir:FuncTransforms",
        "@llvm-project//mlir:IR",
        "@llvm-project//mlir:IndexToLLVM",
        "@llvm-project//mlir:LLVMDialect",
        "@llvm-project//mlir:LLVMIRTransforms",
        "@llvm-project//mlir:LinalgDialect",
        "@llvm-project//mlir:LinalgTransforms",
        "@llvm-project//mlir:MathDialect",
        "@llvm-project//mlir:MathToLLVM",
        "@llvm-project//mlir:MemRefDialect",
        "@llvm-project//mlir:MemRefToLLVM",
        "@llvm-project//mlir:MemRefTransforms",
        "@llvm-project//mlir:MlirOptLib",
        "@llvm-project//mlir:Pass",
        "@llvm-project//mlir:ReconcileUnrealizedCasts",
        "@llvm-project//mlir:SCFDialect",
        "@llvm-project//mlir:SCFToControlFlow",
        "@llvm-project//mlir:SCFTransforms",
        "@llvm-project//mlir:Support",
        "@llvm-project//mlir:TensorDialect",
        "@llvm-project//mlir:TensorExtensions",
        "@llvm-project//mlir:TensorInferTypeOpInterfaceImpl",
        "@llvm-project//mlir:TensorToLinalg",
        "@llvm-project//mlir:TensorTransforms",
        "@llvm-project//mlir:Transforms",
        "@llvm-project//mlir:UBToLLVM",
        "@llvm-project//mlir:VectorToLLVM",
    ],
)

# Custom `mlir-translate` replacement that adds our custom translations
cc_binary(
    name = "heir-translate",
    srcs = ["heir-translate.cpp"],
    includes = ["include"],
    deps = [
        "@heir//lib/Target/FunctionInfo:FunctionInfoEmitter",
        "@heir//lib/Target/Jaxite:JaxiteEmitter",
        "@heir//lib/Target/JaxiteWord:JaxiteWordEmitter",
        "@heir//lib/Target/Lattigo:LattigoEmitter",
        "@heir//lib/Target/Metadata:MetadataEmitter",
        "@heir//lib/Target/OpenFhePke:OpenFheRegistration",
        "@heir//lib/Target/SCIFRBool:SCIFRBoolEmitter",
        "@heir//lib/Target/SimFHE:SimFHEEmitter",
        "@heir//lib/Target/TfheRust:TfheRustEmitter",
        "@heir//lib/Target/TfheRustBool:TfheRustBoolEmitter",
        "@heir//lib/Target/TfheRustHL:TfheRustHLEmitter",
        "@heir//lib/Target/Verilog:VerilogEmitter",
        "@llvm-project//llvm:Support",
        "@llvm-project//mlir:TranslateLib",
    ],
)

cc_binary(
    name = "heir-lsp",
    srcs = ["heir-lsp.cpp"],
    includes = ["include"],
    deps = [
        "@heir//lib/Dialect/BGV/IR:Dialect",
        "@heir//lib/Dialect/CGGI/IR:Dialect",
        "@heir//lib/Dialect/CKKS/IR:Dialect",
        "@heir//lib/Dialect/Comb/IR:Dialect",
        "@heir//lib/Dialect/Debug/IR:Dialect",
        "@heir//lib/Dialect/Jaxite/IR:Dialect",
        "@heir//lib/Dialect/JaxiteWord/IR:Dialect",
        "@heir//lib/Dialect/LWE/IR:Dialect",
        "@heir//lib/Dialect/Lattigo/IR:Dialect",
        "@heir//lib/Dialect/MathExt/IR:Dialect",
        "@heir//lib/Dialect/Mgmt/IR:Dialect",
        "@heir//lib/Dialect/ModArith/IR:Dialect",
        "@heir//lib/Dialect/Openfhe/IR:Dialect",
        "@heir//lib/Dialect/Polynomial/IR:Dialect",
        "@heir//lib/Dialect/RNS/IR:Dialect",
        "@heir//lib/Dialect/RNS/IR:RNSTypeInterfaces",  # build_cleaner: keep
        "@heir//lib/Dialect/Random/IR:Dialect",
        "@heir//lib/Dialect/Secret/IR:Dialect",
        "@heir//lib/Dialect/TensorExt/IR:Dialect",
        "@heir//lib/Dialect/TfheRust/IR:Dialect",
        "@heir//lib/Dialect/TfheRustBool/IR:Dialect",
        "@llvm-project//mlir:AffineDialect",
        "@llvm-project//mlir:ArithDialect",
        "@llvm-project//mlir:BufferizationDialect",
        "@llvm-project//mlir:FuncDialect",
        "@llvm-project//mlir:LLVMDialect",
        "@llvm-project//mlir:LinalgDialect",
        "@llvm-project//mlir:MathDialect",
        "@llvm-project//mlir:MemRefDialect",
        "@llvm-project//mlir:MlirLspServerLib",
        "@llvm-project//mlir:MlirOptLib",
        "@llvm-project//mlir:SCFDialect",
        "@llvm-project//mlir:Support",
        "@llvm-project//mlir:TensorDialect",
    ],
)

bzl_library(
    name = "heir_translate_bzl",
    srcs = ["heir-translate.bzl"],
    visibility = ["//visibility:public"],
)

bzl_library(
    name = "heir_opt_bzl",
    srcs = ["heir-opt.bzl"],
    visibility = ["//visibility:public"],
)

bzl_library(
    name = "heir_jaxite_bzl",
    srcs = ["heir-jaxite.bzl"],
    visibility = ["//visibility:public"],
    deps = [
        ":heir_opt_bzl",
        ":heir_translate_bzl",
        "@rules_python//python:py_library_bzl",
    ],
)

bzl_library(
    name = "heir_openfhe_bzl",
    srcs = ["heir-openfhe.bzl"],
    visibility = ["//visibility:public"],
    deps = [
        ":heir_opt_bzl",
        ":heir_translate_bzl",
    ],
)

bzl_library(
    name = "heir_tfhe_rs",
    srcs = ["heir-tfhe-rs.bzl"],
    visibility = ["//visibility:public"],
    deps = [
        ":heir_opt_bzl",
        ":heir_translate_bzl",
    ],
)

bzl_library(
    name = "llc_bzl",
    srcs = ["llc.bzl"],
    visibility = ["//visibility:public"],
)

bzl_library(
    name = "mlir_translate_bzl",
    srcs = ["mlir-translate.bzl"],
    visibility = ["//visibility:public"],
)
