  Obtaining good performance when programming heterogeneous computing platforms
poses significant challenges. We present a program transformation environment,
implemented in Haskell, where architecture-agnostic scientific C code with
semantic annotations is transformed into functionally equivalent code better
suited for a given platform. The transformation steps are represented as rules
that can be fired when certain syntactic and semantic conditions are fulfilled.
These rules are not hard-wired into the rewriting engine: they are written in a
C-like language and are automatically processed and incorporated into the
rewriting engine. That makes it possible for end-users to add their own rules
or to provide sets of rules that are adapted to certain specific domains or
purposes.
