Add tile declaration capability in KernelWriter

Resolves: COMPMID-5816

Signed-off-by: Gunes Bayir <gunes.bayir@arm.com>
Change-Id: Ibd885707a842550a058252f9d01e072129896055
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9901
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Viet-Hoa Do <viet-hoa.do@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Benchmark: Arm Jenkins <bsgcomp@arm.com>
diff --git a/compute_kernel_writer/include/ckw/Kernel.h b/compute_kernel_writer/include/ckw/Kernel.h
index 0cab713..54e7ca3 100644
--- a/compute_kernel_writer/include/ckw/Kernel.h
+++ b/compute_kernel_writer/include/ckw/Kernel.h
@@ -25,12 +25,17 @@
 #ifndef CKW_INCLUDE_CKW_KERNEL_H
 #define CKW_INCLUDE_CKW_KERNEL_H
 
-#include "ckw/types/TargetLanguage.h"
 #include <string>
 
 namespace ckw
 {
 
+// Forward Declerations
+class TileInfo;
+class ITileOperand;
+
+enum class TargetLanguage;
+
 /** The kernel that has been emitted by the kernel writer.
  *
  * It contains all the necessary information to compile and execute the kernel.
@@ -38,6 +43,8 @@
 class Kernel
 {
 public:
+    virtual ~Kernel();
+
     /** Initialize a new instance of @ref Kernel class with all emitted kernel information.
      *
      * @param[in] language    The target language of the kernel.
@@ -51,6 +58,9 @@
     /** Get the source code. */
     const std::string &source_code() const;
 
+    /** Add a tile operand */
+    virtual ITileOperand &add_operand(const std::string &name, const TileInfo &tile_info) = 0;
+
 private:
     TargetLanguage _language;
     std::string    _source_code;
diff --git a/compute_kernel_writer/include/ckw/KernelWriter.h b/compute_kernel_writer/include/ckw/KernelWriter.h
index ba8a601..f1635c6 100644
--- a/compute_kernel_writer/include/ckw/KernelWriter.h
+++ b/compute_kernel_writer/include/ckw/KernelWriter.h
@@ -25,9 +25,10 @@
 #ifndef CKW_INCLUDE_CKW_KERNELWRITER_H
 #define CKW_INCLUDE_CKW_KERNELWRITER_H
 
-#include "ckw/types/TargetArchitecture.h"
-#include "ckw/types/TargetLanguage.h"
+#include "ckw/ITileOperand.h"
+
 #include <memory>
+#include <set>
 #include <string>
 
 namespace ckw
@@ -35,6 +36,11 @@
 
 class Kernel;
 
+/** Forward Declerations */
+class TileInfo;
+enum class TargetArchitecture;
+enum class TargetLanguage;
+
 /** A kernel writer.
  *
  * This class is used to construct a new kernel by defining arguments, declaring variable and writing code.
@@ -71,6 +77,7 @@
     // =============================================================================================
 
     /** Write the line comment in debug build.
+     *
      * This function does not take effect on release build.
      *
      * The comment must only contain one line (i.e. no newline character is allowed).
@@ -88,6 +95,31 @@
      * @param[in] name The name of the kernel object to be generated.
      */
     virtual std::unique_ptr<Kernel> emit_kernel(const std::string &name) = 0;
+
+    /** Declare a tile given its name and tile info
+     *
+     * @param[in] name Name of the tile
+     * @param[in] tile_info Shape and data type of the tile
+     *
+     * @returns The created tile operand
+     */
+    virtual ITileOperand &declare_tile(const std::string &name, const TileInfo &tile_info) = 0;
+
+protected:
+    int32_t id_space() const;
+
+    /** Pure virtual function to be overridden by language specific subclasses to add a tile operand to the kernel */
+    virtual ITileOperand &add_operand(const std::string &name, const TileInfo &tile_info) = 0;
+
+    /** Add a tile operand to the operand list */
+    ITileOperand &add_operand(std::unique_ptr<ITileOperand> &operand_ptr);
+
+    /** Generate full variable name by prefixing it with id space */
+    std::string generate_full_name(const std::string &name) const;
+
+private:
+    int32_t _id_space{ 0 };
+    std::set<std::unique_ptr<ITileOperand>> _operands {};
 };
 
 } // namespace ckw