load("//tensorflow:tensorflow.bzl", "tf_copts", "tf_kernel_library")

package(
    default_visibility = ["//tensorflow/compiler/tf2xla:internal"],
    licenses = ["notice"],  # Apache 2.0
)

tf_kernel_library(
    name = "xla_ops",
    srcs = [
        "aggregate_ops.cc",
        "arg_op.cc",
        "batch_matmul_op.cc",
        "batch_norm_op.cc",
        "batchtospace_op.cc",
        "bcast_ops.cc",
        "bias_ops.cc",
        "binary_ops.cc",
        "broadcast_to_op.cc",
        "bucketize_op.cc",
        "cast_op.cc",
        "categorical_op.cc",
        "cholesky_op.cc",
        "clip_by_value_op.cc",
        "concat_op.cc",
        "const_op.cc",
        "conv_ops.cc",
        "cross_op.cc",
        "cwise_ops.cc",
        "cwise_ops.h",
        "depthtospace_op.cc",
        "diag_op.cc",
        "dynamic_slice_ops.cc",
        "dynamic_stitch_op.cc",
        "einsum_op.cc",
        "elu_op.cc",
        "empty_op.cc",
        "extract_image_patches_op.cc",
        "fake_param_op.cc",
        "fake_quantize_ops.cc",
        "fft_ops.cc",
        "fill_op.cc",
        "function_ops.cc",
        "gather_op.cc",
        "gather_op_helpers.h",
        "identity_op.cc",
        "image_ops.cc",
        "image_resize_ops.cc",
        "in_topk_op.cc",
        "index_ops.cc",
        "l2loss_op.cc",
        "listdiff_op.cc",
        "lrn_ops.cc",
        "matmul_op.cc",
        "matrix_band_part_op.cc",
        "matrix_set_diag_op.cc",
        "matrix_triangular_solve_op.cc",
        "mirror_pad_op.cc",
        "no_op.cc",
        "one_hot_op.cc",
        "pack_op.cc",
        "pad_op.cc",
        "permute_op.cc",
        "pooling_ops.cc",
        "qr_op.cc",
        "quantize_and_dequantize_op.cc",
        "random_ops.cc",
        "random_ops_util.h",
        "reduce_window_op.cc",
        "reduction_ops.cc",
        "reduction_ops.h",
        "reduction_ops_common.cc",
        "relu_op.cc",
        "replica_id_op.cc",
        "reshape_op.cc",
        "retval_op.cc",
        "reverse_op.cc",
        "reverse_sequence_op.cc",
        "scan_ops.cc",
        "scatter_nd_op.cc",
        "segment_reduction_ops.cc",
        "select_op.cc",
        "sendrecv_ops.cc",
        "sequence_ops.cc",
        "shape_op.cc",
        "shape_util.cc",
        "slice_op.cc",
        "softmax_op.cc",
        "sort_ops.cc",
        "spacetobatch_op.cc",
        "spacetodepth_op.cc",
        "sparse_to_dense_op.cc",
        "split_op.cc",
        "stack_ops.cc",
        "stateful_random_ops.cc",
        "stateless_random_ops.cc",
        "strided_slice_op.cc",
        "tensor_array_ops.cc",
        "tensor_list_ops.cc",
        "tile_ops.cc",
        "topk_op.cc",
        "training_ops.cc",
        "transpose_op.cc",
        "unary_ops.cc",
        "unpack_op.cc",
        "variable_ops.cc",
        "xla_broadcast_helper_op.cc",
        "xla_conv_op.cc",
        "xla_dequantize_op.cc",
        "xla_dot_op.cc",
        "xla_pad_op.cc",
        "xla_reduce_op.cc",
        "xla_select_and_scatter_op.cc",
        "xla_self_adjoint_eig_op.cc",
        "xla_svd_op.cc",
    ],
    hdrs = [
        "index_ops.h",
        "shape_util.h",
    ],
    tags = ["optonly"],
    deps = [
        ":case_op",
        ":conv_op_helpers",
        ":if_op",
        ":tensor_list_utils",
        ":while_op",
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/tf2xla/lib:broadcast",
        "//tensorflow/compiler/tf2xla/lib:data_format",
        "//tensorflow/compiler/tf2xla/lib:random",
        "//tensorflow/compiler/tf2xla/lib:scatter",
        "//tensorflow/compiler/tf2xla/lib:util",
        "//tensorflow/compiler/tf2xla/ops:xla_ops",
        "//tensorflow/compiler/xla:array4d",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla:literal_util",
        "//tensorflow/compiler/xla:shape_util",
        "//tensorflow/compiler/xla:status_macros",
        "//tensorflow/compiler/xla:util",
        "//tensorflow/compiler/xla:xla_data_proto",
        "//tensorflow/compiler/xla/client:client_library",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/compiler/xla/client:xla_computation",
        "//tensorflow/compiler/xla/client/lib:arithmetic",
        "//tensorflow/compiler/xla/client/lib:comparators",
        "//tensorflow/compiler/xla/client/lib:constants",
        "//tensorflow/compiler/xla/client/lib:loops",
        "//tensorflow/compiler/xla/client/lib:math",
        "//tensorflow/compiler/xla/client/lib:matrix",
        "//tensorflow/compiler/xla/client/lib:pooling",
        "//tensorflow/compiler/xla/client/lib:prng",
        "//tensorflow/compiler/xla/client/lib:qr",
        "//tensorflow/compiler/xla/client/lib:quantize",
        "//tensorflow/compiler/xla/client/lib:self_adjoint_eig",
        "//tensorflow/compiler/xla/client/lib:slicing",
        "//tensorflow/compiler/xla/client/lib:sorting",
        "//tensorflow/compiler/xla/client/lib:svd",
        "//tensorflow/core:bitwise_ops_op_lib",
        "//tensorflow/core:control_flow_ops_op_lib",
        "//tensorflow/core:data_flow_ops_op_lib",
        "//tensorflow/core:framework",
        "//tensorflow/core:framework_bounds_check",
        "//tensorflow/core:functional_ops_op_lib",
        "//tensorflow/core:image_ops_op_lib",
        "//tensorflow/core:lib",
        "//tensorflow/core:linalg_ops_op_lib",
        "//tensorflow/core:list_ops_op_lib",
        "//tensorflow/core:math_ops_op_lib",
        "//tensorflow/core:nn_ops_op_lib",
        "//tensorflow/core:no_op_op_lib",
        "//tensorflow/core:protos_all_cc",
        "//tensorflow/core:random_ops_op_lib",
        "//tensorflow/core:resource_variable_ops_op_lib",
        "//tensorflow/core:sendrecv_ops_op_lib",
        "//tensorflow/core:sparse_ops_op_lib",
        "//tensorflow/core:spectral_ops_op_lib",
        "//tensorflow/core:state_ops_op_lib",
        "//tensorflow/core:stateful_random_ops_op_lib",
        "//tensorflow/core:stateless_random_ops_op_lib",
        "//tensorflow/core:training_ops_op_lib",
        "//tensorflow/core/kernels:constant_op",
        "//tensorflow/core/kernels:control_flow_ops",
        "//tensorflow/core/kernels:cwise_op",
        "//tensorflow/core/kernels:list_kernels",
        "//tensorflow/core/kernels:pooling_ops",
        "//tensorflow/core/kernels:random_op",
        "//tensorflow/core/kernels:resource_variable_ops",
        "//tensorflow/core/kernels:sendrecv_ops",
        "//tensorflow/core/kernels:sparse_to_dense_op",
        "//tensorflow/core/kernels:stack_ops",
        "//tensorflow/core/kernels:stateful_random_ops",
        "//tensorflow/core/kernels:training_ops",
        "@com_google_absl//absl/algorithm:container",
        "@com_google_absl//absl/strings",
        "@com_google_absl//absl/types:optional",
        "@com_google_absl//absl/types:span",
    ],
)

