From 825886d96e576c95725006ea7f2e35a4e9c334e9 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Thu, 8 Feb 2024 15:45:30 +0100
Subject: [PATCH] Generate interfaces

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 runtime/boundary_weights.hpp         | 10 +++++--
 src/pairs/code_gen/cgen.py           | 40 ++++++++++++++++++++++++++++
 src/pairs/sim/domain_partitioning.py |  1 +
 src/pairs/sim/simulation.py          |  1 +
 4 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/runtime/boundary_weights.hpp b/runtime/boundary_weights.hpp
index bf8ffbf..6f62547 100644
--- a/runtime/boundary_weights.hpp
+++ b/runtime/boundary_weights.hpp
@@ -5,7 +5,13 @@
 //---
 #include "pairs.hpp"
 #include "pairs_common.hpp"
-#include "gen/interfaces.hpp"
+
+#define INTERFACE_DIR "interfaces/"
+#define INTERFACE_EXT ".hpp"
+#define INTERFACE_FILE(a, b, c) a ## b ## c
+#define INCLUDE_FILE(filename) #filename
+
+#include INCLUDE_FILE(INTERFACE_FILE(INTERFACE_DIR, APPLICATION_REFERENCE, INTERFACE_EXT))
 
 #pragma once
 
@@ -51,4 +57,4 @@ void compute_boundary_weights(
     }
 }
 
-}
\ No newline at end of file
+}
diff --git a/src/pairs/code_gen/cgen.py b/src/pairs/code_gen/cgen.py
index a053d94..7973f44 100644
--- a/src/pairs/code_gen/cgen.py
+++ b/src/pairs/code_gen/cgen.py
@@ -54,10 +54,50 @@ class CGen:
     def real_type(self):
         return Types.c_keyword(self.sim, Types.Real)
 
+    def generate_interfaces(self):
+        self.print = Printer(f"runtime/interfaces/{self.ref}.hpp")
+        self.print.start()
+        self.print("#include \"../pairs.hpp\"")
+        self.generate_interface_namespace('pairs_host_interface')
+        self.generate_interface_namespace('pairs_cuda_interface', "__inline__ __device__")
+        self.print.end()
+
+    def generate_interface_namespace(self, namespace, prefix=None):
+        self.print("")
+        self.print(f"namespace {namespace} {{")
+        self.print("")
+
+        for prop in self.sim.properties.all():
+            prop_name = prop.name()
+            t = prop.type()
+            tkw = Types.c_keyword(self.sim, t)
+            func_decl = "" if prefix is None else f"{prefix} "
+            if Types.is_scalar(t):
+                func_decl += f"{tkw} get_{prop_name}({tkw} *{prop_name}, int i) {{ return {prop_name}[i]; }}"
+
+            else:
+                nelems = Types.number_of_elements(self.sim, t)
+                func_decl += f"{tkw} get_{prop_name}({tkw} *{prop_name}, int i, int j, int capacity) {{ return {prop_name}["
+
+                if prop.layout() == Layouts.AoS:
+                    func_decl += f"i * {nelems} + j"
+
+                else:
+                    func_decl += f"j * capacity + i"
+
+                func_decl += "]; }"
+
+            self.print(func_decl)
+
+        self.print("")
+        self.print("}")
+
+
     def generate_program(self, ast_node):
         ext = ".cu" if self.target.is_gpu() else ".cpp"
         self.print = Printer(self.ref + ext)
         self.print.start()
+        self.print("#define APPLICATION_REFERENCE \"{self.ref}\"")
 
         if self.target.is_gpu():
             self.print("#define PAIRS_TARGET_CUDA")
diff --git a/src/pairs/sim/domain_partitioning.py b/src/pairs/sim/domain_partitioning.py
index e3668be..a617300 100644
--- a/src/pairs/sim/domain_partitioning.py
+++ b/src/pairs/sim/domain_partitioning.py
@@ -1,5 +1,6 @@
 from pairs.ir.assign import Assign
 from pairs.ir.branches import Filter
+from pairs.ir.loops import For
 from pairs.ir.functions import Call_Int, Call_Void
 from pairs.ir.scalars import ScalarOp
 from pairs.ir.select import Select
diff --git a/src/pairs/sim/simulation.py b/src/pairs/sim/simulation.py
index defaf99..048f309 100644
--- a/src/pairs/sim/simulation.py
+++ b/src/pairs/sim/simulation.py
@@ -453,3 +453,4 @@ class Simulation:
         # Generate program
         #ASTGraph(self.functions, "functions.dot").render()
         self.code_gen.generate_program(program)
+        self.code_gen.generate_interfaces()
-- 
GitLab