feldspar-compiler 0.2.1 → 0.3
raw patch · 35 files changed
+6221/−3433 lines, 35 filesdep +ansi-terminaldep ~basedep ~feldspar-languagesetup-changed
Dependencies added: ansi-terminal
Dependency ranges changed: base, feldspar-language
Files
- Feldspar/C/feldspar.c +0/−269
- Feldspar/C/feldspar.h +0/−78
- Feldspar/C/feldspar_c99.c +1008/−0
- Feldspar/C/feldspar_c99.h +179/−0
- Feldspar/C/feldspar_tic64x.c +1078/−0
- Feldspar/C/feldspar_tic64x.h +191/−0
- Feldspar/Compiler.hs +28/−32
- Feldspar/Compiler/Compiler.hs +47/−51
- Feldspar/Compiler/CompilerMain.hs +84/−142
- Feldspar/Compiler/Error.hs +27/−31
- Feldspar/Compiler/Imperative/CodeGeneration.hs +158/−144
- Feldspar/Compiler/Imperative/Representation.hs +142/−202
- Feldspar/Compiler/Imperative/Semantics.hs +148/−166
- Feldspar/Compiler/Options.hs +129/−34
- Feldspar/Compiler/Platforms.hs +223/−0
- Feldspar/Compiler/PluginArchitecture.hs +1026/−808
- Feldspar/Compiler/PluginArchitecture/DefaultConvert.hs +85/−85
- Feldspar/Compiler/Plugins/BackwardPropagation.hs +114/−121
- Feldspar/Compiler/Plugins/ConstantFolding.hs +0/−72
- Feldspar/Compiler/Plugins/ForwardPropagation.hs +158/−157
- Feldspar/Compiler/Plugins/HandlePrimitives.hs +183/−146
- Feldspar/Compiler/Plugins/Precompilation.hs +58/−59
- Feldspar/Compiler/Plugins/PrettyPrint.hs +33/−41
- Feldspar/Compiler/Plugins/PropagationUtils.hs +175/−138
- Feldspar/Compiler/Plugins/Unroll.hs +84/−87
- Feldspar/Compiler/Precompiler/Precompiler.hs +27/−31
- Feldspar/Compiler/Standalone/Constants.hs +42/−0
- Feldspar/Compiler/Standalone/Library.hs +71/−0
- Feldspar/Compiler/Standalone/Options.hs +151/−0
- Feldspar/Compiler/Transformation/GraphToImperative.hs +208/−198
- Feldspar/Compiler/Transformation/GraphUtils.hs +27/−31
- Feldspar/Compiler/Transformation/Lifting.hs +27/−31
- Feldspar/Fs2dot.hs +265/−269
- Setup.hs +27/−2
- feldspar-compiler.cabal +18/−8
− Feldspar/C/feldspar.c
@@ -1,269 +0,0 @@-/*- * Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- * - * Redistribution and use in source and binary forms, with or without- * modification, are permitted provided that the following conditions- * are met:- * - * * Redistributions of source code must retain the above copyright- * notice,- * this list of conditions and the following disclaimer.- * * Redistributions in binary form must reproduce the above copyright- * notice, this list of conditions and the following disclaimer- * in the documentation and/or other materials provided with the- * distribution.- * * Neither the name of the ERICSSON AB nor the names of its- * contributors- * may be used to endorse or promote products derived from this- * software without specific prior written permission.- * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- */--#include "feldspar.h" - - - -int mod_fun_signed_int( int a, int b ) -{ - if ((a > 0 && b > 0) || (a < 0 && b < 0)) return a % b; - return (a % b) * (-1); -} - -int mod_fun_unsigned_int( unsigned int a, unsigned int b ) -{ - return a % b; -} - -long mod_fun_signed_long( long a, long b ) -{ - if ((a > 0 && b > 0) || (a < 0 && b < 0)) return a % b; - return (a % b) * (-1); -} - -long mod_fun_unsigned_long( unsigned long a, unsigned long b ) -{ - return a % b; -} - - - -int pow_fun_signed_int( int a, int b) -{ - int out = 1; - int i; - for(i=0; i<b; i++) out *= a; - return out; -} - -int pow_fun_unsigned_int( unsigned int a, unsigned int b ) -{ - int out = 1; - unsigned int i; - for(i=0; i<b; i++) out *= a; - return out; -} - - - -int bit_fun_signed_int( int i ) -{ - return 1 << i; -} - -int setBit_fun_signed_int( int x, int i ) -{ - return x ^ 1 << i; -} - -int clearBit_fun_signed_int( int x, int i ) -{ - return x & ~(1 << i); -} - -int complementBit_fun_signed_int( int x, int i ) -{ - return x | 1 << i; -} - -int testBit_fun_signed_int( int x, int i ) -{ - return (x & (1 << i)) != 0; -} - - -int bit_shift_fun_signed_int( int x, int i ) - { - if (i < 0) return x >> -i; - if (i > 0) return x << i; - return x; - } - - -int bit_rotate_fun_signed_int( int x, int i ) -{ - if (i < 0 && x < 0) { - int left = i + sizeof(x) * 8; - return ((x >> -i) & ~bit_shift_fun_signed_int(-1, left)) ^ bit_shift_fun_signed_int(x, left); - } - if (i < 0) return x >> -i ^ bit_shift_fun_signed_int(x, i + sizeof(x) * 8); - else if (i == 0) return x; - else return x << i ^ bit_shift_fun_signed_int(x, i - sizeof(x) * 8); -} - -int rotateL_fun_signed_int( int x, int i ) -{ - return bit_rotate_fun_signed_int(x, i); -} - -int rotateR_fun_signed_int( int x, int i ) -{ - return bit_rotate_fun_signed_int(x, -i); -} - - - - -int bitSize_fun_signed_int( int x ) -{ - return sizeof x * 8; -} - -int isSigned_fun_signed_int( int x ) -{ - (void) x; - return 1; -} - - - -int abs_fun_signed_int( int a ) -{ - if (a < 0) return a*(-1); - return a; -} - -int abs_fun_unsigned_int( unsigned int a ) -{ - return a; -} - -long abs_fun_signed_long( long a ) -{ - if (a < 0) return a*(-1); - return a; -} - -long abs_fun_unsigned_long( unsigned long a ) -{ - return a; -} - -double abs_fun_float( float a ) -{ - if (a < 0) return a*(-1); - return a; -} - -double abs_fun_double( double a ) -{ - if (a < 0) return a*(-1); - return a; -} - - - -int signum_fun_signed_int( int a ) -{ - if (a < 0) return -1; - if (a > 0) return 1; - return 0; -} - -int signum_fun_unsigned_int( unsigned int a ) -{ - if (a > 0) return 1; - return 0; -} - -long signum_fun_signed_long( long a ) -{ - if (a < 0) return -1; - if (a > 0) return 1; - return 0; -} - -long signum_fun_unsigned_long( unsigned long a ) -{ - if (a > 0) return 1; - return 0; -} - -double signum_fun_float( float a ) -{ - if (a < 0) return -1; - if (a > 0) return 1; - return 0; -} - -double signum_fun_double( double a ) -{ - if (a < 0) return -1; - if (a > 0) return 1; - return 0; -} - - - -void copy_arrayOf_signed_int( int* a, int a1, int* b) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -} - -void copy_arrayOf_unsigned_int( unsigned int* a, int a1, unsigned int* b ) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -} - -void copy_arrayOf_signed_long( long* a, int a1, long* b ) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -} - -void copy_arrayOf_unsigned_long( unsigned long* a, int a1, unsigned long* b ) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -} - -void copy_arrayOf_float( float* a, int a1, float* b ) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -} - - -void copy_arrayOf_double( double* a, int a1, double* b ) -{ - int i; - for( i=0; i<a1; ++i ) - b[i] = a[i]; -}
− Feldspar/C/feldspar.h
@@ -1,78 +0,0 @@-/*- * Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- * - * Redistribution and use in source and binary forms, with or without- * modification, are permitted provided that the following conditions- * are met:- * - * * Redistributions of source code must retain the above copyright- * notice,- * this list of conditions and the following disclaimer.- * * Redistributions in binary form must reproduce the above copyright- * notice, this list of conditions and the following disclaimer- * in the documentation and/or other materials provided with the- * distribution.- * * Neither the name of the ERICSSON AB nor the names of its- * contributors- * may be used to endorse or promote products derived from this- * software without specific prior written permission.- * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- */--#ifndef FELDSPAR_H -#define FELDSPAR_H - -int mod_fun_signed_int( int, int ); -int mod_fun_unsigned_int( unsigned int, unsigned int ); -long mod_fun_signed_long( long, long ); -long mod_fun_unsigned_long( unsigned long, unsigned long ); - -int pow_fun_signed_int( int, int ); -int pow_fun_unsigned_int( unsigned int, unsigned int ); - -int bit_fun_signed_int( int ); -int setBit_fun_signed_int( int, int ); -int clearBit_fun_signed_int( int, int ); -int complementBit_fun_signed_int( int, int ); -int testBit_fun_signed_int( int, int ); -int rotateL_fun_signed_int( int, int ); -int rotateR_fun_signed_int( int, int ); -// int bit_shift_fun_signed_int( int, int ); -// int bit_rotate_fun_signed_int( int, int ); -int bitSize_fun_signed_int( int ); -int isSigned_fun_signed_int( int ); - -int abs_fun_signed_int( int ); -int abs_fun_unsigned_int( unsigned int ); -long abs_fun_signed_long( long ); -long abs_fun_unsigned_long( unsigned long ); -double abs_fun_float( float ); -double abs_fun_double( double ); - -int signum_fun_signed_int( int ); -int signum_fun_unsigned_int( unsigned int ); -long signum_fun_signed_long( long ); -long signum_fun_unsigned_long( unsigned long ); -double signum_fun_float( float ); -double signum_fun_double( double ); - -void copy_arrayOf_signed_int( int*, int, int* ); -void copy_arrayOf_unsigned_int( unsigned int*, int, unsigned int* ); -void copy_arrayOf_signed_long( long*, int, long* ); -void copy_arrayOf_unsigned_long( unsigned long*, int, unsigned long* ); -void copy_arrayOf_float( float*, int, float* ); -void copy_arrayOf_double( double*, int, double* ); - - -#endif
+ Feldspar/C/feldspar_c99.c view
@@ -0,0 +1,1008 @@+//+// Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+// +// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+// +// * Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+// * Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+// * Neither the name of the ERICSSON AB nor the names of its contributors+// may be used to endorse or promote products derived from this software+// without specific prior written permission.+// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+// THE POSSIBILITY OF SUCH DAMAGE.+//++#include "feldspar_c99.h"++#include <stdint.h>+#include <stdio.h>+#include <stdlib.h>+#include <math.h>++#if defined(WIN32)+ #include <windows.h>+#else+ #include <sys/time.h>+ #include <time.h>+#endif /* WIN32 */++++/*--------------------------------------------------------------------------*+ * pow(), abs(), signum() *+ *--------------------------------------------------------------------------*/++int8_t pow_fun_int8( int8_t a, int8_t b )+{+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ int8_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++int16_t pow_fun_int16( int16_t a, int16_t b )+{+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ int16_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++int32_t pow_fun_int32( int32_t a, int32_t b )+{+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ int32_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++int64_t pow_fun_int64( int64_t a, int64_t b )+{+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %lld `pow` %lld", a, b);+ exit(1);+ }+ int64_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++uint8_t pow_fun_uint8( uint8_t a, uint8_t b )+{+ uint8_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++uint16_t pow_fun_uint16( uint16_t a, uint16_t b )+{+ uint16_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++uint32_t pow_fun_uint32( uint32_t a, uint32_t b )+{+ uint32_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++uint64_t pow_fun_uint64( uint64_t a, uint64_t b )+{+ uint64_t r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++++int8_t abs_fun_int8( int8_t a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ int8_t mask = a >> 7;+ return (a + mask) ^ mask;+}++int16_t abs_fun_int16( int16_t a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ int16_t mask = a >> 15;+ return (a + mask) ^ mask;+}++int32_t abs_fun_int32( int32_t a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ int32_t mask = a >> 31;+ return (a + mask) ^ mask;+}++int64_t abs_fun_int64( int64_t a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ int64_t mask = a >> 63;+ return (a + mask) ^ mask;+}++++int8_t signum_fun_int8( int8_t a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 7);+}++int16_t signum_fun_int16( int16_t a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 15);+}++int32_t signum_fun_int32( int32_t a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 31);+}++int64_t signum_fun_int64( int64_t a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 63);+}++uint8_t signum_fun_uint8( uint8_t a )+{+ return (a > 0);+}++uint16_t signum_fun_uint16( uint16_t a )+{+ return (a > 0);+}++uint32_t signum_fun_uint32( uint32_t a )+{+ return (a > 0);+}++uint64_t signum_fun_uint64( uint64_t a )+{+ return (a > 0);+}++float signum_fun_float( float a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a > 0) - (a < 0);+}++++/*--------------------------------------------------------------------------*+ * Bit operations *+ *--------------------------------------------------------------------------*/++int8_t bit_fun_int8( int32_t i )+{+ return 1 << i;+}++int16_t bit_fun_int16( int32_t i )+{+ return 1 << i;+}++int32_t bit_fun_int32( int32_t i )+{+ return 1 << i;+}++int64_t bit_fun_int64( int32_t i )+{+ return 1 << i;+}++uint8_t bit_fun_uint8( int32_t i )+{+ return 1 << i;+}++uint16_t bit_fun_uint16( int32_t i )+{+ return 1 << i;+}++uint32_t bit_fun_uint32( int32_t i )+{+ return 1 << i;+}++uint64_t bit_fun_uint64( int32_t i )+{+ return 1 << i;+}++++int8_t setBit_fun_int8( int8_t x, int32_t i )+{+ return x | 1 << i;+}++int16_t setBit_fun_int16( int16_t x, int32_t i )+{+ return x | 1 << i;+}++int32_t setBit_fun_int32( int32_t x, int32_t i )+{+ return x | 1 << i;+}++int64_t setBit_fun_int64( int64_t x, int32_t i )+{+ return x | 1 << i;+}++uint8_t setBit_fun_uint8( uint8_t x, int32_t i )+{+ return x | 1 << i;+}++uint16_t setBit_fun_uint16( uint16_t x, int32_t i )+{+ return x | 1 << i;+}++uint32_t setBit_fun_uint32( uint32_t x, int32_t i )+{+ return x | 1 << i;+}++uint64_t setBit_fun_uint64( uint64_t x, int32_t i )+{+ return x | 1 << i;+}++++int8_t clearBit_fun_int8( int8_t x, int32_t i )+{+ return x & ~(1 << i);+}++int16_t clearBit_fun_int16( int16_t x, int32_t i )+{+ return x & ~(1 << i);+}++int32_t clearBit_fun_int32( int32_t x, int32_t i )+{+ return x & ~(1 << i);+}++int64_t clearBit_fun_int64( int64_t x, int32_t i )+{+ return x & ~(1 << i);+}++uint8_t clearBit_fun_uint8( uint8_t x, int32_t i )+{+ return x & ~(1 << i);+}++uint16_t clearBit_fun_uint16( uint16_t x, int32_t i )+{+ return x & ~(1 << i);+}++uint32_t clearBit_fun_uint32( uint32_t x, int32_t i )+{+ return x & ~(1 << i);+}++uint64_t clearBit_fun_uint64( uint64_t x, int32_t i )+{+ return x & ~(1 << i);+}++++int8_t complementBit_fun_int8( int8_t x, int32_t i )+{+ return x ^ 1 << i;+}++int16_t complementBit_fun_int16( int16_t x, int32_t i )+{+ return x ^ 1 << i;+}++int32_t complementBit_fun_int32( int32_t x, int32_t i )+{+ return x ^ 1 << i;+}++int64_t complementBit_fun_int64( int64_t x, int32_t i )+{+ return x ^ 1 << i;+}++uint8_t complementBit_fun_uint8( uint8_t x, int32_t i )+{+ return x ^ 1 << i;+}++uint16_t complementBit_fun_uint16( uint16_t x, int32_t i )+{+ return x ^ 1 << i;+}++uint32_t complementBit_fun_uint32( uint32_t x, int32_t i )+{+ return x ^ 1 << i;+}++uint64_t complementBit_fun_uint64( uint64_t x, int32_t i )+{+ return x ^ 1 << i;+}++++int testBit_fun_int8( int8_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_int16( int16_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_int32( int32_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_int64( int64_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uint8( uint8_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uint16( uint16_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uint32( uint32_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uint64( uint64_t x, int32_t i )+{+ return (x & 1 << i) != 0;+}++++int8_t rotateL_fun_int8( int8_t x, int32_t i )+{+ if ((i %= 8) == 0) return x;+ return (x << i) | ((0x7f >> (7 - i)) & (x >> (8 - i)));+}++int16_t rotateL_fun_int16( int16_t x, int32_t i )+{+ if ((i %= 16) == 0) return x;+ return (x << i) | ((0x7fff >> (15 - i)) & (x >> (16 - i)));+}++int32_t rotateL_fun_int32( int32_t x, int32_t i )+{+ if ((i %= 32) == 0) return x;+ return (x << i) | ((0x7fffffff >> (31 - i)) & (x >> (32 - i)));+}++int64_t rotateL_fun_int64( int64_t x, int32_t i )+{+ if ((i %= 64) == 0) return x;+ return (x << i) | ((0x7fffffffffffffffll >> (63 - i)) & (x >> (64 - i)));+}++uint8_t rotateL_fun_uint8( uint8_t x, int32_t i )+{+ if ((i %= 8) == 0) return x;+ return (x << i) | (x >> (8 - i));+}++uint16_t rotateL_fun_uint16( uint16_t x, int32_t i )+{+ if ((i %= 16) == 0) return x;+ return (x << i) | (x >> (16 - i));+}++uint32_t rotateL_fun_uint32( uint32_t x, int32_t i )+{+ if ((i %= 32) == 0) return x;+ return (x << i) | (x >> (32 - i));+}++uint64_t rotateL_fun_uint64( uint64_t x, int32_t i )+{+ if ((i %= 64) == 0) return x;+ return (x << i) | (x >> (64 - i));+}++++int8_t rotateR_fun_int8( int8_t x, int32_t i )+{+ if ((i %= 8) == 0) return x;+ return (x << (8 - i)) | ((0x7f >> (i - 1)) & (x >> i));+}++int16_t rotateR_fun_int16( int16_t x, int32_t i )+{+ if ((i %= 16) == 0) return x;+ return (x << (16 - i)) | ((0x7fff >> (i - 1)) & (x >> i));+}++int32_t rotateR_fun_int32( int32_t x, int32_t i )+{+ if ((i %= 32) == 0) return x;+ return (x << (32 - i)) | ((0x7fffffff >> (i - 1)) & (x >> i));+}++int64_t rotateR_fun_int64( int64_t x, int32_t i )+{+ if ((i %= 64) == 0) return x;+ return (x << (64 - i)) | ((0x7fffffffffffffffll >> (i - 1)) & (x >> i));+}++uint8_t rotateR_fun_uint8( uint8_t x, int32_t i )+{+ if ((i %= 8) == 0) return x;+ return (x << (8 - i)) | (x >> i);+}++uint16_t rotateR_fun_uint16( uint16_t x, int32_t i )+{+ if ((i %= 16) == 0) return x;+ return (x << (16 - i)) | (x >> i);+}++uint32_t rotateR_fun_uint32( uint32_t x, int32_t i )+{+ if ((i %= 32) == 0) return x;+ return (x << (32 - i)) | (x >> i);+}++uint64_t rotateR_fun_uint64( uint64_t x, int32_t i )+{+ if ((i %= 64) == 0) return x;+ return (x << (64 - i)) | (x >> i);+}++++int8_t reverseBits_fun_int8( int8_t x )+{+ int8_t r = x;+ int i = 7;+ for (x = x >> 1 & 0x7f; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++int16_t reverseBits_fun_int16( int16_t x )+{+ int16_t r = x;+ int i = 15;+ for (x = x >> 1 & 0x7fff; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++int32_t reverseBits_fun_int32( int32_t x )+{+ int32_t r = x;+ int i = 31;+ for (x = x >> 1 & 0x7fffffff; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++int64_t reverseBits_fun_int64( int64_t x )+{+ int64_t r = x;+ int i = 63;+ for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++uint8_t reverseBits_fun_uint8( uint8_t x )+{+ uint8_t r = x;+ int i = 7;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return x << i;+}++uint16_t reverseBits_fun_uint16( uint16_t x )+{+ uint16_t r = x;+ int i = 15;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++uint32_t reverseBits_fun_uint32( uint32_t x )+{+ uint32_t r = x;+ int i = 31;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++uint64_t reverseBits_fun_uint64( uint64_t x )+{+ uint64_t r = x;+ int i = 63;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++++int32_t bitScan_fun_int8( int8_t x )+{+ if (x == 0) return 7;+ int32_t r = 0;+ int8_t s = (x & 0x80);+ while (((x <<= 1) & 0x80) == s)+ ++r;+ return r;+}++int32_t bitScan_fun_int16( int16_t x )+{+ if (x == 0) return 15;+ int32_t r = 0;+ int16_t s = (x & 0x8000);+ while (((x <<= 1) & 0x8000) == s)+ ++r;+ return r;+}++int32_t bitScan_fun_int32( int32_t x )+{+ if (x == 0) return 31;+ int32_t r = 0;+ int32_t s = (x & 0x80000000);+ while (((x <<= 1) & 0x80000000) == s)+ ++r;+ return r;+}++int32_t bitScan_fun_int64( int64_t x )+{+ if (x == 0) return 63;+ int32_t r = 0;+ int64_t s = (x & 0x8000000000000000ll);+ while (((x <<= 1) & 0x8000000000000000ll) == s)+ ++r;+ return r;+}++int32_t bitScan_fun_uint8( uint8_t x )+{+ int32_t r = 8;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int32_t bitScan_fun_uint16( uint16_t x )+{+ int32_t r = 16;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int32_t bitScan_fun_uint32( uint32_t x )+{+ int32_t r = 32;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int32_t bitScan_fun_uint64( uint64_t x )+{+ int32_t r = 64;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int32_t bitCount_fun_int8( int8_t x )+{+ int32_t r = x & 1;+ for (x = x >> 1 & 0x7f; x; x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_int16( int16_t x )+{+ int32_t r = x & 1;+ for (x = x >> 1 & 0x7fff; x; x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_int32( int32_t x )+{+ int32_t r = x & 1;+ for (x = x >> 1 & 0x7fffffff; x; x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_int64( int64_t x )+{+ int32_t r = x & 1;+ for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_uint8( uint8_t x )+{+ int32_t r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_uint16( uint16_t x )+{+ int32_t r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_uint32( uint32_t x )+{+ int32_t r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int32_t bitCount_fun_uint64( uint64_t x )+{+ int32_t r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++++/*--------------------------------------------------------------------------*+ * copy_arrayOf() *+ *--------------------------------------------------------------------------*/++void copy_arrayOf_int8( int8_t* a, int32_t a1, int8_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_int16( int16_t* a, int32_t a1, int16_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_int32( int32_t* a, int32_t a1, int32_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_int64( int64_t* a, int32_t a1, int64_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uint8( uint8_t* a, int32_t a1, uint8_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uint16( uint16_t* a, int32_t a1, uint16_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uint32( uint32_t* a, int32_t a1, uint32_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uint64( uint64_t* a, int32_t a1, uint64_t* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_float( float* a, signed int a1, float* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++++/*--------------------------------------------------------------------------*+ * Trace functions *+ *--------------------------------------------------------------------------*/++static FILE *trace_log_file;++#if defined(WIN32)++static DWORD trace_start_time;++void traceStart()+{+ SYSTEMTIME lt;+ GetLocalTime(<);+ char str [256];+ sprintf(str, "trace-%04d%02d%02d-%02d%02d%02d.log", + lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);+ trace_log_file = fopen(str, "a");+ if (trace_log_file == NULL) {+ fprintf(stderr,"Can not open trace file.\n");+ exit (8);+ }+ fprintf(trace_log_file, + "The logging started at %02d-%02d-%04d %02d:%02d:%02d.\n", + lt.wDay, lt.wMonth, lt.wYear, lt.wHour, lt.wMinute, lt.wSecond);+ fflush(trace_log_file);+ trace_start_time = GetTickCount();+}++inline void elapsedTimeString( char* str )+{+ DWORD diff_ms = GetTickCount() - trace_start_time;+ DWORD diff = diff_ms / 1000;+ diff_ms = diff_ms % 1000;+ sprintf(str, "%d.%.3d", diff, diff_ms);+}++#else++static struct timeval trace_start_time;++void traceStart()+{+ gettimeofday(&trace_start_time, NULL);+ struct tm * timeinfo = localtime(&(trace_start_time.tv_sec));+ char timestr [80];+ char str [256];+ strftime(timestr, 80, "%Y%m%d-%H%M%S", timeinfo);+ sprintf(str, "trace-%s.log", timestr);+ trace_log_file = fopen(str, "a");+ if (trace_log_file == NULL) {+ fprintf(stderr,"Can not open trace file.\n");+ exit (8);+ }+ strftime(timestr, 80, "%d-%b-%Y %H:%M:%S", timeinfo);+ fprintf(trace_log_file, "The logging started at %s.\n", timestr);+ fflush(trace_log_file);+ gettimeofday(&trace_start_time, NULL);+}++inline void elapsedTimeString( char* str )+{+ struct timeval tv;+ gettimeofday (&tv, NULL);+ if (trace_start_time.tv_usec <= tv.tv_usec) {+ tv.tv_sec = tv.tv_sec - trace_start_time.tv_sec;+ tv.tv_usec = tv.tv_usec - trace_start_time.tv_usec;+ } else {+ tv.tv_sec = tv.tv_sec - trace_start_time.tv_sec - 1;+ tv.tv_usec = 1000000 + tv.tv_usec - trace_start_time.tv_usec;+ }+ sprintf(str, "%ld.%06ld", tv.tv_sec, tv.tv_usec);+}++#endif /* WIN32 */++void traceEnd()+{+ fprintf(trace_log_file, "The logging finished.\n");+ fclose(trace_log_file);+}++void trace_int8( int8_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_int16( int16_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_int32( int32_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_int64( int64_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%lld\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uint8( uint8_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uint16( uint16_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uint32( uint32_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uint64( uint64_t val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%llu\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_float( float val, int32_t id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%f\n", id, timestr, val);+ fflush(trace_log_file);+}
+ Feldspar/C/feldspar_c99.h view
@@ -0,0 +1,179 @@+//+// Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+// +// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+// +// * Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+// * Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+// * Neither the name of the ERICSSON AB nor the names of its contributors+// may be used to endorse or promote products derived from this software+// without specific prior written permission.+// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+// THE POSSIBILITY OF SUCH DAMAGE.+//++#ifndef FELDSPAR_C99_H+#define FELDSPAR_C99_H++#include <stdint.h>++++int8_t pow_fun_int8( int8_t, int8_t );+int16_t pow_fun_int16( int16_t, int16_t );+int32_t pow_fun_int32( int32_t, int32_t );+int64_t pow_fun_int64( int64_t, int64_t );+uint8_t pow_fun_uint8( uint8_t, uint8_t );+uint16_t pow_fun_uint16( uint16_t, uint16_t );+uint32_t pow_fun_uint32( uint32_t, uint32_t );+uint64_t pow_fun_uint64( uint64_t, uint64_t );++int8_t abs_fun_int8( int8_t );+int16_t abs_fun_int16( int16_t );+int32_t abs_fun_int32( int32_t );+int64_t abs_fun_int64( int64_t );++int8_t signum_fun_int8( int8_t );+int16_t signum_fun_int16( int16_t );+int32_t signum_fun_int32( int32_t );+int64_t signum_fun_int64( int64_t );+uint8_t signum_fun_uint8( uint8_t );+uint16_t signum_fun_uint16( uint16_t );+uint32_t signum_fun_uint32( uint32_t );+uint64_t signum_fun_uint64( uint64_t );+float signum_fun_float( float );++++int8_t bit_fun_int8( int32_t );+int16_t bit_fun_int16( int32_t );+int32_t bit_fun_int32( int32_t );+int64_t bit_fun_int64( int32_t );+uint8_t bit_fun_uint8( int32_t );+uint16_t bit_fun_uint16( int32_t );+uint32_t bit_fun_uint32( int32_t );+uint64_t bit_fun_uint64( int32_t );++int8_t setBit_fun_int8( int8_t, int32_t );+int16_t setBit_fun_int16( int16_t, int32_t );+int32_t setBit_fun_int32( int32_t, int32_t );+int64_t setBit_fun_int64( int64_t, int32_t );+uint8_t setBit_fun_uint8( uint8_t, int32_t );+uint16_t setBit_fun_uint16( uint16_t, int32_t );+uint32_t setBit_fun_uint32( uint32_t, int32_t );+uint64_t setBit_fun_uint64( uint64_t, int32_t );++int8_t clearBit_fun_int8( int8_t, int32_t );+int16_t clearBit_fun_int16( int16_t, int32_t );+int32_t clearBit_fun_int32( int32_t, int32_t );+int64_t clearBit_fun_int64( int64_t, int32_t );+uint8_t clearBit_fun_uint8( uint8_t, int32_t );+uint16_t clearBit_fun_uint16( uint16_t, int32_t );+uint32_t clearBit_fun_uint32( uint32_t, int32_t );+uint64_t clearBit_fun_uint64( uint64_t, int32_t );++int8_t complementBit_fun_int8( int8_t, int32_t );+int16_t complementBit_fun_int16( int16_t, int32_t );+int32_t complementBit_fun_int32( int32_t, int32_t );+int64_t complementBit_fun_int64( int64_t, int32_t );+uint8_t complementBit_fun_uint8( uint8_t, int32_t );+uint16_t complementBit_fun_uint16( uint16_t, int32_t );+uint32_t complementBit_fun_uint32( uint32_t, int32_t );+uint64_t complementBit_fun_uint64( uint64_t, int32_t );++int testBit_fun_int8( int8_t, int32_t );+int testBit_fun_int16( int16_t, int32_t );+int testBit_fun_int32( int32_t, int32_t );+int testBit_fun_int64( int64_t, int32_t );+int testBit_fun_uint8( uint8_t, int32_t );+int testBit_fun_uint16( uint16_t, int32_t );+int testBit_fun_uint32( uint32_t, int32_t );+int testBit_fun_uint64( uint64_t, int32_t );++int8_t rotateL_fun_int8( int8_t, int32_t );+int16_t rotateL_fun_int16( int16_t, int32_t );+int32_t rotateL_fun_int32( int32_t, int32_t );+int64_t rotateL_fun_int64( int64_t, int32_t );+uint8_t rotateL_fun_uint8( uint8_t, int32_t );+uint16_t rotateL_fun_uint16( uint16_t, int32_t );+uint32_t rotateL_fun_uint32( uint32_t, int32_t );+uint64_t rotateL_fun_uint64( uint64_t, int32_t );++int8_t rotateR_fun_int8( int8_t, int32_t );+int16_t rotateR_fun_int16( int16_t, int32_t );+int32_t rotateR_fun_int32( int32_t, int32_t );+int64_t rotateR_fun_int64( int64_t, int32_t );+uint8_t rotateR_fun_uint8( uint8_t, int32_t );+uint16_t rotateR_fun_uint16( uint16_t, int32_t );+uint32_t rotateR_fun_uint32( uint32_t, int32_t );+uint64_t rotateR_fun_uint64( uint64_t, int32_t );++int8_t reverseBits_fun_int8( int8_t );+int16_t reverseBits_fun_int16( int16_t );+int32_t reverseBits_fun_int32( int32_t );+int64_t reverseBits_fun_int64( int64_t );+uint8_t reverseBits_fun_uint8( uint8_t );+uint16_t reverseBits_fun_uint16( uint16_t );+uint32_t reverseBits_fun_uint32( uint32_t );+uint64_t reverseBits_fun_uint64( uint64_t );++int32_t bitScan_fun_int8( int8_t );+int32_t bitScan_fun_int16( int16_t );+int32_t bitScan_fun_int32( int32_t );+int32_t bitScan_fun_int64( int64_t );+int32_t bitScan_fun_uint8( uint8_t );+int32_t bitScan_fun_uint16( uint16_t );+int32_t bitScan_fun_uint32( uint32_t );+int32_t bitScan_fun_uint64( uint64_t );++int32_t bitCount_fun_int8( int8_t );+int32_t bitCount_fun_int16( int16_t );+int32_t bitCount_fun_int32( int32_t );+int32_t bitCount_fun_int64( int64_t );+int32_t bitCount_fun_uint8( uint8_t );+int32_t bitCount_fun_uint16( uint16_t );+int32_t bitCount_fun_uint32( uint32_t );+int32_t bitCount_fun_uint64( uint64_t );++++void copy_arrayOf_int8( int8_t*, int32_t, int8_t* );+void copy_arrayOf_int16( int16_t*, int32_t, int16_t* );+void copy_arrayOf_int32( int32_t*, int32_t, int32_t* );+void copy_arrayOf_int64( int64_t*, int32_t, int64_t* );+void copy_arrayOf_uint8( uint8_t*, int32_t, uint8_t* );+void copy_arrayOf_uint16( uint16_t*, int32_t, uint16_t* );+void copy_arrayOf_uint32( uint32_t*, int32_t, uint32_t* );+void copy_arrayOf_uint64( uint64_t*, int32_t, uint64_t* );+void copy_arrayOf_float( float*, int32_t, float* );++++void traceStart();+void traceEnd();++void trace_int8( int8_t, int32_t );+void trace_int16( int16_t, int32_t );+void trace_int32( int32_t, int32_t );+void trace_int64( int64_t, int32_t );+void trace_uint8( uint8_t, int32_t );+void trace_uint16( uint16_t, int32_t );+void trace_uint32( uint32_t, int32_t );+void trace_uint64( uint64_t, int32_t );+void trace_float( float, int32_t );++#endif /* FELDSPAR_C99_H */
+ Feldspar/C/feldspar_tic64x.c view
@@ -0,0 +1,1078 @@+//+// Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+// +// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+// +// * Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+// * Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+// * Neither the name of the ERICSSON AB nor the names of its contributors+// may be used to endorse or promote products derived from this software+// without specific prior written permission.+// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+// THE POSSIBILITY OF SUCH DAMAGE.+//++#include "feldspar_tic64x.h"++#include <stdio.h>+#include <stdlib.h>+#include <math.h>+#include <time.h>++++/*--------------------------------------------------------------------------*+ * pow(), abs(), signum() *+ *--------------------------------------------------------------------------*/++char pow_fun_char( char a, char b )+{+ char r = 1;+ int i;+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++short pow_fun_short( short a, short b )+{+ short r = 1;+ int i;+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++int pow_fun_int( int a, int b )+{+ int r = 1;+ int i;+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %d `pow` %d", a, b);+ exit(1);+ }+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++long pow_fun_long( long a, long b )+{+ long r = 1;+ int i;+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %ld `pow` %ld", a, b);+ exit(1);+ }+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++long long pow_fun_llong( long long a, long long b )+{+ long long r = 1;+ int i;+ if (b < 0) {+ fprintf(stderr, "Negative exponent in function pow_fun_(): %lld `pow` %lld", a, b);+ exit(1);+ }+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++unsigned char pow_fun_uchar( unsigned char a, unsigned char b )+{+ unsigned char r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++unsigned short pow_fun_ushort( unsigned short a, unsigned short b )+{+ unsigned short r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++unsigned pow_fun_uint( unsigned a, unsigned b )+{+ unsigned r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++unsigned long pow_fun_ulong( unsigned long a, unsigned long b )+{+ unsigned long r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++unsigned long long pow_fun_ullong( unsigned long long a, unsigned long long b )+{+ unsigned long long r = 1;+ int i;+ for(i = 0; i < b; ++i)+ r *= a;+ return r;+}++++char abs_fun_char( char a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ char mask = a >> 7;+ return (a + mask) ^ mask;+}++short abs_fun_short( short a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ short mask = a >> 15;+ return (a + mask) ^ mask;+}++long abs_fun_long( long a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ long mask = a >> 39;+ return (a + mask) ^ mask;+}++long long abs_fun_llong( long long a )+{+ // From Bit Twiddling Hacks:+ // "Compute the integer absolute value (abs) without branching"+ long long mask = a >> 63;+ return (a + mask) ^ mask;+}++++char signum_fun_char( char a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 7);+}++short signum_fun_short( short a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 15);+}++int signum_fun_int( int a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 31);+}++long signum_fun_long( long a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 39);+}++long long signum_fun_llong( long long a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a != 0) | (a >> 63);+}++unsigned char signum_fun_uchar( unsigned char a )+{+ return (a > 0);+}++unsigned short signum_fun_ushort( unsigned short a )+{+ return (a > 0);+}++unsigned signum_fun_uint( unsigned a )+{+ return (a > 0);+}++unsigned long signum_fun_ulong( unsigned long a )+{+ return (a > 0);+}++unsigned long long signum_fun_ullong( unsigned long long a )+{+ return (a > 0);+}++float signum_fun_float( float a )+{+ // From Bit Twiddling Hacks: "Compute the sign of an integer"+ return (a > 0) - (a < 0);+}++++/*--------------------------------------------------------------------------*+ * Bit operations *+ *--------------------------------------------------------------------------*/++char setBit_fun_char( char x, int i )+{+ return x | 1 << i;+}++short setBit_fun_short( short x, int i )+{+ return x | 1 << i;+}++int setBit_fun_int( int x, int i )+{+ return x | 1 << i;+}++long setBit_fun_long( long x, int i )+{+ return x | 1 << i;+}++long long setBit_fun_llong( long long x, int i )+{+ return x | 1 << i;+}++unsigned char setBit_fun_uchar( unsigned char x, int i )+{+ return x | 1 << i;+}++unsigned short setBit_fun_ushort( unsigned short x, int i )+{+ return x | 1 << i;+}++unsigned setBit_fun_uint( unsigned x, int i )+{+ return x | 1 << i;+}++unsigned long setBit_fun_ulong( unsigned long x, int i )+{+ return x | 1 << i;+}++unsigned long long setBit_fun_ullong( unsigned long long x, int i )+{+ return x | 1 << i;+}++++char clearBit_fun_char( char x, int i )+{+ return x & ~(1 << i);+}++short clearBit_fun_short( short x, int i )+{+ return x & ~(1 << i);+}++int clearBit_fun_int( int x, int i )+{+ return x & ~(1 << i);+}++long clearBit_fun_long( long x, int i )+{+ return x & ~(1 << i);+}++long long clearBit_fun_llong( long long x, int i )+{+ return x & ~(1 << i);+}++unsigned char clearBit_fun_uchar( unsigned char x, int i )+{+ return x & ~(1 << i);+}++unsigned short clearBit_fun_ushort( unsigned short x, int i )+{+ return x & ~(1 << i);+}++unsigned clearBit_fun_uint( unsigned x, int i )+{+ return x & ~(1 << i);+}++unsigned long clearBit_fun_ulong( unsigned long x, int i )+{+ return x & ~(1 << i);+}++unsigned long long clearBit_fun_ullong( unsigned long long x, int i )+{+ return x & ~(1 << i);+}++++char complementBit_fun_char( char x, int i )+{+ return x ^ 1 << i;+}++short complementBit_fun_short( short x, int i )+{+ return x ^ 1 << i;+}++int complementBit_fun_int( int x, int i )+{+ return x ^ 1 << i;+}++long complementBit_fun_long( long x, int i )+{+ return x ^ 1 << i;+}++long long complementBit_fun_llong( long long x, int i )+{+ return x ^ 1 << i;+}++unsigned char complementBit_fun_uchar( unsigned char x, int i )+{+ return x ^ 1 << i;+}++unsigned short complementBit_fun_ushort( unsigned short x, int i )+{+ return x ^ 1 << i;+}++unsigned complementBit_fun_uint( unsigned x, int i )+{+ return x ^ 1 << i;+}++unsigned long complementBit_fun_ulong( unsigned long x, int i )+{+ return x ^ 1 << i;+}++unsigned long long complementBit_fun_ullong( unsigned long long x, int i )+{+ return x ^ 1 << i;+}++++int testBit_fun_char( char x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_short( short x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_int( int x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_long( long x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_llong( long long x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uchar( unsigned char x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_ushort( unsigned short x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_uint( unsigned x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_ulong( unsigned long x, int i )+{+ return (x & 1 << i) != 0;+}++int testBit_fun_ullong( unsigned long long x, int i )+{+ return (x & 1 << i) != 0;+}++++char rotateL_fun_char( char x, int i )+{+ if ((i %= 8) == 0) return x;+ return (x << i) | ((0x7f >> (7 - i)) & (x >> (8 - i)));+}++short rotateL_fun_short( short x, int i )+{+ if ((i %= 16) == 0) return x;+ return (x << i) | ((0x7fff >> (15 - i)) & (x >> (16 - i)));+}++int rotateL_fun_int( int x, int i )+{+ return (int)_rotl((unsigned)x, (unsigned)i);+/* if ((i %= 32) == 0) return x;+ return (x << i) | ((0x7fffffff >> (31 - i)) & (x >> (32 - i)));*/+}++long rotateL_fun_long( long x, int i )+{+ if ((i %= 40) == 0) return x;+ return (x << i) | ((0x7fffffffffl >> (39 - i)) & (x >> (40 - i)));+}++long long rotateL_fun_llong( long long x, int i )+{+ if ((i %= 64) == 0) return x;+ return (x << i) | ((0x7fffffffffffffffll >> (63 - i)) & (x >> (64 - i)));+}++unsigned char rotateL_fun_uchar( unsigned char x, int i )+{+ if ((i %= 8) == 0) return x;+ return (x << i) | (x >> (8 - i));+}++unsigned short rotateL_fun_ushort( unsigned short x, int i )+{+ if ((i %= 16) == 0) return x;+ return (x << i) | (x >> (16 - i));+}++unsigned long rotateL_fun_ulong( unsigned long x, int i )+{+ if ((i %= 40) == 0) return x;+ return (x << i) | (x >> (40 - i));+}++unsigned long long rotateL_fun_ullong( unsigned long long x, int i )+{+ if ((i %= 64) == 0) return x;+ return (x << i) | (x >> (64 - i));+}++++char rotateR_fun_char( char x, int i )+{+ if ((i %= 8) == 0) return x;+ return (x << (8 - i)) | ((0x7f >> (i - 1)) & (x >> i));+}++short rotateR_fun_short( short x, int i )+{+ if ((i %= 16) == 0) return x;+ return (x << (16 - i)) | ((0x7fff >> (i - 1)) & (x >> i));+}++int rotateR_fun_int( int x, int i )+{+ if ((i %= 32) == 0) return x;+ return (x << (32 - i)) | ((0x7fffffff >> (i - 1)) & (x >> i));+}++long rotateR_fun_long( long x, int i )+{+ if ((i %= 40) == 0) return x;+ return (x << (40 - i)) | ((0x7fffffffffl >> (i - 1)) & (x >> i));+}++long long rotateR_fun_llong( long long x, int i )+{+ if ((i %= 64) == 0) return x;+ return (x << (64 - i)) | ((0x7fffffffffffffffll >> (i - 1)) & (x >> i));+}++unsigned char rotateR_fun_uchar( unsigned char x, int i )+{+ if ((i %= 8) == 0) return x;+ return (x << (8 - i)) | (x >> i);+}++unsigned short rotateR_fun_ushort( unsigned short x, int i )+{+ if ((i %= 16) == 0) return x;+ return (x << (16 - i)) | (x >> i);+}++unsigned rotateR_fun_uint( unsigned x, int i )+{+ if ((i %= 32) == 0) return x;+ return (x << (32 - i)) | (x >> i);+}++unsigned long rotateR_fun_ulong( unsigned long x, int i )+{+ if ((i %= 40) == 0) return x;+ return (x << (40 - i)) | (x >> i);+}++unsigned long long rotateR_fun_ullong( unsigned long long x, int i )+{+ if ((i %= 64) == 0) return x;+ return (x << (64 - i)) | (x >> i);+}++++char reverseBits_fun_char( char x )+{+ char r = x;+ int i = 7;+ for (x = x >> 1 & 0x7f; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++short reverseBits_fun_short( short x )+{+ short r = x;+ int i = 15;+ for (x = x >> 1 & 0x7fff; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++int reverseBits_fun_int( int x )+{+ int r = x;+ int i = 31;+ for (x = x >> 1 & 0x7fffffff; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++long reverseBits_fun_long( long x )+{+ long r = x;+ int i = 39;+ for (x = x >> 1 & 0x7fffffffffl; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++long long reverseBits_fun_llong( long long x )+{+ long long r = x;+ int i = 63;+ for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1) + {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++unsigned char reverseBits_fun_uchar( unsigned char x )+{+ unsigned char r = x;+ int i = 7;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return x << i;+}++unsigned short reverseBits_fun_ushort( unsigned short x )+{+ unsigned short r = x;+ int i = 15;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++unsigned long reverseBits_fun_ulong( unsigned long x )+{+ unsigned long r = x;+ int i = 39;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++unsigned long long reverseBits_fun_ullong( unsigned long long x )+{+ unsigned long long r = x;+ int i = 63;+ while (x >>= 1)+ {+ r = (r << 1) | (x & 1);+ --i;+ }+ return r << i;+}++++int bitScan_fun_char( char x )+{+ int r = 0;+ char s = (x & 0x80);+ if (x == 0) return 7;+ while (((x <<= 1) & 0x80) == s)+ ++r;+ return r;+}++int bitScan_fun_short( short x )+{+ int r = 0;+ short s = (x & 0x8000);+ if (x == 0) return 15;+ while (((x <<= 1) & 0x8000) == s)+ ++r;+ return r;+}++int bitScan_fun_int( int x )+{+ int r = 0;+ int s = (x & 0x80000000);+ if (x == 0) return 31;+ while (((x <<= 1) & 0x80000000) == s)+ ++r;+ return r;+}++int bitScan_fun_long( long x )+{+ int r = 0;+ long s = (x & 0x8000000000l);+ if (x == 0) return 39;+ while (((x <<= 1) & 0x8000000000l) == s)+ ++r;+ return r;+}++int bitScan_fun_llong( long long x )+{+ int r = 0;+ long long s = (x & 0x8000000000000000ll);+ if (x == 0) return 63;+ while (((x <<= 1) & 0x8000000000000000ll) == s)+ ++r;+ return r;+}++int bitScan_fun_uchar( unsigned char x )+{+ int r = 8;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int bitScan_fun_ushort( unsigned short x )+{+ int r = 16;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int bitScan_fun_uint( unsigned x )+{+ int r = 32;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int bitScan_fun_ulong( unsigned long x )+{+ int r = 40;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int bitScan_fun_ullong( unsigned long long x )+{+ int r = 64;+ while (x)+ {+ --r;+ x >>= 1;+ }+ return r;+}++int bitCount_fun_char( char x )+{+ int r = x & 1;+ for (x = x >> 1 & 0x7f; x; x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_short( short x )+{+ int r = x & 1;+ for (x = x >> 1 & 0x7fff; x; x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_int( int x )+{+ int r = x & 1;+ for (x = x >> 1 & 0x7fffffff; x; x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_long( long x )+{+ int r = x & 1;+ for (x = x >> 1 & 0x7fffffffffl; x; x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_llong( long long x )+{+ int r = x & 1;+ for (x = x >> 1 & 0x7fffffffffffffffll; x; x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_uchar( unsigned char x )+{+ int r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_ushort( unsigned short x )+{+ int r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_ulong( unsigned long x )+{+ int r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++int bitCount_fun_ullong( unsigned long long x )+{+ int r = x & 1;+ while (x >>= 1)+ r += x & 1;+ return r;+}++++/*--------------------------------------------------------------------------*+ * copy_arrayOf() *+ *--------------------------------------------------------------------------*/++void copy_arrayOf_char( char* a, int a1, char* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_short( short* a, int a1, short* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_int( int* a, int a1, int* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_long( long* a, int a1, long* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_llong( long long* a, int a1, long long* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uchar( unsigned char* a, int a1, unsigned char* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_ushort( unsigned short* a, int a1, unsigned short* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_uint( unsigned* a, int a1, unsigned* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_ulong( unsigned long* a, int a1, unsigned long* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_ullong( unsigned long long* a, int a1, unsigned long long* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++void copy_arrayOf_float( float* a, signed int a1, float* b )+{+ int i;+ for(i = 0; i < a1; ++i)+ b[i] = a[i];+}++++/*--------------------------------------------------------------------------*+ * Trace functions *+ *--------------------------------------------------------------------------*/++static FILE *trace_log_file;+static time_t trace_start_time;++void traceStart()+{+ char timestr [80];+ char str [256];+ struct tm * timeinfo;+ trace_start_time = time(NULL);+ timeinfo = localtime(&(trace_start_time));+ strftime(timestr, 80, "%Y%m%d-%H%M%S", timeinfo);+ sprintf(str, "trace-%s.log", timestr);+ trace_log_file = fopen(str, "a");+ if (trace_log_file == NULL) {+ fprintf(stderr,"Can not open trace file.\n");+ exit (8);+ }+ strftime(timestr, 80, "%d-%b-%Y %H:%M:%S", timeinfo);+ fprintf(trace_log_file, "The logging started at %s.\n", timestr);+ fflush(trace_log_file);+ trace_start_time = time(NULL);+}++inline void elapsedTimeString( char* str )+{+ sprintf(str, "%ld.000", time(NULL) - trace_start_time);+}++void traceEnd()+{+ fprintf(trace_log_file, "The logging finished.\n");+ fclose(trace_log_file);+}++void trace_char( char val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_short( short val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_int( int val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%d\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_long( long val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%ld\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_llong( long long val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%lld\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uchar( unsigned char val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_ushort( unsigned short val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_uint( unsigned val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%u\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_ulong( unsigned long val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%lu\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_ullong( unsigned long long val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%llu\n", id, timestr, val);+ fflush(trace_log_file);+}++void trace_float( float val, int id )+{+ char timestr [80];+ elapsedTimeString(timestr);+ fprintf(trace_log_file, "id=%d, time=%s, value=%f\n", id, timestr, val);+ fflush(trace_log_file);+}
+ Feldspar/C/feldspar_tic64x.h view
@@ -0,0 +1,191 @@+//+// Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+// +// Redistribution and use in source and binary forms, with or without+// modification, are permitted provided that the following conditions are met:+// +// * Redistributions of source code must retain the above copyright notice,+// this list of conditions and the following disclaimer.+// * Redistributions in binary form must reproduce the above copyright+// notice, this list of conditions and the following disclaimer in the+// documentation and/or other materials provided with the distribution.+// * Neither the name of the ERICSSON AB nor the names of its contributors+// may be used to endorse or promote products derived from this software+// without specific prior written permission.+// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+// THE POSSIBILITY OF SUCH DAMAGE.+//++#ifndef FELDSPAR_TI_C64X_H+#define FELDSPAR_TI_C64X_H++++char pow_fun_char( char, char );+short pow_fun_short( short, short );+int pow_fun_int( int, int );+long pow_fun_long( long, long );+long long pow_fun_llong( long long, long long );+unsigned char pow_fun_uchar( unsigned char, unsigned char );+unsigned short pow_fun_ushort( unsigned short, unsigned short );+unsigned pow_fun_uint( unsigned, unsigned );+unsigned long pow_fun_ulong( unsigned long, unsigned long );+unsigned long long pow_fun_ullong( unsigned long long, unsigned long long );++char abs_fun_char( char );+short abs_fun_short( short );+long abs_fun_long( long );+long long abs_fun_llong( long long );++char signum_fun_char( char );+short signum_fun_short( short );+int signum_fun_int( int );+long signum_fun_long( long );+long long signum_fun_llong( long long );+unsigned char signum_fun_uchar( unsigned char );+unsigned short signum_fun_ushort( unsigned short );+unsigned signum_fun_uint( unsigned );+unsigned long signum_fun_ulong( unsigned long );+unsigned long long signum_fun_ullong( unsigned long long );+float signum_fun_float( float );++++char setBit_fun_char( char, int );+short setBit_fun_short( short, int );+int setBit_fun_int( int, int );+long setBit_fun_long( long, int );+long long setBit_fun_llong( long long, int );+unsigned char setBit_fun_uchar( unsigned char, int );+unsigned short setBit_fun_ushort( unsigned short, int );+unsigned setBit_fun_uint( unsigned, int );+unsigned long setBit_fun_ulong( unsigned long, int );+unsigned long long setBit_fun_ullong( unsigned long long, int );++char clearBit_fun_char( char, int );+short clearBit_fun_short( short, int );+int clearBit_fun_int( int, int );+long clearBit_fun_long( long, int );+long long clearBit_fun_llong( long long, int );+unsigned char clearBit_fun_uchar( unsigned char, int );+unsigned short clearBit_fun_ushort( unsigned short, int );+unsigned clearBit_fun_uint( unsigned, int );+unsigned long clearBit_fun_ulong( unsigned long, int );+unsigned long long clearBit_fun_ullong( unsigned long long, int );++char complementBit_fun_char( char, int );+short complementBit_fun_short( short, int );+int complementBit_fun_int( int, int );+long complementBit_fun_long( long, int );+long long complementBit_fun_llong( long long, int );+unsigned char complementBit_fun_uchar( unsigned char, int );+unsigned short complementBit_fun_ushort( unsigned short, int );+unsigned complementBit_fun_uint( unsigned, int );+unsigned long complementBit_fun_ulong( unsigned long, int );+unsigned long long complementBit_fun_ullong( unsigned long long, int );++int testBit_fun_char( char, int );+int testBit_fun_short( short, int );+int testBit_fun_int( int, int );+int testBit_fun_long( long, int );+int testBit_fun_llong( long long, int );+int testBit_fun_uchar( unsigned char, int );+int testBit_fun_ushort( unsigned short, int );+int testBit_fun_uint( unsigned, int );+int testBit_fun_ulong( unsigned long, int );+int testBit_fun_ullong( unsigned long long, int );++char rotateL_fun_char( char, int );+short rotateL_fun_short( short, int );+int rotateL_fun_int( int, int );+long rotateL_fun_long( long, int );+long long rotateL_fun_llong( long long, int );+unsigned char rotateL_fun_uchar( unsigned char, int );+unsigned short rotateL_fun_ushort( unsigned short, int );+unsigned long rotateL_fun_ulong( unsigned long, int );+unsigned long long rotateL_fun_ullong( unsigned long long, int );++char rotateR_fun_char( char, int );+short rotateR_fun_short( short, int );+int rotateR_fun_int( int, int );+long rotateR_fun_long( long, int );+long long rotateR_fun_llong( long long, int );+unsigned char rotateR_fun_uchar( unsigned char, int );+unsigned short rotateR_fun_ushort( unsigned short, int );+unsigned rotateR_fun_uint( unsigned, int );+unsigned long rotateR_fun_ulong( unsigned long, int );+unsigned long long rotateR_fun_ullong( unsigned long long, int );++char reverseBits_fun_char( char );+short reverseBits_fun_short( short );+int reverseBits_fun_int( int );+long reverseBits_fun_long( long );+long long reverseBits_fun_llong( long long );+unsigned char reverseBits_fun_uchar( unsigned char );+unsigned short reverseBits_fun_ushort( unsigned short );+unsigned long reverseBits_fun_ulong( unsigned long );+unsigned long long reverseBits_fun_ullong( unsigned long long );++int bitScan_fun_char( char );+int bitScan_fun_short( short );+int bitScan_fun_int( int );+int bitScan_fun_long( long );+int bitScan_fun_llong( long long );+int bitScan_fun_uchar( unsigned char );+int bitScan_fun_ushort( unsigned short );+int bitScan_fun_uint( unsigned );+int bitScan_fun_ulong( unsigned long );+int bitScan_fun_ullong( unsigned long long );++int bitCount_fun_char( char );+int bitCount_fun_short( short );+int bitCount_fun_int( int );+int bitCount_fun_long( long );+int bitCount_fun_llong( long long );+int bitCount_fun_uchar( unsigned char );+int bitCount_fun_ushort( unsigned short );+int bitCount_fun_ulong( unsigned long );+int bitCount_fun_ullong( unsigned long long );++++void copy_arrayOf_char( char*, int, char* );+void copy_arrayOf_short( short*, int, short* );+void copy_arrayOf_int( int*, int, int* );+void copy_arrayOf_long( long*, int, long* );+void copy_arrayOf_llong( long long*, int, long long* );+void copy_arrayOf_uchar( unsigned char*, int, unsigned char* );+void copy_arrayOf_ushort( unsigned short*, int, unsigned short* );+void copy_arrayOf_uint( unsigned*, int, unsigned* );+void copy_arrayOf_ulong( unsigned long*, int, unsigned long* );+void copy_arrayOf_ullong( unsigned long long*, int, unsigned long long* );+void copy_arrayOf_float( float*, int, float* );++++void traceStart();+void traceEnd();++void trace_char( char, int );+void trace_short( short, int );+void trace_int( int, int );+void trace_long( long, int );+void trace_llong( long long, int );+void trace_uchar( unsigned char, int );+void trace_ushort( unsigned short, int );+void trace_uint( unsigned, int );+void trace_ulong( unsigned long, int );+void trace_ullong( unsigned long long, int );+void trace_float( float, int );++#endif /* FELDSPAR_TI_C64X_H */
Feldspar/Compiler.hs view
@@ -1,42 +1,38 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- module Feldspar.Compiler ( compile , icompile , icompile' , defaultOptions+ , tic64xPlatformOptions , unrollOptions- , c99Options , noSimplification , noPrimitiveInstructionHandling ) where
Feldspar/Compiler/Compiler.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- module Feldspar.Compiler.Compiler ( compile@@ -36,11 +32,12 @@ , icompile , icompile' , defaultOptions+ , tic64xPlatformOptions , unrollOptions- , c99Options , noSimplification , noPrimitiveInstructionHandling- , includeGeneration+ , fixFunctionName+ , c99Options ) where import Data.Map@@ -50,6 +47,7 @@ import qualified Feldspar.Core.Expr as Expr import Feldspar.Core.Types import Feldspar.Compiler.Options+import Feldspar.Compiler.Platforms import Feldspar.Compiler.Transformation.GraphToImperative import Feldspar.Compiler.Transformation.Lifting @@ -60,8 +58,9 @@ import Feldspar.Compiler.Plugins.HandlePrimitives import Feldspar.Compiler.Plugins.PrettyPrint import Feldspar.Compiler.Plugins.Unroll-import Feldspar.Compiler.Plugins.ConstantFolding+--import Feldspar.Compiler.Plugins.ConstantFolding + import Feldspar.Compiler.Transformation.GraphUtils import Feldspar.Compiler.Imperative.Semantics import Feldspar.Compiler.Imperative.Representation@@ -69,12 +68,7 @@ import qualified Feldspar.Compiler.Precompiler.Precompiler as Precompiler import System.IO ---------------------------------------------- Header file for generated C programs --------------------------------------------- -intro = "#include \"feldspar.h\"\n\n"- type Writer t = (CompilationMode -> t -> FilePath -> Precompiler.OriginalFeldsparFunctionSignature -> Options -> IO ()) -------------------------@@ -100,13 +94,9 @@ -- Standalone compiler -- ------------------------- -includeGeneration :: FilePath -> IO ()-includeGeneration fileName- = appendFile fileName intro- standaloneWrite :: (Reify.Program t) => Writer t standaloneWrite compilationMode prg outFileName originalFeldsparFunctionSignature opts- = appendFile outFileName $ compToC $ executePluginChain compilationMode prg originalFeldsparFunctionSignature opts+ = appendFile outFileName $ compToC (platform opts) $ executePluginChain compilationMode prg originalFeldsparFunctionSignature opts standaloneCompile :: (Reify.Program t) => t -> FilePath -> FilePath -> Precompiler.OriginalFeldsparFunctionSignature -> Options -> IO () standaloneCompile prg inputFileName outputFileName originalFeldsparFunctionSignature opts@@ -118,7 +108,7 @@ fileWrite :: (Reify.Program t) => Writer t fileWrite compilationMode prg fileName originalFeldsparFunctionSignature opts- = writeFile fileName $ intro ++ (compToC $ executePluginChain compilationMode prg originalFeldsparFunctionSignature opts)+ = writeFile fileName $ (incList $ includes $ platform $ opts) ++ (compToC (platform opts) $ executePluginChain compilationMode prg originalFeldsparFunctionSignature opts) compile :: (Reify.Program t) => t -> FilePath -> String -> Options -> IO () compile prg fileName functionName opts@@ -126,7 +116,7 @@ writeOut :: (Reify.Program t) => Writer t writeOut compilationMode prg fileName functionName opts- = putStrLn $ intro ++ (compToC $ executePluginChain compilationMode prg functionName opts)+ = putStrLn $ (incList $ includes $ platform $ opts) ++ (compToC (platform opts) $ executePluginChain compilationMode prg functionName opts) icompile :: (Reify.Program t) => t -> IO () icompile prg@@ -136,21 +126,27 @@ icompile' prg functionName opts = coreCompile writeOut Interactive prg "" "" (Precompiler.OriginalFeldsparFunctionSignature functionName []) opts +incList :: [String] -> String+incList [] = "\n"+incList (x:xs) = "#include " ++ x ++ "\n" ++ (incList xs)+ ------------------------ -- Predefined options -- ------------------------ defaultOptions = Options- { platform = AnsiC+ { platform = c99 , unroll = NoUnroll , debug = NoDebug , defaultArraySize = 16 } -c99Options - = defaultOptions { platform = C99 } +c99Options = defaultOptions +tic64xPlatformOptions+ = defaultOptions { platform = tic64x }+ unrollOptions = defaultOptions { unroll = Unroll 8 } @@ -167,7 +163,7 @@ pluginChain :: ExternalInfoCollection -> Procedure InitSemInf -> Procedure PrettyPrintSemanticInfo pluginChain externalInfo = (executePlugin PrettyPrint (prettyPrintExternalInfo externalInfo))- . (executePlugin ConstantFolding ())+-- . (executePlugin ConstantFolding ()) . (executePlugin UnrollPlugin (unrollExternalInfo externalInfo)) . (executePlugin Precompilation (precompilationExternalInfo externalInfo)) . (executePlugin ForwardPropagation (forwardPropagationExternalInfo externalInfo))@@ -195,7 +191,7 @@ }, prettyPrintExternalInfo = (platform opt, defaultArraySize opt), unrollExternalInfo = unroll opt,- handlePrimitivesExternalInfo = (defaultArraySize opt, debug opt),+ handlePrimitivesExternalInfo = (defaultArraySize opt, debug opt, platform opt), forwardPropagationExternalInfo = debug opt, backwardPropagationExternalInfo = debug opt })
Feldspar/Compiler/CompilerMain.hs view
@@ -1,40 +1,40 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE CPP #-} module Main where import Feldspar.Compiler.Precompiler.Precompiler-import qualified Feldspar.Compiler.Compiler -- ONLY for improving compilation speed in normal mode+import qualified Feldspar.Compiler.Compiler as CompilerCore+import qualified Feldspar.Compiler.Options as CoreOptions+import qualified Feldspar.Compiler.Standalone.Options as StandaloneOptions+import Feldspar.Compiler.Standalone.Constants+import Feldspar.Compiler.Standalone.Library as StandaloneLib import System.Exit import System.Environment@@ -50,59 +50,68 @@ import Data.List import System.Console.GetOpt+import System.Console.ANSI import System.FilePath import Language.Haskell.Interpreter -warningPrefix = "[WARNING]: "-errorPrefix = "[ERROR ]: "- serializeOriginalFeldsparFunctionSignature originalFeldsparFunctionSignature =- "(OriginalFeldsparFunctionSignature \"" ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) ++ "\" " ++ (show $ originalFeldsparParameterNames originalFeldsparFunctionSignature) ++ ")"+ "(OriginalFeldsparFunctionSignature \"" ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) +++ "\" " ++ (show $ originalFeldsparParameterNames originalFeldsparFunctionSignature) ++ ")" -generateCompileCode :: String -> String -> String -> OriginalFeldsparFunctionSignature -> String-generateCompileCode inputFileName outputFileName options originalFeldsparFunctionSignature =- "standaloneCompile " ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) ++ " \"" ++ inputFileName ++ "\" " ++ " \""++- outputFileName ++"\" " ++ (serializeOriginalFeldsparFunctionSignature originalFeldsparFunctionSignature) ++ " " ++ options+generateCompileCode :: String -> String -> CoreOptions.Options -> OriginalFeldsparFunctionSignature -> String+generateCompileCode inputFileName outputFileName coreOptions originalFeldsparFunctionSignature =+ "standaloneCompile " ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) +++ " \"" ++ inputFileName ++ "\" " ++ " \"" ++ outputFileName ++ "\" " +++ (serializeOriginalFeldsparFunctionSignature originalFeldsparFunctionSignature) +++ " (Options " +++ "{ platform = " ++ (CoreOptions.name $ CoreOptions.platform coreOptions) +++ ", unroll = " ++ (show $ CoreOptions.unroll coreOptions) +++ ", debug = " ++ (show $ CoreOptions.debug coreOptions) +++ ", defaultArraySize = " ++ (show $ CoreOptions.defaultArraySize coreOptions) +++ "})" -compileFunction :: String -> String -> String -> OriginalFeldsparFunctionSignature -> Interpreter ()+compileFunction :: String -> String -> CoreOptions.Options -> OriginalFeldsparFunctionSignature -> Interpreter () compileFunction inFileName outFileName options originalFeldsparFunctionSignature = do- iPutStr $ "Compiling function " ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) ++ "...\t"+ iPutStr $ StandaloneLib.rpadWith 50 '.' $+ "Compiling function " ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) --result <- catchError ( interpret (generateCompileCode outputFileName options functionName) (as::IO()) ) (\_->error "error") result <- interpret (generateCompileCode inFileName outFileName options originalFeldsparFunctionSignature) (as::IO()) lift result- iPutStrLn "[OK]"+ liftIO $ withColor Green (putStrLn "[OK]") -compileAllFunctions :: String -> String -> String -> [OriginalFeldsparFunctionSignature] -> Interpreter ()+compileAllFunctions :: String -> String -> CoreOptions.Options -> [OriginalFeldsparFunctionSignature] -> Interpreter () compileAllFunctions inFileName outFileName options [] = return() compileAllFunctions inFileName outFileName options (x:xs) = do- (catchError (compileFunction inFileName outFileName options x) ( const $ iPutStrLn "[FAILED]"))+ (catchError (compileFunction inFileName outFileName options x)+ (const $ liftIO $ withColor Red (putStrLn "[FAILED]"))) `Control.Monad.CatchIO.catch`- (\msg -> iPutStrLn $ errorPrefix ++ show (msg::Control.Exception.ErrorCall))+ (\msg -> liftIO $ withColor Red $ putStrLn $ errorPrefix ++ show (msg::Control.Exception.ErrorCall)) compileAllFunctions inFileName outFileName options xs -globalImportList = ["Feldspar.Fs2dot", "Feldspar.Compiler.Compiler", "Feldspar.Compiler.Precompiler.Precompiler"]+buildIncludeString :: [String] -> String+buildIncludeString includes = concatMap (\x -> "#include " ++ x ++ "\n") includes -generateIncludeLine :: String -> Interpreter ()-generateIncludeLine outputFileName = do- result <- interpret ("includeGeneration \"" ++ outputFileName ++ "\"") (as::IO())- lift result+includeGeneration :: FilePath -> CoreOptions.Options -> IO ()+includeGeneration fileName coreOptions+ = appendFile fileName $ buildIncludeString (CoreOptions.includes $ CoreOptions.platform coreOptions) -- | Interpreter body for single-function compilation-singleFunctionCompilationBody :: String -> String -> String -> OriginalFeldsparFunctionSignature -> Interpreter (IO ())-singleFunctionCompilationBody inFileName outFileName options originalFeldsparFunctionSignature = do+singleFunctionCompilationBody :: String -> String -> CoreOptions.Options -> OriginalFeldsparFunctionSignature -> Interpreter (IO ())+singleFunctionCompilationBody inFileName outFileName coreOptions originalFeldsparFunctionSignature = do iPutStrLn $ "Output file: " ++ outFileName iPutStrLn $ "Compiling function " ++ (originalFeldsparFunctionName originalFeldsparFunctionSignature) ++ "..."- generateIncludeLine outFileName- result <- interpret (generateCompileCode inFileName outFileName options originalFeldsparFunctionSignature) (as::IO())+ liftIO $ includeGeneration outFileName coreOptions+ -- iPutStrLn $ generateCompileCode inFileName outFileName coreOptions originalFeldsparFunctionSignature+ result <- interpret (generateCompileCode inFileName outFileName coreOptions originalFeldsparFunctionSignature) (as::IO()) return result -- | Interpreter body for multi-function compilation-multiFunctionCompilationBody :: String -> String -> String -> [OriginalFeldsparFunctionSignature] -> Interpreter (IO ())-multiFunctionCompilationBody inFileName outFileName compilerOptions declarationList = do+multiFunctionCompilationBody :: String -> String -> CoreOptions.Options -> [OriginalFeldsparFunctionSignature] -> Interpreter (IO ())+multiFunctionCompilationBody inFileName outFileName coreOptions declarationList = do iPutStrLn $ "Output file: " ++ outFileName- generateIncludeLine outFileName- compileAllFunctions inFileName outFileName compilerOptions declarationList+ liftIO $ includeGeneration outFileName coreOptions+ compileAllFunctions inFileName outFileName coreOptions declarationList return(return()) -- | A general interpreter body for interpreting an expression@@ -142,66 +151,6 @@ printInterpreterError (WontCompile xs) printInterpreterError e = putStrLn $ "Code generation failed: " ++ (show e) -data FunctionMode = SingleFunction String | MultiFunction--data Options = Options { optSingleFunction :: FunctionMode- , optOutputFileName :: Maybe String- , optDotGeneration :: Bool- , optDotFileName :: Maybe String- , optCompilerMode :: String- }---- | Default options-startOptions :: Options-startOptions = Options { optSingleFunction = MultiFunction- , optOutputFileName = Nothing- , optDotGeneration = False- , optDotFileName = Nothing- , optCompilerMode = "defaultOptions"- }---- | Option descriptions for getOpt-options :: [ OptDescr (Options -> IO Options) ]-options =- [ Option "f" ["singlefunction"]- (ReqArg- (\arg opt -> return opt { optSingleFunction = SingleFunction arg })- "FUNCTION")- "Enables single-function compilation"-- , Option "o" ["output"]- (ReqArg- (\arg opt -> return opt { optOutputFileName = Just arg })- "outputfile.c")- "Overrides the file name for the generated output code"-- , Option "d" ["todot"]- (OptArg- (\arg opt -> return opt { optDotFileName = arg, optDotGeneration = True })- "dotfile.dot")- "Enables dot generation (outputs to stdout if no filename is specified)"-- , Option "c" ["compilermode"]- (ReqArg- (\arg opt -> return opt { optCompilerMode = arg })- "compilerMode")- "Changes compiler mode. Valid options are: unrollOptions, noSimplification, noPrimitiveInstructionHandling, c99Options"-- , Option "h" ["help"]- (NoArg- (\_ -> do- --prg <- getProgName- hPutStrLn stderr (usageInfo header options)- exitWith ExitSuccess))- "Show this help message"- ]--header = "Standalone Feldspar Compiler\nUsage: feldspar [options] inputfile\n" ++- "Notes: \n" ++- " * When no output file name is specified, the input file's name with .c extension is used\n" ++- " * The inputfile parameter is always needed, even in single-function mode\n" ++- "\nAvailable options: \n"- -- | Calculates the output file name. convertOutputFileName :: String -> Maybe String -> String convertOutputFileName inputFileName maybeOutputFileName = case maybeOutputFileName of@@ -212,37 +161,33 @@ args <- getArgs when (length args == 0) (do- putStrLn $ usageInfo header options+ putStrLn $ usageInfo helpHeader StandaloneOptions.optionDescriptors exitWith ExitSuccess) -- Parse options, getting a list of option actions- let (actions, nonOptions, errors) = getOpt Permute options args+ let (actions, nonOptions, errors) = getOpt Permute StandaloneOptions.optionDescriptors args when (length errors > 0) (do putStrLn $ concat errors- putStrLn $ usageInfo header options+ putStrLn $ usageInfo helpHeader StandaloneOptions.optionDescriptors exitWith (ExitFailure 1)) -- Here we thread startOptions through all supplied option actions- opts <- foldl (>>=) (return startOptions) actions+ opts <- foldl (>>=) (return StandaloneOptions.startOptions) actions when (length nonOptions /= 1) (do putStrLn "ERROR: Exactly one input file expected." exitWith (ExitFailure 1)) - let Options { optSingleFunction = functionMode- , optOutputFileName = maybeOutputFileName- , optDotGeneration = dotGeneration- , optDotFileName = dotFileName- , optCompilerMode = compilerMode } = opts+ let StandaloneOptions.Options {+ StandaloneOptions.optSingleFunction = functionMode+ , StandaloneOptions.optOutputFileName = maybeOutputFileName+ , StandaloneOptions.optDotGeneration = dotGeneration+ , StandaloneOptions.optDotFileName = dotFileName+ , StandaloneOptions.optCompilerMode = compilerMode } = opts let inputFileName = head nonOptions -- change it for multi-file operation let outputFileName = convertOutputFileName inputFileName maybeOutputFileName - when (not $ compilerMode `elem`- ["defaultOptions", "unrollOptions", "noSimplification", "noPrimitiveInstructionHandling", "c99Options"]) (do- putStrLn $ "Invalid compiler mode \"" ++ compilerMode ++ "\""- exitWith (ExitFailure 1))- compilationCore functionMode inputFileName outputFileName opts dotGeneration dotFileName compilerMode compilationCore functionMode inputFileName outputFileName commandLineOptions dotGeneration dotFileName compilerMode = do@@ -263,28 +208,29 @@ -- Dot generation case commandLineOptions of- Options { optDotGeneration = True} -> do+ StandaloneOptions.Options { StandaloneOptions.optDotGeneration = True} -> do putStrLn "Dot generation enabled" case functionMode of- SingleFunction funName -> case dotFileName of+ StandaloneOptions.SingleFunction funName -> case dotFileName of Just fileName -> highLevelInterpreterWithModuleInfo (generalInterpreterBody $ "writeDot \"" ++ fileName ++ "\" " ++ funName) Nothing -> highLevelInterpreterWithModuleInfo (generalInterpreterBody $ "putStr $ fs2dot " ++ funName)- MultiFunction -> putStrLn $ "ERROR: Dot generation requested, but not supported in multi-function mode\n"+++ StandaloneOptions.MultiFunction ->+ putStrLn $ "ERROR: Dot generation requested, but not supported in multi-function mode\n"++ "(use the \"-f function\" option to enable single-function mode)" _ -> putStrLn "Dot generation disabled" -- C code generation case functionMode of- MultiFunction + StandaloneOptions.MultiFunction | length declarationList == 0 -> putStrLn "Multi-function mode: Nothing to do." | otherwise -> do if length declarationList > 1 then putStrLn $ "Multi-function mode, compiling " ++ (show $ length declarationList) ++ " functions..." else putStrLn $ "Multi-function mode, compiling the only function (" ++ (originalFeldsparFunctionName $ head declarationList) ++ ")..." highLevelInterpreterWithModuleInfo (multiFunctionCompilationBody inputFileName outputFileName compilerMode declarationList)- SingleFunction funName -> do+ StandaloneOptions.SingleFunction funName -> do putStrLn $ "Single-function mode, compiling function " ++ funName ++ "..." let originalFeldsparFunctionSignatureNeeded = case filter ((==funName).originalFeldsparFunctionName) declarationList of [a] -> a@@ -293,8 +239,4 @@ highLevelInterpreterWithModuleInfo (singleFunctionCompilationBody inputFileName outputFileName compilerMode originalFeldsparFunctionSignatureNeeded) -iPutStrLn :: String -> Interpreter ()-iPutStrLn = liftIO . putStrLn -iPutStr :: String -> Interpreter ()-iPutStr = liftIO . putStr
Feldspar/Compiler/Error.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- module Feldspar.Compiler.Error where
Feldspar/Compiler/Imperative/CodeGeneration.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE FlexibleInstances #-} @@ -37,8 +33,10 @@ import Feldspar.Compiler.Imperative.Representation import Feldspar.Compiler.Imperative.Semantics import Feldspar.Compiler.Error -import qualified Data.List as List (last) +import Feldspar.Compiler.Options +import qualified Data.List as List (last,find) + ------------------------ -- C code generation -- ------------------------ @@ -63,46 +61,36 @@ --input of fun deriving (Eq,Show) -compToC :: ToC a => a -> String -compToC = toC Declaration_pl +compToC :: ToC a => Platform -> a -> String +compToC m = toC m Declaration_pl class ToC a where - toC :: Place -> a -> String - -instance ToC Size where - toC _ S8 = "char" - toC _ S16 = "short" - toC _ S32 = "int" - toC _ S64 = "long long" - -instance ToC Signedness where - toC _ ImpSigned = "signed" - toC _ ImpUnsigned = "unsigned" + toC :: Platform -> Place -> a -> String instance ToC Type where - toC _ BoolType = "int" - toC _ FloatType = "float" - toC p (Numeric s t) = listprint id " " [toC p s, toC p t] + toC m _ t = case (List.find (\(t',_,_) -> t == t') $ types m) of + Just (_,s,_) -> s + Nothing -> codeGenerationError InternalError $ "Unhandled type in platform " ++ name m --arraytype handled in variable instance ToC (Variable PrettyPrintSemanticInfo) where - toC p a@(Variable (VariableData r t n) _) = show_variable r p t n NoRestrict + toC m p a@(Variable r t n _) = show_variable m p r t n NoRestrict -show_variable :: VariableRole -> Place -> Type -> String -> IsRestrict -> String -show_variable r p t n restr = listprint (id) " " [variableType, show_name r p t n ++ arrLn] --concat [addSpace $ variableType, show_name r p t n, arrLn] +show_variable :: Platform -> Place -> VariableRole -> Type -> String -> IsRestrict -> String +show_variable m p r t n restr = listprint (id) " " [variableType, show_name r p t n ++ arrLn] --concat [addSpace $ variableType, show_name r p t n, arrLn] where (variableType,arrLn) = show_type p t restr show_type :: Place -> Type -> IsRestrict -> (String,String) show_type MainParameter_pl (ImpArrayType s t@(ImpArrayType s2 t2)) restr = decl_matr_type s t2 s2 restr show_type Declaration_pl (ImpArrayType s t) restr = decl_arr_type t s ("","") show_type MainParameter_pl (ImpArrayType s t) restr = decl_arr_type_0 t s restr - show_type Declaration_pl t _ = (toC p t,"") - show_type MainParameter_pl t _ = (toC p t,"") + show_type Declaration_pl t _ = (toC m p t,"") + show_type MainParameter_pl t _ = (toC m p t,"") show_type _ _ _ = ("","") decl_arr_type_0 :: Type -> Length -> IsRestrict -> (String,String) - decl_arr_type_0 t s Restrict = ((toC Declaration_pl t) ++ " * const restrict", "") - decl_arr_type_0 t s _ = ((toC Declaration_pl t) ++ " *", "") + decl_arr_type_0 t s Restrict = ((toC m Declaration_pl t) ++ " * const restrict", "") + decl_arr_type_0 t s _ = ((toC m Declaration_pl t) ++ " *", "") decl_matr_type :: Length -> Type -> Length -> IsRestrict -> (String,String) decl_matr_type mb t2 s2 Restrict = decl_arr_type t2 s2 (" (* const restrict", ")") @@ -110,7 +98,7 @@ decl_arr_type :: Type -> Length -> (String,String) -> (String,String) decl_arr_type (ImpArrayType s2 t2) mb (st1,st2) = decl_arr_type t2 s2 (st1,st2 ++ (show_brackets mb)) - decl_arr_type t mb (st1,st2) = ((toC Declaration_pl t) ++ st1, st2 ++ show_brackets mb) + decl_arr_type t mb (st1,st2) = ((toC m Declaration_pl t) ++ st1, st2 ++ show_brackets mb) show_brackets :: Length -> String show_brackets Undefined = codeGenerationError InternalError $ "Unattended unknown array size" @@ -128,7 +116,8 @@ | place == AddressNeed_pl = "&" ++ n | otherwise = n show_name FunOut place t n - | place == AddressNeed_pl = n + | place == AddressNeed_pl && List.last n == ']' = "&" ++ n + | place == AddressNeed_pl && List.last n /= ']' = n | place == Declaration_pl = codeGenerationError InternalError $ "You can't declare output variable of the function" | place == MainParameter_pl = "* " ++ n | List.last n == ']' = n @@ -139,105 +128,120 @@ genIndex _ = "" instance ToC (Constant PrettyPrintSemanticInfo) where - toC _ (IntConstant i) = show (intConstantValue i) - toC _ (FloatConstant i) = show (floatConstantValue i) ++ "f" - toC _ (BoolConstant (BoolConstantType True _)) = "1" - toC _ (BoolConstant (BoolConstantType False _)) = "0" - toC p a@(ArrayConstant l) = "{" ++ (toCArray p a) ++ "}" + toC m p c = toC m p $ constantData c -toCArray :: Place -> Constant PrettyPrintSemanticInfo -> String -toCArray p (ArrayConstant l) = listprint (toCArray p) "," (arrayConstantValue l) -toCArray p i = toC p i +instance ToC (ConstantData PrettyPrintSemanticInfo) where + toC m p a@(ArrayConstant l) = "{" ++ (toCArray m p a) ++ "}" + toC m _ c = case (List.find (\(t',_) -> t' == typeof c) $ values m) of + Just (_,f) -> f c + Nothing -> case c of + (IntConstant i) -> show (intConstantValue i) + (FloatConstant i) -> show (floatConstantValue i) ++ "f" + (BoolConstant (BoolConstantType True _)) -> "1" + (BoolConstant (BoolConstantType False _)) -> "0" + _ -> codeGenerationError InternalError $ "Unhandled constant in platform " ++ name m +toCArray :: Platform -> Place -> ConstantData PrettyPrintSemanticInfo -> String +toCArray m p (ArrayConstant l) = listprint (toCArray m p) "," (map constantData $ arrayConstantValue l) +toCArray m p i = toC m p i + instance ToC (LeftValue PrettyPrintSemanticInfo) where - toC p (VariableLeftValue (VariableInLeftValue v _)) = toC p v - toC p (ArrayElemReferenceLeftValue leftArrayElemReference) = toC p $ insertIndex (arrayName $ arrayElemReferenceData leftArrayElemReference) where + toC m p lv = toC m p $ leftValueData lv + +instance ToC (LeftValueData PrettyPrintSemanticInfo) where + toC m p (VariableLeftValue v) = toC m p v + toC m p (ArrayElemReferenceLeftValue leftArrayElemReference) = toC m p $ insertIndex (arrayName leftArrayElemReference) where insertIndex :: LeftValue PrettyPrintSemanticInfo -> LeftValue PrettyPrintSemanticInfo - insertIndex (VariableLeftValue (VariableInLeftValue variable semInf)) = VariableLeftValue $ VariableInLeftValue - (variable { - variableData = (variableData variable) { - variableType = decrArrayDepth (variableType $ variableData variable), - variableName = (concat[variableName $ variableData variable,"[", - toC ValueNeed_pl (arrayIndex $ arrayElemReferenceData leftArrayElemReference), "]"]) - } + insertIndex (LeftValue (VariableLeftValue variable) semInf) = LeftValue (VariableLeftValue $ + variable { + variableType = decrArrayDepth (variableType variable), + variableName = (concat[variableName variable,"[", + toC m ValueNeed_pl (arrayIndex leftArrayElemReference), "]"]) }) semInf - insertIndex (ArrayElemReferenceLeftValue leftArrayElemReference) = + insertIndex (LeftValue (ArrayElemReferenceLeftValue leftArrayElemReference) semInf) = LeftValue ( ArrayElemReferenceLeftValue $ leftArrayElemReference { - arrayElemReferenceData = ArrayElemReferenceData (insertIndex (arrayName $ arrayElemReferenceData leftArrayElemReference)) - (arrayIndex $ arrayElemReferenceData leftArrayElemReference) - } - + arrayName = (insertIndex (arrayName leftArrayElemReference)), + arrayIndex = (arrayIndex leftArrayElemReference) + }) semInf instance ToC (ActualParameter PrettyPrintSemanticInfo) where - toC p (InputActualParameter (InputActualParameterType e _)) = toC FunctionCallIn_pl e - toC p (OutputActualParameter (OutputActualParameterType l _)) = toC AddressNeed_pl l + toC m p ap = toC m p $ actualParameterData ap + +instance ToC (ActualParameterData PrettyPrintSemanticInfo) where + toC m p (InputActualParameter e) = toC m FunctionCallIn_pl e + toC m p (OutputActualParameter l) = toC m AddressNeed_pl l instance ToC (Expression PrettyPrintSemanticInfo) where - toC p (LeftValueExpression (LeftValueInExpression lv _)) = toC p lv - toC p (ConstantExpression c) = toC p c - toC p (FunctionCallExpression (FunctionCall (FunctionCallData InfixOp _ f [a,b]) _)) = concat["(",toC p a," ",f," ",toC p b,")"] - toC p (FunctionCallExpression (FunctionCall (FunctionCallData _ t f x) _)) = concat [f,"(",listprint (toC p) ", " x,")"] + toC m p expr = toC m p (expressionData expr) +instance ToC (ExpressionData PrettyPrintSemanticInfo) where + toC m p (LeftValueExpression lv) = toC m p lv + toC m p (ConstantExpression c) = toC m p c + toC m p (FunctionCallExpression (FunctionCall InfixOp _ f [a,b] _)) = concat["(",toC m p a," ",f," ",toC m p b,")"] + toC m p (FunctionCallExpression (FunctionCall _ t f x _)) = concat [f,"(",listprint (toC m p) ", " x,")"] + instance ToC (Procedure PrettyPrintSemanticInfo) where - toC p (Procedure n il ol pr semInf) = concat ["void ",n,"(",param,")\n{\n",prog,"}\n"] + toC m p (Procedure n il ol pr semInf) = concat ["void ",n,"(",param,")\n{\n",prog,"}\n"] where - param = listprint (toC MainParameter_pl) ", " (il ++ ol) - prog = ind (toC Declaration_pl) pr + param = listprint (toC m MainParameter_pl) ", " (il ++ ol) + prog = ind (toC m Declaration_pl) pr instance ToC (Block PrettyPrintSemanticInfo) where - toC p (Block (BlockData d pr) semInf) = listprint id "\n" [decl,toC p pr] + toC m p (Block d pr semInf) = listprint id "\n" [decl,toC m p pr] where - decl = concat $ map (\a->toC Declaration_pl a ++ ";\n") d + decl = concat $ map (\a->toC m Declaration_pl a ++ ";\n") d instance ToC (FormalParameter PrettyPrintSemanticInfo) where - toC p (FormalParameter v restr) = (helper p v restr) + toC m p (FormalParameter v restr) = (helper p v restr) where helper :: Place -> Variable PrettyPrintSemanticInfo -> IsRestrict -> String - helper MainParameter_pl (Variable (VariableData r t n) _) restr - = show_variable r MainParameter_pl t n restr - helper _ (Variable (VariableData r t n) _) restr - = show_variable r Declaration_pl t n restr + helper MainParameter_pl (Variable r t n _) restr + = show_variable m MainParameter_pl r t n restr + helper _ (Variable r t n _) restr + = show_variable m Declaration_pl r t n restr instance ToC (LocalDeclaration PrettyPrintSemanticInfo) where - toC p (LocalDeclaration (LocalDeclarationData v i) isDefArrSize) = (helper p v i) + toC m p (LocalDeclaration v i isDefArrSize) = (helper p v i) where helper :: Place -> Variable PrettyPrintSemanticInfo -> (Maybe (Expression PrettyPrintSemanticInfo)) -> String - helper MainParameter_pl v i = concat [toC MainParameter_pl v,init i] - helper _ v i = concat [toC Declaration_pl v,init i] + helper MainParameter_pl v i = concat [toC m MainParameter_pl v,init i] + helper _ v i = concat [toC m Declaration_pl v,init i] init :: Maybe (Expression PrettyPrintSemanticInfo) -> String init Nothing = "" - init (Just e) = " = " ++ toC ValueNeed_pl e + init (Just e) = " = " ++ toC m ValueNeed_pl e instance ToC (Instruction PrettyPrintSemanticInfo) where - toC p (AssignmentInstruction assignment) = - concat [toC ValueNeed_pl (assignmentLhs $ assignmentData assignment)," = ",toC ValueNeed_pl (assignmentRhs $ assignmentData assignment),";\n"] - toC p (ProcedureCallInstruction procedureCall) = - concat [nameOfProcedureToCall $ procedureCallData procedureCall,"(", - listprint (toC p) ", " (actualParametersOfProcedureToCall $ procedureCallData procedureCall),");\n"] - -- TODO ProcedureCall.actualParameters procedureCall -----> External helper functions !!! - + toC m p instruction = toC m p $ instructionData instruction + +instance ToC (InstructionData PrettyPrintSemanticInfo) where + toC m p (AssignmentInstruction assignment) = + concat [toC m ValueNeed_pl (assignmentLhs assignment)," = ",toC m ValueNeed_pl (assignmentRhs assignment),";\n"] + toC m p (ProcedureCallInstruction procedureCall) = + concat [nameOfProcedureToCall procedureCall,"(", + listprint (toC m p) ", " (actualParametersOfProcedureToCall procedureCall),");\n"] + instance ToC (Program PrettyPrintSemanticInfo) where - toC p (Program (EmptyProgram (Empty i)) seminf) = "" - toC p (Program (PrimitiveProgram (Primitive i seminf)) psi) = toC p i - toC p (Program (SequenceProgram (Sequence ps _)) psi) = listprint (toC p) "" ps - toC p (Program (BranchProgram (Branch (BranchData con tPrg ePrg) _)) psi) - = concat ["if(",toC ValueNeed_pl con,")\n{\n", ind (toC p) tPrg,"}\nelse\n{\n",ind (toC p) ePrg,"}\n"] - toC p (Program (SequentialLoopProgram (SequentialLoop (SequentialLoopData condVar condCalc loopBody) _)) psi) = concat["{\n",ind id whereBody,"}\n"] + toC m p (Program (EmptyProgram (Empty i)) seminf) = "" + toC m p (Program (PrimitiveProgram (Primitive i seminf)) psi) = toC m p i + toC m p (Program (SequenceProgram (Sequence ps _)) psi) = listprint (toC m p) "" ps + toC m p (Program (BranchProgram (Branch con tPrg ePrg _)) psi) + = concat ["if(",toC m ValueNeed_pl con,")\n{\n", ind (toC m p) tPrg,"}\nelse\n{\n",ind (toC m p) ePrg,"}\n"] + toC m p (Program (SequentialLoopProgram (SequentialLoop condVar condCalc loopBody _)) psi) = concat["{\n",ind id whereBody,"}\n"] where - whereBody = concat [toC p condCalc,"while(",toC ValueNeed_pl condVar,")\n", - "{\n",ind (toC p) loopBody,ind (toC p) (blockInstructions $ blockData condCalc),"}\n"] - toC p (Program (ParallelLoopProgram (ParallelLoop (ParallelLoopData v num step prg) _)) psi) = concat ["{\n",ind id for_seq,"}\n"] + whereBody = concat [toC m p condCalc,"while(",toC m ValueNeed_pl condVar,")\n", + "{\n",ind (toC m p) loopBody,ind (toC m p) (blockInstructions condCalc),"}\n"] + toC m p (Program (ParallelLoopProgram (ParallelLoop v num step prg _)) psi) = concat ["{\n",ind id for_seq,"}\n"] where - for_seq = concat [toC Declaration_pl v,";\nfor(",for_init,for_test,for_inc,")\n{\n",ind (toC p) prg,"}\n"] - for_init = concat [toC ValueNeed_pl v," = 0; "] - for_test = concat [toC ValueNeed_pl v," < ",toC ValueNeed_pl num,"; "] - for_inc = concat [toC ValueNeed_pl v," += ",show step] + for_seq = concat [toC m Declaration_pl v,";\nfor(",for_init,for_test,for_inc,")\n{\n",ind (toC m p) prg,"}\n"] + for_init = concat [toC m ValueNeed_pl v," = 0; "] + for_test = concat [toC m ValueNeed_pl v," < ",toC m ValueNeed_pl num,"; "] + for_inc = concat [toC m ValueNeed_pl v," += ",show step] instance ToC a => ToC (Maybe a) where - toC p Nothing = "" - toC p (Just a) = toC p a + toC _ p Nothing = "" + toC m p (Just a) = toC m p a instance (ToC a) => ToC [a] where - toC p xs = listprint (toC p) "\n" xs + toC m p xs = listprint (toC m p) "\n" xs ---------------------- -- Type -- @@ -247,14 +251,20 @@ typeof :: a -> Type instance (SemanticInfo t) => HasType (Variable t) where - typeof (Variable (VariableData r t s) _) = t + typeof (Variable r t s _) = t instance (SemanticInfo t) => HasType (LeftValue t) where - typeof (VariableLeftValue (VariableInLeftValue v _)) = typeof v + typeof lv = typeof $ leftValueData lv + +instance (SemanticInfo t) => HasType (LeftValueData t) where + typeof (VariableLeftValue v) = typeof v typeof (ArrayElemReferenceLeftValue arrayElemReference) = - decrArrayDepth (typeof (arrayName $ arrayElemReferenceData arrayElemReference)) + decrArrayDepth (typeof (arrayName arrayElemReference)) instance (SemanticInfo t) => HasType (Constant t) where + typeof c = typeof $ constantData c + +instance (SemanticInfo t) => HasType (ConstantData t) where typeof (IntConstant _) = Numeric ImpSigned S32 typeof (FloatConstant _) = FloatType typeof (BoolConstant _) = BoolType @@ -271,14 +281,20 @@ | otherwise = codeGenerationError InternalError $ "Different element types in constant array: " ++ show arr instance (SemanticInfo t) => HasType (Expression t) where - typeof (LeftValueExpression lve) = typeof $ leftValueExpressionContents lve + typeof e = typeof $ expressionData e + +instance (SemanticInfo t) => HasType (ExpressionData t) where + typeof (LeftValueExpression lve) = typeof lve typeof (ConstantExpression c) = typeof c - typeof (FunctionCallExpression functionCallExpression) = typeOfFunctionToCall $ functionCallData functionCallExpression + typeof (FunctionCallExpression functionCallExpression) = typeOfFunctionToCall functionCallExpression instance (SemanticInfo t) => HasType (ActualParameter t) where - typeof (InputActualParameter (InputActualParameterType e _)) = typeof e - typeof (OutputActualParameter (OutputActualParameterType l _)) = typeof l + typeof ap = typeof $ actualParameterData ap +instance (SemanticInfo t) => HasType (ActualParameterData t) where + typeof (InputActualParameter e) = typeof e + typeof (OutputActualParameter l) = typeof l + ---------------------- -- Helper functions -- ---------------------- @@ -293,9 +309,8 @@ listprint' s (x:y:xs) = x ++ s ++ listprint' s (y:xs) parameterToExpression :: (SemanticInfo t) => ActualParameter t -> Expression t -parameterToExpression (InputActualParameter (InputActualParameterType e _)) = e -parameterToExpression (OutputActualParameter (OutputActualParameterType lv _)) = - LeftValueExpression $ LeftValueInExpression lv undefined -- TODO undefined +parameterToExpression (ActualParameter (InputActualParameter e) _) = e +parameterToExpression (ActualParameter (OutputActualParameter lv) _) = Expression (LeftValueExpression lv) undefined -- TODO undefined decrArrayDepth :: Type -> Type decrArrayDepth (ImpArrayType _ t) = t @@ -306,22 +321,21 @@ simpleType (Numeric _ _) = True simpleType FloatType = True simpleType (ImpArrayType _ _) = False +simpleType (UserType _) = True toLeftValue :: (SemanticInfo t) => Expression t -> LeftValue t -toLeftValue (LeftValueExpression (LeftValueInExpression lv _)) = lv +toLeftValue (Expression (LeftValueExpression lv) _) = lv toLeftValue e = codeGenerationError InternalError $ show e ++ " is not a left value." contains :: (SemanticInfo t) => String -> Expression t -> Bool -contains n (LeftValueExpression (LeftValueInExpression lv _)) = contains' n lv where - contains' n (VariableLeftValue - (VariableInLeftValue (Variable (VariableData _ _ n' ) _) _) - ) = n == n' - contains' n (ArrayElemReferenceLeftValue arrayElemReference) = contains' n (arrayName $ arrayElemReferenceData arrayElemReference) || - contains n (arrayIndex $ arrayElemReferenceData arrayElemReference) -contains _ (ConstantExpression _) = False -contains n (FunctionCallExpression functionCallExpression) = - any (contains n) (actualParametersOfFunctionToCall $ functionCallData functionCallExpression) +contains n (Expression (LeftValueExpression lv) _) = contains' n (leftValueData lv) where + contains' n (VariableLeftValue (Variable _ _ n' _) ) = n == n' + contains' n (ArrayElemReferenceLeftValue arrayElemReference) = contains' n (leftValueData $ arrayName arrayElemReference) || + contains n (arrayIndex arrayElemReference) +contains _ (Expression (ConstantExpression _) _) = False +contains n (Expression (FunctionCallExpression functionCallExpression) _)= + any (contains n) (actualParametersOfFunctionToCall functionCallExpression) getVarName :: (SemanticInfo t) => LeftValue t -> String -getVarName (VariableLeftValue (VariableInLeftValue ( Variable (VariableData _ _ n) _ ) _ )) = n -getVarName (ArrayElemReferenceLeftValue arrayElemReference) = getVarName (arrayName $ arrayElemReferenceData arrayElemReference) +getVarName (LeftValue (VariableLeftValue ( Variable _ _ n _ )) _) = n +getVarName (LeftValue (ArrayElemReferenceLeftValue arrayElemReference) _) = getVarName (arrayName arrayElemReference)
Feldspar/Compiler/Imperative/Representation.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE TypeFamilies #-} @@ -36,259 +32,203 @@ import Feldspar.Compiler.Imperative.Semantics --- ===========================================================================--- == Representation of imperative programs--- ===========================================================================---- ========================= [ Procedure ] ===================================-+-- ====================================================================================================+-- == Representation of imperative programs+-- ==================================================================================================== data (SemanticInfo t) => Procedure t = Procedure {- procedureName :: String,- inParameters :: [FormalParameter t],- outParameters :: [FormalParameter t],- procedureBody :: Block t,- procedureSemInf :: ProcedureInfo t-} deriving (Eq,Show)---- ========================= [ Block ] =======================================+ procedureName :: String,+ inParameters :: [FormalParameter t],+ outParameters :: [FormalParameter t],+ procedureBody :: Block t,+ procedureSemInf :: ProcedureInfo t+} deriving (Eq, Show) data (SemanticInfo t) => Block t = Block {- blockData :: BlockData t,- blockSemInf :: BlockInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => BlockData t = BlockData {- blockDeclarations :: [LocalDeclaration t],- blockInstructions :: Program t-} deriving (Eq,Show)---- ========================= [ Program ] =====================================+ blockDeclarations :: [LocalDeclaration t],+ blockInstructions :: Program t,+ blockSemInf :: BlockInfo t+} deriving (Eq, Show) data (SemanticInfo t) => Program t = Program {- programConstruction :: ProgramConstruction t,- programSemInf :: ProgramInfo t-} deriving (Eq,Show)+ programConstruction :: ProgramConstruction t,+ programSemInf :: ProgramInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => ProgramConstruction t =+data (SemanticInfo t) => ProgramConstruction t = EmptyProgram (Empty t) | PrimitiveProgram (Primitive t) | SequenceProgram (Sequence t) | BranchProgram (Branch t) | SequentialLoopProgram (SequentialLoop t) | ParallelLoopProgram (ParallelLoop t)- deriving (Eq,Show)+ deriving (Eq, Show) data (SemanticInfo t) => Empty t = Empty {- emptySemInf :: EmptyInfo t-} deriving (Eq,Show)- + emptySemInf :: EmptyInfo t+} deriving (Eq, Show)+ data (SemanticInfo t) => Primitive t = Primitive {- primitiveInstruction :: Instruction t,- primitiveSemInf :: PrimitiveInfo t-} deriving (Eq,Show)+ primitiveInstruction :: Instruction t,+ primitiveSemInf :: PrimitiveInfo t+} deriving (Eq, Show) data (SemanticInfo t) => Sequence t = Sequence {- sequenceProgramList :: [Program t],- sequenceSemInf :: SequenceInfo t-} deriving (Eq,Show)+ sequenceProgramList :: [Program t],+ sequenceSemInf :: SequenceInfo t+} deriving (Eq, Show) data (SemanticInfo t) => Branch t = Branch {- branchData :: BranchData t,- branchSemInf :: BranchInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => BranchData t = BranchData {- branchConditionVariable :: Variable t, -- ???- thenBlock :: Block t,- elseBlock :: Block t+ branchConditionVariable :: Variable t,+ thenBlock :: Block t,+ elseBlock :: Block t,+ branchSemInf :: BranchInfo t } deriving (Eq, Show) data (SemanticInfo t) => SequentialLoop t = SequentialLoop {- sequentialLoopData :: SequentialLoopData t,- sequentialLoopSemInf :: SequentialLoopInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => SequentialLoopData t = SequentialLoopData {- sequentialLoopCondition :: Expression t,- conditionCalculation :: Block t, -- ???- sequentialLoopCore :: Block t+ sequentialLoopCondition :: Expression t,+ conditionCalculation :: Block t,+ sequentialLoopCore :: Block t,+ sequentialLoopSemInf :: SequentialLoopInfo t } deriving (Eq, Show) data (SemanticInfo t) => ParallelLoop t = ParallelLoop {- parallelLoopData :: ParallelLoopData t,- parallelLoopSemInf :: ParallelLoopInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => ParallelLoopData t = ParallelLoopData {- parallelLoopConditionVariable :: Variable t,- numberOfIterations :: Expression t, -- ???- parallelLoopStep :: Int, -- ???- parallelLoopCore :: Block t+ parallelLoopConditionVariable :: Variable t,+ numberOfIterations :: Expression t,+ parallelLoopStep :: Int,+ parallelLoopCore :: Block t,+ parallelLoopSemInf :: ParallelLoopInfo t } deriving (Eq, Show) --- ========================= [ FormalParameter ] =============================- data (SemanticInfo t) => FormalParameter t = FormalParameter {- formalParameterVariable :: Variable t,- formalParameterSemInf :: FormalParameterInfo t-} deriving (Eq,Show)---- ========================= [ LocalDeclaration ] ============================+ formalParameterVariable :: Variable t,+ formalParameterSemInf :: FormalParameterInfo t+} deriving (Eq, Show) data (SemanticInfo t) => LocalDeclaration t = LocalDeclaration {- localDeclarationData :: LocalDeclarationData t,- localDeclarationSemInf :: LocalDeclarationInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => LocalDeclarationData t = LocalDeclarationData {- localVariable :: Variable t,- localInitValue :: Maybe (Expression t)-} deriving (Eq,Show)+ localVariable :: Variable t,+ localInitValue :: Maybe (Expression t),+ localDeclarationSemInf :: LocalDeclarationInfo t+} deriving (Eq, Show) --- ========================= [ Expression ] ==================================+data (SemanticInfo t) => Expression t = Expression {+ expressionData :: ExpressionData t,+ expressionSemInf :: ExpressionInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => Expression t =- LeftValueExpression (LeftValueInExpression t)+data (SemanticInfo t) => ExpressionData t = + LeftValueExpression (LeftValue t) | ConstantExpression (Constant t) | FunctionCallExpression (FunctionCall t) deriving (Eq, Show) -data (SemanticInfo t) => LeftValueInExpression t = LeftValueInExpression {- leftValueExpressionContents :: LeftValue t,- leftValueExpressionSemInf :: LeftValueExpressionInfo t+data (SemanticInfo t) => Constant t = Constant {+ constantData :: ConstantData t,+ constantSemInf :: ConstantInfo t } deriving (Eq, Show) data (SemanticInfo t) => FunctionCall t = FunctionCall {- functionCallData :: FunctionCallData t,- functionCallSemInf :: FunctionCallInfo t + roleOfFunctionToCall :: FunctionRole,+ typeOfFunctionToCall :: Type,+ nameOfFunctionToCall :: String,+ actualParametersOfFunctionToCall :: [Expression t],+ functionCallSemInf :: FunctionCallInfo t } deriving (Eq, Show) -data (SemanticInfo t) => FunctionCallData t = FunctionCallData { - roleOfFunctionToCall :: FunctionRole,- typeOfFunctionToCall :: Type,- nameOfFunctionToCall :: String,- actualParametersOfFunctionToCall :: [Expression t] -} deriving (Eq,Show)---- ========================= [ LeftValue ] ===================================+data (SemanticInfo t) => LeftValue t = LeftValue {+ leftValueData :: LeftValueData t,+ leftValueSemInf :: LeftValueInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => LeftValue t =- VariableLeftValue (VariableInLeftValue t)+data (SemanticInfo t) => LeftValueData t = + VariableLeftValue (Variable t) | ArrayElemReferenceLeftValue (ArrayElemReference t)- deriving (Eq,Show)--data (SemanticInfo t) => VariableInLeftValue t = VariableInLeftValue {- variableLeftValueContents :: Variable t,- variableLeftValueSemInf :: VariableInLeftValueInfo t-} deriving (Eq,Show)+ deriving (Eq, Show) data (SemanticInfo t) => ArrayElemReference t = ArrayElemReference {- arrayElemReferenceData :: ArrayElemReferenceData t,- arrayElemReferenceSemInf :: ArrayElemReferenceInfo t -} deriving (Eq,Show)--data (SemanticInfo t) => ArrayElemReferenceData t = ArrayElemReferenceData {- arrayName :: LeftValue t,- arrayIndex :: Expression t-} deriving (Eq,Show)+ arrayName :: LeftValue t,+ arrayIndex :: Expression t,+ arrayElemReferenceSemInf :: ArrayElemReferenceInfo t+} deriving (Eq, Show) --- ========================= [ Instruction ] =================================+data (SemanticInfo t) => Instruction t = Instruction {+ instructionData :: InstructionData t,+ instructionSemInf :: InstructionInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => Instruction t =+data (SemanticInfo t) => InstructionData t = AssignmentInstruction (Assignment t) | ProcedureCallInstruction (ProcedureCall t)- deriving (Eq,Show)+ deriving (Eq, Show) data (SemanticInfo t) => Assignment t = Assignment {- assignmentData :: AssignmentData t,- assignmentSemInf :: AssignmentInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => AssignmentData t = AssignmentData {- assignmentLhs :: LeftValue t,- assignmentRhs :: Expression t-} deriving (Eq,Show)+ assignmentLhs :: LeftValue t,+ assignmentRhs :: Expression t,+ assignmentSemInf :: AssignmentInfo t+} deriving (Eq, Show) data (SemanticInfo t) => ProcedureCall t = ProcedureCall {- procedureCallData :: ProcedureCallData t,- procedureCallSemInf :: ProcedureCallInfo t-} deriving (Eq,Show)--data (SemanticInfo t) => ProcedureCallData t = ProcedureCallData {- nameOfProcedureToCall :: String,- actualParametersOfProcedureToCall :: [ActualParameter t]-} deriving (Eq,Show)---- ========================= [ ActualParameter ] =============================--data (SemanticInfo t) => ActualParameter t =- InputActualParameter (InputActualParameterType t)- | OutputActualParameter (OutputActualParameterType t)- deriving (Eq,Show)+ nameOfProcedureToCall :: String,+ actualParametersOfProcedureToCall :: [ActualParameter t],+ procedureCallSemInf :: ProcedureCallInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => InputActualParameterType t = InputActualParameterType {- inputActualParameterExpression :: Expression t,- inputActualParameterSemInf :: InputActualParameterInfo t-} deriving (Eq,Show)+data (SemanticInfo t) => ActualParameter t = ActualParameter {+ actualParameterData :: ActualParameterData t,+ actualParameterSemInf :: ActualParameterInfo t+} deriving (Eq, Show) -data (SemanticInfo t) => OutputActualParameterType t = OutputActualParameterType {- outputActualParameterLeftValue :: LeftValue t,- outputActualParameterSemInf :: OutputActualParameterInfo t-} deriving (Eq,Show)+data (SemanticInfo t) => ActualParameterData t = + InputActualParameter (Expression t)+ | OutputActualParameter (LeftValue t)+ deriving (Eq, Show) --- ========================= [ Constant ] ====================================+data (SemanticInfo t) => ConstantData t = + IntConstant (IntConstantType t)+ | FloatConstant (FloatConstantType t)+ | BoolConstant (BoolConstantType t)+ | ArrayConstant (ArrayConstantType t)+ deriving (Eq, Show) -data Constant t = IntConstant (IntConstantType t)- | FloatConstant (FloatConstantType t)- | BoolConstant (BoolConstantType t)- | ArrayConstant (ArrayConstantType t)- deriving (Eq,Show)- data (SemanticInfo t) => IntConstantType t = IntConstantType {- intConstantValue :: Int,- intConstantSemInf :: IntConstantInfo t+ intConstantValue :: Int,+ intConstantSemInf :: IntConstantInfo t } deriving (Eq, Show) data (SemanticInfo t) => FloatConstantType t = FloatConstantType {- floatConstantValue :: Float,- floatConstantSemInf :: FloatConstantInfo t+ floatConstantValue :: Float,+ floatConstantSemInf :: FloatConstantInfo t } deriving (Eq, Show) data (SemanticInfo t) => BoolConstantType t = BoolConstantType {- boolConstantValue :: Bool,- boolConstantSemInf :: BoolConstantInfo t+ boolConstantValue :: Bool,+ boolConstantSemInf :: BoolConstantInfo t } deriving (Eq, Show) data (SemanticInfo t) => ArrayConstantType t = ArrayConstantType {- arrayConstantValue :: [Constant t],- arrayConstantSemInf :: ArrayConstantInfo t+ arrayConstantValue :: [Constant t],+ arrayConstantSemInf :: ArrayConstantInfo t } deriving (Eq, Show) --- ========================= [ Variable ] ====================================- data (SemanticInfo t) => Variable t = Variable {- variableData :: VariableData,- variableSemInf :: VariableInfo t-} deriving (Eq,Show)+ variableRole :: VariableRole,+ variableType :: Type,+ variableName :: String,+ variableSemInf :: VariableInfo t+} deriving (Eq, Show) -data VariableData = VariableData {- variableRole :: VariableRole,- variableType :: Type,- variableName :: String-} deriving (Eq,Show) -- ========================= [ Basic structures ] ============================ data Length = Norm Int | Defined Int | Undefined deriving (Eq,Show) -data Size = S8 | S16 | S32 | S64+data Size = S8 | S16 | S32 | S40 | S64 deriving (Eq,Show) data Signedness = ImpSigned | ImpUnsigned deriving (Eq,Show) -data Type = BoolType | FloatType | Numeric Signedness Size | ImpArrayType Length Type+data Type = BoolType | FloatType | Numeric Signedness Size | ImpArrayType Length Type | UserType String deriving (Eq,Show) data FunctionRole = SimpleFun | InfixOp | PrefixOp
Feldspar/Compiler/Imperative/Semantics.hs view
@@ -1,73 +1,73 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE TypeFamilies, EmptyDataDecls, FlexibleContexts #-} module Feldspar.Compiler.Imperative.Semantics where --- ===========================================================================--- == Semantic info class--- ===========================================================================+data InitSemInf+data PrettyPrintSemanticInfo -class (Show (ProcedureInfo t),- Show (BlockInfo t),- Show (ProgramInfo t),- Show (EmptyInfo t), Show (PrimitiveInfo t), Show (SequenceInfo t), Show (BranchInfo t), Show (SequentialLoopInfo t), Show (ParallelLoopInfo t),- Show (FormalParameterInfo t),- Show (LocalDeclarationInfo t),- Show (FunctionCallInfo t),- Show (LeftValueExpressionInfo t), - Show (VariableInLeftValueInfo t),- Show (ArrayElemReferenceInfo t),- Show (InputActualParameterInfo t), Show (OutputActualParameterInfo t),- Show (AssignmentInfo t),- Show (ProcedureCallInfo t),- Show (IntConstantInfo t), Show (FloatConstantInfo t), Show (BoolConstantInfo t), Show (ArrayConstantInfo t),- Show (VariableInfo t),- Eq (ProcedureInfo t),- Eq (BlockInfo t),- Eq (ProgramInfo t),- Eq (EmptyInfo t), Eq (PrimitiveInfo t), Eq (SequenceInfo t), Eq (BranchInfo t), Eq (SequentialLoopInfo t), Eq (ParallelLoopInfo t),- Eq (FormalParameterInfo t),- Eq (LocalDeclarationInfo t),- Eq (FunctionCallInfo t),- Eq (LeftValueExpressionInfo t),- Eq (VariableInLeftValueInfo t),- Eq (ArrayElemReferenceInfo t),- Eq (InputActualParameterInfo t), Eq (OutputActualParameterInfo t),- Eq (AssignmentInfo t),- Eq (ProcedureCallInfo t),- Eq (IntConstantInfo t), Eq (FloatConstantInfo t), Eq (BoolConstantInfo t), Eq (ArrayConstantInfo t),- Eq (VariableInfo t))- => SemanticInfo t where+data IsRestrict = Restrict | NoRestrict+ deriving (Show,Eq)++data IsDefaultArraySize = DefaultArraySize | NoDefaultArraySize+ deriving (Show,Eq)++-- ====================================================================================================+-- == Semantic info class+-- ====================================================================================================+class (+ Show(ProcedureInfo t), Eq(ProcedureInfo t),+ Show(BlockInfo t), Eq(BlockInfo t),+ Show(ProgramInfo t), Eq(ProgramInfo t),+ Show(EmptyInfo t), Eq(EmptyInfo t),+ Show(PrimitiveInfo t), Eq(PrimitiveInfo t),+ Show(SequenceInfo t), Eq(SequenceInfo t),+ Show(BranchInfo t), Eq(BranchInfo t),+ Show(SequentialLoopInfo t), Eq(SequentialLoopInfo t),+ Show(ParallelLoopInfo t), Eq(ParallelLoopInfo t),+ Show(FormalParameterInfo t), Eq(FormalParameterInfo t),+ Show(LocalDeclarationInfo t), Eq(LocalDeclarationInfo t),+ Show(ExpressionInfo t), Eq(ExpressionInfo t),+ Show(ConstantInfo t), Eq(ConstantInfo t),+ Show(FunctionCallInfo t), Eq(FunctionCallInfo t),+ Show(LeftValueInfo t), Eq(LeftValueInfo t),+ Show(ArrayElemReferenceInfo t), Eq(ArrayElemReferenceInfo t),+ Show(InstructionInfo t), Eq(InstructionInfo t),+ Show(AssignmentInfo t), Eq(AssignmentInfo t),+ Show(ProcedureCallInfo t), Eq(ProcedureCallInfo t),+ Show(ActualParameterInfo t), Eq(ActualParameterInfo t),+ Show(IntConstantInfo t), Eq(IntConstantInfo t),+ Show(FloatConstantInfo t), Eq(FloatConstantInfo t),+ Show(BoolConstantInfo t), Eq(BoolConstantInfo t),+ Show(ArrayConstantInfo t), Eq(ArrayConstantInfo t),+ Show(VariableInfo t), Eq(VariableInfo t)+ ) => SemanticInfo t where type ProcedureInfo t type BlockInfo t type ProgramInfo t@@ -79,117 +79,99 @@ type ParallelLoopInfo t type FormalParameterInfo t type LocalDeclarationInfo t- type LeftValueExpressionInfo t- type VariableInLeftValueInfo t+ type ExpressionInfo t+ type ConstantInfo t+ type FunctionCallInfo t+ type LeftValueInfo t type ArrayElemReferenceInfo t- type InputActualParameterInfo t- type OutputActualParameterInfo t+ type InstructionInfo t type AssignmentInfo t type ProcedureCallInfo t- type FunctionCallInfo t+ type ActualParameterInfo t type IntConstantInfo t type FloatConstantInfo t type BoolConstantInfo t type ArrayConstantInfo t type VariableInfo t---- ===========================================================================--- == Unit semantic info instance--- ===========================================================================-+ instance SemanticInfo () where- type ProcedureInfo () = ()- type BlockInfo () = ()- type ProgramInfo () = ()- type EmptyInfo () = ()- type PrimitiveInfo () = ()- type SequenceInfo () = ()- type BranchInfo () = ()- type SequentialLoopInfo () = ()- type ParallelLoopInfo () = ()- type FormalParameterInfo () = ()- type LocalDeclarationInfo () = ()- type LeftValueExpressionInfo () = ()- type VariableInLeftValueInfo () = ()- type ArrayElemReferenceInfo () = ()- type InputActualParameterInfo () = ()- type OutputActualParameterInfo () = ()- type AssignmentInfo () = ()- type ProcedureCallInfo () = ()- type FunctionCallInfo () = ()- type IntConstantInfo () = ()- type FloatConstantInfo () = ()- type BoolConstantInfo () = ()- type ArrayConstantInfo () = ()- type VariableInfo () = ()---- ===========================================================================--- == Basic semantic info instance--- ===========================================================================--data InitSemInf+ type ProcedureInfo () = ()+ type BlockInfo () = ()+ type ProgramInfo () = ()+ type EmptyInfo () = ()+ type PrimitiveInfo () = ()+ type SequenceInfo () = ()+ type BranchInfo () = ()+ type SequentialLoopInfo () = ()+ type ParallelLoopInfo () = ()+ type FormalParameterInfo () = ()+ type LocalDeclarationInfo () = ()+ type ExpressionInfo () = ()+ type ConstantInfo () = ()+ type FunctionCallInfo () = ()+ type LeftValueInfo () = ()+ type ArrayElemReferenceInfo () = ()+ type InstructionInfo () = ()+ type AssignmentInfo () = ()+ type ProcedureCallInfo () = ()+ type ActualParameterInfo () = ()+ type IntConstantInfo () = ()+ type FloatConstantInfo () = ()+ type BoolConstantInfo () = ()+ type ArrayConstantInfo () = ()+ type VariableInfo () = () instance SemanticInfo InitSemInf where- type ProcedureInfo InitSemInf = ()- type BlockInfo InitSemInf = ()- type ProgramInfo InitSemInf = ()- type EmptyInfo InitSemInf = ()- type PrimitiveInfo InitSemInf = Bool- type SequenceInfo InitSemInf = ()- type BranchInfo InitSemInf = ()- type SequentialLoopInfo InitSemInf = ()- type ParallelLoopInfo InitSemInf = ()- type FormalParameterInfo InitSemInf = ()- type LocalDeclarationInfo InitSemInf = ()- type LeftValueExpressionInfo InitSemInf = ()- type VariableInLeftValueInfo InitSemInf = ()- type ArrayElemReferenceInfo InitSemInf = ()- type InputActualParameterInfo InitSemInf = ()- type OutputActualParameterInfo InitSemInf = ()- type AssignmentInfo InitSemInf = ()- type ProcedureCallInfo InitSemInf = ()- type FunctionCallInfo InitSemInf = ()- type IntConstantInfo InitSemInf = ()- type FloatConstantInfo InitSemInf = ()- type BoolConstantInfo InitSemInf = ()- type ArrayConstantInfo InitSemInf = ()- type VariableInfo InitSemInf = ()---- ===========================================================================--- == PrettyPrint semantic info instance--- ===========================================================================---data IsRestrict = Restrict | NoRestrict- deriving (Show,Eq)--data IsDefaultArraySize = DefaultArraySize | NoDefaultArraySize- deriving (Show,Eq)--data PrettyPrintSemanticInfo+ type ProcedureInfo InitSemInf = ()+ type BlockInfo InitSemInf = ()+ type ProgramInfo InitSemInf = ()+ type EmptyInfo InitSemInf = ()+ type PrimitiveInfo InitSemInf = Bool+ type SequenceInfo InitSemInf = ()+ type BranchInfo InitSemInf = ()+ type SequentialLoopInfo InitSemInf = ()+ type ParallelLoopInfo InitSemInf = ()+ type FormalParameterInfo InitSemInf = ()+ type LocalDeclarationInfo InitSemInf = ()+ type ExpressionInfo InitSemInf = ()+ type ConstantInfo InitSemInf = ()+ type FunctionCallInfo InitSemInf = ()+ type LeftValueInfo InitSemInf = ()+ type ArrayElemReferenceInfo InitSemInf = ()+ type InstructionInfo InitSemInf = ()+ type AssignmentInfo InitSemInf = ()+ type ProcedureCallInfo InitSemInf = ()+ type ActualParameterInfo InitSemInf = ()+ type IntConstantInfo InitSemInf = ()+ type FloatConstantInfo InitSemInf = ()+ type BoolConstantInfo InitSemInf = ()+ type ArrayConstantInfo InitSemInf = ()+ type VariableInfo InitSemInf = () instance SemanticInfo PrettyPrintSemanticInfo where- type ProcedureInfo PrettyPrintSemanticInfo = ()- type BlockInfo PrettyPrintSemanticInfo = ()- type ProgramInfo PrettyPrintSemanticInfo = ()- type EmptyInfo PrettyPrintSemanticInfo = ()- type PrimitiveInfo PrettyPrintSemanticInfo = ()- type SequenceInfo PrettyPrintSemanticInfo = ()- type BranchInfo PrettyPrintSemanticInfo = ()- type SequentialLoopInfo PrettyPrintSemanticInfo = ()- type ParallelLoopInfo PrettyPrintSemanticInfo = ()- type FormalParameterInfo PrettyPrintSemanticInfo = IsRestrict- type LocalDeclarationInfo PrettyPrintSemanticInfo = ()- type LeftValueExpressionInfo PrettyPrintSemanticInfo = ()- type VariableInLeftValueInfo PrettyPrintSemanticInfo = ()- type ArrayElemReferenceInfo PrettyPrintSemanticInfo = ()- type InputActualParameterInfo PrettyPrintSemanticInfo = ()- type OutputActualParameterInfo PrettyPrintSemanticInfo = ()- type AssignmentInfo PrettyPrintSemanticInfo = ()- type ProcedureCallInfo PrettyPrintSemanticInfo = ()- type FunctionCallInfo PrettyPrintSemanticInfo = ()- type IntConstantInfo PrettyPrintSemanticInfo = ()- type FloatConstantInfo PrettyPrintSemanticInfo = ()- type BoolConstantInfo PrettyPrintSemanticInfo = ()- type ArrayConstantInfo PrettyPrintSemanticInfo = ()- type VariableInfo PrettyPrintSemanticInfo = ()+ type ProcedureInfo PrettyPrintSemanticInfo = ()+ type BlockInfo PrettyPrintSemanticInfo = ()+ type ProgramInfo PrettyPrintSemanticInfo = ()+ type EmptyInfo PrettyPrintSemanticInfo = ()+ type PrimitiveInfo PrettyPrintSemanticInfo = ()+ type SequenceInfo PrettyPrintSemanticInfo = ()+ type BranchInfo PrettyPrintSemanticInfo = ()+ type SequentialLoopInfo PrettyPrintSemanticInfo = ()+ type ParallelLoopInfo PrettyPrintSemanticInfo = ()+ type FormalParameterInfo PrettyPrintSemanticInfo = IsRestrict+ type LocalDeclarationInfo PrettyPrintSemanticInfo = ()+ type ExpressionInfo PrettyPrintSemanticInfo = ()+ type ConstantInfo PrettyPrintSemanticInfo = ()+ type FunctionCallInfo PrettyPrintSemanticInfo = ()+ type LeftValueInfo PrettyPrintSemanticInfo = ()+ type ArrayElemReferenceInfo PrettyPrintSemanticInfo = ()+ type InstructionInfo PrettyPrintSemanticInfo = ()+ type AssignmentInfo PrettyPrintSemanticInfo = ()+ type ProcedureCallInfo PrettyPrintSemanticInfo = ()+ type ActualParameterInfo PrettyPrintSemanticInfo = ()+ type IntConstantInfo PrettyPrintSemanticInfo = ()+ type FloatConstantInfo PrettyPrintSemanticInfo = ()+ type BoolConstantInfo PrettyPrintSemanticInfo = ()+ type ArrayConstantInfo PrettyPrintSemanticInfo = ()+ type VariableInfo PrettyPrintSemanticInfo = ()+
Feldspar/Compiler/Options.hs view
@@ -1,46 +1,141 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- module Feldspar.Compiler.Options where ++import Feldspar.Compiler.Imperative.Representation+import Feldspar.Compiler.Imperative.Semantics(IsRestrict, PrettyPrintSemanticInfo)+++ data Options = Options { platform :: Platform , unroll :: UnrollStrategy , debug :: DebugOption , defaultArraySize :: Int- }+ } deriving (Eq, Show) -data Platform = AnsiC | C99 + data UnrollStrategy = NoUnroll | Unroll Int+ deriving (Eq, Show)++ data DebugOption = NoDebug | NoSimplification | NoPrimitiveInstructionHandling- deriving Eq+ deriving (Eq, Show)++++data Platform = Platform {+ name :: String,+ types :: [(Type, String, String)],+ values :: [(Type, ShowValue)],+ primitives :: [(FeldPrimDesc, Either CPrimDesc TransformPrim)],+ includes :: [String],+ isRestrict :: IsRestrict+} deriving (Eq, Show)+++data FeldPrimDesc = FeldPrimDesc {+ fName :: String,+ inputs :: [TypeDesc]+} deriving (Eq, Show)+++data CPrimDesc = Op1 {+ cOp :: String+} | Op2 {+ cOp :: String+} | Fun {+ cName :: String,+ funPf :: FunPostfixDescr+} | Proc {+ cName :: String,+ funPf :: FunPostfixDescr+} | Assig+ | InvalidDesc+ deriving (Eq, Show)+++data TypeDesc+ = AllT+ | BoolT+ | FloatT+ | IntT | IntTS | IntTU | IntTS_ Size | IntTU_ Size | IntT_ Size+ | UserT String+ deriving (Eq, Show)+++data FunPostfixDescr = FunPostfixDescr {+ useInputs :: Int,+ useOutputs :: Int+} deriving (Eq, Show)++noneFP = FunPostfixDescr 0 0+firstInFP = FunPostfixDescr 1 0+firstOutFP = FunPostfixDescr 0 1+++type ShowValue = (ConstantData PrettyPrintSemanticInfo -> String)++instance Eq ShowValue where+ (==) _ _ = True++instance Show ShowValue where+ show _ = "<<ShowValue>>"+++type TransformPrim+ = FeldPrimDesc+ -> [Expression ()]+ -> [LeftValue ()]+ -> [(CPrimDesc, [Expression ()], [LeftValue ()])]++instance Eq TransformPrim where+ (==) _ _ = True++instance Show TransformPrim where+ show _ = "<<TransformPrim>>"++++machTypes :: TypeDesc -> Type -> Bool+machTypes AllT _ = True+machTypes BoolT BoolType = True+machTypes FloatT FloatType = True+machTypes IntT (Numeric _ _) = True+machTypes IntTS (Numeric ImpSigned _) = True+machTypes IntTU (Numeric ImpUnsigned _) = True+machTypes (IntTS_ s) (Numeric ImpSigned s') = s == s'+machTypes (IntTU_ s) (Numeric ImpUnsigned s') = s == s'+machTypes (IntT_ s) (Numeric _ s') = s == s'+machTypes (UserT s) (UserType s') = s == s'+machTypes _ _ = False++
+ Feldspar/Compiler/Platforms.hs view
@@ -0,0 +1,223 @@+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+--++module Feldspar.Compiler.Platforms+ ( availablePlatforms+ , c99+ , tic64x+ ) where+++import Feldspar.Compiler.Options+import Feldspar.Compiler.Imperative.Representation+import Feldspar.Compiler.Imperative.Semantics(IsRestrict(..))+import Feldspar.Compiler.Imperative.CodeGeneration (typeof)++++availablePlatforms :: [Platform]+availablePlatforms = [ c99, tic64x ]+++-- ansiC = Platform "ansiC" undefined [] [] ["\"feldspar.h\""] NoRestrict+++c99 = Platform {+ name = "c99",+ types =+ [ (Numeric ImpSigned S8, "int8_t", "int8")+ , (Numeric ImpSigned S16, "int16_t", "int16")+ , (Numeric ImpSigned S32, "int32_t", "int32")+ , (Numeric ImpSigned S64, "int64_t", "int64")+ , (Numeric ImpUnsigned S8, "uint8_t", "uint8")+ , (Numeric ImpUnsigned S16, "uint16_t", "uint16")+ , (Numeric ImpUnsigned S32, "uint32_t", "uint32")+ , (Numeric ImpUnsigned S64, "uint64_t", "uint64")+ , (BoolType, "int", "int")+ , (FloatType, "float", "float")+ ] ,+ values = [] ,+ primitives =+ [ (FeldPrimDesc "(==)" [AllT, AllT], Left $ Op2 "==")+ , (FeldPrimDesc "(/=)" [AllT, AllT], Left $ Op2 "!=")+ , (FeldPrimDesc "(<)" [AllT, AllT], Left $ Op2 "<")+ , (FeldPrimDesc "(>)" [AllT, AllT], Left $ Op2 ">")+ , (FeldPrimDesc "(<=)" [AllT, AllT], Left $ Op2 "<=")+ , (FeldPrimDesc "(>=)" [AllT, AllT], Left $ Op2 ">=")+ , (FeldPrimDesc "not" [BoolT], Left $ Op1 "!")+ , (FeldPrimDesc "(&&)" [BoolT, BoolT], Left $ Op2 "&&")+ , (FeldPrimDesc "(||)" [BoolT, BoolT], Left $ Op2 "||")+ + , (FeldPrimDesc "quot" [AllT, AllT], Right optimizedDivide)+ , (FeldPrimDesc "rem" [AllT, AllT], Left $ Op2 "%")+ , (FeldPrimDesc "(^)" [AllT, AllT], Left $ Fun "pow" firstInFP)+ , (FeldPrimDesc "negate" [AllT], Left $ Op1 "-")+ , (FeldPrimDesc "abs" [IntTU], Left Assig)+ , (FeldPrimDesc "abs" [FloatT], Left $ Fun "fabsf" noneFP)+ , (FeldPrimDesc "abs" [AllT], Left $ Fun "abs" firstInFP)+ , (FeldPrimDesc "signum" [AllT], Left $ Fun "signum" firstInFP)+ , (FeldPrimDesc "(+)" [AllT, AllT], Left $ Op2 "+")+ , (FeldPrimDesc "(-)" [AllT, AllT], Left $ Op2 "-")+ , (FeldPrimDesc "(*)" [AllT, AllT], Right optimizedMultiply)+ , (FeldPrimDesc "(/)" [AllT, AllT], Left $ Op2 "/")+ + , (FeldPrimDesc "(.&.)" [IntT, IntT], Left $ Op2 "&")+ , (FeldPrimDesc "(.|.)" [IntT, IntT], Left $ Op2 "|")+ , (FeldPrimDesc "xor" [IntT, IntT], Left $ Op2 "^")+ , (FeldPrimDesc "complement" [IntT], Left $ Op1 "~")+ , (FeldPrimDesc "bit" [IntT], Right bitFunToShift)+ , (FeldPrimDesc "setBit" [IntT, IntT], Left $ Fun "setBit" firstInFP)+ , (FeldPrimDesc "clearBit" [IntT, IntT], Left $ Fun "clearBit" firstInFP)+ , (FeldPrimDesc "complementBit" [IntT, IntT], Left $ Fun "complementBit" firstInFP)+ , (FeldPrimDesc "testBit" [IntT, IntT], Left $ Fun "testBit" firstInFP)+ , (FeldPrimDesc "shiftL" [IntT, IntT], Left $ Op2 "<<")+ , (FeldPrimDesc "shiftR" [IntT, IntT], Left $ Op2 ">>")+ , (FeldPrimDesc "rotateL" [IntT, IntT], Left $ Fun "rotateL" firstInFP)+ , (FeldPrimDesc "rotateR" [IntT, IntT], Left $ Fun "rotateR" firstInFP)+ , (FeldPrimDesc "reverseBits" [IntT], Left $ Fun "reverseBits" firstInFP)+ , (FeldPrimDesc "bitScan" [IntT], Left $ Fun "bitScan" firstInFP)+ , (FeldPrimDesc "bitCount" [IntT], Left $ Fun "bitCount" firstInFP)+ , (FeldPrimDesc "bitSize" [IntT], Right bitSizeFunToConst)+ , (FeldPrimDesc "isSigned" [IntT], Right isSignedFunToConst)+ ] ,+ includes = ["\"feldspar_c99.h\"", "<stdint.h>", "<math.h>"],+ isRestrict = NoRestrict+}+++tic64x = Platform {+ name = "tic64x",+ types =+ [ (Numeric ImpSigned S8, "char", "char")+ , (Numeric ImpSigned S16, "short", "short")+ , (Numeric ImpSigned S32, "int", "int")+ , (Numeric ImpSigned S40, "long", "long")+ , (Numeric ImpSigned S64, "long long","llong")+ , (Numeric ImpUnsigned S8, "unsigned char", "uchar")+ , (Numeric ImpUnsigned S16, "unsigned short", "ushort")+ , (Numeric ImpUnsigned S32, "unsigned", "uint")+ , (Numeric ImpUnsigned S40, "unsigned long", "ulong")+ , (Numeric ImpUnsigned S64, "unsigned long long", "ullong")+ , (BoolType, "int", "int")+ , (FloatType, "float", "float")+ ] ,+ values = [] ,+ primitives =+ [ (FeldPrimDesc "abs" [IntTS_ S32], Left $ Fun "_abs" noneFP)+ , (FeldPrimDesc "abs" [FloatT], Left $ Fun "_fabsf" noneFP)+ , (FeldPrimDesc "rotateL" [IntTU_ S32, IntT], Left $ Fun "_rotl" noneFP)+ , (FeldPrimDesc "reverseBits" [IntTU_ S32], Left $ Fun "_bitr" noneFP)+ , (FeldPrimDesc "bitCount" [IntTU_ S32], Right optimizedBitCount)+ ]+ ++ primitives c99,+ includes = ["\"feldspar_tic64x.h\"", "<c6x.h>"],+ isRestrict = Restrict+}+++optimizedMultiply :: TransformPrim+optimizedMultiply _ [x, y] [o] = case (x,y) of+ (_, (Expression (ConstantExpression (Constant (IntConstant _) _)) _)) -> optimizedMultiply' x y+ ((Expression (ConstantExpression (Constant (IntConstant _) _)) _), _) -> optimizedMultiply' y x+ (_, _) -> [(Op2 "*", [x, y], [o])]+ where+ optimizedMultiply' int con+ | (machTypes IntT $ typeof int) + && (con' >= 0) + && (2 ^ (numberOfTwoPrimeFactors con') == con')+ = [ (Op2 "<<", [int, (intToCe $ numberOfTwoPrimeFactors con')], [o]) ]+ | (machTypes IntT $ typeof int) + && (con' < 0) + && (2 ^ (numberOfTwoPrimeFactors $ con'*(-1)) == con'*(-1))+ = [ (Op2 "<<", [int, (intToCe $ numberOfTwoPrimeFactors $ con'*(-1))], [o])+ , (Op1 "-", [lToe o], [o])+ ]+ | otherwise = [(Op2 "*", [x, y], [o])]+ where+ con' = ceToInt con+++optimizedDivide :: TransformPrim+optimizedDivide _ [x, y] [o] = case (x,y) of+ (_, (Expression (ConstantExpression (Constant (IntConstant _) _)) _)) -> optimizedDivide' x y+ (_, _) -> [(Op2 "/", [x, y], [o])]+ where+ optimizedDivide' int con+ | (machTypes IntT $ typeof int) + && (con' >= 0) + && (2 ^ (numberOfTwoPrimeFactors con') == con')+ = [ (Op2 ">>", [int, (intToCe $ numberOfTwoPrimeFactors con')], [o]) ]+ | (machTypes IntT $ typeof int) + && (con' < 0) + && (2 ^ (numberOfTwoPrimeFactors $ con'*(-1)) == con'*(-1))+ = [ (Op2 ">>", [int, (intToCe $ numberOfTwoPrimeFactors $ con'*(-1))], [o])+ , (Op1 "-", [lToe o], [o])+ ]+ | otherwise = [(Op2 "/", [x, y], [o])]+ where+ con' = ceToInt con+++bitFunToShift _ [i] [o] = [ (Op2 "<<", [intToCe 1, i], [o]) ]+++bitSizeFunToConst :: TransformPrim+bitSizeFunToConst _ [i] [o] = case (typeof i) of+ (Numeric _ S8) -> [ (Assig, [intToCe 8], [o]) ]+ (Numeric _ S16) -> [ (Assig, [intToCe 16], [o]) ]+ (Numeric _ S32) -> [ (Assig, [intToCe 32], [o]) ]+ (Numeric _ S40) -> [ (Assig, [intToCe 40], [o]) ]+ (Numeric _ S64) -> [ (Assig, [intToCe 64], [o]) ]+++isSignedFunToConst :: TransformPrim+isSignedFunToConst _ [i] [o] = case (typeof i) of+ (Numeric ImpSigned _) -> [ (Assig, [boolToCe True], [o]) ]+ (Numeric ImpUnsigned _) -> [ (Assig, [boolToCe False], [o]) ]+++optimizedBitCount :: TransformPrim+optimizedBitCount _ [i] [o]+ = [ (Fun "_bitc4" noneFP, [i], [o])+ , (Fun "_dotpu4" noneFP, [lToe o, intToCe 0x01010101], [o])+ ]+++numberOfTwoPrimeFactors 2 = 1+numberOfTwoPrimeFactors x | x `mod` 2 == 0 = (numberOfTwoPrimeFactors $ x `div` 2) + 1+ | otherwise = 0++++ceToInt (Expression (ConstantExpression (Constant (IntConstant (IntConstantType x _)) _)) _) = x+intToCe x = Expression (ConstantExpression $ Constant (IntConstant $ IntConstantType x ()) ()) ()+boolToCe x = Expression (ConstantExpression $ Constant (BoolConstant $ BoolConstantType x ()) ()) ()++lToe x = Expression (LeftValueExpression x) ()++
Feldspar/Compiler/PluginArchitecture.hs view
@@ -1,808 +1,1026 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}--{-# LANGUAGE TypeFamilies, FlexibleContexts, Rank2Types #-}--module Feldspar.Compiler.PluginArchitecture (- module Feldspar.Compiler.PluginArchitecture,- module Feldspar.Compiler.Imperative.Representation,- module Feldspar.Compiler.Imperative.Semantics,- module Feldspar.Compiler.PluginArchitecture.DefaultConvert-) where--import Feldspar.Compiler.Imperative.Representation-import Feldspar.Compiler.Imperative.Semantics-import Feldspar.Compiler.PluginArchitecture.DefaultConvert---- ==================================================================================================================================--- == Plugin class--- ==================================================================================================================================--type Walker t construction = (TransformationPhase t) => t -> Downwards t -> construction (From t) -> (construction (To t), Upwards t)--class (TransformationPhase t) => Plugin t where- type ExternalInfo t- executePlugin :: t -> ExternalInfo t -> Procedure (From t) -> Procedure (To t)--class (SemanticInfo (From t), SemanticInfo (To t)- , ConvertAllInfos (From t) (To t)- , Combine (Upwards t), Default (Upwards t)) => TransformationPhase t where- type From t- type To t- type Downwards t- type Upwards t-- executeTransformationPhase :: Walker t Procedure- executeTransformationPhase = walkProcedure---- ==================================================================================================================================--- == Node Transformers specification--- ==================================================================================================================================-- downwardsProcedure :: t -> Downwards t -> Procedure (From t) -> Downwards t- transformProcedure :: t -> Downwards t -> Procedure (From t) -> InfosFromProcedureParts t -> Procedure (To t)- upwardsProcedure :: t -> Downwards t -> Procedure (From t) -> InfosFromProcedureParts t -> Procedure (To t) -> Upwards t-- downwardsBlock :: t -> Downwards t -> Block (From t) -> Downwards t- transformBlock :: t -> Downwards t -> Block (From t) -> InfosFromBlockParts t -> Block (To t)- upwardsBlock :: t -> Downwards t -> Block (From t) -> InfosFromBlockParts t -> Block (To t) -> Upwards t-- downwardsProgram :: t -> Downwards t -> Program (From t) -> Downwards t- transformProgram :: t -> Downwards t -> Program (From t) -> InfosFromProgramParts t -> Program (To t)- upwardsProgram :: t -> Downwards t -> Program (From t) -> InfosFromProgramParts t -> Program (To t) -> Upwards t-- transformEmpty :: t -> Downwards t -> Empty (From t) -> ProgramConstruction (To t)- upwardsEmpty :: t -> Downwards t -> Empty (From t) -> ProgramConstruction (To t) -> Upwards t- - downwardsPrimitive :: t -> Downwards t -> Primitive (From t) -> Downwards t- transformPrimitive :: t -> Downwards t -> Primitive (From t) -> InfosFromPrimitiveParts t -> ProgramConstruction (To t)- upwardsPrimitive :: t -> Downwards t -> Primitive (From t) -> InfosFromPrimitiveParts t -> ProgramConstruction (To t) -> Upwards t- - downwardsSequence :: t -> Downwards t -> Sequence (From t) -> Downwards t- transformSequence :: t -> Downwards t -> Sequence (From t) -> InfosFromSequenceParts t -> ProgramConstruction (To t)- upwardsSequence :: t -> Downwards t -> Sequence (From t) -> InfosFromSequenceParts t -> ProgramConstruction (To t) -> Upwards t- - downwardsBranch :: t -> Downwards t -> Branch (From t) -> Downwards t- transformBranch :: t -> Downwards t -> Branch (From t) -> InfosFromBranchParts t -> ProgramConstruction (To t)- upwardsBranch :: t -> Downwards t -> Branch (From t) -> InfosFromBranchParts t -> ProgramConstruction (To t) -> Upwards t- - downwardsSequentialLoop :: t -> Downwards t -> SequentialLoop (From t) -> Downwards t- transformSequentialLoop :: t -> Downwards t -> SequentialLoop (From t) -> InfosFromSequentialLoopParts t -> ProgramConstruction (To t)- upwardsSequentialLoop :: t -> Downwards t -> SequentialLoop (From t) -> InfosFromSequentialLoopParts t -> ProgramConstruction (To t) -> Upwards t- - downwardsParallelLoop :: t -> Downwards t -> ParallelLoop (From t) -> Downwards t- transformParallelLoop :: t -> Downwards t -> ParallelLoop (From t) -> InfosFromParallelLoopParts t -> ProgramConstruction (To t)- upwardsParallelLoop :: t -> Downwards t -> ParallelLoop (From t) -> InfosFromParallelLoopParts t -> ProgramConstruction (To t) -> Upwards t- - downwardsFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> Downwards t- transformFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> InfosFromFormalParameterParts t -> FormalParameter (To t)- upwardsFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> InfosFromFormalParameterParts t -> FormalParameter (To t) -> Upwards t- - downwardsLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> Downwards t- transformLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> InfosFromLocalDeclarationParts t -> LocalDeclaration (To t)- upwardsLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> InfosFromLocalDeclarationParts t -> LocalDeclaration (To t) -> Upwards t- - downwardsAssignment :: t -> Downwards t -> Assignment (From t) -> Downwards t- transformAssignment :: t -> Downwards t -> Assignment (From t) -> InfosFromAssignmentParts t -> Instruction (To t)- upwardsAssignment :: t -> Downwards t -> Assignment (From t) -> InfosFromAssignmentParts t -> Instruction (To t) -> Upwards t- - downwardsProcedureCall :: t -> Downwards t -> ProcedureCall (From t) -> Downwards t- transformProcedureCall :: t -> Downwards t -> ProcedureCall (From t) -> InfosFromProcedureCallParts t -> Instruction (To t)- upwardsProcedureCall :: t -> Downwards t -> ProcedureCall (From t) -> InfosFromProcedureCallParts t -> Instruction (To t) -> Upwards t- - downwardsInputActualParameter :: t -> Downwards t -> InputActualParameterType (From t) -> Downwards t- transformInputActualParameter :: t -> Downwards t -> InputActualParameterType (From t) -> InfosFromInputActualParameterParts t -> ActualParameter (To t)- upwardsInputActualParameter :: t -> Downwards t -> InputActualParameterType (From t) -> InfosFromInputActualParameterParts t -> ActualParameter (To t) -> Upwards t- - downwardsOutputActualParameter :: t -> Downwards t -> OutputActualParameterType (From t) -> Downwards t- transformOutputActualParameter :: t -> Downwards t -> OutputActualParameterType (From t) -> InfosFromOutputActualParameterParts t -> ActualParameter (To t)- upwardsOutputActualParameter :: t -> Downwards t -> OutputActualParameterType (From t) -> InfosFromOutputActualParameterParts t -> ActualParameter (To t) -> Upwards t- - downwardsVariableInLeftValue :: t -> Downwards t -> VariableInLeftValue (From t) -> Downwards t- transformVariableInLeftValue :: t -> Downwards t -> VariableInLeftValue (From t) -> InfosFromVariableLeftValueParts t -> LeftValue (To t)- upwardsVariableInLeftValue :: t -> Downwards t -> VariableInLeftValue (From t) -> InfosFromVariableLeftValueParts t -> LeftValue (To t) -> Upwards t- - downwardsArrayElemReference :: t -> Downwards t -> ArrayElemReference (From t) -> Downwards t- transformArrayElemReference :: t -> Downwards t -> ArrayElemReference (From t) -> InfosFromArrayElemReferenceParts t -> LeftValue (To t)- upwardsArrayElemReference :: t -> Downwards t -> ArrayElemReference (From t) -> InfosFromArrayElemReferenceParts t -> LeftValue (To t) -> Upwards t- - downwardsLeftValueExpression :: t -> Downwards t -> LeftValueInExpression (From t) -> Downwards t- transformLeftValueExpression :: t -> Downwards t -> LeftValueInExpression (From t) -> InfosFromLeftValueExpressionParts t -> Expression (To t)- upwardsLeftValueExpression :: t -> Downwards t -> LeftValueInExpression (From t) -> InfosFromLeftValueExpressionParts t -> Expression (To t) -> Upwards t- - downwardsFunctionCall :: t -> Downwards t -> FunctionCall (From t) -> Downwards t- transformFunctionCall :: t -> Downwards t -> FunctionCall (From t) -> InfosFromFunctionCallParts t -> Expression (To t)- upwardsFunctionCall :: t -> Downwards t -> FunctionCall (From t) -> InfosFromFunctionCallParts t -> Expression (To t) -> Upwards t- - transformIntConstant :: t -> Downwards t -> IntConstantType (From t) -> Constant (To t)- upwardsIntConstant :: t -> Downwards t -> IntConstantType (From t) -> Constant (To t) -> Upwards t- - transformFloatConstant :: t -> Downwards t -> FloatConstantType (From t) -> Constant (To t)- upwardsFloatConstant :: t -> Downwards t -> FloatConstantType (From t) -> Constant (To t) -> Upwards t- - transformBoolConstant :: t -> Downwards t -> BoolConstantType (From t) -> Constant (To t)- upwardsBoolConstant :: t -> Downwards t -> BoolConstantType (From t) -> Constant (To t) -> Upwards t- - downwardsArrayConstant :: t -> Downwards t -> ArrayConstantType (From t) -> Downwards t- transformArrayConstant :: t -> Downwards t -> ArrayConstantType (From t) -> InfosFromArrayConstantParts t -> Constant (To t)- upwardsArrayConstant :: t -> Downwards t -> ArrayConstantType (From t) -> InfosFromArrayConstantParts t -> Constant (To t) -> Upwards t- - transformVariable :: t -> Downwards t -> Variable (From t) -> Variable (To t)- upwardsVariable :: t -> Downwards t -> Variable (From t) -> Variable (To t) -> Upwards t---- ==================================================================================================================================--- == Node Transformer defaults--- ==================================================================================================================================-- downwardsProcedure self = const- transformProcedure self fromAbove originalProcedure fromBelow = originalProcedure {- inParameters = recursivelyTransformedInParameters fromBelow,- outParameters = recursivelyTransformedOutParameters fromBelow,- procedureBody = recursivelyTransformedProcedureBody fromBelow,- procedureSemInf = convert $ procedureSemInf originalProcedure- }- upwardsProcedure self fromAbove originalProcedure fromBelow transformedProcedure = foldl combine (upwardsInfoFromProcedureBody fromBelow)- ((upwardsInfoFromInParameters fromBelow)++(upwardsInfoFromOutParameters fromBelow))- - downwardsBlock self = const- transformBlock self fromAbove originalBlock fromBelow = Block {- blockData = recursivelyTransformedBlockData fromBelow,- blockSemInf = convert $ blockSemInf originalBlock- }- upwardsBlock self fromAbove originalBlock fromBelow transformedBlock = foldl combine- (upwardsInfoFromBlockInstructions fromBelow) (upwardsInfoFromBlockDeclarations fromBelow)- - downwardsProgram self = const- transformProgram self fromAbove originalProgram fromBelow = Program {- programConstruction = recursivelyTransformedProgramConstruction fromBelow,- programSemInf = convert $ programSemInf originalProgram- }- upwardsProgram self fromAbove originalProgram fromBelow transformedProgram = upwardsInfoFromProgramConstruction fromBelow- - transformEmpty self fromAbove originalEmpty = EmptyProgram $ Empty {- emptySemInf = convert $ emptySemInf originalEmpty- }- upwardsEmpty self fromAbove originalEmpty transformedEmpty = defaultValue- - downwardsPrimitive self = const- transformPrimitive self fromAbove originalPrimitive fromBelow = PrimitiveProgram $ Primitive {- primitiveInstruction = recursivelyTransformedPrimitiveInstruction fromBelow,- primitiveSemInf = convert $ primitiveSemInf originalPrimitive- }- upwardsPrimitive self fromAbove originalPrimitive fromBelow transformedPrimitive = upwardsInfoFromPrimitiveInstruction fromBelow- - downwardsSequence self = const- transformSequence self fromAbove originalSequence fromBelow = SequenceProgram $ Sequence {- sequenceProgramList = recursivelyTransformedSequenceProgramList fromBelow,- sequenceSemInf = convert $ sequenceSemInf originalSequence- }- upwardsSequence self fromAbove originalSequence fromBelow transformedSequence = case ul of- [] -> defaultValue- otherwise -> foldl combine (head ul) (tail ul)- where ul = upwardsInfoFromSequenceProgramList fromBelow- - downwardsBranch self = const- transformBranch self fromAbove originalBranch fromBelow = BranchProgram $ Branch {- branchData = recursivelyTransformedBranchData fromBelow,- branchSemInf = convert $ branchSemInf originalBranch- }- upwardsBranch self fromAbove originalBranch fromBelow transformedBranch = - foldl combine (upwardsInfoFromBranchConditionVariable fromBelow) [upwardsInfoFromThenBlock fromBelow, upwardsInfoFromElseBlock fromBelow]- - downwardsSequentialLoop self = const- transformSequentialLoop self fromAbove originalSequentialLoop fromBelow = SequentialLoopProgram $ SequentialLoop {- sequentialLoopData = recursivelyTransformedSequentialLoopData fromBelow,- sequentialLoopSemInf = convert $ sequentialLoopSemInf originalSequentialLoop- }- upwardsSequentialLoop self fromAbove originalSequentialLoop fromBelow transformedSequentialLoop =- foldl combine (upwardsInfoFromSequentialLoopConditionVariable fromBelow)- [upwardsInfoFromSequentialLoopConditionCalculation fromBelow, upwardsInfoFromSequentialLoopCore fromBelow]- - downwardsParallelLoop self = const- transformParallelLoop self fromAbove originalParallelLoop fromBelow = ParallelLoopProgram $ ParallelLoop {- parallelLoopData = recursivelyTransformedParallelLoopData fromBelow,- parallelLoopSemInf = convert $ parallelLoopSemInf originalParallelLoop- }- upwardsParallelLoop self fromAbove originalParallelLoop fromBelow transformedParallelLoop =- foldl combine (upwardsInfoFromParallelLoopConditionVariable fromBelow)- [upwardsInfoFromNumberOfIterations fromBelow, upwardsInfoFromParallelLoopCore fromBelow]- - downwardsFormalParameter self = const- transformFormalParameter self fromAbove originalFormalParameter fromBelow = FormalParameter {- formalParameterVariable = recursivelyTransformedFormalParameterVariable fromBelow,- formalParameterSemInf = convert $ formalParameterSemInf originalFormalParameter- }- upwardsFormalParameter self fromAbove originalFormalParameter fromBelow transformedFormalParameter =- upwardsInfoFromFormalParameterVariable fromBelow- - downwardsLocalDeclaration self = const- transformLocalDeclaration self fromAbove originalLocalDeclaration fromBelow = LocalDeclaration {- localDeclarationData = recursivelyTransformedLocalDeclarationData fromBelow,- localDeclarationSemInf = convert $ localDeclarationSemInf originalLocalDeclaration- }- upwardsLocalDeclaration self fromAbove originalLocalDeclaration fromBelow transformedLocalDeclaration =- case (upwardsInfoFromLocalInitValue fromBelow) of- Nothing -> (upwardsInfoFromLocalVariable fromBelow)- Just justUpFromLocalInitValue -> combine (upwardsInfoFromLocalVariable fromBelow) justUpFromLocalInitValue- - downwardsAssignment self = const- transformAssignment self fromAbove originalAssignment fromBelow = AssignmentInstruction $ Assignment {- assignmentData = recursivelyTransformedAssignmentData fromBelow,- assignmentSemInf = convert $ assignmentSemInf originalAssignment- }- upwardsAssignment self fromAbove originalAssignment fromBelow transformedAssignment =- combine (upwardsInfoFromAssignmentLhs fromBelow) (upwardsInfoFromAssignmentRhs fromBelow)- - downwardsProcedureCall self = const- transformProcedureCall self fromAbove originalProcedureCall fromBelow = ProcedureCallInstruction $ ProcedureCall {- procedureCallData = recursivelyTransformedProcedureCallData fromBelow,- procedureCallSemInf = convert $ procedureCallSemInf originalProcedureCall- }- upwardsProcedureCall self fromAbove originalProcedureCall fromBelow transformedProcedureCall =- case ul of- [] -> defaultValue- otherwise -> foldl combine (head ul) (tail ul)- where- ul = upwardsInfoFromActualParametersOfProcedureToCall fromBelow- - downwardsInputActualParameter self = const- transformInputActualParameter self fromAbove originalInputActualParameter fromBelow = InputActualParameter $ InputActualParameterType {- inputActualParameterExpression = recursivelyTransformedInputActualParameterExpression fromBelow,- inputActualParameterSemInf = convert $ inputActualParameterSemInf originalInputActualParameter- }- upwardsInputActualParameter self fromAbove originalInputActualParameter fromBelow transformedInputActualParameter =- upwardsInfoFromInputActualParameter fromBelow- - downwardsOutputActualParameter self = const- transformOutputActualParameter self fromAbove originalOutputActualParameter fromBelow = OutputActualParameter $ OutputActualParameterType {- outputActualParameterLeftValue = recursivelyTransformedOutputActualParameterLeftValue fromBelow,- outputActualParameterSemInf = convert $ outputActualParameterSemInf originalOutputActualParameter- }- upwardsOutputActualParameter self fromAbove originalOutputActualParameter fromBelow transformedOutputActualParameter =- upwardsInfoFromOutputActualParameterLeftValue fromBelow- - downwardsVariableInLeftValue self = const- transformVariableInLeftValue self fromAbove originalVariableInLeftValue fromBelow = VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = recursivelyTransformedVariableLeftValueContents fromBelow,- variableLeftValueSemInf = convert $ variableLeftValueSemInf originalVariableInLeftValue- }- upwardsVariableInLeftValue self fromAbove originalVariableInLeftValue fromBelow transformedVariableInLeftValue =- upwardsInfoFromVariableLeftValueContents fromBelow- - downwardsArrayElemReference self = const- transformArrayElemReference self fromAbove originalArrayElemReference fromBelow = ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = recursivelyTransformedArrayElemReferenceData fromBelow,- arrayElemReferenceSemInf = convert $ arrayElemReferenceSemInf originalArrayElemReference- }- upwardsArrayElemReference self fromAbove originalArrayElemReference fromBelow transformedArrayElemReference =- combine (upwardsInfoFromArrayName fromBelow) (upwardsInfoFromArrayIndex fromBelow)- - downwardsLeftValueExpression self = const- transformLeftValueExpression self fromAbove originalLeftValueExpression fromBelow = LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = recursivelyTransformedLeftValueExpressionContents fromBelow,- leftValueExpressionSemInf = convert $ leftValueExpressionSemInf originalLeftValueExpression- }- upwardsLeftValueExpression self fromAbove originalLeftValueExpression fromBelow transformedLeftValueExpression = - upwardsInfoFromLeftValueExpressionContents fromBelow- - downwardsFunctionCall self = const- transformFunctionCall self fromAbove originalFunctionCall fromBelow = FunctionCallExpression $ FunctionCall {- functionCallData = recursivelyTransformedFunctionCallData fromBelow,- functionCallSemInf = convert $ functionCallSemInf originalFunctionCall- }- upwardsFunctionCall self fromAbove originalFunctionCall fromBelow transformedFunctionCall = case ul of- [] -> defaultValue- otherwise -> foldl combine (head ul) (tail ul)- where ul = upwardsInfoFromActualParametersOfFunctionToCall fromBelow- - transformIntConstant self fromAbove originalIntConstant = IntConstant originalIntConstant {- intConstantSemInf = convert $ intConstantSemInf originalIntConstant- }- upwardsIntConstant self fromAbove originalIntConstant transformedIntConstant = defaultValue- - transformFloatConstant self fromAbove originalFloatConstant = FloatConstant originalFloatConstant {- floatConstantSemInf = convert $ floatConstantSemInf originalFloatConstant- }- upwardsFloatConstant self fromAbove originalFloatConstant transformedFloatConstant = defaultValue- - transformBoolConstant self fromAbove originalBoolConstant = BoolConstant originalBoolConstant {- boolConstantSemInf = convert $ boolConstantSemInf originalBoolConstant- }- upwardsBoolConstant self fromAbove originalBoolConstant transformedBoolConstant = defaultValue- - downwardsArrayConstant self = const- transformArrayConstant self fromAbove originalArrayConstant fromBelow = ArrayConstant $ ArrayConstantType {- arrayConstantValue = recursivelyTransformedArrayConstantValue fromBelow,- arrayConstantSemInf = convert $ arrayConstantSemInf originalArrayConstant- }- upwardsArrayConstant self fromAbove originalArrayConstant fromBelow transformedArrayConstant = case ul of- [] -> defaultValue- otherwise -> foldl combine (head ul) (tail ul)- where ul = upwardsInfoFromConstantList fromBelow- - transformVariable self fromAbove originalVariable = originalVariable {- variableSemInf = convert $ variableSemInf originalVariable- }- upwardsVariable self fromAbove originalVariable transformedVariable = defaultValue---- ==================================================================================================================================--- == Walker defaults--- ==================================================================================================================================-- walkProcedure :: Walker t Procedure- walkProcedure selfpointer fromAbove construction = (transformedProcedure, toAbove)- where- toBelow = downwardsProcedure selfpointer fromAbove construction- transformedInParameters = map (walkFormalParameter selfpointer toBelow) $ inParameters construction- transformedOutParameters = map (walkFormalParameter selfpointer toBelow) $ outParameters construction- transformedProcedureBody = (walkBlock selfpointer toBelow) $ procedureBody construction- fromBelow = InfosFromProcedureParts {- recursivelyTransformedInParameters = map fst transformedInParameters,- upwardsInfoFromInParameters = map snd transformedInParameters,- recursivelyTransformedOutParameters = map fst transformedOutParameters,- upwardsInfoFromOutParameters = map snd transformedOutParameters,- recursivelyTransformedProcedureBody = fst transformedProcedureBody,- upwardsInfoFromProcedureBody = snd transformedProcedureBody- }- transformedProcedure = transformProcedure selfpointer fromAbove construction fromBelow- toAbove = upwardsProcedure selfpointer fromAbove construction fromBelow transformedProcedure- - walkFormalParameter :: Walker t FormalParameter- walkFormalParameter selfpointer fromAbove p = (transformedFormalParameter, toAbove)- where- toBelow = downwardsFormalParameter selfpointer fromAbove p- transformedVariable = walkVariable selfpointer toBelow (formalParameterVariable p)- fromBelow = InfosFromFormalParameterParts {- recursivelyTransformedFormalParameterVariable = fst transformedVariable,- upwardsInfoFromFormalParameterVariable = snd transformedVariable- }- transformedFormalParameter = transformFormalParameter selfpointer fromAbove p fromBelow- toAbove = upwardsFormalParameter selfpointer fromAbove p fromBelow transformedFormalParameter- - walkBlock :: Walker t Block- walkBlock selfpointer fromAbove block = (transformedBlock, toAbove)- where- toBelow = downwardsBlock selfpointer fromAbove block- transformedLocalDeclarations = map (walkLocalDeclaration selfpointer toBelow) $ blockDeclarations $ blockData block- transformedProgram = walkProgram selfpointer toBelow $ blockInstructions $ blockData block- fromBelow = InfosFromBlockParts {- recursivelyTransformedBlockData = BlockData {- blockDeclarations = map fst transformedLocalDeclarations,- blockInstructions = fst transformedProgram- },- upwardsInfoFromBlockDeclarations = map snd transformedLocalDeclarations,- upwardsInfoFromBlockInstructions = snd transformedProgram- }- transformedBlock = transformBlock selfpointer fromAbove block fromBelow- toAbove = upwardsBlock selfpointer fromAbove block fromBelow transformedBlock- - walkProgram :: Walker t Program- walkProgram selfpointer fromAbove program = (transformedProgram, toAbove)- where- toBelow = downwardsProgram selfpointer fromAbove program- transformedProgramConstruction = case programConstruction program of- EmptyProgram empty -> walkEmpty selfpointer toBelow empty - PrimitiveProgram primitive -> walkPrimitive selfpointer toBelow primitive- SequenceProgram sequence -> walkSequence selfpointer toBelow sequence- BranchProgram branch -> walkBranch selfpointer toBelow branch- SequentialLoopProgram sequentialLoop -> walkSequentialLoop selfpointer toBelow sequentialLoop - ParallelLoopProgram parallelLoop -> walkParallelLoop selfpointer toBelow parallelLoop- fromBelow = InfosFromProgramParts {- recursivelyTransformedProgramConstruction = fst transformedProgramConstruction,- upwardsInfoFromProgramConstruction = snd transformedProgramConstruction- }- transformedProgram = transformProgram selfpointer fromAbove program fromBelow- toAbove = upwardsProgram selfpointer fromAbove program fromBelow transformedProgram- - walkEmpty :: (TransformationPhase t) => t -> Downwards t -> Empty (From t) -> (ProgramConstruction (To t), Upwards t)- walkEmpty selfpointer fromAbove empty = (transformedEmpty, toAbove)- where- transformedEmpty = transformEmpty selfpointer fromAbove empty- toAbove = upwardsEmpty selfpointer fromAbove empty transformedEmpty- - walkPrimitive :: (TransformationPhase t) => t -> Downwards t -> Primitive (From t) -> (ProgramConstruction (To t), Upwards t)- walkPrimitive selfpointer fromAbove primitive = (transformedPrimitive, toAbove)- where- toBelow = downwardsPrimitive selfpointer fromAbove primitive- transformedPrimitiveInstruction =- walkInstruction selfpointer toBelow (primitiveInstruction primitive)- fromBelow = InfosFromPrimitiveParts {- recursivelyTransformedPrimitiveInstruction = fst transformedPrimitiveInstruction,- upwardsInfoFromPrimitiveInstruction = snd transformedPrimitiveInstruction- }- transformedPrimitive = transformPrimitive selfpointer fromAbove primitive fromBelow- toAbove = upwardsPrimitive selfpointer fromAbove primitive fromBelow transformedPrimitive-- walkSequence :: (TransformationPhase t) => t -> Downwards t -> Sequence (From t) -> (ProgramConstruction (To t), Upwards t)- walkSequence selfpointer fromAbove sequence = (transformedSequence, toAbove)- where- toBelow = downwardsSequence selfpointer fromAbove sequence- transformedProgramList =- map (walkProgram selfpointer toBelow) (sequenceProgramList sequence)- fromBelow = InfosFromSequenceParts {- recursivelyTransformedSequenceProgramList = map fst transformedProgramList,- upwardsInfoFromSequenceProgramList = map snd transformedProgramList- }- transformedSequence = transformSequence selfpointer fromAbove sequence fromBelow- toAbove = upwardsSequence selfpointer fromAbove sequence fromBelow transformedSequence- - walkBranch :: (TransformationPhase t) => t -> Downwards t -> Branch (From t) -> (ProgramConstruction (To t), Upwards t)- walkBranch selfpointer fromAbove branch = (transformedBranch, toAbove)- where- toBelow = downwardsBranch selfpointer fromAbove branch- transformedBranchConditionVariable = walkVariable selfpointer toBelow (branchConditionVariable $ branchData branch) - transformedThenBlock = walkBlock selfpointer toBelow (thenBlock $ branchData branch)- transformedElseBlock = walkBlock selfpointer toBelow (elseBlock $ branchData branch)- fromBelow = InfosFromBranchParts {- recursivelyTransformedBranchData = BranchData {- branchConditionVariable = fst transformedBranchConditionVariable,- thenBlock = fst transformedThenBlock,- elseBlock = fst transformedElseBlock- },- upwardsInfoFromBranchConditionVariable = snd transformedBranchConditionVariable,- upwardsInfoFromThenBlock = snd transformedThenBlock,- upwardsInfoFromElseBlock = snd transformedElseBlock- } - transformedBranch = transformBranch selfpointer fromAbove branch fromBelow- toAbove = upwardsBranch selfpointer fromAbove branch fromBelow transformedBranch-- walkSequentialLoop :: (TransformationPhase t) => t -> Downwards t -> SequentialLoop (From t) -> (ProgramConstruction (To t), Upwards t)- walkSequentialLoop selfpointer fromAbove loop = (transformedSequentialLoop, toAbove)- where- toBelow = downwardsSequentialLoop selfpointer fromAbove loop- transformedLoopConditionVariable =- walkExpression selfpointer toBelow (sequentialLoopCondition $ sequentialLoopData loop) - transformedConditionCalculation =- walkBlock selfpointer toBelow (conditionCalculation $ sequentialLoopData loop)- transformedSequentialLoopCore =- walkBlock selfpointer toBelow (sequentialLoopCore $ sequentialLoopData loop)- fromBelow = InfosFromSequentialLoopParts {- recursivelyTransformedSequentialLoopData = SequentialLoopData {- sequentialLoopCondition = fst transformedLoopConditionVariable,- conditionCalculation = fst transformedConditionCalculation,- sequentialLoopCore = fst transformedSequentialLoopCore- },- upwardsInfoFromSequentialLoopConditionVariable = snd transformedLoopConditionVariable,- upwardsInfoFromSequentialLoopConditionCalculation = snd transformedConditionCalculation,- upwardsInfoFromSequentialLoopCore = snd transformedSequentialLoopCore- }- transformedSequentialLoop = transformSequentialLoop selfpointer fromAbove loop fromBelow- toAbove = upwardsSequentialLoop selfpointer fromAbove loop fromBelow transformedSequentialLoop- - walkParallelLoop :: (TransformationPhase t) => t -> Downwards t -> ParallelLoop (From t) -> (ProgramConstruction (To t), Upwards t)- walkParallelLoop selfpointer fromAbove loop = (transformedParallelLoop, toAbove)- where- toBelow = downwardsParallelLoop selfpointer fromAbove loop- transformedParallelLoopConditionVariable =- walkVariable selfpointer toBelow (parallelLoopConditionVariable $ parallelLoopData loop)- transformedNumberOfIterations =- walkExpression selfpointer toBelow (numberOfIterations $ parallelLoopData loop) - transformedParallelLoopCore =- walkBlock selfpointer toBelow (parallelLoopCore $ parallelLoopData loop)- fromBelow = InfosFromParallelLoopParts {- recursivelyTransformedParallelLoopData = ParallelLoopData {- parallelLoopConditionVariable = fst transformedParallelLoopConditionVariable,- numberOfIterations = fst transformedNumberOfIterations,- parallelLoopStep = parallelLoopStep $ parallelLoopData loop,- parallelLoopCore = fst transformedParallelLoopCore- },- upwardsInfoFromParallelLoopConditionVariable = snd transformedParallelLoopConditionVariable,- upwardsInfoFromNumberOfIterations = snd transformedNumberOfIterations,- upwardsInfoFromParallelLoopCore = snd transformedParallelLoopCore- }- transformedParallelLoop = transformParallelLoop selfpointer fromAbove loop fromBelow- toAbove = upwardsParallelLoop selfpointer fromAbove loop fromBelow transformedParallelLoop- - walkLocalDeclaration :: Walker t LocalDeclaration- walkLocalDeclaration selfpointer fromAbove local = (transformedLocalDeclaration, toAbove)- where- toBelow = downwardsLocalDeclaration selfpointer fromAbove local- transformedLocalVariable = walkVariable selfpointer toBelow (localVariable $ localDeclarationData local)- transformedLocalInitValue = case localInitValue $ localDeclarationData local of- Nothing -> (Nothing, Nothing)- Just localInitExpression -> (Just (fst transformedLocalInitExpression), Just (snd transformedLocalInitExpression))- where transformedLocalInitExpression = walkExpression selfpointer toBelow localInitExpression- fromBelow = InfosFromLocalDeclarationParts {- recursivelyTransformedLocalDeclarationData = LocalDeclarationData {- localVariable = fst transformedLocalVariable,- localInitValue = fst transformedLocalInitValue- },- upwardsInfoFromLocalVariable = snd transformedLocalVariable,- upwardsInfoFromLocalInitValue = snd transformedLocalInitValue - }- transformedLocalDeclaration = transformLocalDeclaration selfpointer fromAbove local fromBelow- toAbove = upwardsLocalDeclaration selfpointer fromAbove local fromBelow transformedLocalDeclaration- - walkExpression :: Walker t Expression- walkExpression selfpointer fromAbove expression = case expression of- LeftValueExpression leftValueExpression -> (transformedLeftValueExpression, toAbove)- where- toBelow = downwardsLeftValueExpression selfpointer fromAbove leftValueExpression- transformedLeftValueExpressionContents = walkLeftValue selfpointer- toBelow (leftValueExpressionContents leftValueExpression) - fromBelow = InfosFromLeftValueExpressionParts {- recursivelyTransformedLeftValueExpressionContents = fst transformedLeftValueExpressionContents,- upwardsInfoFromLeftValueExpressionContents = snd transformedLeftValueExpressionContents- }- transformedLeftValueExpression = transformLeftValueExpression selfpointer fromAbove leftValueExpression fromBelow- toAbove = upwardsLeftValueExpression selfpointer fromAbove leftValueExpression fromBelow transformedLeftValueExpression- ConstantExpression constant -> ((ConstantExpression $ fst transformedConstant), snd transformedConstant) - where- toBelow = fromAbove -- calculations are done in WalkConstant, used only in the ArrayConstant branch- transformedConstant = walkConstant selfpointer toBelow constant- FunctionCallExpression functionCall -> (transformedFunctionCallExpression, toAbove)- where- toBelow = downwardsFunctionCall selfpointer fromAbove functionCall- transformedActualParametersOfFunctionToCall = map- (walkExpression selfpointer toBelow)- (actualParametersOfFunctionToCall $ functionCallData functionCall)- fromBelow = InfosFromFunctionCallParts {- recursivelyTransformedFunctionCallData = (functionCallData functionCall) {- actualParametersOfFunctionToCall = map fst transformedActualParametersOfFunctionToCall- },- upwardsInfoFromActualParametersOfFunctionToCall = map snd transformedActualParametersOfFunctionToCall- }- transformedFunctionCallExpression = transformFunctionCall selfpointer fromAbove functionCall fromBelow- toAbove = upwardsFunctionCall selfpointer fromAbove functionCall fromBelow transformedFunctionCallExpression- - walkConstant :: Walker t Constant- walkConstant selfpointer fromAbove constant = case constant of- IntConstant intConstant -> (transformedIntConstant, toAbove)- where- transformedIntConstant = transformIntConstant selfpointer fromAbove intConstant- toAbove = upwardsIntConstant selfpointer fromAbove intConstant transformedIntConstant- FloatConstant floatConstant -> (transformedFloatConstant, toAbove)- where- transformedFloatConstant = transformFloatConstant selfpointer fromAbove floatConstant- toAbove = upwardsFloatConstant selfpointer fromAbove floatConstant transformedFloatConstant- BoolConstant boolConstant -> (transformedBoolConstant, toAbove)- where- transformedBoolConstant = transformBoolConstant selfpointer fromAbove boolConstant- toAbove = upwardsBoolConstant selfpointer fromAbove boolConstant transformedBoolConstant- ArrayConstant arrayConstant -> (transformedArrayConstant, toAbove) - where- toBelow = downwardsArrayConstant selfpointer fromAbove arrayConstant- transformedConstantList = map (walkConstant selfpointer toBelow) (arrayConstantValue arrayConstant) - fromBelow = InfosFromArrayConstantParts {- recursivelyTransformedArrayConstantValue = map fst transformedConstantList,- upwardsInfoFromConstantList = map snd transformedConstantList- }- transformedArrayConstant = transformArrayConstant selfpointer fromAbove arrayConstant fromBelow- toAbove = upwardsArrayConstant selfpointer fromAbove arrayConstant fromBelow transformedArrayConstant- - walkLeftValue :: Walker t LeftValue- walkLeftValue selfpointer fromAbove leftValue = case leftValue of- VariableLeftValue lvt -> (transformedVariableLeftValue, toAbove)- where- toBelow = downwardsVariableInLeftValue selfpointer fromAbove lvt- transformedVariableLeftValueContents =- walkVariable selfpointer toBelow (variableLeftValueContents lvt) - fromBelow = InfosFromVariableLeftValueParts {- recursivelyTransformedVariableLeftValueContents = fst transformedVariableLeftValueContents,- upwardsInfoFromVariableLeftValueContents = snd transformedVariableLeftValueContents- }- transformedVariableLeftValue = transformVariableInLeftValue selfpointer fromAbove lvt fromBelow- toAbove = upwardsVariableInLeftValue selfpointer fromAbove lvt fromBelow transformedVariableLeftValue- ArrayElemReferenceLeftValue arrayElemReference -> (transformedArrayElemReference, toAbove)- where- toBelow = downwardsArrayElemReference selfpointer fromAbove arrayElemReference- transformedArrayName =- walkLeftValue selfpointer toBelow (arrayName $ arrayElemReferenceData arrayElemReference)- transformedArrayIndex =- walkExpression selfpointer toBelow (arrayIndex $ arrayElemReferenceData arrayElemReference) - fromBelow = InfosFromArrayElemReferenceParts {- recursivelyTransformedArrayElemReferenceData = ArrayElemReferenceData {- arrayName = fst transformedArrayName,- arrayIndex = fst transformedArrayIndex- },- upwardsInfoFromArrayName = snd transformedArrayName,- upwardsInfoFromArrayIndex = snd transformedArrayIndex- }- transformedArrayElemReference = transformArrayElemReference selfpointer fromAbove arrayElemReference fromBelow- toAbove = upwardsArrayElemReference selfpointer fromAbove arrayElemReference fromBelow transformedArrayElemReference- - walkActualParameter :: Walker t ActualParameter- walkActualParameter selfpointer fromAbove actualParameter = case actualParameter of- InputActualParameter input -> (transformedInputActualParameter, toAbove)- where- toBelow = downwardsInputActualParameter selfpointer fromAbove input- transformedInputActualParameterExpression =- walkExpression selfpointer toBelow (inputActualParameterExpression input) - fromBelow = InfosFromInputActualParameterParts {- recursivelyTransformedInputActualParameterExpression = fst transformedInputActualParameterExpression,- upwardsInfoFromInputActualParameter = snd transformedInputActualParameterExpression- }- transformedInputActualParameter = transformInputActualParameter selfpointer fromAbove input fromBelow- toAbove = upwardsInputActualParameter selfpointer fromAbove input fromBelow transformedInputActualParameter- OutputActualParameter output -> (transformedOutputActualParameter, toAbove)- where- toBelow = downwardsOutputActualParameter selfpointer fromAbove output- transformedOutputActualParameterLeftValue =- walkLeftValue selfpointer toBelow (outputActualParameterLeftValue output)- fromBelow = InfosFromOutputActualParameterParts {- recursivelyTransformedOutputActualParameterLeftValue = fst transformedOutputActualParameterLeftValue,- upwardsInfoFromOutputActualParameterLeftValue = snd transformedOutputActualParameterLeftValue - }- transformedOutputActualParameter = transformOutputActualParameter selfpointer fromAbove output fromBelow- toAbove = upwardsOutputActualParameter selfpointer fromAbove output fromBelow transformedOutputActualParameter- - - walkInstruction :: Walker t Instruction- walkInstruction selfpointer fromAbove instruction = case instruction of- AssignmentInstruction assignment -> (transformedAssignment, toAbove)- where- toBelow = downwardsAssignment selfpointer fromAbove assignment- transformedAssignmentLhs = walkLeftValue selfpointer toBelow (assignmentLhs $ assignmentData assignment)- transformedAssignmentRhs = walkExpression selfpointer toBelow (assignmentRhs $ assignmentData assignment) - fromBelow = InfosFromAssignmentParts {- recursivelyTransformedAssignmentData = AssignmentData {- assignmentLhs = fst transformedAssignmentLhs,- assignmentRhs = fst transformedAssignmentRhs- },- upwardsInfoFromAssignmentLhs = snd transformedAssignmentLhs,- upwardsInfoFromAssignmentRhs = snd transformedAssignmentRhs- }- transformedAssignment = transformAssignment selfpointer fromAbove assignment fromBelow- toAbove = upwardsAssignment selfpointer fromAbove assignment fromBelow transformedAssignment- ProcedureCallInstruction procedureCall -> (transformedProcedureCall, toAbove)- where- toBelow = downwardsProcedureCall selfpointer fromAbove procedureCall- transformedActualParametersOfProcedureToCall = map (walkActualParameter selfpointer toBelow)- (actualParametersOfProcedureToCall $ procedureCallData procedureCall)- fromBelow = InfosFromProcedureCallParts {- recursivelyTransformedProcedureCallData = (procedureCallData procedureCall) {- actualParametersOfProcedureToCall = map fst transformedActualParametersOfProcedureToCall- },- upwardsInfoFromActualParametersOfProcedureToCall = map snd transformedActualParametersOfProcedureToCall - }- transformedProcedureCall = transformProcedureCall selfpointer fromAbove procedureCall fromBelow- toAbove = upwardsProcedureCall selfpointer fromAbove procedureCall fromBelow transformedProcedureCall- - walkVariable :: Walker t Variable- walkVariable selfpointer fromAbove v = (transformedVariable, toAbove)- where- transformedVariable = transformVariable selfpointer fromAbove v- toAbove = upwardsVariable selfpointer fromAbove v transformedVariable---- ==================================================================================================================================--- == Upwards infos--- ==================================================================================================================================--data (TransformationPhase t) => InfosFromProcedureParts t = InfosFromProcedureParts {- recursivelyTransformedInParameters :: [FormalParameter (To t)],- upwardsInfoFromInParameters :: [Upwards t],- recursivelyTransformedOutParameters :: [FormalParameter (To t)],- upwardsInfoFromOutParameters :: [Upwards t],- recursivelyTransformedProcedureBody :: Block (To t),- upwardsInfoFromProcedureBody :: Upwards t-}--data (TransformationPhase t) => InfosFromBlockParts t = InfosFromBlockParts {- recursivelyTransformedBlockData :: BlockData (To t),- upwardsInfoFromBlockDeclarations :: [Upwards t],- upwardsInfoFromBlockInstructions :: Upwards t-}--data (TransformationPhase t) => InfosFromProgramParts t = InfosFromProgramParts {- recursivelyTransformedProgramConstruction :: ProgramConstruction (To t),- upwardsInfoFromProgramConstruction :: Upwards t-}--data (TransformationPhase t) => InfosFromPrimitiveParts t = InfosFromPrimitiveParts {- recursivelyTransformedPrimitiveInstruction :: Instruction (To t),- upwardsInfoFromPrimitiveInstruction :: Upwards t-}--data (TransformationPhase t) => InfosFromSequenceParts t = InfosFromSequenceParts {- recursivelyTransformedSequenceProgramList :: [Program (To t)],- upwardsInfoFromSequenceProgramList :: [Upwards t]-}--data (TransformationPhase t) => InfosFromBranchParts t = InfosFromBranchParts {- recursivelyTransformedBranchData :: BranchData (To t),- upwardsInfoFromBranchConditionVariable :: Upwards t,- upwardsInfoFromThenBlock :: Upwards t,- upwardsInfoFromElseBlock :: Upwards t-}--data (TransformationPhase t) => InfosFromSequentialLoopParts t = InfosFromSequentialLoopParts {- recursivelyTransformedSequentialLoopData :: SequentialLoopData (To t),- upwardsInfoFromSequentialLoopConditionVariable :: Upwards t,- upwardsInfoFromSequentialLoopConditionCalculation :: Upwards t,- upwardsInfoFromSequentialLoopCore :: Upwards t-}--data (TransformationPhase t) => InfosFromParallelLoopParts t = InfosFromParallelLoopParts {- recursivelyTransformedParallelLoopData :: ParallelLoopData (To t),- upwardsInfoFromParallelLoopConditionVariable :: Upwards t,- upwardsInfoFromNumberOfIterations :: Upwards t,- upwardsInfoFromParallelLoopCore :: Upwards t-}--data (TransformationPhase t) => InfosFromFormalParameterParts t = InfosFromFormalParameterParts {- recursivelyTransformedFormalParameterVariable :: Variable (To t),- upwardsInfoFromFormalParameterVariable :: Upwards t-}--data (TransformationPhase t) => InfosFromLocalDeclarationParts t = InfosFromLocalDeclarationParts {- recursivelyTransformedLocalDeclarationData :: LocalDeclarationData (To t),- upwardsInfoFromLocalVariable :: Upwards t,- upwardsInfoFromLocalInitValue :: Maybe (Upwards t)-}--data (TransformationPhase t) => InfosFromAssignmentParts t = InfosFromAssignmentParts {- recursivelyTransformedAssignmentData :: AssignmentData (To t),- upwardsInfoFromAssignmentLhs :: Upwards t,- upwardsInfoFromAssignmentRhs :: Upwards t-}--data (TransformationPhase t) => InfosFromProcedureCallParts t = InfosFromProcedureCallParts {- recursivelyTransformedProcedureCallData :: ProcedureCallData (To t),- upwardsInfoFromActualParametersOfProcedureToCall :: [Upwards t]-}--data (TransformationPhase t) => InfosFromInputActualParameterParts t = InfosFromInputActualParameterParts {- recursivelyTransformedInputActualParameterExpression :: Expression (To t),- upwardsInfoFromInputActualParameter :: Upwards t-}--data (TransformationPhase t) => InfosFromOutputActualParameterParts t = InfosFromOutputActualParameterParts {- recursivelyTransformedOutputActualParameterLeftValue :: LeftValue (To t),- upwardsInfoFromOutputActualParameterLeftValue :: Upwards t-}--data (TransformationPhase t) => InfosFromArrayElemReferenceParts t = InfosFromArrayElemReferenceParts {- recursivelyTransformedArrayElemReferenceData :: ArrayElemReferenceData (To t),- upwardsInfoFromArrayName :: Upwards t,- upwardsInfoFromArrayIndex :: Upwards t-}--data (TransformationPhase t) => InfosFromVariableLeftValueParts t = InfosFromVariableLeftValueParts {- recursivelyTransformedVariableLeftValueContents :: Variable (To t),- upwardsInfoFromVariableLeftValueContents :: Upwards t-}--data (TransformationPhase t) => InfosFromLeftValueExpressionParts t = InfosFromLeftValueExpressionParts {- recursivelyTransformedLeftValueExpressionContents :: LeftValue (To t),- upwardsInfoFromLeftValueExpressionContents :: Upwards t-}--data (TransformationPhase t) => InfosFromFunctionCallParts t = InfosFromFunctionCallParts {- recursivelyTransformedFunctionCallData :: FunctionCallData (To t),- upwardsInfoFromActualParametersOfFunctionToCall :: [Upwards t]-}--data (TransformationPhase t) => InfosFromArrayConstantParts t = InfosFromArrayConstantParts {- recursivelyTransformedArrayConstantValue :: [Constant (To t)],- upwardsInfoFromConstantList :: [Upwards t]-}-+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+--++{-# LANGUAGE TypeFamilies, FlexibleContexts, Rank2Types #-}++module Feldspar.Compiler.PluginArchitecture (+ module Feldspar.Compiler.PluginArchitecture,+ module Feldspar.Compiler.Imperative.Representation,+ module Feldspar.Compiler.Imperative.Semantics,+ module Feldspar.Compiler.PluginArchitecture.DefaultConvert+) where++import Feldspar.Compiler.Imperative.Representation+import Feldspar.Compiler.Imperative.Semantics+import Feldspar.Compiler.PluginArchitecture.DefaultConvert++foldlist :: (Default a, Combine a) => [a] -> a+foldlist ul = case ul of+ [] -> defaultValue+ otherwise -> foldl combine (head ul) (tail ul)+ +convertMaybeList :: Maybe [a] -> [a]+convertMaybeList ul = case ul of+ Nothing -> []+ Just x -> x++convertMaybe :: Maybe a -> [a]+convertMaybe ul = case ul of+ Nothing -> []+ Just x -> [x]+++-- ==================================================================================================================================+-- == Plugin class+-- ==================================================================================================================================++type Walker t construction = (TransformationPhase t) => t -> Downwards t -> construction (From t) -> (construction (To t), Upwards t)++class (TransformationPhase t) => Plugin t where+ type ExternalInfo t+ executePlugin :: t -> ExternalInfo t -> Procedure (From t) -> Procedure (To t)++class (SemanticInfo (From t), SemanticInfo (To t)+ , ConvertAllInfos (From t) (To t)+ , Combine (Upwards t), Default (Upwards t)) => TransformationPhase t where+ type From t+ type To t+ type Downwards t+ type Upwards t++ executeTransformationPhase :: Walker t Procedure+ executeTransformationPhase = walkProcedure++-- ====================================================================================================+-- == Node transformers (downwards-transform-upwards)+-- ====================================================================================================+ -- ====================================================================================================+ -- == Node transformers for Procedure+ -- ====================================================================================================+ downwardsProcedure :: t -> Downwards t -> Procedure (From t) -> Downwards t+ downwardsProcedure self = const+ transformProcedure :: t -> Downwards t -> Procedure (From t) -> InfoFromProcedureParts t -> Procedure (To t)+ transformProcedure self fromAbove originalProcedure fromBelow = originalProcedure {+ inParameters = recursivelyTransformedInParameters fromBelow,+ outParameters = recursivelyTransformedOutParameters fromBelow,+ procedureBody = recursivelyTransformedProcedureBody fromBelow,+ procedureSemInf = convert $ procedureSemInf originalProcedure+ }+ upwardsProcedure :: t -> Downwards t -> Procedure (From t) -> InfoFromProcedureParts t -> Procedure (To t) -> Upwards t+ upwardsProcedure self fromAbove originalProcedure fromBelow transformedProcedure = foldlist ((upwardsInfoFromInParameters fromBelow) ++ (upwardsInfoFromOutParameters fromBelow) ++ [(upwardsInfoFromProcedureBody fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Block+ -- ====================================================================================================+ downwardsBlock :: t -> Downwards t -> Block (From t) -> Downwards t+ downwardsBlock self = const+ transformBlock :: t -> Downwards t -> Block (From t) -> InfoFromBlockParts t -> Block (To t)+ transformBlock self fromAbove originalBlock fromBelow = originalBlock {+ blockDeclarations = recursivelyTransformedBlockDeclarations fromBelow,+ blockInstructions = recursivelyTransformedBlockInstructions fromBelow,+ blockSemInf = convert $ blockSemInf originalBlock+ }+ upwardsBlock :: t -> Downwards t -> Block (From t) -> InfoFromBlockParts t -> Block (To t) -> Upwards t+ upwardsBlock self fromAbove originalBlock fromBelow transformedBlock = foldlist ((upwardsInfoFromBlockDeclarations fromBelow) ++ [(upwardsInfoFromBlockInstructions fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Program+ -- ====================================================================================================+ downwardsProgram :: t -> Downwards t -> Program (From t) -> Downwards t+ downwardsProgram self = const+ transformProgram :: t -> Downwards t -> Program (From t) -> InfoFromProgramParts t -> Program (To t)+ transformProgram self fromAbove originalProgram fromBelow = originalProgram {+ programConstruction = recursivelyTransformedProgramConstruction fromBelow,+ programSemInf = convert $ programSemInf originalProgram+ }+ upwardsProgram :: t -> Downwards t -> Program (From t) -> InfoFromProgramParts t -> Program (To t) -> Upwards t+ upwardsProgram self fromAbove originalProgram fromBelow transformedProgram = foldlist ([(upwardsInfoFromProgramConstruction fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Empty(current basetype: ProgramConstruction)+ -- ====================================================================================================+ transformEmptyProgramInProgram :: t -> Downwards t -> Empty (From t) -> ProgramConstruction (To t)+ transformEmptyProgramInProgram self fromAbove originalEmpty = EmptyProgram $ originalEmpty {+ emptySemInf = convert $ emptySemInf originalEmpty+ }+ upwardsEmptyProgramInProgram :: t -> Downwards t -> Empty (From t) -> ProgramConstruction (To t) -> Upwards t+ upwardsEmptyProgramInProgram self fromAbove originalEmpty transformedEmpty = defaultValue+ -- ====================================================================================================+ -- == Node transformers for Primitive(current basetype: ProgramConstruction)+ -- ====================================================================================================+ downwardsPrimitiveProgramInProgram :: t -> Downwards t -> Primitive (From t) -> Downwards t+ downwardsPrimitiveProgramInProgram self = const+ transformPrimitiveProgramInProgram :: t -> Downwards t -> Primitive (From t) -> InfoFromPrimitiveParts t -> ProgramConstruction (To t)+ transformPrimitiveProgramInProgram self fromAbove originalPrimitive fromBelow = PrimitiveProgram $ originalPrimitive {+ primitiveInstruction = recursivelyTransformedPrimitiveInstruction fromBelow,+ primitiveSemInf = convert $ primitiveSemInf originalPrimitive+ }+ upwardsPrimitiveProgramInProgram :: t -> Downwards t -> Primitive (From t) -> InfoFromPrimitiveParts t -> ProgramConstruction (To t) -> Upwards t+ upwardsPrimitiveProgramInProgram self fromAbove originalPrimitive fromBelow transformedPrimitive = foldlist ([(upwardsInfoFromPrimitiveInstruction fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Sequence(current basetype: ProgramConstruction)+ -- ====================================================================================================+ downwardsSequenceProgramInProgram :: t -> Downwards t -> Sequence (From t) -> Downwards t+ downwardsSequenceProgramInProgram self = const+ transformSequenceProgramInProgram :: t -> Downwards t -> Sequence (From t) -> InfoFromSequenceParts t -> ProgramConstruction (To t)+ transformSequenceProgramInProgram self fromAbove originalSequence fromBelow = SequenceProgram $ originalSequence {+ sequenceProgramList = recursivelyTransformedSequenceProgramList fromBelow,+ sequenceSemInf = convert $ sequenceSemInf originalSequence+ }+ upwardsSequenceProgramInProgram :: t -> Downwards t -> Sequence (From t) -> InfoFromSequenceParts t -> ProgramConstruction (To t) -> Upwards t+ upwardsSequenceProgramInProgram self fromAbove originalSequence fromBelow transformedSequence = foldlist ((upwardsInfoFromSequenceProgramList fromBelow))+ -- ====================================================================================================+ -- == Node transformers for Branch(current basetype: ProgramConstruction)+ -- ====================================================================================================+ downwardsBranchProgramInProgram :: t -> Downwards t -> Branch (From t) -> Downwards t+ downwardsBranchProgramInProgram self = const+ transformBranchProgramInProgram :: t -> Downwards t -> Branch (From t) -> InfoFromBranchParts t -> ProgramConstruction (To t)+ transformBranchProgramInProgram self fromAbove originalBranch fromBelow = BranchProgram $ originalBranch {+ branchConditionVariable = recursivelyTransformedBranchConditionVariable fromBelow,+ thenBlock = recursivelyTransformedThenBlock fromBelow,+ elseBlock = recursivelyTransformedElseBlock fromBelow,+ branchSemInf = convert $ branchSemInf originalBranch+ }+ upwardsBranchProgramInProgram :: t -> Downwards t -> Branch (From t) -> InfoFromBranchParts t -> ProgramConstruction (To t) -> Upwards t+ upwardsBranchProgramInProgram self fromAbove originalBranch fromBelow transformedBranch = foldlist ([(upwardsInfoFromBranchConditionVariable fromBelow)] ++ [(upwardsInfoFromThenBlock fromBelow)] ++ [(upwardsInfoFromElseBlock fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for SequentialLoop(current basetype: ProgramConstruction)+ -- ====================================================================================================+ downwardsSequentialLoopProgramInProgram :: t -> Downwards t -> SequentialLoop (From t) -> Downwards t+ downwardsSequentialLoopProgramInProgram self = const+ transformSequentialLoopProgramInProgram :: t -> Downwards t -> SequentialLoop (From t) -> InfoFromSequentialLoopParts t -> ProgramConstruction (To t)+ transformSequentialLoopProgramInProgram self fromAbove originalSequentialLoop fromBelow = SequentialLoopProgram $ originalSequentialLoop {+ sequentialLoopCondition = recursivelyTransformedSequentialLoopCondition fromBelow,+ conditionCalculation = recursivelyTransformedConditionCalculation fromBelow,+ sequentialLoopCore = recursivelyTransformedSequentialLoopCore fromBelow,+ sequentialLoopSemInf = convert $ sequentialLoopSemInf originalSequentialLoop+ }+ upwardsSequentialLoopProgramInProgram :: t -> Downwards t -> SequentialLoop (From t) -> InfoFromSequentialLoopParts t -> ProgramConstruction (To t) -> Upwards t+ upwardsSequentialLoopProgramInProgram self fromAbove originalSequentialLoop fromBelow transformedSequentialLoop = foldlist ([(upwardsInfoFromSequentialLoopCondition fromBelow)] ++ [(upwardsInfoFromConditionCalculation fromBelow)] ++ [(upwardsInfoFromSequentialLoopCore fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for ParallelLoop(current basetype: ProgramConstruction)+ -- ====================================================================================================+ downwardsParallelLoopProgramInProgram :: t -> Downwards t -> ParallelLoop (From t) -> Downwards t+ downwardsParallelLoopProgramInProgram self = const+ transformParallelLoopProgramInProgram :: t -> Downwards t -> ParallelLoop (From t) -> InfoFromParallelLoopParts t -> ProgramConstruction (To t)+ transformParallelLoopProgramInProgram self fromAbove originalParallelLoop fromBelow = ParallelLoopProgram $ originalParallelLoop {+ parallelLoopConditionVariable = recursivelyTransformedParallelLoopConditionVariable fromBelow,+ numberOfIterations = recursivelyTransformedNumberOfIterations fromBelow,+ parallelLoopCore = recursivelyTransformedParallelLoopCore fromBelow,+ parallelLoopSemInf = convert $ parallelLoopSemInf originalParallelLoop+ }+ upwardsParallelLoopProgramInProgram :: t -> Downwards t -> ParallelLoop (From t) -> InfoFromParallelLoopParts t -> ProgramConstruction (To t) -> Upwards t+ upwardsParallelLoopProgramInProgram self fromAbove originalParallelLoop fromBelow transformedParallelLoop = foldlist ([(upwardsInfoFromParallelLoopConditionVariable fromBelow)] ++ [(upwardsInfoFromNumberOfIterations fromBelow)] ++ [(upwardsInfoFromParallelLoopCore fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for FormalParameter+ -- ====================================================================================================+ downwardsFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> Downwards t+ downwardsFormalParameter self = const+ transformFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> InfoFromFormalParameterParts t -> FormalParameter (To t)+ transformFormalParameter self fromAbove originalFormalParameter fromBelow = originalFormalParameter {+ formalParameterVariable = recursivelyTransformedFormalParameterVariable fromBelow,+ formalParameterSemInf = convert $ formalParameterSemInf originalFormalParameter+ }+ upwardsFormalParameter :: t -> Downwards t -> FormalParameter (From t) -> InfoFromFormalParameterParts t -> FormalParameter (To t) -> Upwards t+ upwardsFormalParameter self fromAbove originalFormalParameter fromBelow transformedFormalParameter = foldlist ([(upwardsInfoFromFormalParameterVariable fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for LocalDeclaration+ -- ====================================================================================================+ downwardsLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> Downwards t+ downwardsLocalDeclaration self = const+ transformLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> InfoFromLocalDeclarationParts t -> LocalDeclaration (To t)+ transformLocalDeclaration self fromAbove originalLocalDeclaration fromBelow = originalLocalDeclaration {+ localVariable = recursivelyTransformedLocalVariable fromBelow,+ localInitValue = recursivelyTransformedLocalInitValue fromBelow,+ localDeclarationSemInf = convert $ localDeclarationSemInf originalLocalDeclaration+ }+ upwardsLocalDeclaration :: t -> Downwards t -> LocalDeclaration (From t) -> InfoFromLocalDeclarationParts t -> LocalDeclaration (To t) -> Upwards t+ upwardsLocalDeclaration self fromAbove originalLocalDeclaration fromBelow transformedLocalDeclaration = foldlist ([(upwardsInfoFromLocalVariable fromBelow)] ++ convertMaybe (upwardsInfoFromLocalInitValue fromBelow))+ -- ====================================================================================================+ -- == Node transformers for Expression+ -- ====================================================================================================+ downwardsExpression :: t -> Downwards t -> Expression (From t) -> Downwards t+ downwardsExpression self = const+ transformExpression :: t -> Downwards t -> Expression (From t) -> InfoFromExpressionParts t -> Expression (To t)+ transformExpression self fromAbove originalExpression fromBelow = originalExpression {+ expressionData = recursivelyTransformedExpressionData fromBelow,+ expressionSemInf = convert $ expressionSemInf originalExpression+ }+ upwardsExpression :: t -> Downwards t -> Expression (From t) -> InfoFromExpressionParts t -> Expression (To t) -> Upwards t+ upwardsExpression self fromAbove originalExpression fromBelow transformedExpression = foldlist ([(upwardsInfoFromExpressionData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for LeftValue(current basetype: ExpressionData)+ -- ====================================================================================================+ downwardsLeftValueExpressionInExpression :: t -> Downwards t -> LeftValue (From t) -> Downwards t+ downwardsLeftValueExpressionInExpression self = const+ transformLeftValueExpressionInExpression :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> ExpressionData (To t)+ transformLeftValueExpressionInExpression self fromAbove originalLeftValue fromBelow = LeftValueExpression $ originalLeftValue {+ leftValueData = recursivelyTransformedLeftValueData fromBelow,+ leftValueSemInf = convert $ leftValueSemInf originalLeftValue+ }+ upwardsLeftValueExpressionInExpression :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> ExpressionData (To t) -> Upwards t+ upwardsLeftValueExpressionInExpression self fromAbove originalLeftValue fromBelow transformedLeftValue = foldlist ([(upwardsInfoFromLeftValueData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Constant(current basetype: ExpressionData)+ -- ====================================================================================================+ downwardsConstantExpressionInExpression :: t -> Downwards t -> Constant (From t) -> Downwards t+ downwardsConstantExpressionInExpression self = const+ transformConstantExpressionInExpression :: t -> Downwards t -> Constant (From t) -> InfoFromConstantParts t -> ExpressionData (To t)+ transformConstantExpressionInExpression self fromAbove originalConstant fromBelow = ConstantExpression $ originalConstant {+ constantData = recursivelyTransformedConstantData fromBelow,+ constantSemInf = convert $ constantSemInf originalConstant+ }+ upwardsConstantExpressionInExpression :: t -> Downwards t -> Constant (From t) -> InfoFromConstantParts t -> ExpressionData (To t) -> Upwards t+ upwardsConstantExpressionInExpression self fromAbove originalConstant fromBelow transformedConstant = foldlist ([(upwardsInfoFromConstantData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for FunctionCall(current basetype: ExpressionData)+ -- ====================================================================================================+ downwardsFunctionCallExpressionInExpression :: t -> Downwards t -> FunctionCall (From t) -> Downwards t+ downwardsFunctionCallExpressionInExpression self = const+ transformFunctionCallExpressionInExpression :: t -> Downwards t -> FunctionCall (From t) -> InfoFromFunctionCallParts t -> ExpressionData (To t)+ transformFunctionCallExpressionInExpression self fromAbove originalFunctionCall fromBelow = FunctionCallExpression $ originalFunctionCall {+ actualParametersOfFunctionToCall = recursivelyTransformedActualParametersOfFunctionToCall fromBelow,+ functionCallSemInf = convert $ functionCallSemInf originalFunctionCall+ }+ upwardsFunctionCallExpressionInExpression :: t -> Downwards t -> FunctionCall (From t) -> InfoFromFunctionCallParts t -> ExpressionData (To t) -> Upwards t+ upwardsFunctionCallExpressionInExpression self fromAbove originalFunctionCall fromBelow transformedFunctionCall = foldlist ((upwardsInfoFromActualParametersOfFunctionToCall fromBelow))+ -- ====================================================================================================+ -- == Node transformers for Constant+ -- ====================================================================================================+ downwardsConstant :: t -> Downwards t -> Constant (From t) -> Downwards t+ downwardsConstant self = const+ transformConstant :: t -> Downwards t -> Constant (From t) -> InfoFromConstantParts t -> Constant (To t)+ transformConstant self fromAbove originalConstant fromBelow = originalConstant {+ constantData = recursivelyTransformedConstantData fromBelow,+ constantSemInf = convert $ constantSemInf originalConstant+ }+ upwardsConstant :: t -> Downwards t -> Constant (From t) -> InfoFromConstantParts t -> Constant (To t) -> Upwards t+ upwardsConstant self fromAbove originalConstant fromBelow transformedConstant = foldlist ([(upwardsInfoFromConstantData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for IntConstantType(current basetype: ConstantData)+ -- ====================================================================================================+ transformIntConstantInConstant :: t -> Downwards t -> IntConstantType (From t) -> ConstantData (To t)+ transformIntConstantInConstant self fromAbove originalIntConstantType = IntConstant $ originalIntConstantType {+ intConstantSemInf = convert $ intConstantSemInf originalIntConstantType+ }+ upwardsIntConstantInConstant :: t -> Downwards t -> IntConstantType (From t) -> ConstantData (To t) -> Upwards t+ upwardsIntConstantInConstant self fromAbove originalIntConstantType transformedIntConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for FloatConstantType(current basetype: ConstantData)+ -- ====================================================================================================+ transformFloatConstantInConstant :: t -> Downwards t -> FloatConstantType (From t) -> ConstantData (To t)+ transformFloatConstantInConstant self fromAbove originalFloatConstantType = FloatConstant $ originalFloatConstantType {+ floatConstantSemInf = convert $ floatConstantSemInf originalFloatConstantType+ }+ upwardsFloatConstantInConstant :: t -> Downwards t -> FloatConstantType (From t) -> ConstantData (To t) -> Upwards t+ upwardsFloatConstantInConstant self fromAbove originalFloatConstantType transformedFloatConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for BoolConstantType(current basetype: ConstantData)+ -- ====================================================================================================+ transformBoolConstantInConstant :: t -> Downwards t -> BoolConstantType (From t) -> ConstantData (To t)+ transformBoolConstantInConstant self fromAbove originalBoolConstantType = BoolConstant $ originalBoolConstantType {+ boolConstantSemInf = convert $ boolConstantSemInf originalBoolConstantType+ }+ upwardsBoolConstantInConstant :: t -> Downwards t -> BoolConstantType (From t) -> ConstantData (To t) -> Upwards t+ upwardsBoolConstantInConstant self fromAbove originalBoolConstantType transformedBoolConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for ArrayConstantType(current basetype: ConstantData)+ -- ====================================================================================================+ downwardsArrayConstantInConstant :: t -> Downwards t -> ArrayConstantType (From t) -> Downwards t+ downwardsArrayConstantInConstant self = const+ transformArrayConstantInConstant :: t -> Downwards t -> ArrayConstantType (From t) -> InfoFromArrayConstantParts t -> ConstantData (To t)+ transformArrayConstantInConstant self fromAbove originalArrayConstantType fromBelow = ArrayConstant $ originalArrayConstantType {+ arrayConstantValue = recursivelyTransformedArrayConstantValue fromBelow,+ arrayConstantSemInf = convert $ arrayConstantSemInf originalArrayConstantType+ }+ upwardsArrayConstantInConstant :: t -> Downwards t -> ArrayConstantType (From t) -> InfoFromArrayConstantParts t -> ConstantData (To t) -> Upwards t+ upwardsArrayConstantInConstant self fromAbove originalArrayConstantType fromBelow transformedArrayConstantType = foldlist ((upwardsInfoFromArrayConstantValue fromBelow))+ -- ====================================================================================================+ -- == Node transformers for LeftValue+ -- ====================================================================================================+ downwardsLeftValue :: t -> Downwards t -> LeftValue (From t) -> Downwards t+ downwardsLeftValue self = const+ transformLeftValue :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> LeftValue (To t)+ transformLeftValue self fromAbove originalLeftValue fromBelow = originalLeftValue {+ leftValueData = recursivelyTransformedLeftValueData fromBelow,+ leftValueSemInf = convert $ leftValueSemInf originalLeftValue+ }+ upwardsLeftValue :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> LeftValue (To t) -> Upwards t+ upwardsLeftValue self fromAbove originalLeftValue fromBelow transformedLeftValue = foldlist ([(upwardsInfoFromLeftValueData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Variable(current basetype: LeftValueData)+ -- ====================================================================================================+ transformVariableLeftValueInLeftValue :: t -> Downwards t -> Variable (From t) -> LeftValueData (To t)+ transformVariableLeftValueInLeftValue self fromAbove originalVariable = VariableLeftValue $ originalVariable {+ variableSemInf = convert $ variableSemInf originalVariable+ }+ upwardsVariableLeftValueInLeftValue :: t -> Downwards t -> Variable (From t) -> LeftValueData (To t) -> Upwards t+ upwardsVariableLeftValueInLeftValue self fromAbove originalVariable transformedVariable = defaultValue+ -- ====================================================================================================+ -- == Node transformers for ArrayElemReference(current basetype: LeftValueData)+ -- ====================================================================================================+ downwardsArrayElemReferenceLeftValueInLeftValue :: t -> Downwards t -> ArrayElemReference (From t) -> Downwards t+ downwardsArrayElemReferenceLeftValueInLeftValue self = const+ transformArrayElemReferenceLeftValueInLeftValue :: t -> Downwards t -> ArrayElemReference (From t) -> InfoFromArrayElemReferenceParts t -> LeftValueData (To t)+ transformArrayElemReferenceLeftValueInLeftValue self fromAbove originalArrayElemReference fromBelow = ArrayElemReferenceLeftValue $ originalArrayElemReference {+ arrayName = recursivelyTransformedArrayName fromBelow,+ arrayIndex = recursivelyTransformedArrayIndex fromBelow,+ arrayElemReferenceSemInf = convert $ arrayElemReferenceSemInf originalArrayElemReference+ }+ upwardsArrayElemReferenceLeftValueInLeftValue :: t -> Downwards t -> ArrayElemReference (From t) -> InfoFromArrayElemReferenceParts t -> LeftValueData (To t) -> Upwards t+ upwardsArrayElemReferenceLeftValueInLeftValue self fromAbove originalArrayElemReference fromBelow transformedArrayElemReference = foldlist ([(upwardsInfoFromArrayName fromBelow)] ++ [(upwardsInfoFromArrayIndex fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Instruction+ -- ====================================================================================================+ downwardsInstruction :: t -> Downwards t -> Instruction (From t) -> Downwards t+ downwardsInstruction self = const+ transformInstruction :: t -> Downwards t -> Instruction (From t) -> InfoFromInstructionParts t -> Instruction (To t)+ transformInstruction self fromAbove originalInstruction fromBelow = originalInstruction {+ instructionData = recursivelyTransformedInstructionData fromBelow,+ instructionSemInf = convert $ instructionSemInf originalInstruction+ }+ upwardsInstruction :: t -> Downwards t -> Instruction (From t) -> InfoFromInstructionParts t -> Instruction (To t) -> Upwards t+ upwardsInstruction self fromAbove originalInstruction fromBelow transformedInstruction = foldlist ([(upwardsInfoFromInstructionData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Assignment(current basetype: InstructionData)+ -- ====================================================================================================+ downwardsAssignmentInstructionInInstruction :: t -> Downwards t -> Assignment (From t) -> Downwards t+ downwardsAssignmentInstructionInInstruction self = const+ transformAssignmentInstructionInInstruction :: t -> Downwards t -> Assignment (From t) -> InfoFromAssignmentParts t -> InstructionData (To t)+ transformAssignmentInstructionInInstruction self fromAbove originalAssignment fromBelow = AssignmentInstruction $ originalAssignment {+ assignmentLhs = recursivelyTransformedAssignmentLhs fromBelow,+ assignmentRhs = recursivelyTransformedAssignmentRhs fromBelow,+ assignmentSemInf = convert $ assignmentSemInf originalAssignment+ }+ upwardsAssignmentInstructionInInstruction :: t -> Downwards t -> Assignment (From t) -> InfoFromAssignmentParts t -> InstructionData (To t) -> Upwards t+ upwardsAssignmentInstructionInInstruction self fromAbove originalAssignment fromBelow transformedAssignment = foldlist ([(upwardsInfoFromAssignmentLhs fromBelow)] ++ [(upwardsInfoFromAssignmentRhs fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for ProcedureCall(current basetype: InstructionData)+ -- ====================================================================================================+ downwardsProcedureCallInstructionInInstruction :: t -> Downwards t -> ProcedureCall (From t) -> Downwards t+ downwardsProcedureCallInstructionInInstruction self = const+ transformProcedureCallInstructionInInstruction :: t -> Downwards t -> ProcedureCall (From t) -> InfoFromProcedureCallParts t -> InstructionData (To t)+ transformProcedureCallInstructionInInstruction self fromAbove originalProcedureCall fromBelow = ProcedureCallInstruction $ originalProcedureCall {+ actualParametersOfProcedureToCall = recursivelyTransformedActualParametersOfProcedureToCall fromBelow,+ procedureCallSemInf = convert $ procedureCallSemInf originalProcedureCall+ }+ upwardsProcedureCallInstructionInInstruction :: t -> Downwards t -> ProcedureCall (From t) -> InfoFromProcedureCallParts t -> InstructionData (To t) -> Upwards t+ upwardsProcedureCallInstructionInInstruction self fromAbove originalProcedureCall fromBelow transformedProcedureCall = foldlist ((upwardsInfoFromActualParametersOfProcedureToCall fromBelow))+ -- ====================================================================================================+ -- == Node transformers for ActualParameter+ -- ====================================================================================================+ downwardsActualParameter :: t -> Downwards t -> ActualParameter (From t) -> Downwards t+ downwardsActualParameter self = const+ transformActualParameter :: t -> Downwards t -> ActualParameter (From t) -> InfoFromActualParameterParts t -> ActualParameter (To t)+ transformActualParameter self fromAbove originalActualParameter fromBelow = originalActualParameter {+ actualParameterData = recursivelyTransformedActualParameterData fromBelow,+ actualParameterSemInf = convert $ actualParameterSemInf originalActualParameter+ }+ upwardsActualParameter :: t -> Downwards t -> ActualParameter (From t) -> InfoFromActualParameterParts t -> ActualParameter (To t) -> Upwards t+ upwardsActualParameter self fromAbove originalActualParameter fromBelow transformedActualParameter = foldlist ([(upwardsInfoFromActualParameterData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for Expression(current basetype: ActualParameterData)+ -- ====================================================================================================+ downwardsInputActualParameterInActualParameter :: t -> Downwards t -> Expression (From t) -> Downwards t+ downwardsInputActualParameterInActualParameter self = const+ transformInputActualParameterInActualParameter :: t -> Downwards t -> Expression (From t) -> InfoFromExpressionParts t -> ActualParameterData (To t)+ transformInputActualParameterInActualParameter self fromAbove originalExpression fromBelow = InputActualParameter $ originalExpression {+ expressionData = recursivelyTransformedExpressionData fromBelow,+ expressionSemInf = convert $ expressionSemInf originalExpression+ }+ upwardsInputActualParameterInActualParameter :: t -> Downwards t -> Expression (From t) -> InfoFromExpressionParts t -> ActualParameterData (To t) -> Upwards t+ upwardsInputActualParameterInActualParameter self fromAbove originalExpression fromBelow transformedExpression = foldlist ([(upwardsInfoFromExpressionData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for LeftValue(current basetype: ActualParameterData)+ -- ====================================================================================================+ downwardsOutputActualParameterInActualParameter :: t -> Downwards t -> LeftValue (From t) -> Downwards t+ downwardsOutputActualParameterInActualParameter self = const+ transformOutputActualParameterInActualParameter :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> ActualParameterData (To t)+ transformOutputActualParameterInActualParameter self fromAbove originalLeftValue fromBelow = OutputActualParameter $ originalLeftValue {+ leftValueData = recursivelyTransformedLeftValueData fromBelow,+ leftValueSemInf = convert $ leftValueSemInf originalLeftValue+ }+ upwardsOutputActualParameterInActualParameter :: t -> Downwards t -> LeftValue (From t) -> InfoFromLeftValueParts t -> ActualParameterData (To t) -> Upwards t+ upwardsOutputActualParameterInActualParameter self fromAbove originalLeftValue fromBelow transformedLeftValue = foldlist ([(upwardsInfoFromLeftValueData fromBelow)])+ -- ====================================================================================================+ -- == Node transformers for IntConstantType+ -- ====================================================================================================+ transformIntConstant :: t -> Downwards t -> IntConstantType (From t) -> IntConstantType (To t)+ transformIntConstant self fromAbove originalIntConstantType = originalIntConstantType {+ intConstantSemInf = convert $ intConstantSemInf originalIntConstantType+ }+ upwardsIntConstant :: t -> Downwards t -> IntConstantType (From t) -> IntConstantType (To t) -> Upwards t+ upwardsIntConstant self fromAbove originalIntConstantType transformedIntConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for FloatConstantType+ -- ====================================================================================================+ transformFloatConstant :: t -> Downwards t -> FloatConstantType (From t) -> FloatConstantType (To t)+ transformFloatConstant self fromAbove originalFloatConstantType = originalFloatConstantType {+ floatConstantSemInf = convert $ floatConstantSemInf originalFloatConstantType+ }+ upwardsFloatConstant :: t -> Downwards t -> FloatConstantType (From t) -> FloatConstantType (To t) -> Upwards t+ upwardsFloatConstant self fromAbove originalFloatConstantType transformedFloatConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for BoolConstantType+ -- ====================================================================================================+ transformBoolConstant :: t -> Downwards t -> BoolConstantType (From t) -> BoolConstantType (To t)+ transformBoolConstant self fromAbove originalBoolConstantType = originalBoolConstantType {+ boolConstantSemInf = convert $ boolConstantSemInf originalBoolConstantType+ }+ upwardsBoolConstant :: t -> Downwards t -> BoolConstantType (From t) -> BoolConstantType (To t) -> Upwards t+ upwardsBoolConstant self fromAbove originalBoolConstantType transformedBoolConstantType = defaultValue+ -- ====================================================================================================+ -- == Node transformers for Variable+ -- ====================================================================================================+ transformVariable :: t -> Downwards t -> Variable (From t) -> Variable (To t)+ transformVariable self fromAbove originalVariable = originalVariable {+ variableSemInf = convert $ variableSemInf originalVariable+ }+ upwardsVariable :: t -> Downwards t -> Variable (From t) -> Variable (To t) -> Upwards t+ upwardsVariable self fromAbove originalVariable transformedVariable = defaultValue+-- ====================================================================================================+-- == Walker functions+-- ====================================================================================================+ -- ====================================================================================================+ -- == Walker for Procedure+ -- ====================================================================================================+ walkProcedure :: Walker t Procedure+ walkProcedure selfpointer fromAbove construction = (transformedProcedure, toAbove)+ where+ toBelow = downwardsProcedure selfpointer fromAbove construction+ transformedInParameters = map (walkFormalParameter selfpointer toBelow) $ inParameters construction+ transformedOutParameters = map (walkFormalParameter selfpointer toBelow) $ outParameters construction+ transformedProcedureBody = (walkBlock selfpointer toBelow) $ procedureBody construction+ fromBelow = InfoFromProcedureParts {+ recursivelyTransformedInParameters = map fst transformedInParameters,+ upwardsInfoFromInParameters = map snd transformedInParameters,+ recursivelyTransformedOutParameters = map fst transformedOutParameters,+ upwardsInfoFromOutParameters = map snd transformedOutParameters,+ recursivelyTransformedProcedureBody = fst transformedProcedureBody,+ upwardsInfoFromProcedureBody = snd transformedProcedureBody+ }+ transformedProcedure = transformProcedure selfpointer fromAbove construction fromBelow+ toAbove = upwardsProcedure selfpointer fromAbove construction fromBelow transformedProcedure+ -- ====================================================================================================+ -- == Walker for Block+ -- ====================================================================================================+ walkBlock :: Walker t Block+ walkBlock selfpointer fromAbove construction = (transformedBlock, toAbove)+ where+ toBelow = downwardsBlock selfpointer fromAbove construction+ transformedBlockDeclarations = map (walkLocalDeclaration selfpointer toBelow) $ blockDeclarations construction+ transformedBlockInstructions = (walkProgram selfpointer toBelow) $ blockInstructions construction+ fromBelow = InfoFromBlockParts {+ recursivelyTransformedBlockDeclarations = map fst transformedBlockDeclarations,+ upwardsInfoFromBlockDeclarations = map snd transformedBlockDeclarations,+ recursivelyTransformedBlockInstructions = fst transformedBlockInstructions,+ upwardsInfoFromBlockInstructions = snd transformedBlockInstructions+ }+ transformedBlock = transformBlock selfpointer fromAbove construction fromBelow+ toAbove = upwardsBlock selfpointer fromAbove construction fromBelow transformedBlock+ -- ====================================================================================================+ -- == Walker for Program+ -- ====================================================================================================+ walkProgram :: Walker t Program+ walkProgram selfpointer fromAbove construction = (transformedProgram, toAbove)+ where+ toBelow = downwardsProgram selfpointer fromAbove construction+ transformedProgramConstruction = case programConstruction construction of+ EmptyProgram construction -> (walkEmptyProgramInProgram selfpointer toBelow) construction+ PrimitiveProgram construction -> (walkPrimitiveProgramInProgram selfpointer toBelow) construction+ SequenceProgram construction -> (walkSequenceProgramInProgram selfpointer toBelow) construction+ BranchProgram construction -> (walkBranchProgramInProgram selfpointer toBelow) construction+ SequentialLoopProgram construction -> (walkSequentialLoopProgramInProgram selfpointer toBelow) construction+ ParallelLoopProgram construction -> (walkParallelLoopProgramInProgram selfpointer toBelow) construction+ fromBelow = InfoFromProgramParts {+ recursivelyTransformedProgramConstruction = fst transformedProgramConstruction,+ upwardsInfoFromProgramConstruction = snd transformedProgramConstruction+ }+ transformedProgram = transformProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsProgram selfpointer fromAbove construction fromBelow transformedProgram+ -- ====================================================================================================+ -- == Walker for Empty, current base type: ProgramConstruction+ -- ====================================================================================================+ walkEmptyProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> Empty (From t) -> (ProgramConstruction (To t), Upwards t)+ walkEmptyProgramInProgram selfpointer fromAbove construction = (transformedEmpty, toAbove)+ where+ transformedEmpty = transformEmptyProgramInProgram selfpointer fromAbove construction+ toAbove = upwardsEmptyProgramInProgram selfpointer fromAbove construction transformedEmpty+ -- ====================================================================================================+ -- == Walker for Primitive, current base type: ProgramConstruction+ -- ====================================================================================================+ walkPrimitiveProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> Primitive (From t) -> (ProgramConstruction (To t), Upwards t)+ walkPrimitiveProgramInProgram selfpointer fromAbove construction = (transformedPrimitive, toAbove)+ where+ toBelow = downwardsPrimitiveProgramInProgram selfpointer fromAbove construction+ transformedPrimitiveInstruction = (walkInstruction selfpointer toBelow) $ primitiveInstruction construction+ fromBelow = InfoFromPrimitiveParts {+ recursivelyTransformedPrimitiveInstruction = fst transformedPrimitiveInstruction,+ upwardsInfoFromPrimitiveInstruction = snd transformedPrimitiveInstruction+ }+ transformedPrimitive = transformPrimitiveProgramInProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsPrimitiveProgramInProgram selfpointer fromAbove construction fromBelow transformedPrimitive+ -- ====================================================================================================+ -- == Walker for Sequence, current base type: ProgramConstruction+ -- ====================================================================================================+ walkSequenceProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> Sequence (From t) -> (ProgramConstruction (To t), Upwards t)+ walkSequenceProgramInProgram selfpointer fromAbove construction = (transformedSequence, toAbove)+ where+ toBelow = downwardsSequenceProgramInProgram selfpointer fromAbove construction+ transformedSequenceProgramList = map (walkProgram selfpointer toBelow) $ sequenceProgramList construction+ fromBelow = InfoFromSequenceParts {+ recursivelyTransformedSequenceProgramList = map fst transformedSequenceProgramList,+ upwardsInfoFromSequenceProgramList = map snd transformedSequenceProgramList+ }+ transformedSequence = transformSequenceProgramInProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsSequenceProgramInProgram selfpointer fromAbove construction fromBelow transformedSequence+ -- ====================================================================================================+ -- == Walker for Branch, current base type: ProgramConstruction+ -- ====================================================================================================+ walkBranchProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> Branch (From t) -> (ProgramConstruction (To t), Upwards t)+ walkBranchProgramInProgram selfpointer fromAbove construction = (transformedBranch, toAbove)+ where+ toBelow = downwardsBranchProgramInProgram selfpointer fromAbove construction+ transformedBranchConditionVariable = (walkVariable selfpointer toBelow) $ branchConditionVariable construction+ transformedThenBlock = (walkBlock selfpointer toBelow) $ thenBlock construction+ transformedElseBlock = (walkBlock selfpointer toBelow) $ elseBlock construction+ fromBelow = InfoFromBranchParts {+ recursivelyTransformedBranchConditionVariable = fst transformedBranchConditionVariable,+ upwardsInfoFromBranchConditionVariable = snd transformedBranchConditionVariable,+ recursivelyTransformedThenBlock = fst transformedThenBlock,+ upwardsInfoFromThenBlock = snd transformedThenBlock,+ recursivelyTransformedElseBlock = fst transformedElseBlock,+ upwardsInfoFromElseBlock = snd transformedElseBlock+ }+ transformedBranch = transformBranchProgramInProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsBranchProgramInProgram selfpointer fromAbove construction fromBelow transformedBranch+ -- ====================================================================================================+ -- == Walker for SequentialLoop, current base type: ProgramConstruction+ -- ====================================================================================================+ walkSequentialLoopProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> SequentialLoop (From t) -> (ProgramConstruction (To t), Upwards t)+ walkSequentialLoopProgramInProgram selfpointer fromAbove construction = (transformedSequentialLoop, toAbove)+ where+ toBelow = downwardsSequentialLoopProgramInProgram selfpointer fromAbove construction+ transformedSequentialLoopCondition = (walkExpression selfpointer toBelow) $ sequentialLoopCondition construction+ transformedConditionCalculation = (walkBlock selfpointer toBelow) $ conditionCalculation construction+ transformedSequentialLoopCore = (walkBlock selfpointer toBelow) $ sequentialLoopCore construction+ fromBelow = InfoFromSequentialLoopParts {+ recursivelyTransformedSequentialLoopCondition = fst transformedSequentialLoopCondition,+ upwardsInfoFromSequentialLoopCondition = snd transformedSequentialLoopCondition,+ recursivelyTransformedConditionCalculation = fst transformedConditionCalculation,+ upwardsInfoFromConditionCalculation = snd transformedConditionCalculation,+ recursivelyTransformedSequentialLoopCore = fst transformedSequentialLoopCore,+ upwardsInfoFromSequentialLoopCore = snd transformedSequentialLoopCore+ }+ transformedSequentialLoop = transformSequentialLoopProgramInProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsSequentialLoopProgramInProgram selfpointer fromAbove construction fromBelow transformedSequentialLoop+ -- ====================================================================================================+ -- == Walker for ParallelLoop, current base type: ProgramConstruction+ -- ====================================================================================================+ walkParallelLoopProgramInProgram :: (TransformationPhase t) => t -> Downwards t -> ParallelLoop (From t) -> (ProgramConstruction (To t), Upwards t)+ walkParallelLoopProgramInProgram selfpointer fromAbove construction = (transformedParallelLoop, toAbove)+ where+ toBelow = downwardsParallelLoopProgramInProgram selfpointer fromAbove construction+ transformedParallelLoopConditionVariable = (walkVariable selfpointer toBelow) $ parallelLoopConditionVariable construction+ transformedNumberOfIterations = (walkExpression selfpointer toBelow) $ numberOfIterations construction+ transformedParallelLoopCore = (walkBlock selfpointer toBelow) $ parallelLoopCore construction+ fromBelow = InfoFromParallelLoopParts {+ recursivelyTransformedParallelLoopConditionVariable = fst transformedParallelLoopConditionVariable,+ upwardsInfoFromParallelLoopConditionVariable = snd transformedParallelLoopConditionVariable,+ recursivelyTransformedNumberOfIterations = fst transformedNumberOfIterations,+ upwardsInfoFromNumberOfIterations = snd transformedNumberOfIterations,+ recursivelyTransformedParallelLoopCore = fst transformedParallelLoopCore,+ upwardsInfoFromParallelLoopCore = snd transformedParallelLoopCore+ }+ transformedParallelLoop = transformParallelLoopProgramInProgram selfpointer fromAbove construction fromBelow+ toAbove = upwardsParallelLoopProgramInProgram selfpointer fromAbove construction fromBelow transformedParallelLoop+ -- ====================================================================================================+ -- == Walker for FormalParameter+ -- ====================================================================================================+ walkFormalParameter :: Walker t FormalParameter+ walkFormalParameter selfpointer fromAbove construction = (transformedFormalParameter, toAbove)+ where+ toBelow = downwardsFormalParameter selfpointer fromAbove construction+ transformedFormalParameterVariable = (walkVariable selfpointer toBelow) $ formalParameterVariable construction+ fromBelow = InfoFromFormalParameterParts {+ recursivelyTransformedFormalParameterVariable = fst transformedFormalParameterVariable,+ upwardsInfoFromFormalParameterVariable = snd transformedFormalParameterVariable+ }+ transformedFormalParameter = transformFormalParameter selfpointer fromAbove construction fromBelow+ toAbove = upwardsFormalParameter selfpointer fromAbove construction fromBelow transformedFormalParameter+ -- ====================================================================================================+ -- == Walker for LocalDeclaration+ -- ====================================================================================================+ walkLocalDeclaration :: Walker t LocalDeclaration+ walkLocalDeclaration selfpointer fromAbove construction = (transformedLocalDeclaration, toAbove)+ where+ toBelow = downwardsLocalDeclaration selfpointer fromAbove construction+ transformedLocalVariable = (walkVariable selfpointer toBelow) $ localVariable construction+ transformedLocalInitValue = case localInitValue construction of+ Nothing -> (Nothing, Nothing)+ Just justLocalInitValue -> (Just (fst transformedJustLocalInitValue), Just (snd transformedJustLocalInitValue))+ where transformedJustLocalInitValue = (walkExpression selfpointer toBelow) $ justLocalInitValue+ fromBelow = InfoFromLocalDeclarationParts {+ recursivelyTransformedLocalVariable = fst transformedLocalVariable,+ upwardsInfoFromLocalVariable = snd transformedLocalVariable,+ recursivelyTransformedLocalInitValue = fst transformedLocalInitValue,+ upwardsInfoFromLocalInitValue = snd transformedLocalInitValue+ }+ transformedLocalDeclaration = transformLocalDeclaration selfpointer fromAbove construction fromBelow+ toAbove = upwardsLocalDeclaration selfpointer fromAbove construction fromBelow transformedLocalDeclaration+ -- ====================================================================================================+ -- == Walker for Expression+ -- ====================================================================================================+ walkExpression :: Walker t Expression+ walkExpression selfpointer fromAbove construction = (transformedExpression, toAbove)+ where+ toBelow = downwardsExpression selfpointer fromAbove construction+ transformedExpressionData = case expressionData construction of+ LeftValueExpression construction -> (walkLeftValueExpressionInExpression selfpointer toBelow) construction+ ConstantExpression construction -> (walkConstantExpressionInExpression selfpointer toBelow) construction+ FunctionCallExpression construction -> (walkFunctionCallExpressionInExpression selfpointer toBelow) construction+ fromBelow = InfoFromExpressionParts {+ recursivelyTransformedExpressionData = fst transformedExpressionData,+ upwardsInfoFromExpressionData = snd transformedExpressionData+ }+ transformedExpression = transformExpression selfpointer fromAbove construction fromBelow+ toAbove = upwardsExpression selfpointer fromAbove construction fromBelow transformedExpression+ -- ====================================================================================================+ -- == Walker for LeftValue, current base type: ExpressionData+ -- ====================================================================================================+ walkLeftValueExpressionInExpression :: (TransformationPhase t) => t -> Downwards t -> LeftValue (From t) -> (ExpressionData (To t), Upwards t)+ walkLeftValueExpressionInExpression selfpointer fromAbove construction = (transformedLeftValue, toAbove)+ where+ toBelow = downwardsLeftValueExpressionInExpression selfpointer fromAbove construction+ transformedLeftValueData = case leftValueData construction of+ VariableLeftValue construction -> (walkVariableLeftValueInLeftValue selfpointer toBelow) construction+ ArrayElemReferenceLeftValue construction -> (walkArrayElemReferenceLeftValueInLeftValue selfpointer toBelow) construction+ fromBelow = InfoFromLeftValueParts {+ recursivelyTransformedLeftValueData = fst transformedLeftValueData,+ upwardsInfoFromLeftValueData = snd transformedLeftValueData+ }+ transformedLeftValue = transformLeftValueExpressionInExpression selfpointer fromAbove construction fromBelow+ toAbove = upwardsLeftValueExpressionInExpression selfpointer fromAbove construction fromBelow transformedLeftValue+ -- ====================================================================================================+ -- == Walker for Constant, current base type: ExpressionData+ -- ====================================================================================================+ walkConstantExpressionInExpression :: (TransformationPhase t) => t -> Downwards t -> Constant (From t) -> (ExpressionData (To t), Upwards t)+ walkConstantExpressionInExpression selfpointer fromAbove construction = (transformedConstant, toAbove)+ where+ toBelow = downwardsConstantExpressionInExpression selfpointer fromAbove construction+ transformedConstantData = case constantData construction of+ IntConstant construction -> (walkIntConstantInConstant selfpointer toBelow) construction+ FloatConstant construction -> (walkFloatConstantInConstant selfpointer toBelow) construction+ BoolConstant construction -> (walkBoolConstantInConstant selfpointer toBelow) construction+ ArrayConstant construction -> (walkArrayConstantInConstant selfpointer toBelow) construction+ fromBelow = InfoFromConstantParts {+ recursivelyTransformedConstantData = fst transformedConstantData,+ upwardsInfoFromConstantData = snd transformedConstantData+ }+ transformedConstant = transformConstantExpressionInExpression selfpointer fromAbove construction fromBelow+ toAbove = upwardsConstantExpressionInExpression selfpointer fromAbove construction fromBelow transformedConstant+ -- ====================================================================================================+ -- == Walker for FunctionCall, current base type: ExpressionData+ -- ====================================================================================================+ walkFunctionCallExpressionInExpression :: (TransformationPhase t) => t -> Downwards t -> FunctionCall (From t) -> (ExpressionData (To t), Upwards t)+ walkFunctionCallExpressionInExpression selfpointer fromAbove construction = (transformedFunctionCall, toAbove)+ where+ toBelow = downwardsFunctionCallExpressionInExpression selfpointer fromAbove construction+ transformedActualParametersOfFunctionToCall = map (walkExpression selfpointer toBelow) $ actualParametersOfFunctionToCall construction+ fromBelow = InfoFromFunctionCallParts {+ recursivelyTransformedActualParametersOfFunctionToCall = map fst transformedActualParametersOfFunctionToCall,+ upwardsInfoFromActualParametersOfFunctionToCall = map snd transformedActualParametersOfFunctionToCall+ }+ transformedFunctionCall = transformFunctionCallExpressionInExpression selfpointer fromAbove construction fromBelow+ toAbove = upwardsFunctionCallExpressionInExpression selfpointer fromAbove construction fromBelow transformedFunctionCall+ -- ====================================================================================================+ -- == Walker for Constant+ -- ====================================================================================================+ walkConstant :: Walker t Constant+ walkConstant selfpointer fromAbove construction = (transformedConstant, toAbove)+ where+ toBelow = downwardsConstant selfpointer fromAbove construction+ transformedConstantData = case constantData construction of+ IntConstant construction -> (walkIntConstantInConstant selfpointer toBelow) construction+ FloatConstant construction -> (walkFloatConstantInConstant selfpointer toBelow) construction+ BoolConstant construction -> (walkBoolConstantInConstant selfpointer toBelow) construction+ ArrayConstant construction -> (walkArrayConstantInConstant selfpointer toBelow) construction+ fromBelow = InfoFromConstantParts {+ recursivelyTransformedConstantData = fst transformedConstantData,+ upwardsInfoFromConstantData = snd transformedConstantData+ }+ transformedConstant = transformConstant selfpointer fromAbove construction fromBelow+ toAbove = upwardsConstant selfpointer fromAbove construction fromBelow transformedConstant+ -- ====================================================================================================+ -- == Walker for IntConstantType, current base type: ConstantData+ -- ====================================================================================================+ walkIntConstantInConstant :: (TransformationPhase t) => t -> Downwards t -> IntConstantType (From t) -> (ConstantData (To t), Upwards t)+ walkIntConstantInConstant selfpointer fromAbove construction = (transformedIntConstantType, toAbove)+ where+ transformedIntConstantType = transformIntConstantInConstant selfpointer fromAbove construction+ toAbove = upwardsIntConstantInConstant selfpointer fromAbove construction transformedIntConstantType+ -- ====================================================================================================+ -- == Walker for FloatConstantType, current base type: ConstantData+ -- ====================================================================================================+ walkFloatConstantInConstant :: (TransformationPhase t) => t -> Downwards t -> FloatConstantType (From t) -> (ConstantData (To t), Upwards t)+ walkFloatConstantInConstant selfpointer fromAbove construction = (transformedFloatConstantType, toAbove)+ where+ transformedFloatConstantType = transformFloatConstantInConstant selfpointer fromAbove construction+ toAbove = upwardsFloatConstantInConstant selfpointer fromAbove construction transformedFloatConstantType+ -- ====================================================================================================+ -- == Walker for BoolConstantType, current base type: ConstantData+ -- ====================================================================================================+ walkBoolConstantInConstant :: (TransformationPhase t) => t -> Downwards t -> BoolConstantType (From t) -> (ConstantData (To t), Upwards t)+ walkBoolConstantInConstant selfpointer fromAbove construction = (transformedBoolConstantType, toAbove)+ where+ transformedBoolConstantType = transformBoolConstantInConstant selfpointer fromAbove construction+ toAbove = upwardsBoolConstantInConstant selfpointer fromAbove construction transformedBoolConstantType+ -- ====================================================================================================+ -- == Walker for ArrayConstantType, current base type: ConstantData+ -- ====================================================================================================+ walkArrayConstantInConstant :: (TransformationPhase t) => t -> Downwards t -> ArrayConstantType (From t) -> (ConstantData (To t), Upwards t)+ walkArrayConstantInConstant selfpointer fromAbove construction = (transformedArrayConstantType, toAbove)+ where+ toBelow = downwardsArrayConstantInConstant selfpointer fromAbove construction+ transformedArrayConstantValue = map (walkConstant selfpointer toBelow) $ arrayConstantValue construction+ fromBelow = InfoFromArrayConstantParts {+ recursivelyTransformedArrayConstantValue = map fst transformedArrayConstantValue,+ upwardsInfoFromArrayConstantValue = map snd transformedArrayConstantValue+ }+ transformedArrayConstantType = transformArrayConstantInConstant selfpointer fromAbove construction fromBelow+ toAbove = upwardsArrayConstantInConstant selfpointer fromAbove construction fromBelow transformedArrayConstantType++ -- ====================================================================================================+ -- == Walker for LeftValue+ -- ====================================================================================================+ walkLeftValue :: Walker t LeftValue+ walkLeftValue selfpointer fromAbove construction = (transformedLeftValue, toAbove)+ where+ toBelow = downwardsLeftValue selfpointer fromAbove construction+ transformedLeftValueData = case leftValueData construction of+ VariableLeftValue construction -> (walkVariableLeftValueInLeftValue selfpointer toBelow) construction+ ArrayElemReferenceLeftValue construction -> (walkArrayElemReferenceLeftValueInLeftValue selfpointer toBelow) construction+ fromBelow = InfoFromLeftValueParts {+ recursivelyTransformedLeftValueData = fst transformedLeftValueData,+ upwardsInfoFromLeftValueData = snd transformedLeftValueData+ }+ transformedLeftValue = transformLeftValue selfpointer fromAbove construction fromBelow+ toAbove = upwardsLeftValue selfpointer fromAbove construction fromBelow transformedLeftValue+ -- ====================================================================================================+ -- == Walker for Variable, current base type: LeftValueData+ -- ====================================================================================================+ walkVariableLeftValueInLeftValue :: (TransformationPhase t) => t -> Downwards t -> Variable (From t) -> (LeftValueData (To t), Upwards t)+ walkVariableLeftValueInLeftValue selfpointer fromAbove construction = (transformedVariable, toAbove)+ where+ transformedVariable = transformVariableLeftValueInLeftValue selfpointer fromAbove construction+ toAbove = upwardsVariableLeftValueInLeftValue selfpointer fromAbove construction transformedVariable+ -- ====================================================================================================+ -- == Walker for ArrayElemReference, current base type: LeftValueData+ -- ====================================================================================================+ walkArrayElemReferenceLeftValueInLeftValue :: (TransformationPhase t) => t -> Downwards t -> ArrayElemReference (From t) -> (LeftValueData (To t), Upwards t)+ walkArrayElemReferenceLeftValueInLeftValue selfpointer fromAbove construction = (transformedArrayElemReference, toAbove)+ where+ toBelow = downwardsArrayElemReferenceLeftValueInLeftValue selfpointer fromAbove construction+ transformedArrayName = (walkLeftValue selfpointer toBelow) $ arrayName construction+ transformedArrayIndex = (walkExpression selfpointer toBelow) $ arrayIndex construction+ fromBelow = InfoFromArrayElemReferenceParts {+ recursivelyTransformedArrayName = fst transformedArrayName,+ upwardsInfoFromArrayName = snd transformedArrayName,+ recursivelyTransformedArrayIndex = fst transformedArrayIndex,+ upwardsInfoFromArrayIndex = snd transformedArrayIndex+ }+ transformedArrayElemReference = transformArrayElemReferenceLeftValueInLeftValue selfpointer fromAbove construction fromBelow+ toAbove = upwardsArrayElemReferenceLeftValueInLeftValue selfpointer fromAbove construction fromBelow transformedArrayElemReference+ -- ====================================================================================================+ -- == Walker for Instruction+ -- ====================================================================================================+ walkInstruction :: Walker t Instruction+ walkInstruction selfpointer fromAbove construction = (transformedInstruction, toAbove)+ where+ toBelow = downwardsInstruction selfpointer fromAbove construction+ transformedInstructionData = case instructionData construction of+ AssignmentInstruction construction -> (walkAssignmentInstructionInInstruction selfpointer toBelow) construction+ ProcedureCallInstruction construction -> (walkProcedureCallInstructionInInstruction selfpointer toBelow) construction+ fromBelow = InfoFromInstructionParts {+ recursivelyTransformedInstructionData = fst transformedInstructionData,+ upwardsInfoFromInstructionData = snd transformedInstructionData+ }+ transformedInstruction = transformInstruction selfpointer fromAbove construction fromBelow+ toAbove = upwardsInstruction selfpointer fromAbove construction fromBelow transformedInstruction+ -- ====================================================================================================+ -- == Walker for Assignment, current base type: InstructionData+ -- ====================================================================================================+ walkAssignmentInstructionInInstruction :: (TransformationPhase t) => t -> Downwards t -> Assignment (From t) -> (InstructionData (To t), Upwards t)+ walkAssignmentInstructionInInstruction selfpointer fromAbove construction = (transformedAssignment, toAbove)+ where+ toBelow = downwardsAssignmentInstructionInInstruction selfpointer fromAbove construction+ transformedAssignmentLhs = (walkLeftValue selfpointer toBelow) $ assignmentLhs construction+ transformedAssignmentRhs = (walkExpression selfpointer toBelow) $ assignmentRhs construction+ fromBelow = InfoFromAssignmentParts {+ recursivelyTransformedAssignmentLhs = fst transformedAssignmentLhs,+ upwardsInfoFromAssignmentLhs = snd transformedAssignmentLhs,+ recursivelyTransformedAssignmentRhs = fst transformedAssignmentRhs,+ upwardsInfoFromAssignmentRhs = snd transformedAssignmentRhs+ }+ transformedAssignment = transformAssignmentInstructionInInstruction selfpointer fromAbove construction fromBelow+ toAbove = upwardsAssignmentInstructionInInstruction selfpointer fromAbove construction fromBelow transformedAssignment+ -- ====================================================================================================+ -- == Walker for ProcedureCall, current base type: InstructionData+ -- ====================================================================================================+ walkProcedureCallInstructionInInstruction :: (TransformationPhase t) => t -> Downwards t -> ProcedureCall (From t) -> (InstructionData (To t), Upwards t)+ walkProcedureCallInstructionInInstruction selfpointer fromAbove construction = (transformedProcedureCall, toAbove)+ where+ toBelow = downwardsProcedureCallInstructionInInstruction selfpointer fromAbove construction+ transformedActualParametersOfProcedureToCall = map (walkActualParameter selfpointer toBelow) $ actualParametersOfProcedureToCall construction+ fromBelow = InfoFromProcedureCallParts {+ recursivelyTransformedActualParametersOfProcedureToCall = map fst transformedActualParametersOfProcedureToCall,+ upwardsInfoFromActualParametersOfProcedureToCall = map snd transformedActualParametersOfProcedureToCall+ }+ transformedProcedureCall = transformProcedureCallInstructionInInstruction selfpointer fromAbove construction fromBelow+ toAbove = upwardsProcedureCallInstructionInInstruction selfpointer fromAbove construction fromBelow transformedProcedureCall+ -- ====================================================================================================+ -- == Walker for ActualParameter+ -- ====================================================================================================+ walkActualParameter :: Walker t ActualParameter+ walkActualParameter selfpointer fromAbove construction = (transformedActualParameter, toAbove)+ where+ toBelow = downwardsActualParameter selfpointer fromAbove construction+ transformedActualParameterData = case actualParameterData construction of+ InputActualParameter construction -> (walkInputActualParameterInActualParameter selfpointer toBelow) construction+ OutputActualParameter construction -> (walkOutputActualParameterInActualParameter selfpointer toBelow) construction+ fromBelow = InfoFromActualParameterParts {+ recursivelyTransformedActualParameterData = fst transformedActualParameterData,+ upwardsInfoFromActualParameterData = snd transformedActualParameterData+ }+ transformedActualParameter = transformActualParameter selfpointer fromAbove construction fromBelow+ toAbove = upwardsActualParameter selfpointer fromAbove construction fromBelow transformedActualParameter+ -- ====================================================================================================+ -- == Walker for Expression, current base type: ActualParameterData+ -- ====================================================================================================+ walkInputActualParameterInActualParameter :: (TransformationPhase t) => t -> Downwards t -> Expression (From t) -> (ActualParameterData (To t), Upwards t)+ walkInputActualParameterInActualParameter selfpointer fromAbove construction = (transformedExpression, toAbove)+ where+ toBelow = downwardsInputActualParameterInActualParameter selfpointer fromAbove construction+ transformedExpressionData = case expressionData construction of+ LeftValueExpression construction -> (walkLeftValueExpressionInExpression selfpointer toBelow) construction+ ConstantExpression construction -> (walkConstantExpressionInExpression selfpointer toBelow) construction+ FunctionCallExpression construction -> (walkFunctionCallExpressionInExpression selfpointer toBelow) construction+ fromBelow = InfoFromExpressionParts {+ recursivelyTransformedExpressionData = fst transformedExpressionData,+ upwardsInfoFromExpressionData = snd transformedExpressionData+ }+ transformedExpression = transformInputActualParameterInActualParameter selfpointer fromAbove construction fromBelow+ toAbove = upwardsInputActualParameterInActualParameter selfpointer fromAbove construction fromBelow transformedExpression+ -- ====================================================================================================+ -- == Walker for LeftValue, current base type: ActualParameterData+ -- ====================================================================================================+ walkOutputActualParameterInActualParameter :: (TransformationPhase t) => t -> Downwards t -> LeftValue (From t) -> (ActualParameterData (To t), Upwards t)+ walkOutputActualParameterInActualParameter selfpointer fromAbove construction = (transformedLeftValue, toAbove)+ where+ toBelow = downwardsOutputActualParameterInActualParameter selfpointer fromAbove construction+ transformedLeftValueData = case leftValueData construction of+ VariableLeftValue construction -> (walkVariableLeftValueInLeftValue selfpointer toBelow) construction+ ArrayElemReferenceLeftValue construction -> (walkArrayElemReferenceLeftValueInLeftValue selfpointer toBelow) construction+ fromBelow = InfoFromLeftValueParts {+ recursivelyTransformedLeftValueData = fst transformedLeftValueData,+ upwardsInfoFromLeftValueData = snd transformedLeftValueData+ }+ transformedLeftValue = transformOutputActualParameterInActualParameter selfpointer fromAbove construction fromBelow+ toAbove = upwardsOutputActualParameterInActualParameter selfpointer fromAbove construction fromBelow transformedLeftValue+ -- ====================================================================================================+ -- == Walker for Variable+ -- ====================================================================================================+ walkVariable :: Walker t Variable+ walkVariable selfpointer fromAbove construction = (transformedVariable, toAbove)+ where+ transformedVariable = transformVariable selfpointer fromAbove construction+ toAbove = upwardsVariable selfpointer fromAbove construction transformedVariable+-- ====================================================================================================+-- == Upwards types+-- ====================================================================================================+data (TransformationPhase t) => InfoFromProcedureParts t = InfoFromProcedureParts {+ recursivelyTransformedInParameters :: [FormalParameter (To t)],+ upwardsInfoFromInParameters :: [Upwards t],+ recursivelyTransformedOutParameters :: [FormalParameter (To t)],+ upwardsInfoFromOutParameters :: [Upwards t],+ recursivelyTransformedProcedureBody :: Block (To t),+ upwardsInfoFromProcedureBody :: Upwards t+}+data (TransformationPhase t) => InfoFromBlockParts t = InfoFromBlockParts {+ recursivelyTransformedBlockDeclarations :: [LocalDeclaration (To t)],+ upwardsInfoFromBlockDeclarations :: [Upwards t],+ recursivelyTransformedBlockInstructions :: Program (To t),+ upwardsInfoFromBlockInstructions :: Upwards t+}+data (TransformationPhase t) => InfoFromProgramParts t = InfoFromProgramParts {+ recursivelyTransformedProgramConstruction :: ProgramConstruction (To t),+ upwardsInfoFromProgramConstruction :: Upwards t+}+data (TransformationPhase t) => InfoFromPrimitiveParts t = InfoFromPrimitiveParts {+ recursivelyTransformedPrimitiveInstruction :: Instruction (To t),+ upwardsInfoFromPrimitiveInstruction :: Upwards t+}+data (TransformationPhase t) => InfoFromSequenceParts t = InfoFromSequenceParts {+ recursivelyTransformedSequenceProgramList :: [Program (To t)],+ upwardsInfoFromSequenceProgramList :: [Upwards t]+}+data (TransformationPhase t) => InfoFromBranchParts t = InfoFromBranchParts {+ recursivelyTransformedBranchConditionVariable :: Variable (To t),+ upwardsInfoFromBranchConditionVariable :: Upwards t,+ recursivelyTransformedThenBlock :: Block (To t),+ upwardsInfoFromThenBlock :: Upwards t,+ recursivelyTransformedElseBlock :: Block (To t),+ upwardsInfoFromElseBlock :: Upwards t+}+data (TransformationPhase t) => InfoFromSequentialLoopParts t = InfoFromSequentialLoopParts {+ recursivelyTransformedSequentialLoopCondition :: Expression (To t),+ upwardsInfoFromSequentialLoopCondition :: Upwards t,+ recursivelyTransformedConditionCalculation :: Block (To t),+ upwardsInfoFromConditionCalculation :: Upwards t,+ recursivelyTransformedSequentialLoopCore :: Block (To t),+ upwardsInfoFromSequentialLoopCore :: Upwards t+}+data (TransformationPhase t) => InfoFromParallelLoopParts t = InfoFromParallelLoopParts {+ recursivelyTransformedParallelLoopConditionVariable :: Variable (To t),+ upwardsInfoFromParallelLoopConditionVariable :: Upwards t,+ recursivelyTransformedNumberOfIterations :: Expression (To t),+ upwardsInfoFromNumberOfIterations :: Upwards t,+ recursivelyTransformedParallelLoopCore :: Block (To t),+ upwardsInfoFromParallelLoopCore :: Upwards t+}+data (TransformationPhase t) => InfoFromFormalParameterParts t = InfoFromFormalParameterParts {+ recursivelyTransformedFormalParameterVariable :: Variable (To t),+ upwardsInfoFromFormalParameterVariable :: Upwards t+}+data (TransformationPhase t) => InfoFromLocalDeclarationParts t = InfoFromLocalDeclarationParts {+ recursivelyTransformedLocalVariable :: Variable (To t),+ upwardsInfoFromLocalVariable :: Upwards t,+ recursivelyTransformedLocalInitValue :: Maybe (Expression (To t)),+ upwardsInfoFromLocalInitValue :: Maybe (Upwards t)+}+data (TransformationPhase t) => InfoFromExpressionParts t = InfoFromExpressionParts {+ recursivelyTransformedExpressionData :: ExpressionData (To t),+ upwardsInfoFromExpressionData :: Upwards t+}+data (TransformationPhase t) => InfoFromConstantParts t = InfoFromConstantParts {+ recursivelyTransformedConstantData :: ConstantData (To t),+ upwardsInfoFromConstantData :: Upwards t+}+data (TransformationPhase t) => InfoFromFunctionCallParts t = InfoFromFunctionCallParts {+ recursivelyTransformedActualParametersOfFunctionToCall :: [Expression (To t)],+ upwardsInfoFromActualParametersOfFunctionToCall :: [Upwards t]+}+data (TransformationPhase t) => InfoFromLeftValueParts t = InfoFromLeftValueParts {+ recursivelyTransformedLeftValueData :: LeftValueData (To t),+ upwardsInfoFromLeftValueData :: Upwards t+}+data (TransformationPhase t) => InfoFromArrayElemReferenceParts t = InfoFromArrayElemReferenceParts {+ recursivelyTransformedArrayName :: LeftValue (To t),+ upwardsInfoFromArrayName :: Upwards t,+ recursivelyTransformedArrayIndex :: Expression (To t),+ upwardsInfoFromArrayIndex :: Upwards t+}+data (TransformationPhase t) => InfoFromInstructionParts t = InfoFromInstructionParts {+ recursivelyTransformedInstructionData :: InstructionData (To t),+ upwardsInfoFromInstructionData :: Upwards t+}+data (TransformationPhase t) => InfoFromAssignmentParts t = InfoFromAssignmentParts {+ recursivelyTransformedAssignmentLhs :: LeftValue (To t),+ upwardsInfoFromAssignmentLhs :: Upwards t,+ recursivelyTransformedAssignmentRhs :: Expression (To t),+ upwardsInfoFromAssignmentRhs :: Upwards t+}+data (TransformationPhase t) => InfoFromProcedureCallParts t = InfoFromProcedureCallParts {+ recursivelyTransformedActualParametersOfProcedureToCall :: [ActualParameter (To t)],+ upwardsInfoFromActualParametersOfProcedureToCall :: [Upwards t]+}+data (TransformationPhase t) => InfoFromActualParameterParts t = InfoFromActualParameterParts {+ recursivelyTransformedActualParameterData :: ActualParameterData (To t),+ upwardsInfoFromActualParameterData :: Upwards t+}+data (TransformationPhase t) => InfoFromArrayConstantParts t = InfoFromArrayConstantParts {+ recursivelyTransformedArrayConstantValue :: [Constant (To t)],+ upwardsInfoFromArrayConstantValue :: [Upwards t]+}
Feldspar/Compiler/PluginArchitecture/DefaultConvert.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE UndecidableInstances, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-} @@ -66,60 +62,64 @@ class Convert a b where convert :: a -> b -{-instance Convert a a where - convert = id-} - instance Default b => Convert a b where convert _ = defaultValue - ++-- ====================================================================================================+-- == ConvertAllInfos class & instance+-- ==================================================================================================== class (SemanticInfo from, SemanticInfo to - , Convert (ProcedureInfo from) (ProcedureInfo to) - , Convert (BlockInfo from) (BlockInfo to) - , Default (ProgramInfo to) - , Convert (EmptyInfo from) (EmptyInfo to) - , Convert (PrimitiveInfo from) (PrimitiveInfo to) - , Convert (SequenceInfo from) (SequenceInfo to) - , Convert (BranchInfo from) (BranchInfo to) - , Convert (FormalParameterInfo from) (FormalParameterInfo to) - , Convert (SequentialLoopInfo from) (SequentialLoopInfo to) - , Convert (ParallelLoopInfo from) (ParallelLoopInfo to) - , Convert (LocalDeclarationInfo from) (LocalDeclarationInfo to) - , Convert (LeftValueExpressionInfo from) (LeftValueExpressionInfo to) - , Convert (InputActualParameterInfo from) (InputActualParameterInfo to) - , Convert (OutputActualParameterInfo from) (OutputActualParameterInfo to) - , Convert (VariableInLeftValueInfo from) (VariableInLeftValueInfo to) - , Convert (ArrayElemReferenceInfo from) (ArrayElemReferenceInfo to) - , Convert (ProcedureCallInfo from) (ProcedureCallInfo to) - , Convert (AssignmentInfo from) (AssignmentInfo to) - , Convert (FunctionCallInfo from) (FunctionCallInfo to) - , Convert (IntConstantInfo from) (IntConstantInfo to) - , Convert (FloatConstantInfo from) (FloatConstantInfo to) - , Convert (BoolConstantInfo from) (BoolConstantInfo to) - , Convert (ArrayConstantInfo from) (ArrayConstantInfo to) - , Convert (VariableInfo from) (VariableInfo to)) => ConvertAllInfos from to - -instance (SemanticInfo from, SemanticInfo to -- TODO general instance needs UndecidableInstances, check whether it is ok - , Convert (ProcedureInfo from) (ProcedureInfo to) - , Convert (BlockInfo from) (BlockInfo to) - , Default (ProgramInfo to) - , Convert (EmptyInfo from) (EmptyInfo to) - , Convert (PrimitiveInfo from) (PrimitiveInfo to) - , Convert (SequenceInfo from) (SequenceInfo to) - , Convert (BranchInfo from) (BranchInfo to) - , Convert (FormalParameterInfo from) (FormalParameterInfo to) - , Convert (SequentialLoopInfo from) (SequentialLoopInfo to) - , Convert (ParallelLoopInfo from) (ParallelLoopInfo to) - , Convert (LocalDeclarationInfo from) (LocalDeclarationInfo to) - , Convert (LeftValueExpressionInfo from) (LeftValueExpressionInfo to) - , Convert (InputActualParameterInfo from) (InputActualParameterInfo to) - , Convert (OutputActualParameterInfo from) (OutputActualParameterInfo to) - , Convert (VariableInLeftValueInfo from) (VariableInLeftValueInfo to) - , Convert (ArrayElemReferenceInfo from) (ArrayElemReferenceInfo to) - , Convert (ProcedureCallInfo from) (ProcedureCallInfo to) - , Convert (AssignmentInfo from) (AssignmentInfo to) - , Convert (FunctionCallInfo from) (FunctionCallInfo to) - , Convert (IntConstantInfo from) (IntConstantInfo to) - , Convert (FloatConstantInfo from) (FloatConstantInfo to) - , Convert (BoolConstantInfo from) (BoolConstantInfo to) - , Convert (ArrayConstantInfo from) (ArrayConstantInfo to) - , Convert (VariableInfo from) (VariableInfo to)) => ConvertAllInfos from to + , Convert(ProcedureInfo from) (ProcedureInfo to)+ , Convert(BlockInfo from) (BlockInfo to)+ , Convert(ProgramInfo from) (ProgramInfo to)+ , Convert(EmptyInfo from) (EmptyInfo to)+ , Convert(PrimitiveInfo from) (PrimitiveInfo to)+ , Convert(SequenceInfo from) (SequenceInfo to)+ , Convert(BranchInfo from) (BranchInfo to)+ , Convert(SequentialLoopInfo from) (SequentialLoopInfo to)+ , Convert(ParallelLoopInfo from) (ParallelLoopInfo to)+ , Convert(FormalParameterInfo from) (FormalParameterInfo to)+ , Convert(LocalDeclarationInfo from) (LocalDeclarationInfo to)+ , Convert(ExpressionInfo from) (ExpressionInfo to)+ , Convert(ConstantInfo from) (ConstantInfo to)+ , Convert(FunctionCallInfo from) (FunctionCallInfo to)+ , Convert(LeftValueInfo from) (LeftValueInfo to)+ , Convert(ArrayElemReferenceInfo from) (ArrayElemReferenceInfo to)+ , Convert(InstructionInfo from) (InstructionInfo to)+ , Convert(AssignmentInfo from) (AssignmentInfo to)+ , Convert(ProcedureCallInfo from) (ProcedureCallInfo to)+ , Convert(ActualParameterInfo from) (ActualParameterInfo to)+ , Convert(IntConstantInfo from) (IntConstantInfo to)+ , Convert(FloatConstantInfo from) (FloatConstantInfo to)+ , Convert(BoolConstantInfo from) (BoolConstantInfo to)+ , Convert(ArrayConstantInfo from) (ArrayConstantInfo to)+ , Convert(VariableInfo from) (VariableInfo to)+ ) => ConvertAllInfos from to++instance (SemanticInfo from, SemanticInfo to+ , Convert(ProcedureInfo from) (ProcedureInfo to)+ , Convert(BlockInfo from) (BlockInfo to)+ , Convert(ProgramInfo from) (ProgramInfo to)+ , Convert(EmptyInfo from) (EmptyInfo to)+ , Convert(PrimitiveInfo from) (PrimitiveInfo to)+ , Convert(SequenceInfo from) (SequenceInfo to)+ , Convert(BranchInfo from) (BranchInfo to)+ , Convert(SequentialLoopInfo from) (SequentialLoopInfo to)+ , Convert(ParallelLoopInfo from) (ParallelLoopInfo to)+ , Convert(FormalParameterInfo from) (FormalParameterInfo to)+ , Convert(LocalDeclarationInfo from) (LocalDeclarationInfo to)+ , Convert(ExpressionInfo from) (ExpressionInfo to)+ , Convert(ConstantInfo from) (ConstantInfo to)+ , Convert(FunctionCallInfo from) (FunctionCallInfo to)+ , Convert(LeftValueInfo from) (LeftValueInfo to)+ , Convert(ArrayElemReferenceInfo from) (ArrayElemReferenceInfo to)+ , Convert(InstructionInfo from) (InstructionInfo to)+ , Convert(AssignmentInfo from) (AssignmentInfo to)+ , Convert(ProcedureCallInfo from) (ProcedureCallInfo to)+ , Convert(ActualParameterInfo from) (ActualParameterInfo to)+ , Convert(IntConstantInfo from) (IntConstantInfo to)+ , Convert(FloatConstantInfo from) (FloatConstantInfo to)+ , Convert(BoolConstantInfo from) (BoolConstantInfo to)+ , Convert(ArrayConstantInfo from) (ArrayConstantInfo to)+ , Convert(VariableInfo from) (VariableInfo to)+ ) => ConvertAllInfos from to
Feldspar/Compiler/Plugins/BackwardPropagation.hs view
@@ -1,38 +1,36 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE EmptyDataDecls, TypeFamilies, FlexibleInstances #-} -module Feldspar.Compiler.Plugins.BackwardPropagation +module Feldspar.Compiler.Plugins.BackwardPropagation (+ BackwardPropagation(..)+ ) where import Feldspar.Compiler.PluginArchitecture@@ -59,71 +57,70 @@ instance Plugin BackwardPropagation where type ExternalInfo BackwardPropagation = DebugOption executePlugin BackwardPropagation externalInfo procedure- | externalInfo == NoSimplification = fst $ executeTransformationPhase BackwardPropagation () procedure- | otherwise = fst $ executeTransformationPhase PropagationTransform [] $ fst $ executeTransformationPhase PropagationCollect (Occurrence_read,False) procedure+ | externalInfo == NoSimplification = fst $ executeTransformationPhase BackwardPropagation () procedure+ | otherwise = fst $ executeTransformationPhase PropagationTransform [] $ fst $ executeTransformationPhase BackwardPropagationCollect (Occurrence_read,False) procedure -- ==================== -- Collect -- ==================== -instance Default [(VariableData, LeftValue ())] where+instance Default [(VariableData, LeftValueData ())] where defaultValue = [] -- meaning (out,var,out written in a sequence before out=var)-instance Default [(VariableData, LeftValue (),Bool)] where+instance Default [(VariableData, LeftValueData (),Bool)] where defaultValue = [] -instance Combine (VarStatBck, [(VariableData, LeftValue (),Bool)]) where+instance Combine (VarStatBck, [(VariableData, LeftValueData (),Bool)]) where combine (m1,x1) (m2,x2) = (combine m1 m2, x1 ++ x2) -instance Default (Maybe (VariableData, LeftValue (),Bool)) where+instance Default (Maybe (VariableData, LeftValueData (),Bool)) where defaultValue = Nothing -data PropagationSemInf+data BackwardPropagationSemInf -instance SemanticInfo PropagationSemInf where- type ProcedureInfo PropagationSemInf = ()- type BlockInfo PropagationSemInf = [(VariableData, LeftValue ())] --replacements inside block- type ProgramInfo PropagationSemInf = ()- type EmptyInfo PropagationSemInf = ()- type PrimitiveInfo PropagationSemInf = Maybe (VariableData, LeftValue (), Bool) --if the primitive is a copy assignment the datas of the assigment, just because when we delete primitives at 2nd phase we need this - type SequenceInfo PropagationSemInf = ()- type BranchInfo PropagationSemInf = ()- type SequentialLoopInfo PropagationSemInf = ()- type ParallelLoopInfo PropagationSemInf = ()- type FormalParameterInfo PropagationSemInf = ()- type LocalDeclarationInfo PropagationSemInf = ()- type LeftValueExpressionInfo PropagationSemInf = ()- type VariableInLeftValueInfo PropagationSemInf = ()- type ArrayElemReferenceInfo PropagationSemInf = ()- type InputActualParameterInfo PropagationSemInf = ()- type OutputActualParameterInfo PropagationSemInf = ()- type AssignmentInfo PropagationSemInf = ()- type ProcedureCallInfo PropagationSemInf = ()- type FunctionCallInfo PropagationSemInf = ()- type IntConstantInfo PropagationSemInf = ()- type FloatConstantInfo PropagationSemInf = ()- type BoolConstantInfo PropagationSemInf = ()- type ArrayConstantInfo PropagationSemInf = ()- type VariableInfo PropagationSemInf = ()+instance SemanticInfo BackwardPropagationSemInf where+ type ProcedureInfo BackwardPropagationSemInf = ()+ type BlockInfo BackwardPropagationSemInf = [(VariableData, LeftValueData ())] --replacements inside block+ type ProgramInfo BackwardPropagationSemInf = ()+ type EmptyInfo BackwardPropagationSemInf = ()+ type PrimitiveInfo BackwardPropagationSemInf = Maybe (VariableData, LeftValueData (), Bool) --if the primitive is a copy assignment the datas of the assigment, just because when we delete primitives at 2nd phase we need this + type SequenceInfo BackwardPropagationSemInf = ()+ type BranchInfo BackwardPropagationSemInf = ()+ type SequentialLoopInfo BackwardPropagationSemInf = ()+ type ParallelLoopInfo BackwardPropagationSemInf = ()+ type FormalParameterInfo BackwardPropagationSemInf = ()+ type LocalDeclarationInfo BackwardPropagationSemInf = ()+ type ExpressionInfo BackwardPropagationSemInf = ()+ type ConstantInfo BackwardPropagationSemInf = ()+ type FunctionCallInfo BackwardPropagationSemInf = ()+ type LeftValueInfo BackwardPropagationSemInf = ()+ type ArrayElemReferenceInfo BackwardPropagationSemInf = ()+ type InstructionInfo BackwardPropagationSemInf = ()+ type AssignmentInfo BackwardPropagationSemInf = ()+ type ProcedureCallInfo BackwardPropagationSemInf = ()+ type ActualParameterInfo BackwardPropagationSemInf = ()+ type IntConstantInfo BackwardPropagationSemInf = ()+ type FloatConstantInfo BackwardPropagationSemInf = ()+ type BoolConstantInfo BackwardPropagationSemInf = ()+ type ArrayConstantInfo BackwardPropagationSemInf = ()+ type VariableInfo BackwardPropagationSemInf = () -data PropagationCollect = PropagationCollect+data BackwardPropagationCollect = BackwardPropagationCollect -instance TransformationPhase PropagationCollect where- type From PropagationCollect = InitSemInf- type To PropagationCollect = PropagationSemInf- type Downwards PropagationCollect = (Occurrence_place, Bool)- type Upwards PropagationCollect = (VarStatBck, [(VariableData, LeftValue (),Bool)])- downwardsBranch self d orig = (occurrenceDownwards orig, False)- downwardsSequentialLoop self d orig = (occurrenceDownwards orig, False)- downwardsParallelLoop self d orig = (occurrenceDownwards orig, False)+instance TransformationPhase BackwardPropagationCollect where+ type From BackwardPropagationCollect = InitSemInf+ type To BackwardPropagationCollect = BackwardPropagationSemInf+ type Downwards BackwardPropagationCollect = (Occurrence_place, Bool)+ type Upwards BackwardPropagationCollect = (VarStatBck, [(VariableData, LeftValueData (),Bool)])+ downwardsBranchProgramInProgram self d orig = (occurrenceDownwards orig, False)+ downwardsSequentialLoopProgramInProgram self d orig = (occurrenceDownwards orig, False)+ downwardsParallelLoopProgramInProgram self d orig = (occurrenceDownwards orig, False) downwardsFormalParameter self d orig = (occurrenceDownwards orig, False)- downwardsLocalDeclaration self d orig = (occurrenceDownwards orig, isJust $ localInitValue $ localDeclarationData orig)- downwardsAssignment self d orig = (occurrenceDownwards orig, False)- downwardsInputActualParameter self d orig = (occurrenceDownwards orig, False)- downwardsOutputActualParameter self d orig = (occurrenceDownwards orig, False)- downwardsLeftValueExpression self d orig = (occurrenceDownwards orig, False)- downwardsFunctionCall self d orig = (occurrenceDownwards orig, False)+ downwardsLocalDeclaration self d orig = (occurrenceDownwards orig, isJust $ localInitValue orig)+ downwardsAssignmentInstructionInInstruction self d orig = (occurrenceDownwards orig, False)+ downwardsActualParameter self d orig = (occurrenceDownwards orig, False)+ downwardsExpression self d orig = (occurrenceDownwards orig, False) upwardsVariable self (d,me) origVar newVar = case d of Occurrence_declare | me -> (Map.singleton (variableData origVar) $ Occurrences (One Nothing) Zero, [])@@ -131,51 +128,53 @@ Occurrence_read -> (Map.singleton (variableData origVar) $ Occurrences Zero (One ()), []) Occurrence_write -> (Map.singleton (variableData origVar) $ Occurrences (One Nothing) Zero, []) Occurrence_notopt -> (Map.singleton (variableData origVar) $ Occurrences Multiple Multiple, [])- upwardsPrimitive self d origPrimitive u newPrimitive = case newPrimitive of+ upwardsPrimitiveProgramInProgram self d origPrimitive u newPrimitive = case newPrimitive of PrimitiveProgram newPr -> case primitiveSemInf newPr of Just e -> (fst $ upwardsInfoFromPrimitiveInstruction u, [e]) Nothing -> upwardsInfoFromPrimitiveInstruction u _ -> upwardsInfoFromPrimitiveInstruction u+ upwardsBlock self d origBlock u newBlock = (deleteFromVarStatistics (map (fst) $ blockSemInf newBlock) $ fst $ upwardsInfoFromBlockInstructions u,[])- upwardsSequence self d origiSeq u transformedSequence = checkInSequence $ upwardsInfoFromSequenceProgramList u+ upwardsSequenceProgramInProgram self d origiSeq u transformedSequence = checkInSequence $ upwardsInfoFromSequenceProgramList u transformBlock self d origBlock u = Block {- blockData = recursivelyTransformedBlockData u,+ blockDeclarations = recursivelyTransformedBlockDeclarations u,+ blockInstructions = recursivelyTransformedBlockInstructions u, blockSemInf = unChain $ checkInDeclatation origBlock $ upwardsInfoFromBlockInstructions u- }- transformPrimitive self d origPrimitive u = PrimitiveProgram $ Primitive {+ } + transformPrimitiveProgramInProgram self d origPrimitive u = PrimitiveProgram $ Primitive { primitiveInstruction = recursivelyTransformedPrimitiveInstruction u, primitiveSemInf = getNames origPrimitive } -getNames :: (SemanticInfo t) => Primitive t -> Maybe (VariableData, LeftValue (),Bool)-getNames pr = getNames' $ primitiveInstruction pr where+getNames :: (SemanticInfo t) => Primitive t -> Maybe (VariableData, LeftValueData (),Bool)+getNames pr = getNames' $ instructionData $ primitiveInstruction pr where getNames' (AssignmentInstruction _) = Nothing getNames' (ProcedureCallInstruction pc)- | goodName pc = getParamNames $ actualParametersOfProcedureToCall $ procedureCallData pc+ | goodName pc = getParamNames $ map actualParameterData $ actualParametersOfProcedureToCall pc | otherwise = Nothing- goodName pc = "copy" == (nameOfProcedureToCall $ procedureCallData pc)+ goodName pc = "copy" == (nameOfProcedureToCall pc) getParamNames [InputActualParameter i, OutputActualParameter o] = pairJust (getIName i) (getOName o) getParamNames _ = Nothing pairJust (Just a) (Just b) = Just (a,b,False) pairJust _ _ = Nothing- getIName i = getExpName $ inputActualParameterExpression i- getOName o = Just $ deleteSemInf $ outputActualParameterLeftValue o- getExpName (LeftValueExpression le) = getLvName_noarr $ leftValueExpressionContents le+ getIName i = getExpName $ expressionData i+ getOName o = Just $ deleteSemInf $ leftValueData o+ getExpName (LeftValueExpression lv) = getLvName_noarr $ leftValueData lv getExpName _ = Nothing- getLvName_noarr (VariableLeftValue vlv) = Just $ variableData $ variableLeftValueContents vlv+ getLvName_noarr (VariableLeftValue v) = Just $ variableData v getLvName_noarr _ = Nothing -getLvName :: (SemanticInfo t) => LeftValue t -> VariableData-getLvName (VariableLeftValue vlv) = variableData $ variableLeftValueContents vlv-getLvName (ArrayElemReferenceLeftValue aer) = getLvName $ arrayName $ arrayElemReferenceData aer+getLvName :: (SemanticInfo t) => LeftValueData t -> VariableData+getLvName (VariableLeftValue v) = variableData v+getLvName (ArrayElemReferenceLeftValue aer) = getLvName $ leftValueData $ arrayName aer -checkInSequence :: [(VarStatBck, [(VariableData, LeftValue (), Bool)])] -> (VarStatBck, [(VariableData, LeftValue (), Bool)])+checkInSequence :: [(VarStatBck, [(VariableData, LeftValueData (), Bool)])] -> (VarStatBck, [(VariableData, LeftValueData (), Bool)]) checkInSequence [] = defaultValue checkInSequence xs = (varstat $ map fst xs, mapMaybe (checkSeq xs False False False) $ foldl (\ls (vs,s) -> s++ls) [] xs) where varstat :: [VarStatBck] -> VarStatBck varstat = foldl combine defaultValue- checkSeq :: [(VarStatBck, [(VariableData, LeftValue (), Bool)])] -> Bool{-usedVar-} -> Bool{-usedOut-} -> Bool{-after-} -> (VariableData {-var-}, LeftValue () {-out-}, Bool) -> Maybe (VariableData, LeftValue (), Bool)+ checkSeq :: [(VarStatBck, [(VariableData, LeftValueData (), Bool)])] -> Bool{-usedVar-} -> Bool{-usedOut-} -> Bool{-after-} -> (VariableData {-var-}, LeftValueData () {-out-}, Bool) -> Maybe (VariableData, LeftValueData (), Bool) checkSeq [] _ usedOut _ (var,outD,outUsedLower) = Just (var,outD,usedOut) checkSeq ((vs,s):ys) usedVar usedOut after sp@(var,outD,outUsedLower) | after && (vs `notUse` var) = checkSeq ys usedVar usedOut after sp@@ -190,7 +189,6 @@ | {-(not after) && (not usedVar) && (vs `notUse` var) && -} (vs `hasUse` out) = checkSeq ys usedVar True after sp | {-(not after) && (not usedVar) && (vs `notUse` var) && (vs `notUse` out)-} otherwise = checkSeq ys usedVar usedOut after sp where- --var = variableName varD out = getLvName outD {- check the sequence format:@@ -208,13 +206,13 @@ | -} -checkInDeclatation :: Block InitSemInf -> (VarStatBck, [(VariableData, LeftValue (), Bool)]) -> [(VariableData, LeftValue ())]+checkInDeclatation :: Block InitSemInf -> (VarStatBck, [(VariableData, LeftValueData (), Bool)]) -> [(VariableData, LeftValueData ())] checkInDeclatation origBlock u = mapMaybe (checkDecl $ decl) (snd u) where- decl = blockDeclarations $ blockData origBlock- checkDecl :: [LocalDeclaration InitSemInf] -> (VariableData, LeftValue (), Bool) -> Maybe (VariableData, LeftValue ())+ decl = blockDeclarations origBlock+ checkDecl :: [LocalDeclaration InitSemInf] -> (VariableData, LeftValueData (), Bool) -> Maybe (VariableData, LeftValueData ()) checkDecl lds (var,outD,outUsedLower) = case List.find (\ld -> var == declaredVar ld) lds of Nothing -> Nothing- Just ld -> case localInitValue $ localDeclarationData ld of+ Just ld -> case localInitValue ld of Nothing -> Just (var,outD) Just exp -> case outUsedLower of True -> Nothing@@ -230,14 +228,14 @@ data PropagationTransform = PropagationTransform instance TransformationPhase PropagationTransform where- type From PropagationTransform = PropagationSemInf+ type From PropagationTransform = BackwardPropagationSemInf type To PropagationTransform = ()- type Downwards PropagationTransform = [(VariableData, LeftValue ())]+ type Downwards PropagationTransform = [(VariableData, LeftValueData ())] type Upwards PropagationTransform = () downwardsBlock self d origBlock = foldl addChain (blockSemInf origBlock) d downwardsLocalDeclaration self d origLocDecl = []- transformBlock self d orig fromBelow = delUnusedDecl (map fst $ foldl addChain (blockSemInf orig) d) orig $ recursivelyTransformedBlockData fromBelow- transformPrimitive self d origPrimitive u =+ transformBlock self d orig u = delUnusedDecl (map fst $ foldl addChain (blockSemInf orig) d) orig (recursivelyTransformedBlockDeclarations u) (recursivelyTransformedBlockInstructions u)+ transformPrimitiveProgramInProgram self d origPrimitive u = case primitiveSemInf origPrimitive of Nothing -> makedPrim Just (var,outD,_)@@ -248,35 +246,30 @@ primitiveInstruction = recursivelyTransformedPrimitiveInstruction u, primitiveSemInf =() }- transformVariableInLeftValue self d origVIL u = case List.find (\(a,b) -> a == newVar) d of- Nothing -> VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = recursivelyTransformedVariableLeftValueContents u,- variableLeftValueSemInf = ()+ transformVariableLeftValueInLeftValue self d origVar = case List.find (\(a,b) -> a == {-newVar-} variableData origVar) d of+ Nothing -> VariableLeftValue $ origVar {+ variableSemInf = () } Just (var,out) -> out- where- newVar = variableData $ recursivelyTransformedVariableLeftValueContents u+ --where+ -- newVar = variableData $ recursivelyTransformedVariableLeftValueContents u -unChain :: [(VariableData, LeftValue ())] -> [(VariableData, LeftValue ())]+unChain :: [(VariableData, LeftValueData ())] -> [(VariableData, LeftValueData ())] unChain s = foldl addChain [] s -addChain :: [(VariableData, LeftValue ())] -> (VariableData, LeftValue ()) -> [(VariableData, LeftValue ())]+addChain :: [(VariableData, LeftValueData ())] -> (VariableData, LeftValueData ()) -> [(VariableData, LeftValueData ())] addChain [] pair = [pair] addChain (x@(mibe1,mit1):xs) r@(mibe2,mit2) | (getLvName mit1) == mibe2 = (mibe1,changeInnerArrayName mit1 mit2):r:xs | (getLvName mit2) == mibe1 = (mibe2,changeInnerArrayName mit2 mit1):x:xs | otherwise = x:(addChain xs r) where- changeInnerArrayName :: LeftValue () {-toChange-} -> LeftValue () {-newName-} -> LeftValue ()+ changeInnerArrayName :: LeftValueData () {-toChange-} -> LeftValueData () {-newName-} -> LeftValueData () changeInnerArrayName toChange (ArrayElemReferenceLeftValue aer) = ArrayElemReferenceLeftValue aer {- arrayElemReferenceData = (arrayElemReferenceData aer) {- arrayName = changeInnerArrayName toChange (arrayName $ arrayElemReferenceData aer)- }+ arrayName = LeftValue (changeInnerArrayName toChange $ leftValueData $ arrayName aer) () } changeInnerArrayName (ArrayElemReferenceLeftValue aer) newName@(VariableLeftValue _) = ArrayElemReferenceLeftValue aer {- arrayElemReferenceData = (arrayElemReferenceData aer) {- arrayName = changeInnerArrayName (arrayName $ arrayElemReferenceData aer) newName- }+ arrayName = LeftValue (changeInnerArrayName (leftValueData $ arrayName aer) newName) () } changeInnerArrayName (VariableLeftValue _) newName@(VariableLeftValue _) = newName
− Feldspar/Compiler/Plugins/ConstantFolding.hs
@@ -1,72 +0,0 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}--{-# LANGUAGE TypeFamilies #-} - -module Feldspar.Compiler.Plugins.ConstantFolding where - -import Feldspar.Compiler.PluginArchitecture - -data ConstantFolding = ConstantFolding - -instance Plugin ConstantFolding where - type ExternalInfo ConstantFolding = () - executePlugin ConstantFolding _ procedure = - fst $ executeTransformationPhase ConstantFolding () procedure - -instance TransformationPhase ConstantFolding where - type From ConstantFolding = () - type To ConstantFolding = () - type Downwards ConstantFolding = () - type Upwards ConstantFolding = () - - transformFunctionCall ConstantFolding _ _ (InfosFromFunctionCallParts funData _) = - case roleOfFunctionToCall $ funData of - InfixOp -> case nameOfFunctionToCall $ funData of - "+" -> elimParamIf (isConstIntN 0) True funCall - "-" -> elimParamIf (isConstIntN 0) False funCall - "*" -> elimParamIf (isConstIntN 1) True funCall - _ -> FunctionCallExpression funCall - _ -> FunctionCallExpression funCall - - where - funCall = FunctionCall (funData) () - - isConstIntN n (ConstantExpression (IntConstant (IntConstantType i _))) = n == i - isConstIntN _ _ = False - - elimParamIf pred flippable funCall@(FunctionCall (FunctionCallData InfixOp _ _ (x:xs)) _) - | pred (head xs) = x - | flippable && pred x = head xs - | otherwise = FunctionCallExpression funCall - elimParamIf _ _ funCall = FunctionCallExpression funCall -
Feldspar/Compiler/Plugins/ForwardPropagation.hs view
@@ -1,38 +1,37 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE EmptyDataDecls, TypeFamilies, FlexibleInstances #-} -module Feldspar.Compiler.Plugins.ForwardPropagation where+module Feldspar.Compiler.Plugins.ForwardPropagation (+ ForwardPropagation(..)+ ) + where import Feldspar.Compiler.PluginArchitecture import qualified Data.Map as Map@@ -49,15 +48,15 @@ -- == Copy propagation plugin (forward) -- =========================================================================== -type VarStatFwd = VarStatistics (Expression ForwardPropagationpSemInf,[VariableData],Bool)-type OccurrencesFwd = Occurrences (Expression ForwardPropagationpSemInf,[VariableData],Bool)+type VarStatFwd = VarStatistics (ExpressionData ForwardPropagationSemInf, [VariableData], Bool)+type OccurrencesFwd = Occurrences (ExpressionData ForwardPropagationSemInf, [VariableData], Bool) data ForwardPropagation = ForwardPropagation instance Plugin ForwardPropagation where type ExternalInfo ForwardPropagation = DebugOption executePlugin ForwardPropagation externalInfo procedure - | externalInfo == NoSimplification || externalInfo == NoPrimitiveInstructionHandling = procedure+ | externalInfo == NoSimplification || externalInfo == NoPrimitiveInstructionHandling = procedure | otherwise = fst $ executeTransformationPhase ForwardPropagationTransform (fst globals1) procedureCollected1 where (procedureCollected1,globals1) = executeTransformationPhase ForwardPropagationCollect Occurrence_read procedure@@ -72,36 +71,34 @@ -- Collect -- ==================== -data ForwardPropagationpSemInf--instance SemanticInfo ForwardPropagationpSemInf where- type ProcedureInfo ForwardPropagationpSemInf = ()- type BlockInfo ForwardPropagationpSemInf = VarStatFwd- type ProgramInfo ForwardPropagationpSemInf = ()- type EmptyInfo ForwardPropagationpSemInf = ()- type PrimitiveInfo ForwardPropagationpSemInf = ()- type SequenceInfo ForwardPropagationpSemInf = ()- type BranchInfo ForwardPropagationpSemInf = ()- type SequentialLoopInfo ForwardPropagationpSemInf = VarStatFwd- type ParallelLoopInfo ForwardPropagationpSemInf = ()- type FormalParameterInfo ForwardPropagationpSemInf = ()- type LocalDeclarationInfo ForwardPropagationpSemInf = ()- type LeftValueExpressionInfo ForwardPropagationpSemInf = ()- type VariableInLeftValueInfo ForwardPropagationpSemInf = ()- type ArrayElemReferenceInfo ForwardPropagationpSemInf = Maybe VariableData --name of the indexed variable- type InputActualParameterInfo ForwardPropagationpSemInf = ()- type OutputActualParameterInfo ForwardPropagationpSemInf = ()- type AssignmentInfo ForwardPropagationpSemInf = ()- type ProcedureCallInfo ForwardPropagationpSemInf = ()- type FunctionCallInfo ForwardPropagationpSemInf = ()- type IntConstantInfo ForwardPropagationpSemInf = ()- type FloatConstantInfo ForwardPropagationpSemInf = ()- type BoolConstantInfo ForwardPropagationpSemInf = ()- type ArrayConstantInfo ForwardPropagationpSemInf = ()- type VariableInfo ForwardPropagationpSemInf = Occurrence_place+data ForwardPropagationSemInf -instance Default (Maybe VariableData) where- defaultValue = Nothing+instance SemanticInfo ForwardPropagationSemInf where+ type ProcedureInfo ForwardPropagationSemInf = ()+ type BlockInfo ForwardPropagationSemInf = VarStatFwd+ type ProgramInfo ForwardPropagationSemInf = ()+ type EmptyInfo ForwardPropagationSemInf = ()+ type PrimitiveInfo ForwardPropagationSemInf = ()+ type SequenceInfo ForwardPropagationSemInf = ()+ type BranchInfo ForwardPropagationSemInf = ()+ type SequentialLoopInfo ForwardPropagationSemInf = VarStatFwd+ type ParallelLoopInfo ForwardPropagationSemInf = ()+ type FormalParameterInfo ForwardPropagationSemInf = ()+ type LocalDeclarationInfo ForwardPropagationSemInf = ()+ type ExpressionInfo ForwardPropagationSemInf = ()+ type ConstantInfo ForwardPropagationSemInf = ()+ type FunctionCallInfo ForwardPropagationSemInf = ()+ type LeftValueInfo ForwardPropagationSemInf = ()+ type ArrayElemReferenceInfo ForwardPropagationSemInf = Maybe VariableData --name of the indexed variable+ type InstructionInfo ForwardPropagationSemInf = ()+ type AssignmentInfo ForwardPropagationSemInf = ()+ type ProcedureCallInfo ForwardPropagationSemInf = ()+ type ActualParameterInfo ForwardPropagationSemInf = ()+ type IntConstantInfo ForwardPropagationSemInf = ()+ type FloatConstantInfo ForwardPropagationSemInf = ()+ type BoolConstantInfo ForwardPropagationSemInf = ()+ type ArrayConstantInfo ForwardPropagationSemInf = ()+ type VariableInfo ForwardPropagationSemInf = Occurrence_place instance Combine (VarStatFwd, Maybe VariableData) where combine a b = (combine (fst a) $ fst b, Nothing)@@ -110,25 +107,24 @@ instance TransformationPhase ForwardPropagationCollect where type From ForwardPropagationCollect = ()- type To ForwardPropagationCollect = ForwardPropagationpSemInf+ type To ForwardPropagationCollect = ForwardPropagationSemInf type Downwards ForwardPropagationCollect = Occurrence_place type Upwards ForwardPropagationCollect = (VarStatFwd, Maybe VariableData)- downwardsBranch self d orig = occurrenceDownwards orig- downwardsSequentialLoop self d orig = occurrenceDownwards orig- downwardsParallelLoop self d orig = occurrenceDownwards orig+ downwardsBranchProgramInProgram self d orig = occurrenceDownwards orig+ downwardsSequentialLoopProgramInProgram self d orig = occurrenceDownwards orig+ downwardsParallelLoopProgramInProgram self d orig = occurrenceDownwards orig downwardsFormalParameter self d orig = occurrenceDownwards orig downwardsLocalDeclaration self d orig = occurrenceDownwards orig- downwardsAssignment self d orig = occurrenceDownwards orig- downwardsInputActualParameter self d orig = occurrenceDownwards orig- downwardsOutputActualParameter self d orig = occurrenceDownwards orig- downwardsLeftValueExpression self d orig = occurrenceDownwards orig- downwardsFunctionCall self d orig = occurrenceDownwards orig+ downwardsAssignmentInstructionInInstruction self d orig = occurrenceDownwards orig+ downwardsActualParameter self d orig = occurrenceDownwards orig+ downwardsInputActualParameterInActualParameter self d orig = occurrenceDownwards orig+ downwardsExpression self d orig = occurrenceDownwards orig transformBlock self d origBlock u = Block {- blockData = recursivelyTransformedBlockData u,+ blockDeclarations = recursivelyTransformedBlockDeclarations u,+ blockInstructions = recursivelyTransformedBlockInstructions u, blockSemInf = selectFromVarStatistics ( declaredVars origBlock) belowStatistics } where- belowStatistics = checkFwdDeclaration (map fst $ upwardsInfoFromBlockDeclarations u) (fst $ upwardsInfoFromBlockInstructions u)- --belowStatistics = foldl combine (fst $ upwardsInfoFromBlockInstructions u) $ map fst $ upwardsInfoFromBlockDeclarations u+ belowStatistics = checkFwdDeclaration (map fst $ upwardsInfoFromBlockDeclarations u) (fst $ upwardsInfoFromBlockInstructions u) transformVariable self d origVar = origVar { variableSemInf = d }@@ -137,35 +133,36 @@ Occurrence_read -> (Map.singleton (variableData origVar) $ Occurrences Zero (One ()), Just $ variableData origVar) Occurrence_write -> (Map.singleton (variableData origVar) $ Occurrences (One Nothing) Zero, Just $ variableData origVar) Occurrence_notopt -> (Map.singleton (variableData origVar) $ Occurrences Multiple Multiple, Just $ variableData origVar) --LIE to save variables- upwardsSequence self d origSeq u transSeq = (checkFwdSequence $ map fst $ upwardsInfoFromSequenceProgramList u, Nothing)+ upwardsSequenceProgramInProgram self d origSeq u transSeq = (checkFwdSequence $ map fst $ upwardsInfoFromSequenceProgramList u, Nothing) upwardsBlock self d origBlock u newBlock = (deleteFromVarStatistics (declaredVars origBlock) belowStatistics, Nothing) where belowStatistics = foldl combine (fst $ upwardsInfoFromBlockInstructions u) $ map fst $ upwardsInfoFromBlockDeclarations u- upwardsParallelLoop self d origParLoop u transParLoop = (multipleVarStatistics $+ upwardsParallelLoopProgramInProgram self d origParLoop u transParLoop = (multipleVarStatistics $ foldl combine (fst $ upwardsInfoFromParallelLoopConditionVariable u) [fst $ upwardsInfoFromNumberOfIterations u, fst $ upwardsInfoFromParallelLoopCore u], Nothing)- upwardsAssignment self d origAssign u transAssig = case assignmentLhs $ assignmentData origAssign of+ upwardsAssignmentInstructionInInstruction self d origAssign u transAssig = case leftValueData $ assignmentLhs origAssign of VariableLeftValue vlv -> (Map.insert var occ $ fst $ upwardsInfoFromAssignmentRhs u, Nothing) where- var = variableData $ variableLeftValueContents vlv+ var = variableData vlv occ = Occurrences (One $ Just (assRs, Map.keys $ fst $ upwardsInfoFromAssignmentRhs u, False)) Zero assRs = case transAssig of - AssignmentInstruction newAssign -> assignmentRhs $ assignmentData newAssign+ AssignmentInstruction newAssign -> expressionData $ assignmentRhs newAssign _ -> fwdPropError $ "Internal error: ForwardPropagation/1!" ArrayElemReferenceLeftValue aer -> (combine (fst $ upwardsInfoFromAssignmentLhs u) (fst $ upwardsInfoFromAssignmentRhs u), Nothing)- upwardsLocalDeclaration self d origDecl u newDecl = case localInitValue $ localDeclarationData newDecl of+ upwardsLocalDeclaration self d origDecl u newDecl = case localInitValue newDecl of Nothing -> defaultCase- Just (ConstantExpression (ArrayConstant ac)) -> defaultCase- Just initExp -> case upwardsInfoFromLocalInitValue u of- Nothing -> defaultCase- Just justUpFromLocalInitValue -> (Map.insert var (occ initExp $ fst justUpFromLocalInitValue) $ fst justUpFromLocalInitValue, Nothing)+ Just exp -> case expressionData exp of+ ConstantExpression (Constant (ArrayConstant ac) ()) -> defaultCase+ initExp -> case upwardsInfoFromLocalInitValue u of+ Nothing -> defaultCase+ Just justUpFromLocalInitValue -> (Map.insert var (occ initExp $ fst justUpFromLocalInitValue) $ fst justUpFromLocalInitValue, Nothing) where- var = variableData $ localVariable $ localDeclarationData $ origDecl+ var = variableData $ localVariable origDecl occ initExp justUpFromLocalInitValue = Occurrences (One $ Just (initExp, Map.keys justUpFromLocalInitValue, False)) Zero defaultCase = (fst $ upwardsInfoFromLocalVariable u, Nothing)- upwardsProcedureCall self d origProcCall u transProcCall- | List.isPrefixOf "copy" $ nameOfProcedureToCall $ procedureCallData origProcCall = case actParams of -- TODO: eliminate string constant+ upwardsProcedureCallInstructionInInstruction self d origProcCall u transProcCall+ | List.isPrefixOf "copy" $ nameOfProcedureToCall origProcCall = case map actualParameterData actParams of -- TODO: eliminate string constant [InputActualParameter inArr, InputActualParameter arrSize, OutputActualParameter outArr] ->- case outputActualParameterLeftValue outArr of+ case leftValueData outArr of VariableLeftValue vlv -> (Map.insert (var vlv) (occ inArr) $ fst $ head ul, Nothing) ArrayElemReferenceLeftValue aer -> defaultTr _ -> defaultTr@@ -176,26 +173,33 @@ otherwise -> foldl combine (head ul) (tail ul) ul = upwardsInfoFromActualParametersOfProcedureToCall u actParams = case transProcCall of- ProcedureCallInstruction pc -> actualParametersOfProcedureToCall $ procedureCallData pc+ ProcedureCallInstruction pc -> actualParametersOfProcedureToCall pc _ -> fwdPropError $ "Internal error: ForwardPropagation/2!"- var vlv = variableData $ variableLeftValueContents vlv- occ inArr = Occurrences (One $ Just (inputActualParameterExpression inArr, Map.keys $ fst $ head ul, False)) Zero- transformSequentialLoop self d origSeqLoop u = SequentialLoopProgram $ SequentialLoop {- sequentialLoopData = (recursivelyTransformedSequentialLoopData u) {- conditionCalculation = (conditionCalculation $ recursivelyTransformedSequentialLoopData u) {+ var vlv = variableData vlv+ occ inArr = Occurrences (One $ Just (expressionData inArr, Map.keys $ fst $ head ul, False)) Zero+ transformSequentialLoopProgramInProgram self d origSeqLoop u = SequentialLoopProgram $ origSeqLoop {+ sequentialLoopCondition = recursivelyTransformedSequentialLoopCondition u,+ conditionCalculation = (recursivelyTransformedConditionCalculation u) { blockSemInf = Map.empty - }- },- sequentialLoopSemInf = blockSemInf $ conditionCalculation $ recursivelyTransformedSequentialLoopData u+ },+ sequentialLoopCore = recursivelyTransformedSequentialLoopCore u,+ sequentialLoopSemInf = blockSemInf $ recursivelyTransformedConditionCalculation u }- upwardsSequentialLoop self d origSeqLoop u newSeqLoop = (multipleVarStatistics $- combine (fst $ upwardsInfoFromSequentialLoopConditionCalculation u) $ fst $ upwardsInfoFromSequentialLoopCore u, Nothing)- transformArrayElemReference self d origArrRef u = ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = recursivelyTransformedArrayElemReferenceData u,+ + upwardsSequentialLoopProgramInProgram self d origSeqLoop u newSeqLoop = (multipleVarStatistics $+ combine (deleteFromVarStatistics [condVar] $ fst $ upwardsInfoFromSequentialLoopCondition u) $ fst $ upwardsInfoFromSequentialLoopCore u, Nothing)+ where+ condVar = head $ Map.keys $ fst $ upwardsInfoFromSequentialLoopCondition u+ transformArrayElemReferenceLeftValueInLeftValue self d origArrRef u = ArrayElemReferenceLeftValue $ ArrayElemReference {+ arrayName = recursivelyTransformedArrayName u,+ arrayIndex = recursivelyTransformedArrayIndex u, arrayElemReferenceSemInf = snd $ upwardsInfoFromArrayName u }- upwardsArrayElemReference self d origArrayRef u transArrayRefe =+ upwardsArrayElemReferenceLeftValueInLeftValue self d origArrayRef u transArrayRefe = (combine (fst $ upwardsInfoFromArrayName u) (fst $ upwardsInfoFromArrayIndex u), snd $ upwardsInfoFromArrayName u)+ --upwardsLeftValue self d origLV u transLV = upwardsInfoFromLeftValueData u+ upwardsVariableLeftValueInLeftValue self d origVar transVar = upwardsVariable self d origVar $ transformVariable self d origVar+ transformVariableLeftValueInLeftValue self d origVar = VariableLeftValue $ transformVariable self d origVar checkFwdSequence :: [VarStatFwd] -> VarStatFwd checkFwdSequence [] = defaultValue@@ -207,7 +211,7 @@ updatePreSeq curr preSeqVar preSeqOcc = case writeVar preSeqOcc of One (Just (preSeqExp,preSeqVars,preSeqVarsWritten)) | preSeqVarsWritten && curr `hasRead` preSeqVar -> Occurrences (One Nothing) $ readVar preSeqOcc- | any (hasWrite curr) preSeqVars -> case (curr `hasRead` preSeqVar) && not ((simpleType $ variableType preSeqVar) && readVar preSeqOcc /= Multiple) of+ | any (hasWrite curr) preSeqVars -> case (curr `hasRead` preSeqVar) && not ((simpleType $ variableDataType preSeqVar) && readVar preSeqOcc /= Multiple) of True -> Occurrences (One Nothing) $ readVar preSeqOcc False -> Occurrences (One (Just (preSeqExp,preSeqVars ++ (addDep curr preSeqVar),True))) $ readVar preSeqOcc | otherwise -> case curr `getWrite` preSeqVar of@@ -217,8 +221,8 @@ | otherwise -> preSeqOcc _ -> preSeqOcc addDep curr preSeqVar = case curr `getWrite` preSeqVar of- Nothing -> []- Just (exp,vars,varsWritten) -> vars+ Nothing -> []+ Just (exp,vars,varsWritten) -> vars checkFwdDeclaration :: [VarStatFwd] -> VarStatFwd -> VarStatFwd checkFwdDeclaration [] blockStat = blockStat@@ -228,100 +232,90 @@ -- ForwardPropagation -- ==================== -type VarWrite t = [(VariableData,Expression t)]+type VarWrite t = [(VariableData,ExpressionData t)] -toVarWrite :: VarStatFwd -> VarWrite ForwardPropagationpSemInf+toVarWrite :: VarStatFwd -> VarWrite ForwardPropagationSemInf toVarWrite vs = Map.foldWithKey (getExp) [] vs where- getExp :: VariableData -> OccurrencesFwd -> VarWrite ForwardPropagationpSemInf -> VarWrite ForwardPropagationpSemInf+ getExp :: VariableData -> OccurrencesFwd -> VarWrite ForwardPropagationSemInf -> VarWrite ForwardPropagationSemInf getExp name (Occurrences (One (Just (exp,_,_))) reads) vw | reads /= Multiple && notConstArray exp = (name,exp):vw --used once and complex expr | simpleExpr exp = (name,exp):vw --used several and simple expr | otherwise = vw getExp name _ vw = vw notConstArray e = case e of- ConstantExpression c -> simplConst c+ ConstantExpression (Constant c _) -> simplConst c _ -> True simpleExpr e = case e of- ConstantExpression c -> simplConst c- LeftValueExpression l -> case leftValueExpressionContents l of+ ConstantExpression (Constant c _) -> simplConst c+ LeftValueExpression l -> case leftValueData l of VariableLeftValue v -> True- ArrayElemReferenceLeftValue a -> simpleExpr $ arrayIndex $ arrayElemReferenceData a+ ArrayElemReferenceLeftValue a -> simpleExpr $ expressionData $ arrayIndex a _ -> False simplConst (ArrayConstant ac) = False simplConst _ = True -instance Default (Set.Set VariableData) where- defaultValue = Set.empty--instance Combine (Set.Set VariableData) where- combine = Set.union- data ForwardPropagationTransform = ForwardPropagationTransform instance TransformationPhase ForwardPropagationTransform where- type From ForwardPropagationTransform = ForwardPropagationpSemInf+ type From ForwardPropagationTransform = ForwardPropagationSemInf type To ForwardPropagationTransform = () type Downwards ForwardPropagationTransform = VarStatFwd type Upwards ForwardPropagationTransform = Set.Set VariableData downwardsBlock self d origBlock = combine d $ blockSemInf origBlock- downwardsSequentialLoop self d origSeqLoop = combine d $ sequentialLoopSemInf origSeqLoop- transformLeftValueExpression self d origLVE u = case leftValueExpressionContents origLVE of- VariableLeftValue origVar -> case List.find (\(vn,e) -> (vn == var origVar)) varwrite of+ downwardsSequentialLoopProgramInProgram self d origSeqLoop = combine d $ sequentialLoopSemInf origSeqLoop+ transformLeftValueExpressionInExpression self d origLV u = case leftValueData origLV of+ VariableLeftValue origVar -> case List.find (\(vn,e) -> (vn == variableData origVar)) varwrite of Nothing -> defaultTr- Just repl -> fst $ walkExpression self d (snd repl)+ Just repl -> expressionData $ fst $ walkExpression self d $ Expression (snd repl) () ArrayElemReferenceLeftValue origArr -> defaultTr where- var v = variableData $ variableLeftValueContents v varwrite = toVarWrite d- defaultTr = LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = recursivelyTransformedLeftValueExpressionContents u,- leftValueExpressionSemInf = ()+ defaultTr = LeftValueExpression $ LeftValue {+ leftValueData = recursivelyTransformedLeftValueData u,+ leftValueSemInf = () }- transformVariableInLeftValue self d origVarLV u = case List.find (\(vn,e) -> (vn == var)) varwrite of+ transformVariableLeftValueInLeftValue self d origVar = case List.find (\(vn,e) -> (vn == var)) varwrite of Nothing -> defaultTr Just repl -> case repl of- (_,LeftValueExpression lve) -> fst $ walkLeftValue self d $ leftValueExpressionContents lve+ (_,LeftValueExpression lv) -> leftValueData $ fst $ walkLeftValue self d lv _ -> defaultTr where - var = variableData $ variableLeftValueContents origVarLV+ var = variableData origVar varwrite = toVarWrite d- defaultTr = VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = recursivelyTransformedVariableLeftValueContents u,- variableLeftValueSemInf = ()+ defaultTr = VariableLeftValue $ origVar {+ variableSemInf = () }- transformArrayElemReference self d origArrayRef u = case List.find (\(vn,e) -> (vn == var)) varwrite of+ transformArrayElemReferenceLeftValueInLeftValue self d origArrayRef u = case List.find (\(vn,e) -> (vn == var)) varwrite of Nothing -> defaultTr Just repl -> case repl of- (_,LeftValueExpression lve) -> case leftValueExpressionContents lve of+ (_,LeftValueExpression lv) -> case leftValueData lv of VariableLeftValue vlv -> defaultTr ArrayElemReferenceLeftValue aer -> ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = ArrayElemReferenceData { - arrayName = fst $ walkLeftValue self (newD d var aer origArrayRef) $ arrayName $ arrayElemReferenceData origArrayRef- , arrayIndex = fst $ walkExpression self d $ arrayIndex $ arrayElemReferenceData aer- },+ arrayName = fst $ walkLeftValue self (swapArrayIndex d var aer origArrayRef) $ arrayName origArrayRef,+ arrayIndex = fst $ walkExpression self d $ arrayIndex aer, arrayElemReferenceSemInf = () } _ -> defaultTr where- newD :: VarStatFwd -> VariableData -> ArrayElemReference ForwardPropagationpSemInf -> ArrayElemReference ForwardPropagationpSemInf -> VarStatFwd- newD d var rep orig = Map.adjust (newDD var rep orig) var d- newDD var rep orig x = x {- writeVar = One $ Just ( LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = ArrayElemReferenceData { - arrayName = arrayName $ arrayElemReferenceData rep- , arrayIndex = arrayIndex $ arrayElemReferenceData orig- },+ swapArrayIndex :: VarStatFwd -> VariableData -> ArrayElemReference ForwardPropagationSemInf -> ArrayElemReference ForwardPropagationSemInf -> VarStatFwd+ swapArrayIndex d var rep orig = Map.adjust (swapArrayIndex2 var rep orig) var d+ swapArrayIndex2 var rep orig x = x {+ writeVar = One $ Just ( LeftValueExpression $ LeftValue {+ leftValueData = ArrayElemReferenceLeftValue $ ArrayElemReference {+ arrayName = arrayName rep,+ arrayIndex = arrayIndex orig, arrayElemReferenceSemInf = Just var }, - leftValueExpressionSemInf = () + leftValueSemInf = () },[],False) } var = getJust $ arrayElemReferenceSemInf origArrayRef getJust (Just a) = a+ getJust _ = fwdPropError $ "Internal error: ForwardPropagation/3!" varwrite = toVarWrite d defaultTr = ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = recursivelyTransformedArrayElemReferenceData u,+ arrayName = recursivelyTransformedArrayName u,+ arrayIndex = recursivelyTransformedArrayIndex u, arrayElemReferenceSemInf = convert $ arrayElemReferenceSemInf origArrayRef } upwardsVariable self d origVar newVar = case variableSemInf origVar of@@ -330,14 +324,21 @@ Occurrence_write -> Set.singleton (variableData origVar) Occurrence_notopt -> Set.empty upwardsBlock self d origBlock u transformedBlock = foldl (\s e -> Set.delete e s) (upwardsInfoFromBlockInstructions u) (declaredVars origBlock) --Not need just optimalize compliler (not try delete locals outside block)- transformBlock self d origBlock u = delUnusedDecl (map fst $ toVarWrite $ combine d $ blockSemInf origBlock) origBlock (recursivelyTransformedBlockData u)- transformPrimitive self d originalPrimitive u = case canDelete of- True -> EmptyProgram $ Empty ()- False ->- PrimitiveProgram $ Primitive {+ transformBlock self d origBlock u = delUnusedDecl (map fst $ toVarWrite $ combine d $ blockSemInf origBlock) origBlock (recursivelyTransformedBlockDeclarations u) (recursivelyTransformedBlockInstructions u)+ transformPrimitiveProgramInProgram self d originalPrimitive u+ | canDelete && deletablePrimitive = EmptyProgram $ Empty ()+ | otherwise = PrimitiveProgram $ Primitive { primitiveInstruction = recursivelyTransformedPrimitiveInstruction u, primitiveSemInf = () } where canDelete = Set.isSubsetOf (upwardsInfoFromPrimitiveInstruction u) (Set.fromList $ map fst $ toVarWrite d)+ deletablePrimitive = case instructionData $ primitiveInstruction originalPrimitive of+ ProcedureCallInstruction pc -> List.isPrefixOf "copy" $ nameOfProcedureToCall pc+ AssignmentInstruction ass -> True+ --need because of the new pluginarcitecture walk structure+ upwardsVariableLeftValueInLeftValue self d origVar transVar = upwardsVariable self d origVar $ transformVariable self d origVar+ transformLeftValue self d origLV u = case transformLeftValueExpressionInExpression self d origLV u of+ LeftValueExpression lv -> lv+ _ -> fwdPropError $ "Internal error: ForwardPropagation/4!"
Feldspar/Compiler/Plugins/HandlePrimitives.hs view
@@ -1,200 +1,229 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE TypeFamilies #-} module Feldspar.Compiler.Plugins.HandlePrimitives ( HandlePrimitives(..) , makeAssignment- , makePrimitive,+ , makePrimitive ) where +import Data.List (find)+ import Feldspar.Compiler.Imperative.Representation import Feldspar.Compiler.Imperative.Semantics (SemanticInfo)-import Feldspar.Compiler.Imperative.CodeGeneration (simpleType, typeof, listprint, compToC, toLeftValue)-import Feldspar.Compiler.PluginArchitecture (TransformationPhase(..), Plugin(..), InfosFromPrimitiveParts(..))+import Feldspar.Compiler.Imperative.CodeGeneration (simpleType, typeof, toLeftValue)+import Feldspar.Compiler.PluginArchitecture (TransformationPhase(..), Plugin(..), InfoFromPrimitiveParts(..), InfoFromProcedureParts(..))+import Feldspar.Compiler.PluginArchitecture.DefaultConvert (Combine(..)) import Feldspar.Compiler.Options import Feldspar.Compiler.Error - handlePrimitivesError = handleError "PluginArch/HandlePrimitives" InternalError +data HandleTraceFunctions = HandleTraceFunctions+++instance TransformationPhase HandleTraceFunctions where+ type From HandleTraceFunctions = ()+ type To HandleTraceFunctions = ()+ type Downwards HandleTraceFunctions = ()+ type Upwards HandleTraceFunctions = Bool+ upwardsPrimitiveProgramInProgram = upwardsPrimitiveProgramInProgram'+ transformProcedure = transformProcedure'++ data HandlePrimitives = HandlePrimitives instance TransformationPhase HandlePrimitives where type From HandlePrimitives = () type To HandlePrimitives = ()- type Downwards HandlePrimitives = Int+ type Downwards HandlePrimitives = (Int,Platform) type Upwards HandlePrimitives = ()- transformPrimitive = transformPrimitive'+ transformPrimitiveProgramInProgram = transformPrimitive' instance Plugin HandlePrimitives where- type ExternalInfo HandlePrimitives = (Int,DebugOption)- executePlugin _ (_,NoPrimitiveInstructionHandling) procedure = procedure- executePlugin _ (defArrSize,_) procedure = fst $ executeTransformationPhase HandlePrimitives defArrSize procedure+ type ExternalInfo HandlePrimitives = (Int, DebugOption, Platform)+ executePlugin _ (_,NoPrimitiveInstructionHandling,_) procedure = procedure+ executePlugin _ (defArrSize,_,platform) procedure+ = fst $ executeTransformationPhase HandlePrimitives (defArrSize,platform)+ $ fst $ executeTransformationPhase HandleTraceFunctions () procedure -transformPrimitive' :: HandlePrimitives -> Int -> Primitive () -> InfosFromPrimitiveParts HandlePrimitives -> ProgramConstruction ()-transformPrimitive' _ defArrSize old modified'- = case (nameS,as) of- ("(==)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "equal" "=="- ("(/=)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "not_equal" "!="- ("(<)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "less" "<"- ("(>)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "greater" ">"- ("(<=)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "less_equal" "<="- ("(>=)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "greater_equal" ">="- ("not", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive PrefixOp 1 as "not" "!"- ("(&&)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "and" "&&"- ("(||)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "or" "||"- ("div", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "divide" "/"- ("rem", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "remainder" "%"- ("mod", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "mod" ""- ("(^)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "pow" ""+instance Combine Bool where+ combine x y = or [x,y] - ("(.&.)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "bit_and" "&"- ("(.|.)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "bit_or" "|"- ("xor", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "bit_xor" "^"- ("complement", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive PrefixOp 1 as "bit_not" "~"- ("bit", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 1 as "bit" ""- ("setBit", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "setBit" ""- ("clearBit", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "clearBit" ""- ("complementBit", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "complementBit" ""- ("testBit", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "testBit" ""- ("shiftL", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "shiftL" "<<"- ("shiftR", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "shiftR" ">>"- ("rotateL", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "rotateL" ""- ("rotateR", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "rotateR" ""- -- ("shift", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "bit_shift" ""- -- ("rotate", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 2 as "bit_rotate" ""- ("bitSize", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 1 as "bitSize" ""- ("isSigned", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 1 as "isSigned" ""+ - ("abs", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 1 as "abs" ""- ("signum", [InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive SimpleFun 1 as "signum" ""- ("(+)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "add" "+"- ("(-)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "sub" "-"- ("(*)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "mult" "*"- ("(/)", [InputActualParameter _, InputActualParameter _, OutputActualParameter _]) -> mkPrg $ makePrimitive InfixOp 2 as "divide" "/"+upwardsPrimitiveProgramInProgram' :: HandleTraceFunctions -> () -> Primitive () -> InfoFromPrimitiveParts HandleTraceFunctions -> ProgramConstruction () -> Bool+upwardsPrimitiveProgramInProgram' _ _ old _ _ | nameS=="trace" = True+ | otherwise = False+ where+ nameS = nameOfProcedureToCall $ (\(ProcedureCallInstruction x) -> x) $ instructionData $ primitiveInstruction old++++transformProcedure' :: HandleTraceFunctions -> () -> Procedure () -> InfoFromProcedureParts HandleTraceFunctions -> Procedure ()+transformProcedure' _ _ old upwardInfos+ | containsTrace = old{ + procedureBody = (procedureBody old){ + blockInstructions = (blockInstructions $ procedureBody old){ + programConstruction = addTraceSE $ programConstruction $ blockInstructions $ procedureBody old } } }+ | otherwise = old+ where+ containsTrace = upwardsInfoFromProcedureBody upwardInfos+ addTraceSE (SequenceProgram sequ) = SequenceProgram sequ{ sequenceProgramList = [traceStart] ++ (sequenceProgramList sequ) ++ [traceEnd] }+ addTraceSE _ = SequenceProgram (Sequence [traceStart, blockInstructions $ procedureBody old, traceEnd] ())+ traceStart = Program (PrimitiveProgram $ Primitive (Instruction (ProcedureCallInstruction $ ProcedureCall "traceStart" [] ()) ()) ()) ()+ traceEnd = Program (PrimitiveProgram $ Primitive (Instruction (ProcedureCallInstruction $ ProcedureCall "traceEnd" [] ()) ()) ()) ()++++transformPrimitive' :: HandlePrimitives -> (Int,Platform) -> Primitive () -> InfoFromPrimitiveParts HandlePrimitives -> ProgramConstruction ()+transformPrimitive' _ (defArrSize,pfm) old modified'+ = case (nameS, inps, outs) of - ("(!)", [arr@(InputActualParameter _), idx@(InputActualParameter _), out@(OutputActualParameter _)])- -> mkPrg $ makeAssignment - (LeftValueExpression $ LeftValueInExpression+ ("(!)", [arr, idx], [out])+ -> mkPrg $ makeAssignment pfm+ (lToe $ LeftValue (ArrayElemReferenceLeftValue $ ArrayElemReference- (ArrayElemReferenceData (toLeftValue $ aToE arr) $ aToE idx) ()+ (toLeftValue arr) idx () ) ()- ) (aToL out) defArrSize-- ("setIx", [original@(InputActualParameter _), idx@(InputActualParameter _), val@(InputActualParameter _), result@(OutputActualParameter _)])+ ) out defArrSize+ + ("setIx", [original, idx, val], [result]) -> SequenceProgram $ Sequence - [ Program (PrimitiveProgram $ Primitive (makeAssignment (aToE original) (aToL result) defArrSize) ()) ()- , Program (PrimitiveProgram $ Primitive - (makeAssignment- (aToE val)- (ArrayElemReferenceLeftValue $ ArrayElemReference (ArrayElemReferenceData (aToL result) $ aToE idx) ())+ [ Program (mkPrg $ makeAssignment pfm original result defArrSize) ()+ , Program (mkPrg $ makeAssignment pfm val+ (LeftValue (ArrayElemReferenceLeftValue $ ArrayElemReference result idx ()) ()) defArrSize- ) ()) ()+ ) () ] () - ("copy", [in1@(InputActualParameter _), out@(OutputActualParameter _)]) - -> mkPrg $ makeAssignment (aToE in1) (aToL out) defArrSize+ ("copy", [in1], [out]) -> mkPrg $ makeAssignment pfm in1 out defArrSize - _ -> mkPrg $ modified+ ("trace", [label, original], [result])+ -> SequenceProgram $ Sequence + [ Program (mkPrg $ makeAssignment pfm original result defArrSize) ()+ , Program (mkPrg $ makePrimitive pfm (Proc "trace" firstInFP) [lToe result, label] [] 0) ()+ ] () + _ -> case (find matchPrimitive $ primitives pfm) of+ Just (fd,Right tp) -> SequenceProgram (Sequence plist ())+ where+ plist = map (\(cd',inps',outs') -> Program (mkPrg $ makePrimitive pfm cd' inps' outs' 0) ()) $ tp fd inps outs+ Just (fd,Left cd) -> mkPrg $ makePrimitive pfm cd inps outs defArrSize+ Nothing -> mkPrg $ modified+ where- nameS = nameOfProcedureToCall $ procedureCallData $ (\(ProcedureCallInstruction x) -> x) $ primitiveInstruction old- as = actualParametersOfProcedureToCall $ procedureCallData $ (\(ProcedureCallInstruction x) -> x) modified+ nameS = nameOfProcedureToCall $ (\(ProcedureCallInstruction x) -> x) $ instructionData $ primitiveInstruction old+ as = actualParametersOfProcedureToCall $ (\(ProcedureCallInstruction x) -> x) $ instructionData modified modified = recursivelyTransformedPrimitiveInstruction modified' mkPrg x = PrimitiveProgram (Primitive x ())+ + inps = map aToE $ filter isInparam as+ outs = map aToL $ filter (not . isInparam) as+ + matchPrimitive (fd,_) = (fName fd == nameS) && (matchTypes' (inputs fd) inps)+ + matchTypes' :: [TypeDesc] -> [Expression ()] -> Bool+ matchTypes' [] [] = True+ matchTypes' [] (y:ys) = False+ matchTypes' (x:xs) [] = False+ matchTypes' (x:xs) (y:ys) = (machTypes x $ typeof y) && (matchTypes' xs ys) -makeAssignment :: Expression () -> LeftValue () -> Int -> Instruction ()-makeAssignment in1 out defaultArraySize- | simpleType (typeof in1) = AssignmentInstruction $ Assignment (AssignmentData out in1) ()- | otherwise = case (typeof in1) of- (ImpArrayType _ t) -> makePrimitive SimpleFun 2 [eToA in1, eToA $ arraySize (typeof in1) defaultArraySize, lToA out] "copy" ""- _ -> handlePrimitivesError $ "Unknown type in makeAssignment:\n" ++ show (typeof in1)+makeAssignment :: Platform -> Expression () -> LeftValue () -> Int -> Instruction ()+makeAssignment pfm in1 out defArrSize = makePrimitive pfm Assig [in1] [out] defArrSize -makePrimitive :: FunctionRole -> Int -> [ActualParameter ()] -> String -> String -> Instruction ()-makePrimitive primType parNum as cFunName cOpName- | simpleType (typeof out) = AssignmentInstruction $ Assignment (AssignmentData out (FunctionCallExpression funCall)) ()- | otherwise = ProcedureCallInstruction procCall+makePrimitive :: Platform -> CPrimDesc -> [Expression ()] -> [LeftValue ()] -> Int -> Instruction ()++makePrimitive pfm Assig [in1] [out] defArrSize+ | simpleType (typeof in1) = Instruction (AssignmentInstruction $ Assignment out in1 ()) ()+ | otherwise = case (typeof in1) of+ (ImpArrayType _ t) -> makePrimitive pfm (Proc "copy" firstInFP) [in1, intToCe $ arraySize (typeof in1) defArrSize] [out] 0+ _ -> handlePrimitivesError $ "Unknown type in makePrimitive:\n" ++ show (typeof in1)++makePrimitive pfm Assig _ _ _ = handlePrimitivesError $ "Wrong number of parameters for an assignment. (Parallel assignment not allowed.)"++makePrimitive pfm desc inps outs _+ | isNotProc desc && simpleType (typeof $ head outs)+ = Instruction (AssignmentInstruction $ Assignment (head outs) (Expression (FunctionCallExpression funCall) ()) ()) ()+ | otherwise = Instruction (ProcedureCallInstruction procCall) () where- funCall = case (primType, parNum) of- (SimpleFun, 1) -> FunctionCall (FunctionCallData SimpleFun (typeof out) completeFunName [in1]) ()- (SimpleFun, 2) -> FunctionCall (FunctionCallData SimpleFun (typeof out) completeFunName [in1, in2]) ()- (PrefixOp, 1) -> FunctionCall (FunctionCallData PrefixOp (typeof out) cOpName [in1]) ()- (InfixOp, 2) -> FunctionCall (FunctionCallData InfixOp (typeof out) cOpName [in1, in2]) ()- _ -> handlePrimitivesError $ "Invalid arguments:\n" ++ show (primType, parNum)- procCall = case (primType, parNum) of- (SimpleFun, 1) -> ProcedureCall (ProcedureCallData completeProcName [in1', out']) ()- (SimpleFun, 2) -> ProcedureCall (ProcedureCallData completeProcName [in1', in2', out']) ()- (PrefixOp, 1) -> ProcedureCall (ProcedureCallData completeProcName [in1', out']) ()- (InfixOp, 2) -> ProcedureCall (ProcedureCallData completeProcName [in1', in2', out']) ()- _ -> handlePrimitivesError $ "Invalid arguments:\n" ++ show (primType, parNum)- completeFunName = cFunName ++ "_fun_" ++ toFunName (typeof in1)- completeProcName = cFunName ++ "_" ++ toFunName (typeof in1)- (in1,in1') = case (filter isInparam as) of- x:_ -> (aToE x,x)- _ -> handlePrimitivesError $ "There is not any Input parameter:\n" ++ show as- (in2,in2') = case (filter isInparam as) of- _:x:_ -> (aToE x,x)- _ -> handlePrimitivesError $ "There is not enough Input parameter:\n" ++ show as- (out,out') = case (filter (not . isInparam) as) of- x:_ -> (aToL x,x)- _ -> handlePrimitivesError $ "There is not any Output parameter:\n" ++ show as+ + funCall = case (desc, length inps, length outs) of+ (Op1 op, 1, 1) -> FunctionCall PrefixOp (typeof $ head outs) op inps ()+ (Op2 op, 2, 1) -> FunctionCall InfixOp (typeof $ head outs) op inps ()+ (Fun _ _, _, 1) -> FunctionCall SimpleFun (typeof $ head outs) completeFunName inps ()+ _ -> errorMessage+ + procCall = case (desc, length inps, length outs) of+ (Fun _ _, _, 1) -> procCall'+ (Proc _ _, _, _) -> procCall'+ _ -> errorMessage+ + procCall' = ProcedureCall completeProcName (inps' ++ outs') ()+ inps' = map eToA inps+ outs' = map lToA outs+ completeFunName | funPf desc == noneFP = cName desc+ | otherwise = cName desc ++ "_fun" ++ apsToName+ completeProcName | funPf desc == noneFP = cName desc+ | otherwise = cName desc ++ apsToName+ apsToName = concatMap (("_"++) . (toFunName pfm) . typeof) apsToNameList+ apsToNameList = (take (useInputs $ funPf desc) inps') ++ (take (useOutputs $ funPf desc) outs')+ isNotProc (Proc _ _) = False+ isNotProc _ = True+ errorMessage = handlePrimitivesError $ "Wrong C pirmitive description or different number of parameter:\n"+ ++ show desc ++ "\n" ++ concatMap ((", "++) . show . typeof) inps -toFunName :: Type -> String-toFunName BoolType = "bool"-toFunName FloatType = "float"-toFunName (Numeric sig siz) = listprint id "_" [compToC sig, compToC siz]-toFunName (ImpArrayType _ t@(ImpArrayType _ _)) = toFunName t -toFunName (ImpArrayType _ t) = "arrayOf_" ++ toFunName t +toFunName :: Platform -> Type -> String+toFunName pfm (ImpArrayType _ t@(ImpArrayType _ _)) = toFunName pfm t+toFunName pfm (ImpArrayType _ t) = "arrayOf_" ++ toFunName pfm t+toFunName pfm t = case (find (\(t',_,_) -> t == t') $ types pfm) of+ Just (_,_,s) -> map (\c -> if c == ' ' then '_' else c) $ s+ Nothing -> handlePrimitivesError $ "Unhandled type in platform " ++ name pfm -arraySize :: Type -> Int -> Expression ()-arraySize a@(ImpArrayType _ t) defaultArraySize- = ConstantExpression $ IntConstant $ IntConstantType (arraySize' a) ()+arraySize :: Type -> Int -> Int+arraySize a@(ImpArrayType _ t) defaultArraySize = arraySize' a where arraySize' (ImpArrayType (Norm n) t) = n * arraySize' t arraySize' (ImpArrayType (Defined n) t) = n * arraySize' t@@ -203,16 +232,24 @@ -isInparam (InputActualParameter _) = True-isInparam (OutputActualParameter _) = False+isInparam (ActualParameter (InputActualParameter _) _) = True+isInparam (ActualParameter (OutputActualParameter _) _) = False -aToE (InputActualParameter x) = inputActualParameterExpression x-aToL (OutputActualParameter x) = outputActualParameterLeftValue x--- TODO create a simple wrapper interface based on these functions+aToE (ActualParameter (InputActualParameter x) ()) = x+aToL (ActualParameter (OutputActualParameter x) ()) = x -eToA x = InputActualParameter $ InputActualParameterType x ()-lToA x = OutputActualParameter $ OutputActualParameterType x ()+-- adToE (InputActualParameter x) = x+-- adToL (OutputActualParameter x) = x +eToA x = ActualParameter (InputActualParameter x) ()+lToA x = ActualParameter (OutputActualParameter x) ()++-- adToA x = ActualParameter x ()++-- ceToInt (Expression (ConstantExpression (Constant (IntConstant (IntConstantType x _)) _)) _) = x+intToCe x = Expression (ConstantExpression $ Constant (IntConstant $ IntConstantType x ()) ()) ()++lToe x = Expression (LeftValueExpression x) ()
Feldspar/Compiler/Plugins/Precompilation.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE EmptyDataDecls, TypeFamilies #-} @@ -63,30 +59,31 @@ data PrecompilationSemanticInfo instance SemanticInfo PrecompilationSemanticInfo where- type ProcedureInfo PrecompilationSemanticInfo = SignatureInformation- type BlockInfo PrecompilationSemanticInfo = ()- type ProgramInfo PrecompilationSemanticInfo = ()- type EmptyInfo PrecompilationSemanticInfo = ()- type PrimitiveInfo PrecompilationSemanticInfo = ()- type SequenceInfo PrecompilationSemanticInfo = ()- type BranchInfo PrecompilationSemanticInfo = ()- type SequentialLoopInfo PrecompilationSemanticInfo = ()- type ParallelLoopInfo PrecompilationSemanticInfo = ()- type FormalParameterInfo PrecompilationSemanticInfo = ()- type LocalDeclarationInfo PrecompilationSemanticInfo = ()- type LeftValueExpressionInfo PrecompilationSemanticInfo = ()- type VariableInLeftValueInfo PrecompilationSemanticInfo = ()- type ArrayElemReferenceInfo PrecompilationSemanticInfo = ()- type InputActualParameterInfo PrecompilationSemanticInfo = ()- type OutputActualParameterInfo PrecompilationSemanticInfo = ()- type AssignmentInfo PrecompilationSemanticInfo = ()- type ProcedureCallInfo PrecompilationSemanticInfo = ()- type FunctionCallInfo PrecompilationSemanticInfo = ()- type IntConstantInfo PrecompilationSemanticInfo = ()- type FloatConstantInfo PrecompilationSemanticInfo = ()- type BoolConstantInfo PrecompilationSemanticInfo = ()- type ArrayConstantInfo PrecompilationSemanticInfo = ()- type VariableInfo PrecompilationSemanticInfo = SignatureInformation+ type ProcedureInfo PrecompilationSemanticInfo = SignatureInformation+ type BlockInfo PrecompilationSemanticInfo = ()+ type ProgramInfo PrecompilationSemanticInfo = ()+ type EmptyInfo PrecompilationSemanticInfo = ()+ type PrimitiveInfo PrecompilationSemanticInfo = ()+ type SequenceInfo PrecompilationSemanticInfo = ()+ type BranchInfo PrecompilationSemanticInfo = ()+ type SequentialLoopInfo PrecompilationSemanticInfo = ()+ type ParallelLoopInfo PrecompilationSemanticInfo = ()+ type FormalParameterInfo PrecompilationSemanticInfo = ()+ type LocalDeclarationInfo PrecompilationSemanticInfo = ()+ type ExpressionInfo PrecompilationSemanticInfo = ()+ type ConstantInfo PrecompilationSemanticInfo = ()+ type FunctionCallInfo PrecompilationSemanticInfo = ()+ type LeftValueInfo PrecompilationSemanticInfo = ()+ type ArrayElemReferenceInfo PrecompilationSemanticInfo = ()+ type InstructionInfo PrecompilationSemanticInfo = ()+ type AssignmentInfo PrecompilationSemanticInfo = ()+ type ProcedureCallInfo PrecompilationSemanticInfo = ()+ type ActualParameterInfo PrecompilationSemanticInfo = ()+ type IntConstantInfo PrecompilationSemanticInfo = ()+ type FloatConstantInfo PrecompilationSemanticInfo = ()+ type BoolConstantInfo PrecompilationSemanticInfo = ()+ type ArrayConstantInfo PrecompilationSemanticInfo = ()+ type VariableInfo PrecompilationSemanticInfo = SignatureInformation data Precompilation = Precompilation @@ -97,7 +94,7 @@ type Upwards Precompilation = () downwardsProcedure Precompilation fromAbove procedure = fromAbove { generatedImperativeParameterNames =- map (variableName . variableData . formalParameterVariable) (inParameters procedure)+ map (variableName . formalParameterVariable) (inParameters procedure) } transformProcedure Precompilation fromAbove originalProcedure fromBelow = Procedure { -- NOTE: fromAbove won't have the generated imperative parameter names right here@@ -108,6 +105,7 @@ procedureSemInf = () } transformVariable = myTransformVariable+ transformVariableLeftValueInLeftValue = myTransformVariableLeftValueInLeftValue getVariableName :: SignatureInformation -> String -> String getVariableName signatureInformation origname = case (originalFeldsparParameterNames signatureInformation) of@@ -127,11 +125,12 @@ myTransformVariable :: Precompilation -> SignatureInformation -> Variable () -> Variable () myTransformVariable Precompilation fromAbove v = v {- variableData = (variableData v) {- variableName = getVariableName fromAbove (variableName $ variableData v)- },+ variableName = getVariableName fromAbove (variableName v), variableSemInf = () }++myTransformVariableLeftValueInLeftValue :: Precompilation -> SignatureInformation -> Variable () -> LeftValueData ()+myTransformVariableLeftValueInLeftValue Precompilation fromAbove v = VariableLeftValue $ myTransformVariable Precompilation fromAbove v data PrecompilationExternalInfo = PrecompilationExternalInfo { originalFeldsparFunctionSignature :: Precompiler.OriginalFeldsparFunctionSignature,
Feldspar/Compiler/Plugins/PrettyPrint.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE TypeFamilies #-} @@ -68,28 +64,24 @@ transformLocalDeclaration _ (_,defArrSize) _ up = LocalDeclaration {- localDeclarationData = ldd{localVariable = addDefaultArraySizes v defArrSize},+ localVariable = addDefaultArraySizes v defArrSize,+ localInitValue = recursivelyTransformedLocalInitValue up, localDeclarationSemInf = () } where- ldd = recursivelyTransformedLocalDeclarationData up- v = localVariable ldd+ v = recursivelyTransformedLocalVariable up instance Plugin PrettyPrint where type ExternalInfo PrettyPrint = (Platform,Int) executePlugin PrettyPrint (platform,defArrSize) procedure = fst- $ executeTransformationPhase PrettyPrint (isRestrict,defArrSize) procedure where- isRestrict = case platform of- C99 -> Restrict- _ -> NoRestrict+ $ executeTransformationPhase PrettyPrint (isRestrict platform,defArrSize) procedure where addDefaultArraySizes :: (SemanticInfo t) => Variable t -> Int -> Variable t-addDefaultArraySizes v defArrSize = v{variableData = vd{variableType = addDefaultArraySizes' t}}+addDefaultArraySizes v defArrSize = v{variableType = addDefaultArraySizes' t} where- vd = variableData v- t = variableType vd+ t = variableType v addDefaultArraySizes' (ImpArrayType (Norm n) t) = ImpArrayType (Norm n) $ addDefaultArraySizes' t addDefaultArraySizes' (ImpArrayType Undefined t) = ImpArrayType (Defined defArrSize) $ addDefaultArraySizes' t addDefaultArraySizes' t = t
Feldspar/Compiler/Plugins/PropagationUtils.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} @@ -36,21 +32,48 @@ import Feldspar.Compiler.PluginArchitecture import qualified Data.Map as Map---import qualified Data.Set as Set+import qualified Data.Set as Set import qualified Data.List as List -- ========================--- VarStatistics+-- VariableData -- ========================+ +data VariableData = VariableData {+ variableDataType :: Type+ , variableDataName :: String+} deriving (Eq,Show) +variableData :: (SemanticInfo t) => Variable t -> VariableData+variableData var = VariableData {+ variableDataName = variableName var+ , variableDataType = variableType var+}+ instance Ord VariableData where- compare v1 v2 = compare (variableName v1) $ variableName v2+ compare v1 v2 = compare (variableDataName v1) $ variableDataName v2 +instance Default (Maybe VariableData) where+ defaultValue = Nothing++instance Default [VariableData] where+ defaultValue = []++instance Default (Set.Set VariableData) where+ defaultValue = Set.empty++instance Combine (Set.Set VariableData) where+ combine = Set.union++-- ========================+-- VarStatistics+-- ========================+ type VarStatistics t = Map.Map VariableData (Occurrences t) data Occurrences t = Occurrences- { writeVar :: Occurrence (Maybe t) --(Maybe (Expression t,[String],Bool))+ { writeVar :: Occurrence (Maybe t) , readVar :: Occurrence () } deriving (Eq,Show)@@ -66,54 +89,54 @@ hasRead :: VarStatistics t -> VariableData -> Bool hasRead vs var = case Map.lookup var vs of- Nothing -> False- Just occ -> case readVar occ of- Zero -> False- _ -> True+ Nothing -> False+ Just occ -> case readVar occ of+ Zero -> False+ _ -> True notRead :: VarStatistics t -> VariableData -> Bool notRead vs var = not $ hasRead vs var hasWrite :: VarStatistics t -> VariableData -> Bool hasWrite vs var = case Map.lookup var vs of- Nothing -> False- Just occ -> case writeVar occ of- Zero -> False- _ -> True+ Nothing -> False+ Just occ -> case writeVar occ of+ Zero -> False+ _ -> True notWrite :: VarStatistics t -> VariableData -> Bool notWrite vs var = not $ hasWrite vs var getWrite :: VarStatistics t -> VariableData -> Maybe t getWrite vs var = case Map.lookup var vs of- Nothing -> Nothing- Just occ -> case writeVar occ of- One val -> val- _ -> Nothing+ Nothing -> Nothing+ Just occ -> case writeVar occ of+ One val -> val+ _ -> Nothing instance Default (VarStatistics t) where defaultValue = Map.empty instance Combine (VarStatistics t) where- combine fst snd = Map.unionWith combine fst snd + combine fst snd = Map.unionWith combine fst snd instance Combine (Occurrences t) where- combine o1 o2 = Occurrences- (combine (writeVar o1) (writeVar o2) )- (combine (readVar o1) (readVar o2) ) + combine o1 o2 = Occurrences+ (combine (writeVar o1) (writeVar o2) )+ (combine (readVar o1) (readVar o2) ) instance Combine (Occurrence t) where- combine Zero x = x- combine Multiple x = Multiple- combine e@(One _) Zero = e- combine (One _) _ = Multiple+ combine Zero x = x+ combine Multiple x = Multiple+ combine e@(One _) Zero = e+ combine (One _) _ = Multiple multipleVarStatistics :: VarStatistics t -> VarStatistics t multipleVarStatistics vs = Map.map multipleOccurrences vs where- multipleOccurrences (Occurrences write read) = Occurrences (multipleOccurrence write) (multipleOccurrence read)- multipleOccurrence Zero = Zero- multipleOccurrence (One _) = Multiple- multipleOccurrence Multiple = Multiple+ multipleOccurrences (Occurrences write read) = Occurrences (multipleOccurrence write) (multipleOccurrence read)+ multipleOccurrence Zero = Zero+ multipleOccurrence (One _) = Multiple+ multipleOccurrence Multiple = Multiple variablesInVarStatistics :: VarStatistics t -> [VariableData] variablesInVarStatistics vs = Map.keys vs@@ -136,114 +159,128 @@ defaultValue = Occurrence_read class OccurrenceDownwards node where- occurrenceDownwards :: node -> Occurrence_place+ occurrenceDownwards :: node -> Occurrence_place instance OccurrenceDownwards (Branch t) where- occurrenceDownwards _ = Occurrence_notopt --condition variable OK+ occurrenceDownwards _ = Occurrence_notopt --condition variable OK instance OccurrenceDownwards (SequentialLoop t) where- occurrenceDownwards _ = Occurrence_read --condition variable OK+ occurrenceDownwards _ = Occurrence_read --condition variable OK instance OccurrenceDownwards (ParallelLoop t) where- occurrenceDownwards _ = Occurrence_notopt --condition variable OK+ occurrenceDownwards _ = Occurrence_notopt --condition variable OK instance OccurrenceDownwards (FormalParameter t) where- occurrenceDownwards _ = Occurrence_notopt+ occurrenceDownwards _ = Occurrence_notopt instance OccurrenceDownwards (LocalDeclaration t) where- occurrenceDownwards _ = Occurrence_declare+ occurrenceDownwards _ = Occurrence_declare instance OccurrenceDownwards (Assignment t) where- occurrenceDownwards _ = Occurrence_write --left OK, right is expression-instance OccurrenceDownwards (InputActualParameterType t) where- occurrenceDownwards _ = Occurrence_read-instance OccurrenceDownwards (OutputActualParameterType t) where- occurrenceDownwards _ = Occurrence_write-instance OccurrenceDownwards (LeftValueInExpression t) where- occurrenceDownwards _ = Occurrence_read -- OK-instance OccurrenceDownwards (FunctionCall t) where- occurrenceDownwards _ = Occurrence_read -- OK--+ occurrenceDownwards _ = Occurrence_write --left OK, right is expression+instance OccurrenceDownwards (ActualParameter t) where+ occurrenceDownwards _ = Occurrence_write+instance OccurrenceDownwards (Expression t) where+ occurrenceDownwards _ = Occurrence_read -- OK -- ======================== -- Other utils -- ======================== -instance Default [VariableData] where- defaultValue = []-- declaredVar :: (SemanticInfo t) => LocalDeclaration t -> VariableData-declaredVar = variableData.localVariable.localDeclarationData+declaredVar = variableData.localVariable declaredVars :: (SemanticInfo t) => Block t -> [VariableData]-declaredVars block = map declaredVar $ blockDeclarations $ blockData block+declaredVars block = map declaredVar $ blockDeclarations block -delUnusedDecl :: (ConvertAllInfos via to) => [VariableData] -> Block via -> BlockData to -> Block to-delUnusedDecl unusedList origblock partiallyTransformedBlock =- Block {- blockData = BlockData {- blockDeclarations = filter (\d -> not $ List.elem (declaredVar d) unusedList) $ blockDeclarations partiallyTransformedBlock,- blockInstructions = blockInstructions partiallyTransformedBlock- },- blockSemInf = convert $ blockSemInf origblock- }+delUnusedDecl :: (ConvertAllInfos via to) => [VariableData] -> Block via -> [LocalDeclaration to] -> Program to -> Block to+delUnusedDecl unusedList origblock partiallyTransformedDecl partiallyTransformedInstr =+ Block {+ blockDeclarations = filter (\d -> not $ List.elem (declaredVar d) unusedList) $ partiallyTransformedDecl,+ blockInstructions = partiallyTransformedInstr,+ blockSemInf = convert $ blockSemInf origblock+ } -- ======================== -- SemInfUtils -- ======================== class SemInfUtils node where- deleteSemInf :: (SemanticInfo t) => node t -> node ()+ deleteSemInf :: (SemanticInfo t) => node t -> node () instance SemInfUtils Expression where- deleteSemInf (LeftValueExpression lve) = LeftValueExpression $ lve {- leftValueExpressionContents = deleteSemInf $ leftValueExpressionContents lve,- leftValueExpressionSemInf = ()- }- deleteSemInf (ConstantExpression ce) = (ConstantExpression $ deleteSemInf ce)- deleteSemInf (FunctionCallExpression fce) = FunctionCallExpression $ fce {- functionCallData = (functionCallData fce) {- actualParametersOfFunctionToCall = map deleteSemInf $ actualParametersOfFunctionToCall $ functionCallData fce- },- functionCallSemInf = ()- }+ deleteSemInf exp = exp {+ expressionData = deleteSemInf $ expressionData exp,+ expressionSemInf = ()+ } +instance SemInfUtils ExpressionData where+ deleteSemInf (LeftValueExpression lve) = LeftValueExpression $ deleteSemInf lve+ deleteSemInf (ConstantExpression ce) = ConstantExpression $ deleteSemInf ce+ deleteSemInf (FunctionCallExpression fce) = FunctionCallExpression $ deleteSemInf fce + instance SemInfUtils LeftValue where- deleteSemInf (VariableLeftValue vlv) = VariableLeftValue vlv {- variableLeftValueContents = deleteSemInf $ variableLeftValueContents vlv,- variableLeftValueSemInf = ()- }- deleteSemInf (ArrayElemReferenceLeftValue aer) = ArrayElemReferenceLeftValue aer {- arrayElemReferenceData = (arrayElemReferenceData aer){- arrayName = deleteSemInf $ arrayName $ arrayElemReferenceData aer,- arrayIndex = deleteSemInf $ arrayIndex $ arrayElemReferenceData aer- },- arrayElemReferenceSemInf = ()- }+ deleteSemInf lv = lv {+ leftValueData = deleteSemInf $ leftValueData lv,+ leftValueSemInf = ()+ } +instance SemInfUtils LeftValueData where+ deleteSemInf (VariableLeftValue vlv) = VariableLeftValue $ deleteSemInf vlv+ deleteSemInf (ArrayElemReferenceLeftValue aer) = ArrayElemReferenceLeftValue $ deleteSemInf aer++instance SemInfUtils ArrayElemReference where+ deleteSemInf aer = aer {+ arrayName = deleteSemInf $ arrayName aer,+ arrayIndex = deleteSemInf $ arrayIndex aer,+ arrayElemReferenceSemInf = ()+ }+ instance SemInfUtils Variable where- deleteSemInf var = var {- variableSemInf = ()- }+ deleteSemInf var = var {+ variableSemInf = ()+ } instance SemInfUtils ActualParameter where- deleteSemInf (InputActualParameter iap) = InputActualParameter iap {- inputActualParameterExpression = deleteSemInf $ inputActualParameterExpression iap,- inputActualParameterSemInf = ()- }- deleteSemInf (OutputActualParameter oap) = OutputActualParameter oap {- outputActualParameterLeftValue = deleteSemInf $ outputActualParameterLeftValue oap,- outputActualParameterSemInf = ()- }+ deleteSemInf ap = ap {+ actualParameterData = deleteSemInf $ actualParameterData ap,+ actualParameterSemInf = ()+ } +instance SemInfUtils ActualParameterData where+ deleteSemInf (InputActualParameter iap) = InputActualParameter $ deleteSemInf iap+ deleteSemInf (OutputActualParameter oap) = OutputActualParameter $ deleteSemInf oap+ instance SemInfUtils Constant where- deleteSemInf (IntConstant ic) = IntConstant ic {- intConstantSemInf = ()- }- deleteSemInf (FloatConstant fc) = FloatConstant fc {- floatConstantSemInf = ()- }- deleteSemInf (BoolConstant bc) = BoolConstant bc {- boolConstantSemInf = ()- }- deleteSemInf (ArrayConstant ac) = ArrayConstant ac {- arrayConstantValue = map deleteSemInf $ arrayConstantValue ac,- arrayConstantSemInf = ()- }+ deleteSemInf c = c {+ constantData = deleteSemInf $ constantData c,+ constantSemInf = ()+ }++instance SemInfUtils ConstantData where+ deleteSemInf (IntConstant ic) = IntConstant $ deleteSemInf ic+ deleteSemInf (FloatConstant fc) = FloatConstant $ deleteSemInf fc+ deleteSemInf (BoolConstant bc) = BoolConstant $ deleteSemInf bc+ deleteSemInf (ArrayConstant ac) = ArrayConstant $ deleteSemInf ac++instance SemInfUtils IntConstantType where+ deleteSemInf c = c {+ intConstantSemInf = ()+ }++instance SemInfUtils FloatConstantType where+ deleteSemInf c = c {+ floatConstantSemInf = ()+ }++instance SemInfUtils BoolConstantType where+ deleteSemInf c = c {+ boolConstantSemInf = ()+ }++instance SemInfUtils ArrayConstantType where+ deleteSemInf c = c {+ arrayConstantValue = map deleteSemInf $ arrayConstantValue c,+ arrayConstantSemInf = ()+ }++instance SemInfUtils FunctionCall where+ deleteSemInf fc = fc {+ actualParametersOfFunctionToCall = map deleteSemInf $ actualParametersOfFunctionToCall fc,+ functionCallSemInf = ()+ }
Feldspar/Compiler/Plugins/Unroll.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE FlexibleInstances, TypeFamilies #-} @@ -60,8 +56,8 @@ type To Unroll_1 = UnrollSemInf type Downwards Unroll_1 = Int type Upwards Unroll_1 = Bool- upwardsParallelLoop _ _ _ _ _ = True- transformParallelLoop Unroll_1 d pl u = trParLoop1 d pl u+ upwardsParallelLoopProgramInProgram _ _ _ _ _ = True+ transformParallelLoopProgramInProgram Unroll_1 d pl u = trParLoop1 d pl u data Unroll_2 = Unroll_2 instance TransformationPhase Unroll_2 where@@ -73,34 +69,36 @@ | programSemInf p == Nothing = d | otherwise = programSemInf p transformVariable Unroll_2 d v = trVariable d v- transformLeftValueExpression Unroll_2 d lvie u = trLVIE d lvie u+ transformVariableLeftValueInLeftValue Unroll_2 d v = VariableLeftValue $ trVariable d $ v+ transformLeftValueExpressionInExpression Unroll_2 d lvie u = trLVIE d lvie u data UnrollSemInf = UnrollSemInf instance SemanticInfo UnrollSemInf where- type ProcedureInfo UnrollSemInf = ()- type BlockInfo UnrollSemInf = ()- type ProgramInfo UnrollSemInf = Maybe SemInfPrg- type EmptyInfo UnrollSemInf = Maybe SemInfPrg- type PrimitiveInfo UnrollSemInf = Maybe SemInfPrg- type SequenceInfo UnrollSemInf = Maybe SemInfPrg- type BranchInfo UnrollSemInf = ()- type SequentialLoopInfo UnrollSemInf = ()- type ParallelLoopInfo UnrollSemInf = ()- type FormalParameterInfo UnrollSemInf = ()- type LocalDeclarationInfo UnrollSemInf = ()- type LeftValueExpressionInfo UnrollSemInf = ()- type VariableInLeftValueInfo UnrollSemInf = ()- type ArrayElemReferenceInfo UnrollSemInf = ()- type InputActualParameterInfo UnrollSemInf = ()- type OutputActualParameterInfo UnrollSemInf = ()- type AssignmentInfo UnrollSemInf = ()- type ProcedureCallInfo UnrollSemInf = ()- type FunctionCallInfo UnrollSemInf = ()- type IntConstantInfo UnrollSemInf = ()- type FloatConstantInfo UnrollSemInf = ()- type BoolConstantInfo UnrollSemInf = ()- type ArrayConstantInfo UnrollSemInf = ()- type VariableInfo UnrollSemInf = ()+ type ProcedureInfo UnrollSemInf = ()+ type BlockInfo UnrollSemInf = ()+ type ProgramInfo UnrollSemInf = Maybe SemInfPrg+ type EmptyInfo UnrollSemInf = Maybe SemInfPrg+ type PrimitiveInfo UnrollSemInf = Maybe SemInfPrg+ type SequenceInfo UnrollSemInf = Maybe SemInfPrg+ type BranchInfo UnrollSemInf = ()+ type SequentialLoopInfo UnrollSemInf = ()+ type ParallelLoopInfo UnrollSemInf = ()+ type FormalParameterInfo UnrollSemInf = ()+ type LocalDeclarationInfo UnrollSemInf = ()+ type ExpressionInfo UnrollSemInf = ()+ type ConstantInfo UnrollSemInf = ()+ type FunctionCallInfo UnrollSemInf = ()+ type LeftValueInfo UnrollSemInf = ()+ type ArrayElemReferenceInfo UnrollSemInf = ()+ type InstructionInfo UnrollSemInf = ()+ type AssignmentInfo UnrollSemInf = ()+ type ProcedureCallInfo UnrollSemInf = ()+ type ActualParameterInfo UnrollSemInf = ()+ type IntConstantInfo UnrollSemInf = ()+ type FloatConstantInfo UnrollSemInf = ()+ type BoolConstantInfo UnrollSemInf = ()+ type ArrayConstantInfo UnrollSemInf = ()+ type VariableInfo UnrollSemInf = () instance Combine Bool where combine = (||) @@ -112,57 +110,56 @@ } deriving (Eq, Show) instance Default (Maybe SemInfPrg) where defaultValue = Nothing -trLVIE d lvie u = case d of+trLVIE :: Downwards Unroll_2 -> LeftValue UnrollSemInf -> InfoFromLeftValueParts Unroll_2 -> ExpressionData ()+trLVIE d (LeftValue leftValue _) u = case d of Just x -> result x otherwise -> orig where- leftValue = leftValueExpressionContents $ lvie name = case leftValue of- VariableLeftValue (VariableInLeftValue d _) -> Just $ getVarName d+ VariableLeftValue d -> Just $ getVarName d otherwise -> Nothing result x = case name of Just n- | n == loopVar x -> FunctionCallExpression $ FunctionCall (FunctionCallData (InfixOp) (Numeric ImpSigned S32) ("+") ([loopVarPar, plusPar])) ()+ | n == loopVar x -> FunctionCallExpression $ FunctionCall InfixOp (Numeric ImpSigned S32) ("+") ([loopVarPar, plusPar]) () | otherwise -> orig otherwise -> orig where- loopVarPar = orig+ loopVarPar = Expression orig () num = position x- plusPar = ConstantExpression $ IntConstant $ IntConstantType num ()- orig = LeftValueExpression $ LeftValueInExpression (recursivelyTransformedLeftValueExpressionContents u ) () + plusPar = Expression (ConstantExpression $ Constant (IntConstant $ IntConstantType num ()) ()) ()+ orig = LeftValueExpression $ LeftValue (recursivelyTransformedLeftValueData u ) () trVariable d v- | d /= Nothing && elementOf (varNames (valueFromJust d)) (getVarName v) = v { variableData = (variableData v){ variableName = (variableName $ variableData v) ++ "_u" ++ (show $ position $ valueFromJust d) },variableSemInf = ()}+ | d /= Nothing && elementOf (varNames (valueFromJust d)) (getVarName v) = v { variableName = (variableName v) ++ "_u" ++ (show $ position $ valueFromJust d), variableSemInf = ()} | otherwise = v {variableSemInf = ()}- ++trParLoop1 :: Downwards Unroll_1 -> ParallelLoop () -> InfoFromParallelLoopParts Unroll_1 -> ProgramConstruction UnrollSemInf trParLoop1 d pl u | ( upwardsInfoFromParallelLoopCore u ) == False && (unrollPossible || varInExpr ) = ParallelLoopProgram newParLoop- | otherwise = ParallelLoopProgram (ParallelLoop trPL ())+ | otherwise = ParallelLoopProgram trPl where- newParLoop = pl { parallelLoopData = ( trPL ) - { parallelLoopStep = unrollNum- , parallelLoopCore = newLoopCore}- , parallelLoopSemInf = ()}+ newParLoop = trPl { parallelLoopStep = unrollNum+ , parallelLoopCore = newLoopCore+ , parallelLoopSemInf = ()} newLoopCore = origLoopCore - { blockData = (blockData origLoopCore)- { blockDeclarations = unrollDecls- , blockInstructions = unrollPrg- }+ { blockDeclarations = unrollDecls+ , blockInstructions = unrollPrg , blockSemInf = ()} unrollPrg = Program (SequenceProgram $ Sequence prgs (Nothing)) (Nothing) prgs = map (\(i,p) -> writeSemInfToPrg p (Just $ SemInfPrg i varNames loopCounter)) $ zip [0,1..] replPrg writeSemInfToPrg prg semInf = prg { programSemInf = semInf } replPrg = replicate unrollNum origPrg- origPrg = blockInstructions $ blockData origLoopCore+ origPrg = blockInstructions $ origLoopCore unrollDecls = concat $ map (\(i,ds) -> renameDecls ds i) $ zip [0,1..] replDecls renameDecls ds i = map (\d -> renameDeclaration d ((getVarNameDecl d) ++ "_u" ++ (show i))) ds replDecls = replicate unrollNum origDecls- origDecls = blockDeclarations $ blockData origLoopCore- origLoopCore = parallelLoopCore $ trPL- iterExpr = numberOfIterations $ trPL- trPL = recursivelyTransformedParallelLoopData u+ origDecls = blockDeclarations $ origLoopCore+ origLoopCore = recursivelyTransformedParallelLoopCore u+ iterExpr = recursivelyTransformedNumberOfIterations u+ loopCounter' = recursivelyTransformedParallelLoopConditionVariable u+ trPl = ParallelLoop loopCounter' iterExpr (parallelLoopStep pl) origLoopCore () unrollNum = d- loopCounter = getVarName $ parallelLoopConditionVariable trPL+ loopCounter = getVarName $ recursivelyTransformedParallelLoopConditionVariable u varNames = map (\d -> getVarNameDecl d) origDecls iterTemp = iterNumFromExpr iterExpr origIterNum = valueFromJust iterTemp@@ -171,14 +168,14 @@ varInExpr = not $ isJust iterTemp -- helper functions : -iterNumFromExpr (ConstantExpression (IntConstant (IntConstantType i _))) = Just i+iterNumFromExpr (Expression (ConstantExpression (Constant (IntConstant (IntConstantType i _)) _)) _) = Just i iterNumFromExpr _ = Nothing isJust (Just x) = True isJust _ = False-getVarNameDecl d = getVarName $ localVariable $ localDeclarationData $ d-getVarName v = variableName $ variableData v+getVarNameDecl d = getVarName $ localVariable d+getVarName v = variableName v valueFromJust (Just v) = v valueFromJust Nothing = error "This was Nothing"-renameDeclaration d n = d { localDeclarationData = (localDeclarationData d) { localVariable = renameVariable (localVariable $ localDeclarationData d) n } }-renameVariable v n = v { variableData = (variableData v) { variableName = n } }+renameDeclaration d n = d { localVariable = renameVariable (localVariable d) n }+renameVariable v n = v { variableName = n } elementOf ss s = (length $ filter (\s' -> s' == s) ss) > 0
Feldspar/Compiler/Precompiler/Precompiler.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- module Feldspar.Compiler.Precompiler.Precompiler where
+ Feldspar/Compiler/Standalone/Constants.hs view
@@ -0,0 +1,42 @@+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+--++module Feldspar.Compiler.Standalone.Constants where++globalImportList = ["Feldspar.Fs2dot", "Feldspar.Compiler.Compiler", + "Feldspar.Compiler.Precompiler.Precompiler", "Feldspar.Compiler.Options",+ "Feldspar.Compiler.Platforms"]++warningPrefix = "[WARNING]: "+errorPrefix = "[ERROR ]: "++helpHeader = "Standalone Feldspar Compiler\nUsage: feldspar [options] inputfile\n" +++ "Notes: \n" +++ " * When no output file name is specified, the input file's name with .c extension is used\n" +++ " * The inputfile parameter is always needed, even in single-function mode\n" +++ "\nAvailable options: \n"
+ Feldspar/Compiler/Standalone/Library.hs view
@@ -0,0 +1,71 @@+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+--++module Feldspar.Compiler.Standalone.Library where++import qualified Feldspar.Compiler.Options as CoreOptions+import Feldspar.Compiler.Platforms++import Data.Char+import System.Console.ANSI+import Language.Haskell.Interpreter++lowerFirst :: String -> String+lowerFirst (first:rest) = (toLower first : rest)++upperFirst :: String -> String+upperFirst (first:rest) = (toUpper first : rest)++formatStringListCore :: [String] -> String+formatStringListCore [] = ""+formatStringListCore [x] = x+formatStringListCore (x:xs) = x ++ " | " ++ (formatStringListCore xs)++formatStringList :: [String] -> String+formatStringList list | length list > 0 = "(" ++ (formatStringListCore list) ++ ")"+formatStringList _ = error "This list should not be empty."++rpad :: Int -> String -> String+rpad target s = rpadWith target ' ' s++rpadWith :: Int -> Char -> String -> String+rpadWith target padchar s+ | length s >= target = s+ | otherwise = rpadWith target padchar (s ++ [padchar])+ +withColor :: Color -> IO () -> IO ()+withColor color action = do+ setSGR [SetColor Foreground Dull color, SetConsoleIntensity BoldIntensity]+ action+ setSGR [Reset]+ +iPutStrLn :: String -> Interpreter ()+iPutStrLn = liftIO . putStrLn++iPutStr :: String -> Interpreter ()+iPutStr = liftIO . putStr
+ Feldspar/Compiler/Standalone/Options.hs view
@@ -0,0 +1,151 @@+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+--++module Feldspar.Compiler.Standalone.Options where++import qualified Feldspar.Compiler.Options as CompilerCoreOptions+import qualified Feldspar.Compiler.Compiler as CompilerCore+import qualified Feldspar.Compiler.Standalone.Library as StandaloneLib+import Feldspar.Compiler.Standalone.Constants+import Feldspar.Compiler.Platforms++import Data.List+import Data.Char++import System.Console.GetOpt+import System.Exit+import System.Environment+import System.IO+import System.Process+import System.Info+import System.Directory++availablePlatformsStrRep = StandaloneLib.formatStringList $+ map (StandaloneLib.upperFirst . CompilerCoreOptions.name) availablePlatforms++data FunctionMode = SingleFunction String | MultiFunction++data Options = Options { optSingleFunction :: FunctionMode+ , optOutputFileName :: Maybe String+ , optDotGeneration :: Bool+ , optDotFileName :: Maybe String+ , optCompilerMode :: CompilerCoreOptions.Options+ }++-- | Default options+startOptions :: Options+startOptions = Options { optSingleFunction = MultiFunction+ , optOutputFileName = Nothing+ , optDotGeneration = False+ , optDotFileName = Nothing+ , optCompilerMode = CompilerCore.defaultOptions+ }++-- | Option descriptions for getOpt+optionDescriptors :: [ OptDescr (Options -> IO Options) ]+optionDescriptors =+ [ Option "f" ["singlefunction"]+ (ReqArg+ (\arg opt -> return opt { optSingleFunction = SingleFunction arg })+ "FUNCTION")+ "Enables single-function compilation"++ , Option "o" ["output"]+ (ReqArg+ (\arg opt -> return opt { optOutputFileName = Just arg })+ "outputfile.c")+ "Overrides the file name for the generated output code"++ , Option "d" ["todot"]+ (OptArg+ (\arg opt -> return opt { optDotFileName = arg, optDotGeneration = True })+ "dotfile.dot")+ "Enables dot generation (outputs to stdout if no filename is specified)"++ , Option "p" ["platform"]+ (ReqArg+ (\arg opt -> return opt { optCompilerMode = (optCompilerMode opt)+ { CompilerCoreOptions.platform = decodePlatform arg } })+ "<platform>")+ ("Overrides the target platform " ++ availablePlatformsStrRep)+ , Option "u" ["unroll"]+ (ReqArg+ (\arg opt -> return opt {+ optCompilerMode = (optCompilerMode opt) {+ CompilerCoreOptions.unroll = CompilerCoreOptions.Unroll (parseInt arg "Invalid unroll count")+ }+ })+ "<unrollCount>")+ "Enables loop unrolling"+ , Option "D" ["debuglevel"]+ (ReqArg+ (\arg opt -> return opt { optCompilerMode = (optCompilerMode opt)+ { CompilerCoreOptions.debug = decodeDebug arg } })+ "<level>")+ "Specifies debug level (NoSimplification | NoPrimitiveInstructionHandling)"+ , Option "a" ["defaultArraySize"]+ (ReqArg+ (\arg opt -> return opt {+ optCompilerMode = (optCompilerMode opt) {+ CompilerCoreOptions.defaultArraySize = parseInt arg "Invalid default array size"+ }+ })+ "<size>")+ "Overrides default array size"++ , Option "h" ["help"]+ (NoArg+ (\_ -> do+ --prg <- getProgName+ hPutStrLn stderr (usageInfo helpHeader optionDescriptors)+ exitWith ExitSuccess))+ "Show this help message"+ ]++-- ==============================================================================+-- == Option Decoders+-- ==============================================================================++findPlatformByName :: String -> Maybe CompilerCoreOptions.Platform+findPlatformByName platformName = -- Finds a platform by name using case-insensitive comparison+ find (\platform -> (map toLower platformName) == (map toLower $ CompilerCoreOptions.name platform))+ availablePlatforms++decodePlatform :: String -> CompilerCoreOptions.Platform+decodePlatform s = case (findPlatformByName s) of+ Just platform -> platform+ Nothing -> error $ "Invalid platform specified. Valid platforms are: " ++ availablePlatformsStrRep++decodeDebug "NoSimplification" = CompilerCoreOptions.NoSimplification+decodeDebug "NoPrimitiveInstructionHandling" = CompilerCoreOptions.NoPrimitiveInstructionHandling+decodeDebug _ = error "Invalid debug level specified"++parseInt :: String -> String -> Int+parseInt arg message = case reads arg of+ [(x, "")] -> x+ _ -> error message
Feldspar/Compiler/Transformation/GraphToImperative.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE FlexibleInstances #-} @@ -103,17 +99,15 @@ inParameters = inputDecls, outParameters = outputDecls, procedureBody = Block {- blockData = BlockData {- blockDeclarations = localDecls,- blockInstructions = Program {- programConstruction = SequenceProgram $ Sequence {- sequenceProgramList = ( map transformNodeToProgram pairs- ++ copyToOutput (interfaceOutput ifc) (interfaceOutputType ifc) True ),- sequenceSemInf = ()- },- programSemInf = ()- }- },+ blockDeclarations = localDecls,+ blockInstructions = Program {+ programConstruction = SequenceProgram $ Sequence {+ sequenceProgramList = ( map transformNodeToProgram pairs+ ++ copyToOutput (interfaceOutput ifc) (interfaceOutputType ifc) True ),+ sequenceSemInf = ()+ },+ programSemInf = ()+ }, blockSemInf = () }, procedureSemInf = ()@@ -126,7 +120,7 @@ outputDecls = tupleWalk transformSourceToFormalParameter $ interfaceOutputType ifc transformSourceToFormalParameter :: [Int] -> StorableType -> FormalParameter InitSemInf transformSourceToFormalParameter path typ = FormalParameter {- formalParameterVariable = Representation.Variable (VariableData FunOut ctyp (outName path)) (),+ formalParameterVariable = Representation.Variable FunOut ctyp (outName path) (), formalParameterSemInf = () } where ctyp = compileStorableType typ@@ -141,7 +135,7 @@ transformNodeToFormalParameter n = tupleWalk genDecl $ tupleZip (outTyps,initVals) where genDecl path (typ,ini) = FormalParameter {- formalParameterVariable = Representation.Variable (VariableData Value ctyp (varPrefix (nodeId n) ++ varPath path)) (),+ formalParameterVariable = Representation.Variable Value ctyp (varPrefix (nodeId n) ++ varPath path) (), formalParameterSemInf = () } where ctyp = compileStorableType typ@@ -157,17 +151,13 @@ transformNodeToLocalDeclaration :: Node -> [LocalDeclaration InitSemInf] transformNodeToLocalDeclaration n = tupleWalk genDecl $ tupleZip (outTyps,initVals) where genDecl path (typ,ini) = LocalDeclaration {- localDeclarationData = LocalDeclarationData {- localVariable = Representation.Variable {- variableData = VariableData {- variableRole = Value,- variableType = ctyp,- variableName = (varPrefix (nodeId n) ++ varPath path)- },- variableSemInf = ()- },- localInitValue = ini+ localVariable = Representation.Variable {+ variableRole = Value,+ variableType = ctyp,+ variableName = (varPrefix (nodeId n) ++ varPath path),+ variableSemInf = () },+ localInitValue = ini, localDeclarationSemInf = () } where ctyp = compileStorableType typ@@ -193,14 +183,15 @@ Array _ -> Program (EmptyProgram $ Empty ()) () Function s -> Program { programConstruction = PrimitiveProgram $ Primitive {- primitiveInstruction = (ProcedureCallInstruction $ ProcedureCall {- procedureCallData = ProcedureCallData {- nameOfProcedureToCall = s,- actualParametersOfProcedureToCall = passInArgs (input n) (inputType n) ++- passOutArgs (nodeId n) (outputType n)- },- procedureCallSemInf = ()- }),+ primitiveInstruction = Instruction {+ instructionData = (ProcedureCallInstruction $ ProcedureCall {+ nameOfProcedureToCall = s,+ actualParametersOfProcedureToCall = passInArgs (input n) (inputType n) +++ passOutArgs (nodeId n) (outputType n),+ procedureCallSemInf = ()+ }),+ instructionSemInf = ()+ }, primitiveSemInf = False }, programSemInf = ()@@ -210,14 +201,15 @@ -- actual arguments come from the node input and the node id NoInline s ifc -> Program { programConstruction = PrimitiveProgram $ Primitive {- primitiveInstruction = (ProcedureCallInstruction $ ProcedureCall {- procedureCallData = ProcedureCallData {- nameOfProcedureToCall = s,- actualParametersOfProcedureToCall = passInArgs (input n) (inputType n) ++- passOutArgs (nodeId n) (outputType n)- },- procedureCallSemInf = ()- }),+ primitiveInstruction = Instruction {+ instructionData = (ProcedureCallInstruction $ ProcedureCall {+ nameOfProcedureToCall = s,+ actualParametersOfProcedureToCall = passInArgs (input n) (inputType n) +++ passOutArgs (nodeId n) (outputType n),+ procedureCallSemInf = ()+ }),+ instructionSemInf = ()+ }, primitiveSemInf = False }, programSemInf = ()@@ -235,11 +227,9 @@ -> error "Error in 'ifThenElse' node: node output is expected to be 'Bool'." | otherwise -> Program { programConstruction = BranchProgram $ Branch {- branchData = BranchData {- branchConditionVariable = condVar,- thenBlock = mkBranch n thenIfc thenH,- elseBlock = mkBranch n elseIfc elseH- },+ branchConditionVariable = condVar,+ thenBlock = mkBranch n thenIfc thenH,+ elseBlock = mkBranch n elseIfc elseH, branchSemInf = () }, programSemInf = ()@@ -247,23 +237,21 @@ where mkBranch :: Node -> Interface -> Hierarchy -> Block InitSemInf mkBranch n ifc h@(Hierarchy pairs) = Block {- blockData = BlockData {- blockDeclarations = (transformNodeListToLocalDeclarations $ map fst pairs),- blockInstructions = Program {- programConstruction = SequenceProgram $ Sequence { - sequenceProgramList = (copyResult inp (interfaceInput ifc) inTyp False- ++ transformNodeListToPrograms pairs- ++ copyResult (interfaceOutput ifc) (nodeId n) (outputType n) True),- sequenceSemInf = ()- },- programSemInf = ()- }+ blockDeclarations = (transformNodeListToLocalDeclarations $ map fst pairs),+ blockInstructions = Program {+ programConstruction = SequenceProgram $ Sequence { + sequenceProgramList = (copyResult inp (interfaceInput ifc) inTyp False+ ++ transformNodeListToPrograms pairs+ ++ copyResult (interfaceOutput ifc) (nodeId n) (outputType n) True),+ sequenceSemInf = ()+ },+ programSemInf = () }, blockSemInf = () } condVar = case cond of One (Graph.Variable (id,path)) ->- Representation.Variable (VariableData Value Representation.BoolType (varName id path)) ()+ Representation.Variable Value Representation.BoolType (varName id path) () _ -> error "Error in 'ifThenElse' node: condition is not a variable." -- TODO: it seems that in case of constant condition the program is already simplified on the graph level otherwise -> error $ "Error in 'ifThenElse' node: incorrect node input or node input type"@@ -282,33 +270,34 @@ (copyResult (input n) (nodeId n) (outputType n) True ++ [Program { programConstruction = SequentialLoopProgram $ SequentialLoop {- sequentialLoopData = SequentialLoopData { - sequentialLoopCondition = (case interfaceOutput condIfc of- One (Graph.Variable (id,path)) -> varToExpr $ Representation.Variable (VariableData Value Representation.BoolType (varName id path)) ()- _ -> error "Error in a while loop: Malformed interface output of condition calculation." - -- TODO: should this hold?- ),- conditionCalculation = Block {- blockData = BlockData {- blockDeclarations = (transformNodeListToLocalDeclarations condNodes),- blockInstructions = Program {- programConstruction = (SequenceProgram (Sequence (copyStateToCond ++ calculationCond) ())),- programSemInf = ()- }- },- blockSemInf = ()- },- sequentialLoopCore = Block {- blockData = BlockData { - blockDeclarations = (transformNodeListToLocalDeclarations bodyNodes),- blockInstructions = Program {- programConstruction = (SequenceProgram (Sequence (copyStateToBody ++ calculationBody ++ copyResultToState) ())),- programSemInf = ()- }+ sequentialLoopCondition = (case interfaceOutput condIfc of+ One (Graph.Variable (id,path)) -> varToExpr $ Representation.Variable Value Representation.BoolType (varName id path) ()+ One (Graph.Constant (BoolData x)) -> Expression {+ expressionData = ConstantExpression $ Representation.Constant {+ constantData = BoolConstant $ BoolConstantType x (),+ constantSemInf = () },- blockSemInf = ()+ expressionSemInf = () }+ unknown -> error $ "Error in a while loop: Malformed interface output of condition calculation: " ++ (show unknown) + -- TODO: should this hold?+ ),+ conditionCalculation = Block {+ blockDeclarations = (transformNodeListToLocalDeclarations condNodes),+ blockInstructions = Program {+ programConstruction = (SequenceProgram (Sequence (copyStateToCond ++ calculationCond) ())),+ programSemInf = ()+ },+ blockSemInf = () },+ sequentialLoopCore = Block {+ blockDeclarations = (transformNodeListToLocalDeclarations bodyNodes),+ blockInstructions = Program {+ programConstruction = (SequenceProgram (Sequence (copyStateToBody ++ calculationBody ++ copyResultToState) ())),+ programSemInf = ()+ },+ blockSemInf = ()+ }, sequentialLoopSemInf = () }, programSemInf = ()@@ -336,9 +325,9 @@ -- body: embedded graph and its interface Parallel ifc -> Program {- programConstruction = ParallelLoopProgram (ParallelLoop (ParallelLoopData- (Representation.Variable (VariableData Value (Numeric ImpSigned S32) (varName inpId [])) ()) num 1 prg- ) ()),+ programConstruction = ParallelLoopProgram $ ParallelLoop + (Representation.Variable Value (Numeric ImpSigned S32) (varName inpId []) ()) num 1 prg+ (), programSemInf = () } where num = case (input n, inputType n) of@@ -368,43 +357,40 @@ outTypArrayImp = compileStorableType outTypArray outTypElemImp = compileStorableType outTypElem prg = Block {- blockData = BlockData {- blockDeclarations = declarations,- blockInstructions = Program {- programConstruction = SequenceProgram $ Sequence {- sequenceProgramList = map transformNodeToProgram notInps ++- [ Program {- programConstruction = PrimitiveProgram $ Primitive {- primitiveInstruction = makeCopyFromExprs- (transformSourceToExpr outSrc outTypElem)- (LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = ArrayElemReferenceLeftValue $ ArrayElemReference {- arrayElemReferenceData = ArrayElemReferenceData {- arrayName = VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = Representation.Variable {- variableData = VariableData {- variableRole = Value, - variableType = outTypArrayImp,- variableName = (varName (nodeId n) [])- },- variableSemInf = ()- },- variableLeftValueSemInf = ()+ blockDeclarations = declarations,+ blockInstructions = Program {+ programConstruction = SequenceProgram $ Sequence {+ sequenceProgramList = map transformNodeToProgram notInps +++ [ Program {+ programConstruction = PrimitiveProgram $ Primitive {+ primitiveInstruction = makeCopyFromExprs+ (transformSourceToExpr outSrc outTypElem)+ (Expression {+ expressionData = LeftValueExpression $ LeftValue {+ leftValueData = (ArrayElemReferenceLeftValue $ ArrayElemReference {+ arrayName = LeftValue {+ leftValueData = VariableLeftValue $ Representation.Variable {+ variableRole = Value, + variableType = outTypArrayImp,+ variableName = (varName (nodeId n) []),+ variableSemInf = () },- arrayIndex = (genVar inpId [] intType)+ leftValueSemInf = () },+ arrayIndex = (genVar inpId [] intType), arrayElemReferenceSemInf = ()- },- leftValueExpressionSemInf = ()- }),- primitiveSemInf = True- },- programSemInf = ()- } ],- sequenceSemInf = ()- },- programSemInf = ()- }+ }),+ leftValueSemInf = ()+ },+ expressionSemInf = ()+ }),+ primitiveSemInf = True+ },+ programSemInf = ()+ } ],+ sequenceSemInf = ()+ },+ programSemInf = () }, blockSemInf = () }@@ -428,15 +414,17 @@ -- Generates a variable genVar :: NodeId -> [Int] -> Type -> Expression InitSemInf-genVar id path typ = LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = Representation.Variable {- variableData = VariableData { variableRole = Value, variableType = typ, variableName = (varName id path) },+genVar id path typ = Expression {+ expressionData = LeftValueExpression $ LeftValue {+ leftValueData = VariableLeftValue $ Representation.Variable {+ variableRole = Value,+ variableType = typ,+ variableName = (varName id path), variableSemInf = () },- variableLeftValueSemInf = ()+ leftValueSemInf = () },- leftValueExpressionSemInf = ()+ expressionSemInf = () } -- Prefix of output parameters@@ -449,35 +437,37 @@ -- Generates an output variable genOut :: [Int] -> Type -> Expression InitSemInf-genOut path typ =LeftValueExpression $ LeftValueInExpression {- leftValueExpressionContents = VariableLeftValue $ VariableInLeftValue {- variableLeftValueContents = Representation.Variable {- variableData = VariableData { variableRole = FunOut, variableType = typ, variableName = (outName path) },+genOut path typ = Expression {+ expressionData = LeftValueExpression $ LeftValue {+ leftValueData = VariableLeftValue $ Representation.Variable {+ variableRole = FunOut,+ variableType = typ,+ variableName = (outName path), variableSemInf = () },- variableLeftValueSemInf = ()+ leftValueSemInf = () },- leftValueExpressionSemInf = ()-} + expressionSemInf = ()+} -- Generates input parameters of a function call from the node input. passInArgs :: Tuple Source -> Tuple StorableType -> [ActualParameter InitSemInf] passInArgs tup typs = tupleWalk genArg $ tupleZip (tup,typs) where- genArg _ (Constant primData, StorableType _ typ) = InputActualParameter $ InputActualParameterType {- inputActualParameterExpression = compilePrimData primData typ,- inputActualParameterSemInf = ()+ genArg _ (Graph.Constant primData, StorableType _ typ) = ActualParameter {+ actualParameterData = InputActualParameter $ compilePrimData primData typ,+ actualParameterSemInf = () }- genArg _ (Graph.Variable (id, path), typ) = InputActualParameter $ InputActualParameterType {- inputActualParameterExpression = genVar id path (compileStorableType typ),- inputActualParameterSemInf = ()+ genArg _ (Graph.Variable (id, path), typ) = ActualParameter {+ actualParameterData = InputActualParameter $ genVar id path (compileStorableType typ),+ actualParameterSemInf = () } -- Generates output parameters of a function call from the node id and output type. passOutArgs :: NodeId -> Tuple StorableType -> [ActualParameter InitSemInf] passOutArgs id typs = tupleWalk genArg typs where- genArg path t = OutputActualParameter $ OutputActualParameterType {- outputActualParameterLeftValue = toLeftValue $ genVar id path (compileStorableType t),- outputActualParameterSemInf = ()+ genArg path t = ActualParameter {+ actualParameterData = OutputActualParameter $ toLeftValue $ genVar id path (compileStorableType t),+ actualParameterSemInf = () } -------------------------------------------------@@ -508,34 +498,50 @@ IntType False 64 _ -> Numeric ImpUnsigned S64 IntType sig size _ -> handleError "GraphToImperative" InvariantViolation $ "unknown integer type: IntType" ++ (show sig) ++ " " ++ (show size) CoreTypes.FloatType x -> Representation.FloatType -- TODO: think about the imperative typesystem!+ CoreTypes.UserType userTypeName -> Representation.UserType userTypeName -- Transforms an array or primitive data to an imperative constant. compileStorableDataToConst :: StorableData -> Constant InitSemInf compileStorableDataToConst (CoreTypes.PrimitiveData pd) = compilePrimDataToConst pd-compileStorableDataToConst (StorableData ds) = ArrayConstant $ ArrayConstantType (map compileStorableDataToConst ds) ()+compileStorableDataToConst (StorableData ds) = Representation.Constant {+ constantData = ArrayConstant $ ArrayConstantType (map compileStorableDataToConst ds) (),+ constantSemInf = ()+} -- Transforms a primitive data to an imperative constant. compilePrimDataToConst :: CoreTypes.PrimitiveData -> Constant InitSemInf-compilePrimDataToConst (UnitData ()) = BoolConstant $ BoolConstantType False ()-compilePrimDataToConst (BoolData x) = BoolConstant $ BoolConstantType x ()-compilePrimDataToConst (IntData x) = IntConstant $ IntConstantType (fromInteger x) ()-compilePrimDataToConst (FloatData x) = FloatConstant $ FloatConstantType x () -- TODO+compilePrimDataToConst (UnitData ()) = Representation.Constant {+ constantData = BoolConstant $ BoolConstantType False (),+ constantSemInf = ()+}+compilePrimDataToConst (BoolData x) = Representation.Constant {+ constantData = BoolConstant $ BoolConstantType x (),+ constantSemInf = ()+}+compilePrimDataToConst (IntData x) = Representation.Constant {+ constantData = IntConstant $ IntConstantType (fromInteger x) (),+ constantSemInf = ()+}+compilePrimDataToConst (FloatData x) = Representation.Constant {+ constantData = FloatConstant $ FloatConstantType x (), -- TODO+ constantSemInf = ()+} -- Transforms an array or primitive data to an imperative typed expression. compileStorableData :: StorableData -> StorableType -> Expression InitSemInf compileStorableData (CoreTypes.PrimitiveData pd) (StorableType _ elemTyp) = compilePrimData pd elemTyp-compileStorableData a@(StorableData ds) typ = (ConstantExpression $ compileStorableDataToConst a)+compileStorableData a@(StorableData ds) typ = Expression (ConstantExpression $ compileStorableDataToConst a) () -- Transforms a primitive data to an imperative typed expression. compilePrimData :: CoreTypes.PrimitiveData -> PrimitiveType -> Expression InitSemInf-compilePrimData d t = ConstantExpression $ compilePrimDataToConst d+compilePrimData d t = Expression (ConstantExpression $ compilePrimDataToConst d) () charType = Numeric ImpSigned S8 intType = Numeric ImpSigned S32 -- Transforms a Source to an imperative expression. transformSourceToExpr :: Source -> StorableType -> Expression InitSemInf-transformSourceToExpr (Constant primData) (StorableType _ typ) = compilePrimData primData typ+transformSourceToExpr (Graph.Constant primData) (StorableType _ typ) = compilePrimData primData typ transformSourceToExpr (Graph.Variable (id,path)) typ = genVar id path ctyp where ctyp = compileStorableType typ@@ -552,18 +558,22 @@ -- Generates a copy call from two expressions. makeCopyFromExprs :: Expression InitSemInf -> Expression InitSemInf -> Instruction InitSemInf-makeCopyFromExprs from to = ProcedureCallInstruction $- ProcedureCall {- procedureCallData = ProcedureCallData "copy" [InputActualParameter $ InputActualParameterType {- inputActualParameterExpression = from,- inputActualParameterSemInf = ()- },- OutputActualParameter $ OutputActualParameterType {- outputActualParameterLeftValue = (toLeftValue to),- outputActualParameterSemInf = ()- }],+makeCopyFromExprs from to = Instruction {+ instructionData = ProcedureCallInstruction $ ProcedureCall {+ nameOfProcedureToCall = "copy",+ actualParametersOfProcedureToCall = [ActualParameter {+ actualParameterData = InputActualParameter from,+ actualParameterSemInf = ()+ },+ ActualParameter {+ actualParameterData = OutputActualParameter $ toLeftValue to,+ actualParameterSemInf = ()+ }], procedureCallSemInf = ()- }+ },+ instructionSemInf = ()+}+ -- Generates copies for all variables of a node to all variables of another node. copyNode :: NodeId -> NodeId -> Tuple StorableType -> Bool -> [Program InitSemInf]@@ -601,10 +611,10 @@ tupleWalk (\path (out,typ) -> Program {- programConstruction = PrimitiveProgram (Primitive {+ programConstruction = PrimitiveProgram $ Primitive { primitiveInstruction = (makeCopyFromExprs (transformSourceToExpr out typ) (genOut path $ compileStorableType typ)), primitiveSemInf = isOutputCopying- }),+ }, programSemInf = () } )@@ -612,10 +622,10 @@ varToExpr :: Representation.Variable InitSemInf -> Expression InitSemInf-varToExpr v =- LeftValueExpression - (LeftValueInExpression - (VariableLeftValue $- VariableInLeftValue v() ) - ()- )+varToExpr v = Expression {+ expressionData = LeftValueExpression $ LeftValue { + leftValueData = VariableLeftValue v, + leftValueSemInf = ()+ },+ expressionSemInf = ()+}
Feldspar/Compiler/Transformation/GraphUtils.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
Feldspar/Compiler/Transformation/Lifting.hs view
@@ -1,34 +1,30 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- {-# LANGUAGE FlexibleInstances #-}
Feldspar/Fs2dot.hs view
@@ -1,270 +1,266 @@-{-- - Copyright (c) 2009-2010, ERICSSON AB All rights reserved.- - - - Redistribution and use in source and binary forms, with or without- - modification, are permitted provided that the following conditions- - are met:- - - - * Redistributions of source code must retain the above copyright- - notice,- - this list of conditions and the following disclaimer.- - * Redistributions in binary form must reproduce the above copyright- - notice, this list of conditions and the following disclaimer- - in the documentation and/or other materials provided with the- - distribution.- - * Neither the name of the ERICSSON AB nor the names of its- - contributors- - may be used to endorse or promote products derived from this- - software without specific prior written permission.- - - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS- - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT- - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR- - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT- - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,- - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT- - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,- - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY- - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT- - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE- - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.- -}+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- --- |Fs2dot is to help us create a visualisation of an algorithm written in --- Feldspar by converting its graph into dot format -- which can be further --- processed by the Graphviz suite. -module Feldspar.Fs2dot - ( fs2dot - , writeDot - , DOTSource - ) - where - -import Feldspar.Core.Types -import Feldspar.Core.Graph -import Feldspar.Core.Reify (reify, Program) -import Prelude hiding (id) - -{- frontend -} - --- |'fs2dot' takes a Feldspar function as its argument and produces DOT language --- source. -fs2dot :: (Program prg) - => prg -- ^Feldspar function - -> DOTSource -- ^DOT language source -fs2dot = toDot . fromGraph . makeHierarchical . reify - --- |'writeDot' creates a DOT language format source file. Expected arguments --- are the desired filename and the Feldspar function to be output in DOT --- language. -writeDot :: (Program prg) - => FilePath -- ^output filename - -> prg -- ^Feldspar function - -> IO () -writeDot filename prg = writeFile filename $ fs2dot prg - --- |This is for clarity. -type DOTSource = String - -{- data types -} - -data DGraph = - DGraph - { inputs :: [NodeId] - , outputs :: [NodeId] - , nodes :: [DNode] - , edges :: [DEdge] - } - deriving (Eq, Show) - -data DNode = - DNode - { id :: Int - , role :: Function - , subgraphs :: [DGraph] - , label :: String - } - deriving (Eq, Show) - -data DEdge = - DEdge - { start :: DConnector - , end :: DConnector - } - deriving (Eq, Show) - -data DConnector = - DNodeConn (NodeId, Int) - | DConstConn PrimitiveData - deriving (Eq, Show) - -{- core -} - -fromGraph :: HierarchicalGraph - -> DGraph -fromGraph graph = - DGraph - { inputs = enumerateInputs graph - , outputs = enumerateOutputs graph - , nodes = (\(Hierarchy h) -> enumerateNodes h) $ graphHierarchy graph - , edges = (\(Hierarchy h) -> enumerateEdges h) $ graphHierarchy graph - } - - where - enumerateInputs graph = [interfaceInput $ hierGraphInterface graph] - enumerateOutputs graph = graph - |> tuple2list . interfaceOutput . hierGraphInterface - |> map (\(Variable (n, _)) -> n) . filter isVariable - - enumerateNodes = map - (\(node, hiers) -> - DNode - { id = nodeId node - , role = function node - , subgraphs = hiers |> map - (\hier -> DGraph - { inputs = [] - , outputs = [] - , nodes = (\(Hierarchy h) -> enumerateNodes h) hier - , edges = [] - } - ) - , label = (fun2label (function node) - ++ " (" ++ show (nodeId node) ++ ")") |> subst '"' '\'' - } - ) - - enumerateEdges :: [(Node, [Hierarchy])] -> [DEdge] - enumerateEdges = concatMap - (\(node, hiers) -> - [ DEdge - { start = DNodeConn (inputnode, 0) - , end = DNodeConn (nodeId node, 0) - } - | inputnode <- - (tuple2list $ input node) - |> filter isVariable |> map (\(Variable (n, _)) -> n) - ] ++ - [ DEdge - { start = DConstConn (constval) - , end = DNodeConn (nodeId node, 0) - } - | constval <- - (tuple2list $ input node) - |> filter (not.isVariable) |> map (\(Constant val) -> val) - ] ++ - concatMap (\(Hierarchy h) -> enumerateEdges h) hiers - ) - - isVariable src = case src of - Variable _ -> True - _ -> False - -toDot :: DGraph - -> DOTSource -toDot graph = - [ dGraphHead - , dGraphOptions - , dGraphNodes graph - , dGraphEdges graph - , dGraphOutputs graph - , dGraphTail - ] |> unlines - |> unlines . filter (not.null) . lines - - where - dGraphHead = "digraph G {" - dGraphOptions = - [ "node [shape=box]" - , "compound=true bgcolor=\"lightgray\"" - , "node [style=filled color=\"black\" fillcolor=\"steelblue\"]" - , "edge []" - ] |> unlines - - dGraphNodes graph = - nodes graph - |> map - (\node -> - if compound node - then - [ "subgraph cluster" ++ show (id node) ++ " {" - , "label =\"" ++ label node ++ "\"" - , subgraphs node |> map - (\subgraph -> - [ dGraphNodes subgraph - , dGraphEdges subgraph - ] |> unlines - ) |> unlines - , "}" - ] |> unlines - else - [ "node" ++ show (id node) - , "[label=\"" ++ label node ++ "\"" - , "href=\"#node" ++ show (id node) ++ "\"]" - ] |> unwords - ) - |> unlines - - dGraphEdges graph = - zip [1..] (edges graph) - |> map - (\(n, edge) -> - if constEdge edge - then "const" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge) - ++ "_" ++ show n - ++ " [label=\"" - ++ show ((\(DEdge (DConstConn val) _) -> val) edge) - ++ "\"]\n" - ++ "const" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge) - ++ "_" ++ show n - ++ " -> " - ++ "node" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge) - else "node" ++ show ((\(DNodeConn (i, _)) -> i) $ start edge) - ++ " -> " - ++ "node" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge) - ) - |> unlines - - where - label edge = "" - constEdge edge = case edge of - DEdge (DConstConn _) _ -> True - _ -> False - - dGraphOutputs graph = zip [0 ..] (outputs graph) |> map - (\(n, opid) -> - [ "node" ++ show opid ++ " -> output" ++ show n - , "output" ++ show n ++ " [label=\"Output " ++ show n ++ "\"]" - ] |> unlines - ) |> unlines - dGraphTail = "}" - compound = \n -> (not.null) $ subgraphs n - -fun2label :: Function - -> String -fun2label (Input) = "Input" -fun2label (Array sd) = "Array " ++ (show sd) -fun2label (Function str) = "Function " ++ (show str) -fun2label (NoInline str ifc) = "NoInLine " ++ (show str) -fun2label (IfThenElse ifc1 ifc2) = "IfThenElse" -fun2label (While ifc1 ifc2) = "While" -fun2label (Parallel ifc) = "Parallel" -- ++ (show i) - -{- utility functions -} - -tupleCount :: Tuple a -> Int -tupleCount (One a) = 1 -tupleCount (Tup as) = sum $ map tupleCount as - -tuple2list :: Tuple a -> [a] -tuple2list (One a) = [a] -tuple2list (Tup as) = concatMap tuple2list as - -subst :: (Eq a) => a -> a -> [a] -> [a] -subst _ _ [] = [] -subst a b (x:xs) = (if a == x then b else x) : subst a b xs - -infixl 1 |> -(|>) :: a -> (a -> b) -> b -(|>) x f = f x - +-- |Fs2dot is to help us create a visualisation of an algorithm written in+-- Feldspar by converting its graph into dot format -- which can be further+-- processed by the Graphviz suite.+module Feldspar.Fs2dot+ ( fs2dot+ , writeDot+ , DOTSource+ )+ where++import Feldspar.Core.Types+import Feldspar.Core.Graph+import Feldspar.Core.Reify (reify, Program)+import Prelude hiding (id)++{- frontend -}++-- |'fs2dot' takes a Feldspar function as its argument and produces DOT language+-- source.+fs2dot :: (Program prg)+ => prg -- ^Feldspar function+ -> DOTSource -- ^DOT language source+fs2dot = toDot . fromGraph . makeHierarchical . reify++-- |'writeDot' creates a DOT language format source file. Expected arguments+-- are the desired filename and the Feldspar function to be output in DOT+-- language.+writeDot :: (Program prg)+ => FilePath -- ^output filename+ -> prg -- ^Feldspar function+ -> IO ()+writeDot filename prg = writeFile filename $ fs2dot prg++-- |This is for clarity.+type DOTSource = String++{- data types -}++data DGraph =+ DGraph+ { inputs :: [NodeId]+ , outputs :: [NodeId]+ , nodes :: [DNode]+ , edges :: [DEdge]+ }+ deriving (Eq, Show)++data DNode =+ DNode+ { id :: Int+ , role :: Function+ , subgraphs :: [DGraph]+ , label :: String+ }+ deriving (Eq, Show)++data DEdge =+ DEdge+ { start :: DConnector+ , end :: DConnector+ }+ deriving (Eq, Show)++data DConnector =+ DNodeConn (NodeId, Int)+ | DConstConn PrimitiveData+ deriving (Eq, Show)++{- core -}++fromGraph :: HierarchicalGraph+ -> DGraph+fromGraph graph =+ DGraph+ { inputs = enumerateInputs graph+ , outputs = enumerateOutputs graph+ , nodes = (\(Hierarchy h) -> enumerateNodes h) $ graphHierarchy graph+ , edges = (\(Hierarchy h) -> enumerateEdges h) $ graphHierarchy graph+ }++ where+ enumerateInputs graph = [interfaceInput $ hierGraphInterface graph]+ enumerateOutputs graph = graph+ |> tuple2list . interfaceOutput . hierGraphInterface+ |> map (\(Variable (n, _)) -> n) . filter isVariable++ enumerateNodes = map+ (\(node, hiers) ->+ DNode+ { id = nodeId node+ , role = function node+ , subgraphs = hiers |> map+ (\hier -> DGraph+ { inputs = []+ , outputs = []+ , nodes = (\(Hierarchy h) -> enumerateNodes h) hier+ , edges = []+ }+ )+ , label = (fun2label (function node)+ ++ " (" ++ show (nodeId node) ++ ")") |> subst '"' '\''+ }+ )++ enumerateEdges :: [(Node, [Hierarchy])] -> [DEdge]+ enumerateEdges = concatMap+ (\(node, hiers) ->+ [ DEdge+ { start = DNodeConn (inputnode, 0)+ , end = DNodeConn (nodeId node, 0)+ }+ | inputnode <-+ (tuple2list $ input node)+ |> filter isVariable |> map (\(Variable (n, _)) -> n)+ ] +++ [ DEdge+ { start = DConstConn (constval)+ , end = DNodeConn (nodeId node, 0)+ }+ | constval <-+ (tuple2list $ input node)+ |> filter (not.isVariable) |> map (\(Constant val) -> val)+ ] +++ concatMap (\(Hierarchy h) -> enumerateEdges h) hiers+ )++ isVariable src = case src of+ Variable _ -> True+ _ -> False++toDot :: DGraph+ -> DOTSource+toDot graph =+ [ dGraphHead+ , dGraphOptions+ , dGraphNodes graph+ , dGraphEdges graph+ , dGraphOutputs graph+ , dGraphTail+ ] |> unlines+ |> unlines . filter (not.null) . lines++ where+ dGraphHead = "digraph G {"+ dGraphOptions =+ [ "node [shape=box]"+ , "compound=true bgcolor=\"lightgray\""+ , "node [style=filled color=\"black\" fillcolor=\"steelblue\"]"+ , "edge []"+ ] |> unlines++ dGraphNodes graph =+ nodes graph+ |> map+ (\node -> + if compound node+ then+ [ "subgraph cluster" ++ show (id node) ++ " {"+ , "label =\"" ++ label node ++ "\""+ , subgraphs node |> map+ (\subgraph ->+ [ dGraphNodes subgraph+ , dGraphEdges subgraph+ ] |> unlines+ ) |> unlines+ , "}"+ ] |> unlines+ else+ [ "node" ++ show (id node)+ , "[label=\"" ++ label node ++ "\""+ , "href=\"#node" ++ show (id node) ++ "\"]"+ ] |> unwords+ )+ |> unlines++ dGraphEdges graph =+ zip [1..] (edges graph)+ |> map+ (\(n, edge) ->+ if constEdge edge+ then "const" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge)+ ++ "_" ++ show n+ ++ " [label=\""+ ++ show ((\(DEdge (DConstConn val) _) -> val) edge)+ ++ "\"]\n"+ ++ "const" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge)+ ++ "_" ++ show n+ ++ " -> "+ ++ "node" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge)+ else "node" ++ show ((\(DNodeConn (i, _)) -> i) $ start edge)+ ++ " -> "+ ++ "node" ++ show ((\(DNodeConn (i, _)) -> i) $ end edge)+ )+ |> unlines++ where+ label edge = ""+ constEdge edge = case edge of+ DEdge (DConstConn _) _ -> True+ _ -> False++ dGraphOutputs graph = zip [0 ..] (outputs graph) |> map+ (\(n, opid) ->+ [ "node" ++ show opid ++ " -> output" ++ show n+ , "output" ++ show n ++ " [label=\"Output " ++ show n ++ "\"]"+ ] |> unlines+ ) |> unlines+ dGraphTail = "}"+ compound = \n -> (not.null) $ subgraphs n++fun2label :: Function+ -> String+fun2label (Input) = "Input"+fun2label (Array sd) = "Array " ++ (show sd)+fun2label (Function str) = "Function " ++ (show str)+fun2label (NoInline str ifc) = "NoInLine " ++ (show str)+fun2label (IfThenElse ifc1 ifc2) = "IfThenElse"+fun2label (While ifc1 ifc2) = "While"+fun2label (Parallel ifc) = "Parallel" -- ++ (show i)++{- utility functions -}++tupleCount :: Tuple a -> Int+tupleCount (One a) = 1+tupleCount (Tup as) = sum $ map tupleCount as++tuple2list :: Tuple a -> [a]+tuple2list (One a) = [a]+tuple2list (Tup as) = concatMap tuple2list as++subst :: (Eq a) => a -> a -> [a] -> [a]+subst _ _ [] = []+subst a b (x:xs) = (if a == x then b else x) : subst a b xs++infixl 1 |>+(|>) :: a -> (a -> b) -> b+(|>) x f = f x+
Setup.hs view
@@ -1,6 +1,31 @@-module Main (main) where+--+-- Copyright (c) 2009-2010, ERICSSON AB All rights reserved.+-- +-- Redistribution and use in source and binary forms, with or without+-- modification, are permitted provided that the following conditions are met:+-- +-- * Redistributions of source code must retain the above copyright notice,+-- this list of conditions and the following disclaimer.+-- * Redistributions in binary form must reproduce the above copyright+-- notice, this list of conditions and the following disclaimer in the+-- documentation and/or other materials provided with the distribution.+-- * Neither the name of the ERICSSON AB nor the names of its contributors+-- may be used to endorse or promote products derived from this software+-- without specific prior written permission.+-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS+-- BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,+-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF+-- THE POSSIBILITY OF SUCH DAMAGE.+-- import Distribution.Simple -main :: IO () main = defaultMain
feldspar-compiler.cabal view
@@ -1,6 +1,6 @@ name: feldspar-compiler-version: 0.2.1-cabal-version: >= 1.2.3+version: 0.3+cabal-version: >= 1.6 build-type: Simple license: BSD3 license-file: LICENSE@@ -9,7 +9,7 @@ Eotvos Lorand University Faculty of Informatics maintainer: deva@inf.elte.hu stability: experimental-homepage: http://feldspar.sourceforge.net/+homepage: http://feldspar.inf.elte.hu/feldspar/ synopsis: Compiler for the Feldspar language description: Feldspar (**F**unctional **E**mbedded **L**anguage for **DSP** and **PAR**allelism) is an embedded DSL for describing digital@@ -28,7 +28,6 @@ Feldspar.Compiler.Imperative.Semantics Feldspar.Compiler.PluginArchitecture.DefaultConvert Feldspar.Compiler.Plugins.BackwardPropagation- Feldspar.Compiler.Plugins.ConstantFolding Feldspar.Compiler.Plugins.ForwardPropagation Feldspar.Compiler.Plugins.HandlePrimitives Feldspar.Compiler.Plugins.Precompilation@@ -42,13 +41,14 @@ Feldspar.Compiler.Compiler Feldspar.Compiler.Error Feldspar.Compiler.Options+ Feldspar.Compiler.Platforms Feldspar.Compiler.PluginArchitecture Feldspar.Compiler Feldspar.Fs2dot build-depends:- feldspar-language == 0.2,- base >= 4.0 && < 4.2,+ feldspar-language == 0.3,+ base >= 4 && < 4.3, containers, haskell-src-exts, directory,@@ -72,11 +72,21 @@ ./Feldspar/C install-includes:- feldspar.h- feldspar.c+ feldspar_c99.h+ feldspar_c99.c+ feldspar_tic64x.h+ feldspar_tic64x.c executable feldspar main-is : ./Feldspar/Compiler/CompilerMain.hs++ other-modules:+ Feldspar.Compiler.Standalone.Constants+ Feldspar.Compiler.Standalone.Library+ Feldspar.Compiler.Standalone.Options++ build-depends:+ ansi-terminal extensions: CPP