# A separate cc_library for resampler_ops is needed because resampler is in
# contrib/, and thus the declaration of resampler cannot be pulled into the deps
# of xla_ops. Therefore, resampler_ops is its own cc_library target, and its
# corresponding tf_kernel_library is defined in contrib/resampler/BUILD.
cc_library(
    name = "resampler_ops",
    srcs = ["resampler_ops.cc"],
    visibility = ["//visibility:public"],
    deps = [
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/xla:array4d",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla:shape_util",
        "//tensorflow/compiler/xla:xla_data_proto",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/compiler/xla/client/lib:arithmetic",
        "//tensorflow/compiler/xla/client/lib:constants",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//tensorflow/core:protos_all_cc",
    ],
    alwayslink = 1,
)

cc_library(
    name = "conv_op_helpers",
    srcs = ["conv_op_helpers.cc"],
    hdrs = ["conv_op_helpers.h"],
    deps = [
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/xla:literal_util",
        "//tensorflow/compiler/xla:statusor",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/compiler/xla/client/lib:arithmetic",
        "//tensorflow/compiler/xla/client/lib:constants",
        "//tensorflow/core:framework",
        "//tensorflow/core:framework_bounds_check",
        "//tensorflow/core/kernels:conv_ops",
        "@com_google_absl//absl/types:span",
    ],
)

