// Copyright (C) 2018-2024 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#pragma once

#include "openvino/op/op.hpp"
#include "snippets/lowered/linear_ir.hpp"

namespace ov {
namespace snippets {
namespace op {

/**
 * @interface Kernel
 * @brief Generated by Canonicalization and represents compute kernel legal for scheduling
 * @ingroup snippets
 */
class Kernel : public ov::op::Op {
public:
    OPENVINO_OP("Kernel", "SnippetsOpset");
    Kernel() = default;
    Kernel(lowered::LinearIR region);

    static std::shared_ptr<Kernel> make_kernel(const lowered::LinearIR& region);

    std::shared_ptr<lowered::LinearIR> region;
    const void *compile_params = nullptr;
};

class KernelStatic : public Kernel {
public:
    OPENVINO_OP("KernelStatic", "SnippetsOpset", Kernel);
    KernelStatic() = default;
    KernelStatic(lowered::LinearIR region);
    std::shared_ptr<Node> clone_with_new_inputs(const OutputVector& inputs) const override;
};

class KernelDynamic : public Kernel {
public:
    OPENVINO_OP("KernelDynamic", "SnippetsOpset", Kernel);
    KernelDynamic() = default;
    KernelDynamic(lowered::LinearIR region);
    std::shared_ptr<Node> clone_with_new_inputs(const OutputVector& inputs) const override;
};

} // namespace op
} // namespace snippets
} // namespace ov
