From b2f09fd60313675f9f8066a71bb9764ce016a6be Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Tue, 16 Jul 2013 17:24:08 -0400
Subject: [PATCH] Add a regstration interface for library bits

---
 doc/reference.rst        | 11 ++++++++
 loopy/__init__.py        | 55 +++++++++++++++++++++++++++++++++++++---
 loopy/kernel/__init__.py |  4 ---
 3 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/doc/reference.rst b/doc/reference.rst
index a35cf510e..81d1acd14 100644
--- a/doc/reference.rst
+++ b/doc/reference.rst
@@ -298,6 +298,17 @@ Manipulating Instructions
 
 .. autofunction:: add_dependency
 
+Library interface
+^^^^^^^^^^^^^^^^^
+
+.. autofunction:: register_reduction_parser
+
+.. autofunction:: register_preamble_generators
+
+.. autofunction:: register_symbol_manglers
+
+.. autofunction:: register_function_manglers
+
 Argument types
 ^^^^^^^^^^^^^^
 
diff --git a/loopy/__init__.py b/loopy/__init__.py
index 989d1a406..c2289f478 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -90,6 +90,10 @@ __all__ = [
         "make_kernel",
         "register_reduction_parser",
 
+        "extract_subst", "expand_subst",
+        "precompute",
+        "split_arg_axis", "find_padding_multiple", "add_padding"
+
         "get_dot_dependency_graph", "add_argument_dtypes",
         "infer_argument_dtypes", "add_and_infer_argument_dtypes",
 
@@ -104,11 +108,22 @@ __all__ = [
         "LoopyFlags",
 
         "make_kernel",
+
+        # {{{ from this file
+
         "split_iname", "join_inames", "tag_inames", "duplicate_inames",
-        "split_dimension", "join_dimensions", "tag_dimensions",
-        "extract_subst", "expand_subst",
-        "precompute", "add_prefetch",
-        "split_arg_axis", "find_padding_multiple", "add_padding"
+        "rename_iname", "link_inames", "remove_unused_inames",
+        "set_loop_priority", "add_prefetch"
+        "find_instructions", "map_instructions",
+        "set_instruction_priority", "add_dependency",
+        "change_arg_to_image", "tag_data_axes",
+        "split_reduction_inward", "split_reduction_outward",
+        "fix_parameters",
+        "register_preamble_generators",
+        "register_symbol_manglers",
+        "register_function_manglers",
+
+        # }}}
         ]
 
 
@@ -1219,4 +1234,36 @@ def fix_parameter(kernel, name, value):
 
 # }}}
 
+
+# {{{ library registration
+
+def register_preamble_generators(kernel, preamble_generators):
+    new_pgens = kernel.preamble_generators[:]
+    for pgen in preamble_generators:
+        if pgen not in new_pgens:
+            new_pgens.append(pgen)
+
+    return kernel.copy(preamble_generators=new_pgens)
+
+
+def register_symbol_manglers(kernel, manglers):
+    new_manglers = kernel.symbol_manglers[:]
+    for m in manglers:
+        if m not in manglers:
+            new_manglers.append(m)
+
+    return kernel.copy(symbol_manglers=new_manglers)
+
+
+def register_function_manglers(kernel, manglers):
+    new_manglers = kernel.function_manglers[:]
+    for m in manglers:
+        if m not in manglers:
+            new_manglers.append(m)
+
+    return kernel.copy(function_manglers=new_manglers)
+
+# }}}
+
+
 # vim: foldmethod=marker
diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py
index 04ec45757..efc606c24 100644
--- a/loopy/kernel/__init__.py
+++ b/loopy/kernel/__init__.py
@@ -275,10 +275,6 @@ class LoopKernel(Record):
 
     # {{{ function mangling
 
-    def register_function_mangler(self, mangler):
-        return self.copy(
-                function_manglers=[mangler]+self.function_manglers)
-
     def mangle_function(self, identifier, arg_dtypes):
         for mangler in self.function_manglers:
             mangle_result = mangler(identifier, arg_dtypes)
-- 
GitLab