cc_library(
    name = "tensor_list_utils",
    srcs = ["tensor_list_utils.cc"],
    hdrs = ["tensor_list_utils.h"],
    deps = [
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/xla:literal_util",
        "//tensorflow/compiler/xla:shape_util",
        "//tensorflow/compiler/xla:status_macros",
        "//tensorflow/compiler/xla:statusor",
        "//tensorflow/compiler/xla:xla_data_proto",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
    ],
)

cc_library(
    name = "if_while_utils",
    srcs = ["if_while_utils.cc"],
    hdrs = ["if_while_utils.h"],
)

tf_kernel_library(
    name = "while_op",
    srcs = ["while_op.cc"],
    hdrs = ["while_op.h"],
    deps = [
        ":if_while_utils",
        ":tensor_list_utils",
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:side_effect_util",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/tf2xla/ops:xla_ops",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla:status_macros",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/compiler/xla/client:xla_computation",
        "//tensorflow/core:framework",
        "//tensorflow/core:protos_all_cc",
        "@com_google_absl//absl/strings",
    ],
)

tf_kernel_library(
    name = "if_op",
    srcs = ["if_op.cc"],
    hdrs = ["if_op.h"],
    deps = [
        ":if_while_utils",
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:side_effect_util",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/tf2xla/ops:xla_ops",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//tensorflow/core:protos_all_cc",
    ],
)

tf_kernel_library(
    name = "case_op",
    srcs = ["case_op.cc"],
    hdrs = ["case_op.h"],
    deps = [
        ":if_while_utils",
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:side_effect_util",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/tf2xla/ops:xla_ops",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//tensorflow/core:protos_all_cc",
    ],
)

# Kernels that have a dummy (no-op) implementation.
tf_kernel_library(
    name = "xla_dummy_ops",
    srcs = [
        "assert_op.cc",
        "check_numerics_op.cc",
    ],
    deps = [
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/core:array_ops_op_lib",
        "//tensorflow/core:framework",
        "//tensorflow/core:lib",
        "//tensorflow/core:logging_ops_op_lib",
    ],
    alwayslink = 1,
)

# Kernels that only work on CPU, because they use XLA custom calls.
# Only link this when using the CPU backend for XLA.
tf_kernel_library(
    name = "xla_cpu_only_ops",
    srcs = ["index_ops_cpu.cc"],
    deps = [
        ":index_ops_kernel_argmax_float_1d",
        ":index_ops_kernel_argmax_float_2d",
        "//tensorflow/compiler/tf2xla:common",
        "//tensorflow/compiler/tf2xla:xla_compiler",
        "//tensorflow/compiler/xla:literal",
        "//tensorflow/compiler/xla:literal_util",
        "//tensorflow/compiler/xla/client:client_library",
        "//tensorflow/compiler/xla/client:xla_builder",
        "//tensorflow/compiler/xla/client/lib:arithmetic",
        "//tensorflow/core:framework",
        "//tensorflow/core:framework_bounds_check",
        "//tensorflow/core:lib",
    ],
)

cc_library(
    name = "index_ops_kernel_argmax_float_1d",
    srcs = ["index_ops_kernel_argmax_float_1d.cc"],
    copts = tf_copts(),
    visibility = ["//visibility:public"],
    deps = [
        "//tensorflow/compiler/xla/service:custom_call_target_registry",
        "//tensorflow/core:framework_lite",
        "//third_party/eigen3",
    ],
    alwayslink = 1,
)

cc_library(
    name = "index_ops_kernel_argmax_float_2d",
    srcs = ["index_ops_kernel_argmax_float_2d.cc"],
    copts = tf_copts(),
    visibility = ["//visibility:public"],
    deps = [
        "//tensorflow/compiler/xla/service:custom_call_target_registry",
        "//tensorflow/core:framework_lite",
        "//third_party/eigen3",
    ],
    alwayslink = 1,
)
