feldspar-language 0.5.0.1 → 0.6.0.2
raw patch · 186 files changed
+12991/−12490 lines, 186 filesdep +bytestringdep +feldspar-languagedep +test-frameworkdep ~QuickAnnotatedep ~QuickCheckdep ~arraynew-uploader
Dependencies added: bytestring, feldspar-language, test-framework, test-framework-golden, test-framework-quickcheck2, test-framework-th
Dependency ranges changed: QuickAnnotate, QuickCheck, array, base, containers, data-hash, data-lens, monad-par, mtl, random, syntactic, tagged, type-level
Files
- CEFP/cefpNotes.hs +0/−210
- Examples/Effects/Overdrive.hs +0/−24
- Examples/Effects/ShiftByOneOctave.hs +0/−26
- Examples/Math/Convolution.hs +0/−23
- Examples/Math/Fft.hs +0/−125
- Examples/Simple/Basics.hs +0/−44
- Examples/Simple/BitVectors.hs +0/−29
- Examples/Simple/Complex.hs +0/−37
- Examples/Simple/Fixedpoint.hs +0/−113
- Examples/Simple/Matrices.hs +0/−28
- Examples/Simple/Pairs.hs +0/−19
- Examples/Simple/Sharing.hs +0/−45
- Examples/Simple/SizeInference.hs +0/−35
- Examples/Simple/Streams.hs +0/−26
- Examples/Simple/Trace.hs +0/−14
- Examples/Simple/Vectors.hs +0/−62
- Feldspar.hs +0/−45
- Feldspar/BitVector.hs +0/−374
- Feldspar/Core.hs +0/−59
- Feldspar/Core/Collection.hs +0/−88
- Feldspar/Core/Constructs.hs +0/−194
- Feldspar/Core/Constructs/Array.hs +0/−252
- Feldspar/Core/Constructs/Binding.hs +0/−190
- Feldspar/Core/Constructs/Bits.hs +0/−270
- Feldspar/Core/Constructs/Complex.hs +0/−111
- Feldspar/Core/Constructs/Condition.hs +0/−77
- Feldspar/Core/Constructs/ConditionM.hs +0/−112
- Feldspar/Core/Constructs/Conversion.hs +0/−129
- Feldspar/Core/Constructs/Eq.hs +0/−105
- Feldspar/Core/Constructs/Error.hs +0/−90
- Feldspar/Core/Constructs/FFI.hs +0/−86
- Feldspar/Core/Constructs/Floating.hs +0/−146
- Feldspar/Core/Constructs/Fractional.hs +0/−85
- Feldspar/Core/Constructs/Integral.hs +0/−210
- Feldspar/Core/Constructs/Literal.hs +0/−60
- Feldspar/Core/Constructs/Logic.hs +0/−123
- Feldspar/Core/Constructs/Loop.hs +0/−212
- Feldspar/Core/Constructs/Mutable.hs +0/−170
- Feldspar/Core/Constructs/MutableArray.hs +0/−103
- Feldspar/Core/Constructs/MutableReference.hs +0/−91
- Feldspar/Core/Constructs/MutableToPure.hs +0/−98
- Feldspar/Core/Constructs/Num.hs +0/−218
- Feldspar/Core/Constructs/Ord.hs +0/−205
- Feldspar/Core/Constructs/Par.hs +0/−196
- Feldspar/Core/Constructs/Save.hs +0/−83
- Feldspar/Core/Constructs/SizeProp.hs +0/−93
- Feldspar/Core/Constructs/SourceInfo.hs +0/−81
- Feldspar/Core/Constructs/Trace.hs +0/−90
- Feldspar/Core/Constructs/Tuple.hs +0/−326
- Feldspar/Core/Frontend.hs +0/−270
- Feldspar/Core/Frontend/Array.hs +0/−63
- Feldspar/Core/Frontend/Binding.hs +0/−43
- Feldspar/Core/Frontend/Bits.hs +0/−122
- Feldspar/Core/Frontend/Complex.hs +0/−75
- Feldspar/Core/Frontend/Condition.hs +0/−48
- Feldspar/Core/Frontend/ConditionM.hs +0/−42
- Feldspar/Core/Frontend/Conversion.hs +0/−67
- Feldspar/Core/Frontend/Eq.hs +0/−77
- Feldspar/Core/Frontend/Error.hs +0/−55
- Feldspar/Core/Frontend/FFI.hs +0/−45
- Feldspar/Core/Frontend/Floating.hs +0/−85
- Feldspar/Core/Frontend/Fractional.hs +0/−62
- Feldspar/Core/Frontend/Integral.hs +0/−84
- Feldspar/Core/Frontend/Literal.hs +0/−55
- Feldspar/Core/Frontend/Logic.hs +0/−62
- Feldspar/Core/Frontend/Loop.hs +0/−51
- Feldspar/Core/Frontend/Mutable.hs +0/−65
- Feldspar/Core/Frontend/MutableArray.hs +0/−78
- Feldspar/Core/Frontend/MutableReference.hs +0/−62
- Feldspar/Core/Frontend/MutableToPure.hs +0/−57
- Feldspar/Core/Frontend/Num.hs +0/−82
- Feldspar/Core/Frontend/Ord.hs +0/−86
- Feldspar/Core/Frontend/Par.hs +0/−59
- Feldspar/Core/Frontend/Save.hs +0/−60
- Feldspar/Core/Frontend/SizeProp.hs +0/−80
- Feldspar/Core/Frontend/SourceInfo.hs +0/−54
- Feldspar/Core/Frontend/Trace.hs +0/−45
- Feldspar/Core/Frontend/Tuple.hs +0/−264
- Feldspar/Core/Interpretation.hs +0/−398
- Feldspar/Core/Types.hs +0/−831
- Feldspar/FixedPoint.hs +0/−251
- Feldspar/Lattice.hs +0/−196
- Feldspar/Matrix.hs +0/−226
- Feldspar/Option.hs +0/−114
- Feldspar/Par.hs +0/−94
- Feldspar/Prelude.hs +0/−77
- Feldspar/Range.hs +0/−1035
- Feldspar/Repa.hs +0/−339
- Feldspar/Stream.hs +0/−493
- Feldspar/Vector.hs +0/−65
- Feldspar/Vector/Internal.hs +0/−345
- Feldspar/Wrap.hs +0/−70
- LICENSE +2/−0
- examples/Examples/Simple/Basics.hs +41/−0
- feldspar-language.cabal +100/−26
- src/Feldspar.hs +45/−0
- src/Feldspar/Algorithm/CRC.hs +87/−0
- src/Feldspar/Algorithm/FFT.hs +102/−0
- src/Feldspar/BitVector.hs +386/−0
- src/Feldspar/Core.hs +58/−0
- src/Feldspar/Core/Collection.hs +64/−0
- src/Feldspar/Core/Constructs.hs +239/−0
- src/Feldspar/Core/Constructs/Array.hs +247/−0
- src/Feldspar/Core/Constructs/Binding.hs +251/−0
- src/Feldspar/Core/Constructs/Bits.hs +238/−0
- src/Feldspar/Core/Constructs/Complex.hs +124/−0
- src/Feldspar/Core/Constructs/Condition.hs +82/−0
- src/Feldspar/Core/Constructs/ConditionM.hs +105/−0
- src/Feldspar/Core/Constructs/Conversion.hs +117/−0
- src/Feldspar/Core/Constructs/Eq.hs +99/−0
- src/Feldspar/Core/Constructs/Error.hs +80/−0
- src/Feldspar/Core/Constructs/FFI.hs +76/−0
- src/Feldspar/Core/Constructs/Floating.hs +109/−0
- src/Feldspar/Core/Constructs/Fractional.hs +93/−0
- src/Feldspar/Core/Constructs/Future.hs +87/−0
- src/Feldspar/Core/Constructs/Integral.hs +192/−0
- src/Feldspar/Core/Constructs/Literal.hs +64/−0
- src/Feldspar/Core/Constructs/Logic.hs +118/−0
- src/Feldspar/Core/Constructs/Loop.hs +203/−0
- src/Feldspar/Core/Constructs/Mutable.hs +167/−0
- src/Feldspar/Core/Constructs/MutableArray.hs +97/−0
- src/Feldspar/Core/Constructs/MutableReference.hs +87/−0
- src/Feldspar/Core/Constructs/MutableToPure.hs +108/−0
- src/Feldspar/Core/Constructs/NoInline.hs +73/−0
- src/Feldspar/Core/Constructs/Num.hs +202/−0
- src/Feldspar/Core/Constructs/Ord.hs +187/−0
- src/Feldspar/Core/Constructs/Par.hs +188/−0
- src/Feldspar/Core/Constructs/Save.hs +74/−0
- src/Feldspar/Core/Constructs/SizeProp.hs +83/−0
- src/Feldspar/Core/Constructs/SourceInfo.hs +87/−0
- src/Feldspar/Core/Constructs/Trace.hs +87/−0
- src/Feldspar/Core/Constructs/Tuple.hs +323/−0
- src/Feldspar/Core/Frontend.hs +282/−0
- src/Feldspar/Core/Frontend/Array.hs +97/−0
- src/Feldspar/Core/Frontend/Binding.hs +48/−0
- src/Feldspar/Core/Frontend/Bits.hs +132/−0
- src/Feldspar/Core/Frontend/Complex.hs +74/−0
- src/Feldspar/Core/Frontend/Condition.hs +43/−0
- src/Feldspar/Core/Frontend/ConditionM.hs +40/−0
- src/Feldspar/Core/Frontend/Conversion.hs +72/−0
- src/Feldspar/Core/Frontend/Eq.hs +78/−0
- src/Feldspar/Core/Frontend/Error.hs +50/−0
- src/Feldspar/Core/Frontend/FFI.hs +48/−0
- src/Feldspar/Core/Frontend/Floating.hs +85/−0
- src/Feldspar/Core/Frontend/Fractional.hs +61/−0
- src/Feldspar/Core/Frontend/Future.hs +66/−0
- src/Feldspar/Core/Frontend/Integral.hs +89/−0
- src/Feldspar/Core/Frontend/Literal.hs +59/−0
- src/Feldspar/Core/Frontend/Logic.hs +62/−0
- src/Feldspar/Core/Frontend/Loop.hs +51/−0
- src/Feldspar/Core/Frontend/Mutable.hs +68/−0
- src/Feldspar/Core/Frontend/MutableArray.hs +78/−0
- src/Feldspar/Core/Frontend/MutableReference.hs +68/−0
- src/Feldspar/Core/Frontend/MutableToPure.hs +58/−0
- src/Feldspar/Core/Frontend/NoInline.hs +38/−0
- src/Feldspar/Core/Frontend/Num.hs +87/−0
- src/Feldspar/Core/Frontend/Ord.hs +89/−0
- src/Feldspar/Core/Frontend/Par.hs +66/−0
- src/Feldspar/Core/Frontend/Save.hs +60/−0
- src/Feldspar/Core/Frontend/Select.hs +41/−0
- src/Feldspar/Core/Frontend/SizeProp.hs +82/−0
- src/Feldspar/Core/Frontend/SourceInfo.hs +51/−0
- src/Feldspar/Core/Frontend/Trace.hs +45/−0
- src/Feldspar/Core/Frontend/Tuple.hs +152/−0
- src/Feldspar/Core/Interpretation.hs +489/−0
- src/Feldspar/Core/Interpretation/Typed.hs +55/−0
- src/Feldspar/Core/Types.hs +863/−0
- src/Feldspar/FixedPoint.hs +240/−0
- src/Feldspar/Future.hs +41/−0
- src/Feldspar/Lattice.hs +198/−0
- src/Feldspar/Matrix.hs +222/−0
- src/Feldspar/Option.hs +121/−0
- src/Feldspar/Par.hs +92/−0
- src/Feldspar/Prelude.hs +77/−0
- src/Feldspar/Range.hs +686/−0
- src/Feldspar/Repa.hs +513/−0
- src/Feldspar/Stream.hs +480/−0
- src/Feldspar/Vector.hs +65/−0
- src/Feldspar/Vector/Internal.hs +408/−0
- src/Feldspar/Vector/Push.hs +183/−0
- src/Feldspar/Wrap.hs +90/−0
- tests/DecorationTests.hs +19/−0
- tests/Feldspar/Range/Test.hs +501/−0
- tests/Feldspar/Vector/Test.hs +27/−0
- tests/RangeTest.hs +8/−0
- tests/SemanticsTest.hs +21/−0
− CEFP/cefpNotes.hs
@@ -1,210 +0,0 @@-import qualified Prelude -import Feldspar -import Feldspar.Vector -import Feldspar.Compiler -import Feldspar.Matrix - - - --- This code accompanies our lecture notes --- "Feldspar: Application and Implementation", in CEFP, --- Springer LNCS 7241, 2012. --- The code is documented in the notes. - - -square :: Data WordN -> Data WordN -square x = x*x - - - -f :: Data Int32 -> Data Int32 -f i = (testBit i 0) ? (2*i, i) - - -arr1n :: Data WordN -> Data [WordN] -arr1n n = parallel n (\i -> (i+1)) - -squareEach :: Data [WordN] -> Data [WordN] -squareEach as = parallel (getLength as) (\i -> square (getIx as i)) - - -sfac :: Data WordN -> Data [WordN] -sfac n = sequential n 1 g - where - g ix st = (j,j) - where j = (ix + 1) * st - - -fib :: Data Index -> Data Index -fib n = fst $ forLoop n (1,1) $ \i (a,b) -> (b,a+b) - - -intLog :: Data WordN -> Data WordN -intLog n = fst $ whileLoop (0,n) - (\(_,b) -> (b > 1)) - (\ (a,b) -> (a+1, b `div` 2)) - - - - - - -tw :: Data WordN -> Data WordN -> Data (Complex Float) -tw n k = exp (-2 * pi * iunit * i2n k / i2n n) - -tws n = indexed n (tw n) - - - -squares :: Data WordN -> Vector1 WordN -squares n = map square (1...n) - - - -flipBit :: Data Index -> Data Index -> Data Index -flipBit i k = i `xor` (bit k) - -flips :: Data WordN -> Vector1 WordN -> Vector1 WordN -flips k = map (\e -> flipBit e k) - - -sumSqVn :: Data WordN -> Data WordN -sumSqVn n = fold (+) 0 $ map square (1...n) - - --- Transforms - - --- DFT - -dft :: Vector (Data (Complex Float)) -> Vector (Data (Complex Float)) -dft xs = indexed n (\k -> sum (indexed n (\j -> xs!j * tw n (j*k)))) - where - n = length xs - - --- FFT - -premap :: (Data Index -> Data Index) -> Vector a -> Vector a -premap f (Indexed l ixf Empty) = indexed l (ixf . f) - - -revp :: (Bits a) => Data Index -> Vector1 a -> Vector1 a -revp k = premap (`xor` (2^k - 1)) - - -bfly :: Data Index -> Vector (Data (Complex Float)) - -> Vector (Data (Complex Float)) -bfly k as = indexed l ixf - where - l = length as - ixf i = (testBit i k) ? (b-a, a+b) - where - a = as ! i - b = as ! (flipBit i k) - - - - - - --- Recursive --- works on sub-arrays of length 2^n -fftr0 :: Index -> Vector (Data (Complex Float)) -> - Vector (Data (Complex Float)) -fftr0 0 = id -fftr0 n = fftr0 n' . twids0 vn' . bfly vn' - where - n' = n - 1 - vn' = value n' - - --- Needs bit reversal on the output -fft0 :: Index -> Vector (Data (Complex Float)) -> - Vector (Data (Complex Float)) -fft0 n = bitRev (value n) . fftr0 n - - - -oneBitsN :: Data Index -> Data Index -oneBitsN k = complement (shiftLU (complement 0) k) - - - --- bit reversal -bitr :: Data Index -> Data Index -> Data Index -bitr n a = let mask = (oneBitsN n) in - (complement mask .&. a) .|. rotateLU (reverseBits (mask .&. a)) n - - -bitRev :: Data Index -> Vector a -> Vector a -bitRev n = premap (bitr n) - - - -dt4 = zipWith (+.) (value [1,2,3,1 :: Float]) (value [4,-2,2,2]) - - - - --- Iterative -fft1 :: Data Index -> Vector (Data (Complex Float)) -> - Vector (Data (Complex Float)) -fft1 n as = bitRev n $ forLoop n as (\k -> twids0 (n-1-k) . bfly (n-1-k)) - - - - -fft2 :: Data Index -> Vector (Data (Complex Float)) - -> Vector (Data (Complex Float)) -fft2 n as = bitRev n $ forLoop n as (\k -> bfly2 (n-1-k)) - where - bfly2 k as = indexed l ixf - where - l = length as - ixf i = (testBit i k) ? (t*(b-a), a+b) - where - a = as ! i - b = as ! (flipBit i k) - t = tw (2^(k+1)) (i `mod` (2^k)) - - - -twids0 :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float) -twids0 k as = indexed l ixf - where - l = length as - ixf i = (testBit i k) ? (t*(as!i),as!i) - where - t = tw (2^(k+1)) (i `mod` (2^k)) - - - -twids1 :: Data Index -> Data Index -> Vector1 (Complex Float) - -> Vector1 (Complex Float) -twids1 n k as = indexed (length as) ixf - where - ixf i = (testBit i k) ? (t * (as!i), as!i) - where - t = tw (2^n) ((i `mod` (2^k)) .<<. (n-1-k)) - - - -twids2 :: Data Index -> Data Index -> Vector1 (Complex Float) - -> Vector1 (Complex Float) -twids2 n k as = indexed (length as) ixf - where - ts = force $ indexed (2^(n-1)) (tw (2^n)) - ixf i = (testBit i k) ? (t * (as!i), as!i) - where - t = ts ! ((i `mod` (2^k)) .<<. (n-1-k)) - - -fft3 :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float) -fft3 n as = bitRev n $ forLoop n as (\k -> twids2 n (n-1-k) . bfly (n-1-k)) - - --- Decimation in Time (Earlier versions are Decimation in Frequency) -fft4 :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float) -fft4 n as = forLoop n (bitRev n as) (\k -> bfly k . twids2 n k) -
− Examples/Effects/Overdrive.hs
@@ -1,24 +0,0 @@-module Examples.Effects.Overdrive where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler---- | Generic (not compilable) overdrive function-overdrive :: (Numeric a, Ord a) => Vector1 a -> Data a -> Data a -> Vector1 a-overdrive x mul bound = map (\x -> x * mul) $ map mapFn x- where- mapFn elem = (?) (elem > bound) (bound, elseBranch)- where- elseBranch = (?) (elem < - bound) (-bound,elem)---- | Wrapper to fix the type and size of the vectors in overdrive.-overdriveInstance :: Data [Float] -> Data Float -> Data Float -> Data [Float]-overdriveInstance x mul bound =- desugar $ overdrive (thawVector' 256 x) mul bound---- | Wrapper to fix the type and size of the vectors in overdrive.-overdrive_wrapped :: Data' D256 [Float] -> Data Float -> Data Float -> Data [Float]-overdrive_wrapped = wrap (overdrive :: Vector1 Float -> Data Float -> Data Float -> Vector1 Float)
− Examples/Effects/ShiftByOneOctave.hs
@@ -1,26 +0,0 @@-module Examples.Effects.ShiftByOneOctave where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler---- | Generic (not compilable) algorithm to double the frequency of a signal.--- This is an approximate solution without using FFT.-shiftByOneOctave :: (Fraction a) => Vector1 a -> Vector1 a-shiftByOneOctave inp = half ++ half- where- half = everySecond $ map avg $ zip inp $ tail inp- everySecond xs = indexed (length xs `div` 2) $ \idx -> xs ! (2*idx)- avg (x,y) = (x + y) / 2---- | Wrapper to fix the type and size of the vectors in shiftByOneOctave.-shiftByOneOctaveInstance :: Data [Float] -> Data [Float]-shiftByOneOctaveInstance input = desugar $ shiftByOneOctave input'- where- input' = thawVector' 256 input---- | Wrapper to fix the type and size of the vectors in shiftByOneOctave.-shiftByOneOctave_wrapped :: Data' D256 [Float] -> Data [Float]-shiftByOneOctave_wrapped = wrap (shiftByOneOctave :: Vector1 Float -> Vector1 Float)
− Examples/Math/Convolution.hs
@@ -1,23 +0,0 @@-module Examples.Math.Convolution where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler-import Feldspar.Matrix---- | Generic (not compilable) convolution function-convolution :: (Numeric a) => Vector1 a -> Vector1 a -> Vector1 a-convolution kernel input = map ((scalarProd kernel) . reverse) $ inits input---- | Wrappers to define the size and element type of vectors in 'convolution'-convolutionInstance :: Data [Float] -> Data [Float] -> Data [Float]-convolutionInstance kernel input = desugar $ convolution kernel' input'- where- input' = thawVector' 256 input- kernel' = thawVector' 16 kernel---- | Wrappers to define the size and element type of vectors in 'convolution'-convolution_wrapped :: Data' D16 [Float] -> Data' D256 [Float] -> Data [Float]-convolution_wrapped = wrap (convolution :: Vector1 Float -> Vector1 Float -> Vector1 Float)
− Examples/Math/Fft.hs
@@ -1,125 +0,0 @@-module Examples.Math.Fft where--import qualified Prelude as P-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Matrix-import Feldspar.Compiler---- | Wrapper to define the size of vectors in 'fft'-fftInstance :: Data [Complex Float] -> Data [Complex Float]-fftInstance = desugar . fft . thawVector' 256---- | Wrapper to define the size of vectors in 'fft'-fft_wrapped ::Data' D256 [Complex Float] -> Data [Complex Float]-fft_wrapped = wrap fft---- | Wrapper to define the size of vectors in 'ifft'-ifftInstance :: Data [Complex Float] -> Data [Complex Float]-ifftInstance = desugar . ifft . thawVector' 256---- | Wrapper to define the size of vectors in 'ifft'-ifft_wrapped ::Data' D256 [Complex Float] -> Data [Complex Float]-ifft_wrapped = wrap ifft----- =================== INTERFACE ==================================--- | Radix-2 Decimation-In-Frequeny Fast Fourier Transformation of the given complex vector--- The given vector must be power-of-two sized, (for example 2, 4, 8, 16, 32, etc.)-fft :: Vector1 (Complex Float) -> Vector1 (Complex Float)-fft v = bitRev (loglen-1) $ fftCore (loglen-1) v- where loglen = f2i $ logBase 2 $ i2f $ length v---- | Radix-2 Decimation-In-Frequeny Inverse Fast Fourier Transformation of the given complex vector--- The given vector must be power-of-two sized, (for example 2, 4, 8, 16, 32, etc.)-ifft :: Vector1 (Complex Float) -> Vector1 (Complex Float)-ifft v = bitRev (loglen-1) $ ifftCore (loglen-1) v- where loglen = f2i $ logBase 2 $ i2f $ length v--- ================================================================------- | fftCore function uses 2^(n+1) input vector.--- Output from the last stage needs to be bit reversed using bitRev function (if required)-fftCore :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float)-fftCore n v = composeOn stage (reverse (0...n)) v--stage k (Indexed l ixf Empty) = (Indexed l ixf' Empty)- where- k2 = 1 .<<. k- ixf' i = condition (testBit i k) (twid * (b-a)) (a+b)- where- a = ixf i- b = ixf (i `xor` k2)- twid = cis (-pi*(i2f (lsbs k i)) / i2f k2)----- | ifftCore function uses 2^(n+1) input vector.--- Output from the last stage needs to be bit reversed using bitRev function (if required)-ifftCore :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float)-ifftCore n v = map (/ (complex (i2f (2^(n+1))) 0)) $ composeOn istage (reverse (0...n)) v--istage k (Indexed l ixf Empty) = (Indexed l ixf' Empty)- where- k2 = 1 .<<. k- ixf' i = condition (testBit i k) (twid * (b-a)) (a+b)- where- a = ixf i- b = ixf (i `xor` k2)- twid = cis (pi*(i2f (lsbs k i)) / i2f k2)----- | bitRev function transforms the given vector to bitreversal order--- parameter n is the size of the input vector-bitRev :: Type a => Data Index -> Vector (Data a) -> Vector (Data a)-bitRev n = pipe riffle (1...n)----- | Helper functions for fftCore and ifftCore and bitRev-pipe :: (Syntax a) => (Data Index -> a -> a) -> Vector (Data Index) -> a -> a-pipe = flip.fold.flip--composeOn f is as = fold (flip f) as is--allOnes = complement 0--oneBits n = complement (allOnes .<<. n)--lsbs k i = i .&. oneBits k--par m n f = mat2Vec m n . map f . vec2Mat m n---- k at least 1-rotBit :: Data Index -> Data Index -> Data Index-rotBit 0 _ = P.error "k should be at least 1"-rotBit k i = lefts .|. rights- where- ir = i .>>. 1- rights = ir .&. (oneBits k)- lefts = (((ir .>>. k) .<<. 1) .|. (i .&. 1)) .<<. k--riffle k (Indexed l ixf Empty) = indexed l (ixf.rotBit k)--vec2Mat :: Data Index -> Data Index -> Vector (Data a) -> Matrix a-vec2Mat m n (Indexed l ixf Empty) = indexedMat (1 .<<. m) (1 .<<. n) ixf'- where- ixf' i j = ixf $ (i .<<. n) `xor` j--mat2Vec :: Type a => Data Index -> Data Index -> Matrix a -> Vector (Data a)-mat2Vec m n matr = Indexed (1 .<<. m .<<. n) ixf Empty- where- ixf i = matr ! y ! x- where- y = i .>>. n- x = i .&. (oneBits n)------ Ad-hoc function to generate a power-of-two sequence in order to test fft and ifft-pow2Seq :: Data WordN -> Vector1 (Complex Float)-pow2Seq n = indexed (2 ^ n) (\i ->complex (i2f i) 0 )---
− Examples/Simple/Basics.hs
@@ -1,44 +0,0 @@-module Examples.Simple.Basics where--import qualified Prelude-import Feldspar-import Feldspar.Vector-import Feldspar.Compiler---- Identity function for 32 bit integers.-example1 :: Data Int32 -> Data Int32-example1 = id---- Constant function-example2 :: Data Int32-example2 = 2---- A constant core vector-example3 :: Data [Int32]-example3 = value [42,1,2,3]---- Examples showing some of the integer and boolean operations:--example4 :: Data Int32 -> Data Int32-example4 x = negate x--example5 :: Data Int32 -> Data Int32 -> Data Int32-example5 x y = x + y--example6 :: Data Int32 -> Data Int32 -> Data Bool-example6 x y = x == y--example7 :: Data Bool-example7 = 2 /= (2 :: Data Int32) -- Type of numeric literals sometimes have to be written explicitly.--example8 :: Data Bool -> Data Bool-example8 b = not b---- Examples on using conditionals:--example9 :: Data Int32 -> Data Int32-example9 a = condition (a<5) (3*(a+a)) (30*(a+20))--example10 :: Data Int32 -> Data Int32-example10 a = condition (a<5) (3*(a+a)) (30*(a+a))-
− Examples/Simple/BitVectors.hs
@@ -1,29 +0,0 @@-module Examples.Simple.BitVectors where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.BitVector-import Feldspar.Compiler---- | Counting 1 bits in a bitvector-countOnes :: (Unit w, Size w ~ Range w) => BitVector w -> Data Length-countOnes = fold (\a b -> a + b2i b) (0 :: Data Length)--countOnes' :: Data' D10 [Word32] -> Data Length-countOnes' = wrap (countOnes :: BitVector Word32 -> Data Length)---- | CRC-crc :: (Unit w, Size w ~ Range w) => BitVector w -> BitVector w -> BitVector w-crc input control- = fold step (takeUnits n padded) $ dropUnits n padded- where- n = numOfUnits control- padded = input ++ replUnit n 0- step window bit = head window ?- ( zipWith (/=) (tail bit window) control- , tail bit window- )--crc' :: Data' D10 [Word16] -> Data' D1 [Word16] -> Data [Word16]-crc' = wrap (crc :: BitVector Word16 -> BitVector Word16 -> BitVector Word16)
− Examples/Simple/Complex.hs
@@ -1,37 +0,0 @@-module Examples.Simple.Complex where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler---- | Creation of complex values, addition and conjugation.-complex1 :: Data (Complex Float)-complex1 = conjugate $ value (3 :+ 4) + value (0 :+ 9)---- | Constant vector containing complex values.-complex2 :: Data [Complex Float]-complex2 = value- [ 3 :+ 4 :: Complex Float, 0 :+ 9, (-13) :+ (-4), 32 :+ 22- , 0 :+ 0, 10 :+ 9, 3 :+ (-2), 21 :+ 3- , 10 :+ 4, 2 :+ 2, 0 :+ 1, 0 :+ (-10)- , (-1) :+ 0, 3 :+ (-3), 5 :+ 55- ]---- | Sum of a complex vector.-complex3 :: Data' D256 [Complex Float] -> Data (Complex Float)-complex3 = wrap (sum :: Vector1 (Complex Float) -> Data (Complex Float))---- | Generic (not compilable) pairwise multiplication of vectors.-complex4 :: (Syntax a, Num a) => Vector a -> Vector a -> Vector a-complex4 = zipWith (*)---- | Instance of the generic algorithm for complex values and fixed length arrays.-complex4' :: Data' D256 [Complex Float] -> Data' D256 [Complex Float] -> Data [Complex Float]-complex4' = wrap (complex4 :: Vector1 (Complex Float) -> Vector1 (Complex Float) -> Vector1 (Complex Float))---- | Real parts of a complex vector.-complex5 :: Data' D256 [Complex Float] -> Data [Float]-complex5 = wrap $ map (realPart :: Data (Complex Float) -> Data Float)-
− Examples/Simple/Fixedpoint.hs
@@ -1,113 +0,0 @@-module Examples.Simple.Fixedpoint where--import Prelude ()-import qualified Prelude as P-import Feldspar-import Feldspar.FixedPoint-import Feldspar.Compiler-import Feldspar.Vector---- | Generic (not compilable) adder-fpex1 :: (Num a) => a -> a -> a-fpex1 x y = x + y---- | Wrapper for 'fpex1' using fixed-point numbers--- (with type Int32, input exponents are (-2) and (-3),--- while the output exponent is (-4))-fpex1Fix32 :: Data Int32 -> Data Int32 -> Data Int32-fpex1Fix32 x y = freezeFix' (-2) $ fpex1 ((unfreezeFix' (-3) x))- ((unfreezeFix' (-4) y))---- | Wrapper for 'fpex1' using floating-point numbers-fpex1Float :: Data Float -> Data Float -> Data Float-fpex1Float x y = fpex1 x y---- | Generic (not compilable) division-fpex2 :: (Fractional a, Fixable a) => a -> a -> a-fpex2 x y = x / y---- | Wrapper for 'fpex2' using fixed-point numbers-fpex2Fix32 :: Data Int32 -> Data Int32 -> Data Int32-fpex2Fix32 x y = freezeFix' (-4) $ fpex2 ((unfreezeFix' (-8) x))- ((unfreezeFix' (-4) y))---- | Wrapper for 'fpex3' using floating-point numbers-fpex2Float :: Data Float -> Data Float -> Data Float-fpex2Float x y = fpex2 x y---- | Generic (not compilable) function adding 0.25 to the input-fpex3 :: (Num a,Fractional a,Fixable a) => a -> a-fpex3 x = x + (fix (-2) 0.25)---- | Wrapper for 'fpex3' using fixed-point numbers (with type Int32)-fpex3Fix32 :: Data Int32 -> Data Int32-fpex3Fix32 x = freezeFix' (-4) $ fpex3 $ unfreezeFix' (-2) x---- | Wrapper for 'fpex3' using floating-point numbers-fpex3Float :: Data Float -> Data Float-fpex3Float x = fpex3 x---- | Generic (not compilable) function increasing each element of the input vector-fpex4 :: (Num a) =>- a -> Vector a -> Vector a-fpex4 x = map (x+)---- | Wrapper for 'fpex4' using fixed-point numbers (with type Int32)-fpex4Fix32 :: Data Int32 -> Vector1 Int32 -> Vector1 Int32-fpex4Fix32 x xs = map (freezeFix' (-4)) $ fpex4 x' xs'- where- xs' :: Vector (Fix Int32)- xs' = map (unfreezeFix' (-6)) xs- x' :: Fix Int32- x' = unfreezeFix' (-8) x---- | Wrapper for 'fpex4' using floating-point numbers-fpex4Float :: Data Float -> Data [Float] -> Data [Float]-fpex4Float x xs = desugar $ fpex4 x xs'- where- xs' = thawVector' 256 xs----- | Generic (not compilable) average function-fpex5 :: (Num a,Fractional a) => a -> a -> a-fpex5 x y = (x + y) / 2---- | Wrapper for 'fpex5' using fixed-point numbers (with type Int32)-fpex5Fix32 :: Data Int32 -> Data Int32 -> Data Int32-fpex5Fix32 x y = freezeFix' (-5) $ fpex5 x' y'- where- x' = unfreezeFix' (-4) x- y' = unfreezeFix' (-6) y---- | Wrapper for 'fpex5' using floating-point numbers-fpex5Float :: Data Float -> Data Float -> Data Float-fpex5Float x y = fpex5 x y---- | Generic (not compilable) function with condition-fpex6 :: (Fractional a, Syntax a, Fixable a) => Data Bool -> a -> a-fpex6 cond x = cond ?! (x, x+100.256)---- | Wrapper for 'fpex6' using fixed-point numbers (with type Int32)-fpex6Fix32 :: Data Bool -> Data Int32 -> Data Int32-fpex6Fix32 cond = freezeFix' (-2) . fpex6 cond . unfreezeFix' (-3)---- | Wrapper for 'fpex6' using floating-point numbers-fpex6Float :: Data Bool -> Data Float -> Data Float-fpex6Float = fpex6---- | Generic (not compilable) scalar product function-fpScalarProd :: (Num a, Syntax a, Fixable a) =>- Vector a -> Vector a -> a-fpScalarProd x y = fixFold (+) (fix (-8) 0) $ zipWith (*) x y---- | Wrapper for 'fpScalarProd' using fixed-point numbers (with type Int32)-fpScalarProdFix32 :: Vector1 Int32 -> Vector1 Int32 -> Data Int32-fpScalarProdFix32 x y = freezeFix' (-8) $ fpScalarProd x' y'- where- x' = map (unfreezeFix' (-6)) x- y' = map (unfreezeFix' (-4)) y---- | Wrapper for 'fpScalarProd' using floating-point numbers-fpScalarProdFloat :: Vector1 Float -> Vector1 Float -> Data Float-fpScalarProdFloat = fpScalarProd-
− Examples/Simple/Matrices.hs
@@ -1,28 +0,0 @@-module Examples.Simple.Matrices where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Matrix-import Feldspar.Compiler---- * Examples on working with matrices.---- | Generates a parallel matrix.-matrix1 :: Matrix Index-matrix1 = indexed 2 vec- where- vec x = indexed 10 ((+x) . (*10))---- | Generates a parallel matrix (20x100) and transposes it.-matrix2 :: Matrix Index-matrix2 = transpose $ indexed 20 (\x -> indexed 100 ((+x) . (*10)))---- | Matrix multiplication-matMult :: Data' (D16,D16) [[Int32]] -> Data' (D16,D16) [[Int32]] -> Data [[Int32]]-matMult = wrap ((***) :: Matrix Int32 -> Matrix Int32 -> Matrix Int32)--matMult' :: Data [[Int32]] -> Data [[Int32]] -> Data [[Int32]]-matMult' m1 m2 = freezeMatrix $ (thawMatrix' 16 16 m1) *** (thawMatrix' 16 16 m2)-
− Examples/Simple/Pairs.hs
@@ -1,19 +0,0 @@-module Examples.Simple.Pairs where--import Prelude ()-import Feldspar-import Feldspar.Vector-import Feldspar.Compiler---- | Haskell pairs are compiled to separate variables.-pairs1 :: Data Int32 -> Data Float -> (Data Int32, Data Float)-pairs1 x y = (x,y)---- | Selector functions: getFst, getSnd.-pairs3 :: (Data Int32, Data Float) -> (Data Int32, Data Float)-pairs3 p = (fst p, snd p)---- | Zipping two vectors into a vector of pairs.-pairs4 :: Data [Float] -> Data [Int32] -> Data [(Float,Int32)]-pairs4 xs ys = desugar $ zipWith (\a b -> desugar (a,b)) (thawVector' 256 xs) (thawVector' 256 ys)-
− Examples/Simple/Sharing.hs
@@ -1,45 +0,0 @@-module Examples.Simple.Sharing where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler---- | Examples on the optimization transformation 'sharing' (also called 'common subexpression elimination').--share1 :: Data Int32 -> Data Int32-share1 v = w + w where- w = 2 * v--share2 :: Data Int32 -> Data Int32-share2 v = (2*v) + (2*v)--share3 :: Data Int32 -> Vector1 Int32-share3 v = indexed 10 $ const w where- w = 2 * v + v--share4 :: Data Int32 -> Vector1 Int32-share4 v = indexed 10 $ const w where- w = 2 * q + q where- q = v + 1--share4' :: Data Int32 -> Data [Int32]-share4' = wrap share4--share5 :: Data Index -> Vector1 Index-share5 v = indexed 10 $ \ix -> w ix where- w ix = 2 * v + ix--share5' :: Data Index -> Data [Index]-share5' = wrap share5--share6 :: Vector1 Int32 -> Vector1 Int32-share6 v = share (map (*2) v) $ \w -> zipWith (+) w w--save1 :: Vector1 Index -> Vector1 Index-save1 = map (*3) . save . reverse--save2 :: Data Index -> Data Index-save2 = (*3) . save . (+2)-
− Examples/Simple/SizeInference.hs
@@ -1,35 +0,0 @@-module Examples.Simple.SizeInference where----import qualified Prelude as P--import Feldspar-import Feldspar.Compiler hiding (setLength)------ This example shows that size inference works through `forLoop` if the step--- function does not increase the size of the state.-reverse :: Type a => Data [a] -> Data [a]-reverse a = forLoop l a $ \i a' -> setIx a' i (a ! (l-i-1))- where- l = getLength a--test_reverse = icompile $ reverse- -:: tArr1 tI32 >-> id- -:: notAbove 100 |> id >-> id------ This example shows that size inference fails if the step function increases--- the size of the state.-reverseBad :: Type a => Data [a] -> Data [a]-reverseBad a = forLoop l a $ \i a' -> setLength (l-1) $ setIx a' i (a ! (l-i-1))- where- l = getLength a--test_reverseBad = drawDecor $ reverseBad- -:: tArr1 tI32 >-> id- -:: notAbove 100 |> id >-> id-
− Examples/Simple/Streams.hs
@@ -1,26 +0,0 @@-module Examples.Simple.Streams where--import Prelude ()-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Stream-import Feldspar.Compiler---- | Generic (not compilable) function to introduce usage of scan function for Streams.--- 'scan f a str' produces a stream by successively applying 'f' to--- each element of the input stream 'str' and the previous element of--- the output stream.-stream1 :: (Num a, Syntax a) => Stream a -> Stream a-stream1 = scan (+) 0---- | Wrapper to turn the parameters of 'stream1' into vectors.-stream1_1 :: (Numeric a) => Vector1 a -> Vector1 a-stream1_1 = streamAsVector stream1---- | Wrappers to fix the type and size of the streams in 'stream1_1'.-stream1_1' :: Data [Int32] -> Data [Int32]-stream1_1' xs = desugar $ stream1_1 $ thawVector' 64 xs--stream1_1_wrapped:: Data' D64 [Int32] -> Data [Int32]-stream1_1_wrapped = wrap (stream1_1 :: Vector1 Int32 -> Vector1 Int32)
− Examples/Simple/Trace.hs
@@ -1,14 +0,0 @@-module Examples.Simple.Trace where--import qualified Prelude-import Feldspar-import Feldspar.Vector-import Feldspar.Compiler----- | Example showing the application of tracing function.---- Creating three tracing point for each loop cycle,---- tracing two inputs and result of '+' operation.--traceExample :: Data [Int32] -> Data Int32-traceExample xs = fold (\x y -> trace 3 $ trace 1 x + trace 2 y) 0 $ thawVector' 255 xs-
− Examples/Simple/Vectors.hs
@@ -1,62 +0,0 @@-module Examples.Simple.Vectors where--import qualified Prelude-import Feldspar-import Feldspar.Wrap-import Feldspar.Vector-import Feldspar.Compiler---- * Examples on working with vectors.---- | Generates a vector: [1, 2, 3, ... , 16],--- adds 3 to every element and--- reverses the vector then--- multiplies every element by 10.-vector1 :: Vector1 Index-vector1 = map (*10) $ reverse $ map (+3) $ enumFromTo 1 16---- | The same computation, but storing each intermediate result into temporal buffers-vector1' :: Vector1 Index-vector1' = map (*10) $ force $ reverse $ force $ map (+3) $ force $ enumFromTo 1 16---- | Drops the first 3 elements of a vector-vector2 :: Vector1 Int32 -> Vector1 Int32-vector2 = drop 3---- | Wrappers to `vector2` to provide static information on the input vector size-vector2' :: Data' D10 [Int32] -> Data [Int32]-vector2' = wrap vector2--vector2'' :: Data [Int32] -> Data [Int32]-vector2'' = desugar . vector2 . thawVector' 10---- | Generates a parallel vector of size 10-vector3 :: Data Index -> Vector1 Index-vector3 a = indexed 10 ((+a) . (*10))---- | Vector summation.-vector4 :: (Numeric a, Type a) => Vector1 a -> Data a-vector4 xs = fold (+) 0 xs---- | Wrappers to provide the necessary type information-vector4' :: Vector1 Int32 -> Data Int32-vector4' = vector4--vector4'' :: Vector1 Word8 -> Data Word8-vector4'' = vector4---- | Generic function to increment vector elements-vector5 :: (Type a, Numeric a) => Vector1 a -> Vector1 a-vector5 = map (+1)---- | Wrappers to provide necessary type information and input size-vector5' :: Vector1 Int32 -> Vector1 Int32-vector5' = vector5--vector5'' :: Data' D64 [Int32] -> Data [Int32]-vector5'' = wrap (vector5 :: Vector1 Int32 -> Vector1 Int32)---- | Concatenation-vector6 :: Vector1 Int32 -> Vector1 Int32-vector6 xs = map (+1) xs ++ map (*2) xs-
− Feldspar.hs
@@ -1,45 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | Interface to the essential parts of the Feldspar language. High-level--- libraries have to be imported separately.--module Feldspar- ( module Feldspar.Prelude- , module Feldspar.Core- ) where----import qualified Prelude- -- In order to be able to use the Feldspar module in GHCi without getting name- -- clashes.--import Feldspar.Prelude-import Feldspar.Core-
− Feldspar/BitVector.hs
@@ -1,374 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.BitVector where--import qualified Prelude-import qualified Data.TypeLevel-import Data.Int-import Data.Word-import Data.Typeable-import Data.List (inits)-import qualified Data.TypeLevel as TL--import Language.Syntactic--import Feldspar.Wrap-import Feldspar.Prelude-import Feldspar hiding (sugar, desugar, resugar)-import qualified Feldspar.Vector as Vec---- * Types and classes--data T a = T- -- TODO Use `Data.Proxy.Proxy` instead--class (Type w, Numeric w, Bits w, Integral w) => Unit w- where- width :: T w -> Length--instance Unit Word8- where- width _ = 8--instance Unit Word16- where- width _ = 16--instance Unit Word32- where- width _ = 32--data (Unit w) => BitVector w- = BitVector- { segments :: [Segment w]- }--data (Unit w) => Segment w- = Segment- { numUnits :: Data Length- , elements :: Data Index -> Data w- }---- * Feldspar integration of BitVector--type instance Elem (BitVector w) = Data Bool-type instance CollIndex (BitVector w) = Data Index--instance (Unit a) => Syntactic (BitVector a) FeldDomainAll- where- type Internal (BitVector a) = [a]- desugar = desugar . freezeBitVector- sugar = unfreezeBitVector . sugar--instance (Unit a) => Syntax (BitVector a)---- * Operations--length :: forall w . (Unit w) => BitVector w -> Data Length-length bv = Prelude.foldl (+) 0 $ Prelude.map segmentLen $ segments bv- where- segmentLen s = numUnits s * w- w = value $ width (T :: T w)--numOfUnits :: (Unit w) => BitVector w -> Data Length-numOfUnits bv = Prelude.foldl (+) 0 $ Prelude.map numUnits $ segments bv--freezeBitVector :: forall w . (Unit w) => BitVector w -> Data [w]-freezeBitVector bv = freezeSegments $ segments bv- where- freezeSegments segs = case segs of- [] -> value []- (s:ss) -> parallel (numUnits s) (elements s) `append` freezeSegments ss--unfreezeBitVector :: forall w . (Unit w) => Data [w] -> BitVector w-unfreezeBitVector ws = BitVector [Segment (getLength ws) (ws!)]--{- TODO--- | Variant of `unfreezeBitVector` with additional static size information.-unfreezeBitVector' :: forall w . (Unit w) => Length -> Data [w] -> BitVector w-unfreezeBitVector' len arr = unfreezeBitVector $ cap (r :> elemSize) arr- where- (_ :> elemSize) = dataSize arr- singleton :: a -> Range a- singleton x = Range x x- r = (singleton (fromIntegral len),singleton (fromIntegral len)- ,singleton (fromIntegral len))--}---- | Transforms a bool vector to a bitvector.--- Length of the vector has to be divisible by the wordlength,--- otherwise booleans at the end will be dropped.-fromVector :: forall w . (Unit w, Size w ~ Range w) => Vec.Vector (Data Bool) -> BitVector w-fromVector v = BitVector- { segments = [Segment wl (loop w)]- -- TODO: Should Vector segments be transformed to BitVector segments- -- for the sake of efficiency?- }- where- w = value $ width (T :: T w)- wl = Vec.length v `div` w- loop n ix = forLoop n 0 $ \i st ->- st `shiftLU` 1 .|. (v ! (w * ix + i) ? (1,0))--toVector :: forall w . (Unit w, Size w ~ Range w) => BitVector w -> Vec.Vector (Data Bool)-toVector bv = Vec.indexed (length bv) (bv!)--instance (Unit w, Size w ~ Range w) => Indexed (BitVector w)- where- bv ! i = help 0 (segments bv)- where- help accum [] = false- -- XXX Should be an error here...- help accum [s] = bit s accum i- help accum (s:ss) = i < accum + numUnits s * w ?- ( bit s accum i- , help (accum + numUnits s * w) ss- )- w = value $ width (T :: T w)- bit s accum i = testBit (elements s ((i - accum) `div` w)) (w - 1 - ((i - accum) `mod` w))--fromBits :: forall w . (Unit w) => [Bool] -> BitVector w-fromBits bs = unfreezeBitVector $ value xs- where- xs = [ conv (T :: T w) $ Prelude.take w (Prelude.drop (i*w) bs) | i <- [0..Prelude.length bs `Prelude.div` w Prelude.- 1]]- w = fromInteger $ toInteger $ width (T :: T w)- conv :: (Unit w) => T w -> [Bool] -> w- conv _ = Prelude.foldl (\n b -> if b then n Prelude.* 2 Prelude.+ 1 else n Prelude.* 2) 0--fromUnits :: (Unit w) => [w] -> BitVector w-fromUnits = unfreezeBitVector . value--replUnit :: (Unit w) => Data Length -> w -> BitVector w-replUnit n u = BitVector [Segment n $ const $ value u]--indexed :: (Unit w, Size w ~ Range w) =>- Data Length -> (Data Index -> Data Bool) -> BitVector w-indexed l ixf = fromVector $ Vec.indexed l ixf--map :: (Unit w, Size w ~ Range w) =>- (Data Bool -> Data Bool) -> BitVector w -> BitVector w-map f bv = boolFun1 f result- where- result f' = BitVector $- Prelude.map (\s -> s{elements = f' . elements s}) $ segments bv--takeUnits :: forall w . (Unit w) =>- Data Length -> BitVector w -> BitVector w-takeUnits len bv = help len [] $ segments bv- where- help n acc [] = BitVector acc- help n acc (s:ss) = n < numUnits s ?- ( BitVector (acc Prelude.++ [s{numUnits = n}])- , help (n - numUnits s) (acc Prelude.++ [s]) ss- )--dropUnits :: forall w . (Unit w) =>- Data Length -> BitVector w -> BitVector w-dropUnits len bv = help len $ segments bv- where- help n [] = BitVector []- help n (s:ss) = n < numUnits s ?- ( BitVector $ s':ss- , help (n - numUnits s) ss- )- where- s' = Segment- { numUnits = numUnits s - n- , elements = \i -> elements s (i + n)- }--(++) :: forall w . (Unit w) =>- BitVector w -> BitVector w -> BitVector w-(BitVector ss) ++ (BitVector zs) = BitVector $ ss Prelude.++ zs--drop :: forall w . (Unit w, Size w ~ Range w) =>- Data Length -> Data w -> BitVector w -> BitVector w-drop len end bv = dropSegments len $ segments bv- where- w = value $ width (T :: T w)- dropSegments n [] = BitVector []- dropSegments n (s:ss) = n < sLen ?- ( dropUnits n s ss- , dropSegments (n - sLen) ss- )- where- sLen = numUnits s * w- dropUnits n s ss = dropBits bitsToDrop (s':ss)- where- s' = Segment- { numUnits = numUnits s - wordsToDrop- , elements = \i -> elements s (i + wordsToDrop)- }- wordsToDrop = n `div` w- bitsToDrop = n `mod` w- dropBits n [] = BitVector []- dropBits n (s:ss) = n > 0 ?- ( BitVector $ s' : segments bv'- , BitVector (s:ss)- )- where- s' = Segment- { numUnits = numUnits s - 1- , elements = \i ->- (elements s i `shiftLU` n)- .|.- (elements s (i+1) `shiftRU` (w-n))- }- bv' = addBits (w - n) (elements s (numUnits s - 1) `shiftLU` n) ss- addBits n bs [] = BitVector [Segment 1 $ const $ bs .|. (end `shiftRU` n)]- addBits n bs (s:ss) = numUnits s > 0 ?- ( BitVector $ s':(segments bv')- , addBits n bs ss- )- where- s' = Segment- { numUnits = 1- , elements = const $ bs .|. (elements s 0 `shiftRU` n)- }- bv' = dropBits (w - n) (s:ss)--fold :: forall w a. (Syntax a, Unit w, Size w ~ Range w) =>- (a -> Data Bool -> a) -> a -> BitVector w -> a-fold f ini (BitVector []) = ini-fold f ini (BitVector (s:ss)) = fold f (forLoop (numUnits s) ini f') $ BitVector ss- where- f' :: Data Index -> a -> a- f' i st = Prelude.snd $ forLoop w (elements s i, st) f''- f'' :: Data Index -> (Data w,a) -> (Data w,a)- f'' _ (unit,st) = (unit `shiftLU` 1, f st $ testBit unit $ w-1)- w = value $ width (T :: T w)--zipWith :: forall w. (Unit w, Size w ~ Range w) =>- (Data Bool -> Data Bool -> Data Bool)- -> BitVector w- -> BitVector w- -> BitVector w-zipWith f bv bw = boolFun2 f result- where- result f' = Prelude.foldl (++) (BitVector [])- [ zipSegments f' s z | s <- segIdxs bv, z <- segIdxs bw ]- segIdxs bvec = Prelude.zip (segments bvec) $- Prelude.map (\ss -> Prelude.foldl (+) 0 $ Prelude.map numUnits ss) $- inits $ segments bvec- zipSegments f' (s,sStart) (z,zStart) = BitVector- [ Segment- { numUnits = end - start- , elements = \i ->- f' (elements s (i+sOffset)) (elements z (i+zOffset))- }- ]- where- sEnd = sStart + numUnits s- zEnd = zStart + numUnits z- start = max sStart zStart- end = min sEnd zEnd- sOffset = start - sStart- zOffset = start - zStart--head :: (Unit w, Size w ~ Range w) => BitVector w -> Data Bool-head = (!0)--tail :: forall w. (Unit w, Size w ~ Range w) => Data Bool -> BitVector w -> BitVector w-tail b bv = drop 1 (b2i b `shiftLU` (w - 1)) bv- where- w = value $ width (T :: T w)---- * Boolean functions extended to words--boolFun1 :: (Syntax t, Unit w, Size w ~ Range w) =>- (Data Bool -> Data Bool)- -> ((Data w -> Data w) -> t)- -> t-boolFun1 f c = f true ?- ( f false ? (c (const $ complement 0), c id)- , f false ? (c complement, c (const 0))- )--boolFun2 :: (Syntax t, Unit w, Size w ~ Range w) =>- (Data Bool -> Data Bool -> Data Bool)- -> ((Data w -> Data w -> Data w) -> t)- -> t-boolFun2 f c =- f true true ?- ( f true false ?- ( f false true ?- ( f false false ?- ( c $ \a b -> complement 0- , c $ \a b -> a .|. b- )- , f false false ?- ( c $ \a b -> a .|. complement b- , c $ \a _ -> a- )- )- , f false true ?- ( f false false ?- ( c $ \a b -> complement a .|. b- , c $ \a b -> b- )- , f false false ?- ( c $ \a b -> complement (a `xor` b)- , c $ \a b -> a .&. b- )- )- )- , f true false ?- ( f false true ?- ( f false false ?- ( c $ \a b -> complement (a .&. b)- , c $ \a b -> a `xor` b- )- , f false false ?- ( c $ \a b -> complement b- , c $ \a b -> a .&. complement b- )- )- , f false true ?- ( f false false ?- ( c $ \a b -> complement a- , c $ \a b -> complement a .&. b- )- , f false false ?- ( c $ \a b -> complement (a .|. b)- , c $ \a b -> 0- )- )- )- )---- * Wrapping for bitvectors--instance (Unit w) => Wrap (BitVector w) (Data [w]) where- wrap v = freezeBitVector v--instance (Wrap t u, Unit w, TL.Nat s) => Wrap (BitVector w -> t) (Data' s [w] -> u) where- wrap f = \(Data' d) -> wrap $ f $ unfreezeBitVector $ setLength s' d where- s' = fromInteger $ toInteger $ TL.toInt (undefined :: s)
− Feldspar/Core.hs
@@ -1,59 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | The Feldspar core language--module Feldspar.Core- (- -- * Reexported standard modules- Complex (..)- , module Data.Int- , module Data.Word-- -- * Feldspar types- , Range (..)- , BoundedInt- , module Feldspar.Core.Types-- -- * Frontend- , module Feldspar.Core.Frontend- , module Feldspar.Core.Collection- ) where----import Data.Complex-import Data.Int hiding (Int)-import Data.Word--import Feldspar.Lattice-import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Frontend-import Feldspar.Core.Collection-
− Feldspar/Core/Collection.hs
@@ -1,88 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | General interfaces to collections of data--module Feldspar.Core.Collection where----import Feldspar.Core.Types-import Feldspar.Core.Frontend------ | Collection element type-type family Elem a---- | Collection index type-type family CollIndex a---- | Collection size type-type family CollSize a--type instance Elem (Data [a]) = Data a-type instance CollIndex (Data [a]) = Data Index-type instance CollSize (Data [a]) = Data Length---- | Data structures that support indexing-class Indexed a- where- (!) :: a -> CollIndex a -> Elem a--infixl 9 !--instance Type a => Indexed (Data [a])- where- (!) = getIx---- | Sized data structures-class Sized a- where- collSize :: a -> CollSize a- setCollSize :: CollSize a -> a -> a--instance Type a => Sized (Data [a])- where- collSize = getLength- setCollSize = setLength--class CollMap a b- where- collMap :: (Elem a -> Elem b) -> a -> b--instance (Type a, Type b) => CollMap (Data [a]) (Data [b])- where- collMap f arr = parallel (getLength arr) (f . getIx arr)---- | Array patch-(|>) :: (Sized a, CollMap a a) =>- Patch (CollSize a) (CollSize a) -> Patch (Elem a) (Elem a) -> Patch a a-(sizePatch |> elemPatch) a =- collMap elemPatch $ setCollSize (sizePatch (collSize a)) a-
− Feldspar/Core/Constructs.hs
@@ -1,194 +0,0 @@------ Copyright (c) 2009-2011, 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 OverlappingInstances #-}-{-# LANGUAGE UndecidableInstances #-}--module Feldspar.Core.Constructs where----import Data.Typeable--import Language.Syntactic-import Language.Syntactic.Constructs.Binding.HigherOrder--import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Array-import Feldspar.Core.Constructs.Binding-import Feldspar.Core.Constructs.Bits-import Feldspar.Core.Constructs.Complex-import Feldspar.Core.Constructs.Condition-import Feldspar.Core.Constructs.ConditionM-import Feldspar.Core.Constructs.Conversion-import Feldspar.Core.Constructs.Eq-import Feldspar.Core.Constructs.Error-import Feldspar.Core.Constructs.FFI-import Feldspar.Core.Constructs.Floating-import Feldspar.Core.Constructs.Fractional-import Feldspar.Core.Constructs.Integral-import Feldspar.Core.Constructs.Literal-import Feldspar.Core.Constructs.Logic-import Feldspar.Core.Constructs.Loop-import Feldspar.Core.Constructs.Mutable-import Feldspar.Core.Constructs.MutableArray-import Feldspar.Core.Constructs.MutableReference-import Feldspar.Core.Constructs.MutableToPure-import Feldspar.Core.Constructs.Par-import Feldspar.Core.Constructs.Num-import Feldspar.Core.Constructs.Ord-import Feldspar.Core.Constructs.Save-import Feldspar.Core.Constructs.SizeProp-import Feldspar.Core.Constructs.SourceInfo-import Feldspar.Core.Constructs.Trace-import Feldspar.Core.Constructs.Tuple-------------------------------------------------------------------------------------- * Domain-----------------------------------------------------------------------------------type FeldSymbols- = Decor SourceInfo1 (Identity TypeCtx)- :+: Condition TypeCtx- :+: ConditionM Mut- :+: FFI- :+: Let TypeCtx TypeCtx- :+: Literal TypeCtx- :+: Select TypeCtx- :+: Tuple TypeCtx- :+: Array- :+: BITS- :+: COMPLEX- :+: Conversion- :+: EQ- :+: Error- :+: FLOATING- :+: FRACTIONAL- :+: INTEGRAL- :+: Logic- :+: Loop- :+: LoopM Mut- :+: MONAD Mut- :+: Mutable- :+: MutableArray- :+: MutableReference- :+: MutableToPure- :+: MONAD Par- :+: NUM- :+: ORD- :+: ParFeature- :+: PropSize- :+: Save- :+: Trace--newtype FeldDomain a = FeldDomain (FeldSymbols a)--deriving instance (sym :<: FeldSymbols) => sym :<: FeldDomain--deriving instance WitnessCons FeldDomain-deriving instance MaybeWitnessSat TypeCtx FeldDomain--deriving instance ExprEq FeldDomain-deriving instance Render FeldDomain-deriving instance ToTree FeldDomain-deriving instance Eval FeldDomain-deriving instance EvalBind FeldDomain--instance VarEqEnv env => AlphaEq- FeldDomain- FeldDomain- (Lambda TypeCtx :+: (Variable TypeCtx :+: FeldDomain))- env- where- alphaEqSym (FeldDomain a) aArgs (FeldDomain b) bArgs =- alphaEqSym a aArgs b bArgs--instance AlphaEq- FeldDomain- FeldDomain- (Decor Info (Lambda TypeCtx :+: (Variable TypeCtx :+: FeldDomain)))- [(VarId, VarId)]- where- alphaEqSym (FeldDomain a) aArgs (FeldDomain b) bArgs =- alphaEqSym a aArgs b bArgs--deriving instance Sharable FeldDomain--instance Optimize FeldDomain (Lambda TypeCtx :+: (Variable TypeCtx :+: FeldDomain))- where- optimizeFeat (FeldDomain a) = optimizeFeat a- constructFeatOpt (FeldDomain a) = constructFeatOpt a- constructFeatUnOpt (FeldDomain a) = constructFeatUnOpt a--type FeldDomainAll = HODomain TypeCtx FeldDomain--------------------------------------------------------------------------------------- * Front end-----------------------------------------------------------------------------------newtype Data a = Data { unData :: ASTF FeldDomainAll a }--deriving instance Typeable1 Data--instance Type a => Syntactic (Data a) FeldDomainAll- where- type Internal (Data a) = a- desugar = unData- sugar = Data---- | Specialization of the 'Syntactic' class for the Feldspar domain-class- ( Syntactic a FeldDomainAll- , SyntacticN a (ASTF FeldDomainAll (Internal a))- , Type (Internal a)- ) =>- Syntax a- -- It would be possible to let 'Syntax' be an alias instead of giving separate- -- instances for all types. However, this leads to horrible error messages.- -- For example, if 'Syntax' is an alias, the following expression gives a huge- -- type error:- --- -- > eval (forLoop 10 0 (const (+id)))- --- -- The type error is not very readable now either, but at least it fits on the- -- screen.--instance Type a => Syntax (Data a)--instance Type a => Eq (Data a)- where- Data a == Data b = alphaEq (reify a) (reify b)--instance Type a => Show (Data a)- where- show (Data a) = render $ reify a-
− Feldspar/Core/Constructs/Array.hs
@@ -1,252 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Array-where--import Control.Monad-import Data.List-import Data.Map (notMember)--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Literal--import Feldspar.Range-import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Binding-import Feldspar.Core.Constructs.Num-import Feldspar.Core.Constructs.Ord--data Array a- where- Parallel :: Type a => Array (Length :-> (Index -> a) :-> Full [a])- Sequential :: (Type a, Type st) =>- Array (Length :-> st :-> (Index -> st -> (a,st)) :-> Full [a])- Append :: Type a => Array ([a] :-> [a] :-> Full [a])- GetIx :: Type a => Array ([a] :-> Index :-> Full a)- SetIx :: Type a => Array ([a] :-> Index :-> a :-> Full [a])- GetLength :: Type a => Array ([a] :-> Full Length)- SetLength :: Type a => Array (Length :-> [a] :-> Full [a])--instance WitnessCons Array- where- witnessCons Parallel = ConsWit- witnessCons Sequential = ConsWit- witnessCons Append = ConsWit- witnessCons GetIx = ConsWit- witnessCons SetIx = ConsWit- witnessCons GetLength = ConsWit- witnessCons SetLength = ConsWit--instance WitnessSat Array- where- type SatContext Array = TypeCtx- witnessSat Parallel = SatWit- witnessSat Sequential = SatWit- witnessSat Append = SatWit- witnessSat GetIx = SatWit- witnessSat SetIx = SatWit- witnessSat GetLength = SatWit- witnessSat SetLength = SatWit--instance MaybeWitnessSat TypeCtx Array- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Array- where- semantics Append = Sem "(++)" (++)- semantics GetIx = Sem "(!)" genericIndex- semantics GetLength = Sem "getLength" genericLength- semantics SetLength = Sem "setLength"- (\n as -> genericTake n (as ++ repeat err))- where- err = error "reading uninitialized array element"-- semantics Parallel = Sem "parallel"- (\len ixf -> genericTake len $ map ixf [0..])-- semantics Sequential = Sem "sequential"- (\len i step -> genericTake len $- snd $ mapAccumL (\a ix -> swap (step ix a)) i [0..])- where swap (a,b) = (b,a)-- semantics SetIx = Sem "setIx" evalSetIx- where- evalSetIx as i v- | i < len = genericTake i as ++ [v] ++ genericDrop (i+1) as- | otherwise = error $ unwords- [ "setIx: assigning index"- , show i- , "past the end of an array of length"- , show len- ]- where- len = genericLength as--instance ExprEq Array where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Array where renderPart = renderPartSem-instance ToTree Array-instance Eval Array where evaluate = evaluateSem-instance EvalBind Array where evalBindSym = evalBindSymDefault--instance AlphaEq dom dom dom env => AlphaEq Array Array dom env- where- alphaEqSym = alphaEqSymDefault--instance Sharable Array- where- sharable GetIx = False- sharable _ = True--instance SizeProp Array- where- sizeProp Parallel (WrapFull len :* WrapFull ixf :* Nil) =- infoSize len :> infoSize ixf- sizeProp Sequential (WrapFull len :* init :* WrapFull step :* Nil) =- infoSize len :> fst (infoSize step)- sizeProp Append (WrapFull arra :* WrapFull arrb :* Nil) =- (alen + blen) :> (aelem \/ belem)- where- alen :> aelem = infoSize arra- blen :> belem = infoSize arrb- sizeProp GetIx (WrapFull arr :* ix :* Nil) = elem- where- _ :> elem = infoSize arr- sizeProp SetIx (WrapFull arr :* ix :* WrapFull e :* Nil) =- len :> (elem \/ infoSize e)- where- len :> elem = infoSize arr- sizeProp GetLength (WrapFull arr :* Nil) = len- where- len :> _ = infoSize arr- sizeProp SetLength (WrapFull len :* WrapFull arr :* Nil) =- infoSize len :> elem- where- _ :> elem = infoSize arr----instance- ( Array :<: dom- , NUM :<: dom- , ORD :<: dom- , Optimize dom dom- ) =>- Optimize Array dom- where- optimizeFeat Parallel (len :* ixf :* Nil) = do- len' <- optimizeM len- let szI = infoSize (getInfo len')- ixRange = rangeByRange 0 (szI-1)- ixf' <- optimizeFunction optimizeM (mkInfo ixRange) ixf- constructFeat Parallel (len' :* ixf' :* Nil)-- optimizeFeat Sequential (len :* init :* step :* Nil) = do- len' <- optimizeM len- init' <- optimizeM init- let szI = infoSize (getInfo len')- ixRange = rangeByRange 0 (szI-1)- step' <- optimizeFunction- optimizeM -- TODO (optimizeFunctionFix optimizeM (mkInfo universal))- (mkInfo ixRange)- step- constructFeat Sequential (len' :* init' :* step' :* Nil)- -- TODO Should use fixed-point iteration, but `optimizeFunctionFix` only- -- works for functions of type `a -> a`.-- optimizeFeat a args = optimizeFeatDefault a args-- constructFeatOpt Parallel (len :* ixf :* Nil)- | Just 0 <- viewLiteral len- = return $ literalDecor []- -- TODO Optimize when length is one. This requires a way to create an- -- uninitialized array of length one, and setting the first element.- -- Use `betaReduce` to apply `ixf` to the literal 0.-- constructFeatOpt Parallel (len :* (lam :$ (gix :$ arr2 :$ ix)) :* Nil)- | Just (_,Lambda v1) <- prjDecorCtx typeCtx lam- , Just (_,GetIx) <- prjDecor gix- , Just (_,Variable v2) <- prjDecorCtx typeCtx ix- , v1 == v2- , v1 `notMember` infoVars (getInfo arr2)- = constructFeat SetLength (len :* arr2 :* Nil)-- constructFeatOpt Sequential (len :* init :* ixf :* Nil)- | Just 0 <- viewLiteral len- = return $ literalDecor []- -- TODO Optimize when length is one. This requires a way to create an- -- uninitialized array of length one, and setting the first element.- -- Use `betaReduce` to apply the step function.-- constructFeatOpt Append (a :* b :* Nil)- | Just [] <- viewLiteral a = return b- | Just [] <- viewLiteral b = return a-- constructFeatOpt GetIx ((op :$ _ :$ ixf) :* ix :* Nil)- | Just (_, Parallel) <- prjDecor op- = optimizeM $ betaReduce typeCtx (stripDecor ix) (stripDecor ixf)- -- TODO should not need to drop the decorations-- constructFeatOpt GetIx ((op :$ len :$ arr) :* ix :* Nil)- | Just (_, SetLength) <- prjDecor op- = constructFeat GetIx (arr :* ix :* Nil)-- constructFeatOpt GetLength (arr :* Nil)- | Just as <- viewLiteral arr = return $ literalDecor $ genericLength as-- constructFeatOpt GetLength (((prjDecor -> Just (_,op)) :$ a :$ _ :$ _) :* Nil)- | Sequential <- op = return a- | SetIx <- op = constructFeat GetLength (a :* Nil)-- constructFeatOpt GetLength (((prjDecor -> Just (_,op)) :$ a :$ b) :* Nil)- | Append <- op = do- aLen <- constructFeat GetLength (a :* Nil)- bLen <- constructFeat GetLength (b :* Nil)- constructFeatOpt Add (aLen :* bLen :* Nil)- | Parallel <- op = return a- | SetLength <- op = return a-- constructFeatOpt SetLength (len :* arr :* Nil)- | Just 0 <- viewLiteral len = return $ literalDecor []-- constructFeatOpt SetLength ((getLength :$ arr') :* arr :* Nil)- | Just (_,GetLength) <- prjDecor getLength- , alphaEq arr arr'- = return arr-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Binding.hs
@@ -1,190 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}---- | Interpretation of binding constructs--module Feldspar.Core.Constructs.Binding- ( module Language.Syntactic.Constructs.Binding- , optimizeLambda- , optimizeFunction- , optimizeFunctionFix- ) where--import Control.Monad.Reader-import Data.Maybe-import Data.Map-import Data.Typeable (Typeable, gcast)--import Data.Lens.Common-import Data.Proxy--import Language.Syntactic-import Language.Syntactic.Constructs.Binding--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation----instance Sharable (Variable TypeCtx)- -- Will not be shared anyway, because it's a terminal--instance Sharable (Lambda TypeCtx)- where- sharable _ = False--instance Sharable (Let TypeCtx TypeCtx)----optimizeLambda :: (Lambda TypeCtx :<: dom, Optimize dom dom)- => (ASTF dom b -> Opt (ASTF (Decor Info dom) b)) -- ^ Optimization of the body- -> Info a- -> Lambda TypeCtx (b :-> Full (a -> b))- -> Args (AST dom) (b :-> Full (a -> b))- -> Opt (ASTF (Decor Info dom) (a -> b))-optimizeLambda opt info lam@(Lambda v) (body :* Nil) = do- body' <- localVar v info $ opt body- constructFeatUnOpt lam (body' :* Nil)---- | Assumes that the expression is a 'Lambda'-optimizeFunction :: (Lambda TypeCtx :<: dom, Optimize dom dom)- => (ASTF dom b -> Opt (ASTF (Decor Info dom) b)) -- ^ Optimization of the body- -> Info a- -> (ASTF dom (a -> b) -> Opt (ASTF (Decor Info dom) (a -> b)))-optimizeFunction opt info (lam :$ body)- | Just (Lambda v) <- prjCtx typeCtx lam- = optimizeLambda opt info (Lambda v) (body :* Nil)--optimizeFunBody :: (Lambda TypeCtx :<: dom, Optimize dom dom, Typeable a)- => (ASTF dom a -> Opt (ASTF (Decor Info dom) a)) -- ^ Optimization of the body- -> Env -- ^ Environment (instead of using 'Opt')- -> VarId -- ^ Bound variable- -> ASTF dom a -- ^ Body- -> Info a -- ^ 'Info' of bound variable- -> ASTF (Decor Info dom) a-optimizeFunBody opt env v body info =- flip runReader env $ localVar v info $ opt body---- | Assumes that the expression is a 'Lambda'-optimizeFunctionFix- :: forall dom a- . (Lambda TypeCtx :<: dom, Optimize dom dom, Type a)- => (ASTF dom a -> Opt (ASTF (Decor Info dom) a)) -- ^ Optimization of the body- -> Info a- -> (ASTF dom (a -> a) -> Opt (ASTF (Decor Info dom) (a -> a)))-optimizeFunctionFix opt info (lam :$ body)- | Just (Lambda v) <- prjCtx typeCtx lam- = do- env <- ask-- let aLens :: Lens (Info a) (Size a)- aLens = lens infoSize (\sz info -> info {infoSize = sz})-- let bLens :: Lens (ASTF (Decor Info dom) a) (Size a)- bLens = lens (infoSize . getInfo)- (\sz a -> updateDecor (\info -> info {infoSize = sz}) a)-- let body' = fst $ boundedLensedFixedPoint 1 aLens bLens- (optimizeFunBody opt env v body)- info- -- Using 1 as bound is motivated by the fact that a higher number- -- leads to exponential blowup when there are many nested- -- iterations. Since it is probably uncommon to have very deeply- -- nested loops, it might be fine to increase the bound. However- -- it is not clear that we gain anything by doing so, other than- -- in very special cases.-- constructFeatUnOpt (Lambda v `withContext` typeCtx) (body' :* Nil)----instance (Variable TypeCtx :<: dom, Optimize dom dom) =>- Optimize (Variable TypeCtx) dom- where- constructFeatUnOpt var@(Variable v) Nil- | TypeWit <- fromSatWit $ witnessSat var- = reader $ \env -> case Prelude.lookup v (varEnv env) of- Nothing -> error $- "optimizeFeat: can't get size of free variable: v" ++ show v- Just (SomeInfo info) ->- let info' = (fromJust $ gcast info) {infoVars = singleton v 1}- in injDecorCtx typeCtx info' (Variable v)--instance (Lambda TypeCtx :<: dom, Optimize dom dom) =>- Optimize (Lambda TypeCtx) dom- where- -- | Assigns a 'universal' size to the bound variable. This only makes sense- -- for top-level lambdas. For other uses, use 'optimizeLambda' instead.- optimizeFeat lam@(Lambda v)- | TypeWit <- witnessByProxy typeCtx (argProxy lam)- = optimizeLambda optimizeM (mkInfo universal) (Lambda v)-- constructFeatUnOpt lam@(Lambda v) (body :* Nil)- | TypeWit <- witnessByProxy typeCtx (argProxy lam)- , Info t sz vars _ <- getInfo body- = do- src <- asks sourceEnv- let info = Info (FunType typeRep t) sz (delete v vars) src- return $ injDecorCtx typeCtx info (Lambda v) :$ body--argProxy :: Lambda TypeCtx (b :-> Full (a -> b)) -> Proxy a-argProxy (Lambda _) = Proxy--instance SizeProp (Let TypeCtx TypeCtx)- where- sizeProp Let (_ :* WrapFull f :* Nil) = infoSize f--instance- ( Let TypeCtx TypeCtx :<: dom- , Lambda TypeCtx :<: dom- , Variable TypeCtx :<: dom- , Optimize dom dom- ) =>- Optimize (Let TypeCtx TypeCtx) dom- where- optimizeFeat lt@Let (a :* f :* Nil) = do- a' <- optimizeM a- f' <- optimizeFunction optimizeM (getInfo a') f- case getInfo f' of- Info{} -> constructFeat lt (a' :* f' :* Nil)- -- TODO Why is this pattern match needed?-- constructFeatOpt Let (a :* (lam :$ var) :* Nil)- | Just (_,Lambda v1) <- prjDecorCtx typeCtx lam- , Just (_,Variable v2) <- prjDecorCtx typeCtx var- , v1 == v2- = return $ fromJust $ gcast a-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Bits.hs
@@ -1,270 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Bits- ( BITS (..)- ) where----import Data.Hash--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--import Data.Bits--data BITS a- where- BAnd :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)- BOr :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)- BXor :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)- Complement :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full a)-- Bit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (Index :-> Full a)- SetBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- ClearBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- ComplementBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- TestBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full Bool)-- ShiftLU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- ShiftRU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- ShiftL :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)- ShiftR :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)- RotateLU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- RotateRU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)- RotateL :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)- RotateR :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)- ReverseBits :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full a)-- BitScan :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Index)- BitCount :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Index)-- BitSize :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Index)- IsSigned :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Bool)---instance WitnessCons BITS- where- witnessCons BAnd = ConsWit- witnessCons BOr = ConsWit- witnessCons BXor = ConsWit- witnessCons Complement = ConsWit-- witnessCons Bit = ConsWit- witnessCons SetBit = ConsWit- witnessCons ClearBit = ConsWit- witnessCons ComplementBit = ConsWit- witnessCons TestBit = ConsWit-- witnessCons ShiftLU = ConsWit- witnessCons ShiftRU = ConsWit- witnessCons ShiftL = ConsWit- witnessCons ShiftR = ConsWit- witnessCons RotateLU = ConsWit- witnessCons RotateRU = ConsWit- witnessCons RotateL = ConsWit- witnessCons RotateR = ConsWit- witnessCons ReverseBits = ConsWit-- witnessCons BitScan = ConsWit- witnessCons BitCount = ConsWit-- witnessCons BitSize = ConsWit- witnessCons IsSigned = ConsWit---instance WitnessSat BITS- where- type SatContext BITS = TypeCtx- witnessSat BAnd = SatWit- witnessSat BOr = SatWit- witnessSat BXor = SatWit- witnessSat Complement = SatWit-- witnessSat Bit = SatWit- witnessSat SetBit = SatWit- witnessSat ClearBit = SatWit- witnessSat ComplementBit = SatWit- witnessSat TestBit = SatWit-- witnessSat ShiftLU = SatWit- witnessSat ShiftRU = SatWit- witnessSat ShiftL = SatWit- witnessSat ShiftR = SatWit- witnessSat RotateLU = SatWit- witnessSat RotateRU = SatWit- witnessSat RotateL = SatWit- witnessSat RotateR = SatWit- witnessSat ReverseBits = SatWit-- witnessSat BitScan = SatWit- witnessSat BitCount = SatWit-- witnessSat BitSize = SatWit- witnessSat IsSigned = SatWit---instance MaybeWitnessSat TypeCtx BITS- where- maybeWitnessSat = maybeWitnessSatDefault---instance Semantic BITS- where- semantics BAnd = Sem "(.&.)" (.&.)- semantics BOr = Sem "(.|.)" (.|.)- semantics BXor = Sem "xor" xor- semantics Complement = Sem "complement" complement-- semantics Bit = Sem "bit" (bit . fromIntegral)- semantics SetBit = Sem "setBit" (liftIntWord setBit)- semantics ClearBit = Sem "clearBit" (liftIntWord clearBit)- semantics ComplementBit = Sem "complementBit" (liftIntWord complementBit)- semantics TestBit = Sem "testBit" (liftIntWord testBit)-- semantics ShiftLU = Sem "shiftL" (liftIntWord shiftL)- semantics ShiftRU = Sem "shiftR" (liftIntWord shiftR)- semantics ShiftL = Sem "shiftL" (liftInt shiftL)- semantics ShiftR = Sem "shiftR" (liftInt shiftR)- semantics RotateLU = Sem "rotateL" (liftIntWord rotateL)- semantics RotateRU = Sem "rotateR" (liftIntWord rotateR)- semantics RotateL = Sem "rotateL" (liftInt rotateL)- semantics RotateR = Sem "rotateR" (liftInt rotateR)- semantics ReverseBits = Sem "reverseBits" evalReverseBits-- semantics BitScan = Sem "bitScan" evalBitScan- semantics BitCount = Sem "bitCount" evalBitCount-- semantics BitSize = Sem "bitSize" (fromIntegral . bitSize)- semantics IsSigned = Sem "isSigned" isSigned---liftIntWord :: (a -> Int -> b) -> (a -> WordN -> b)-liftIntWord f x = f x . fromIntegral--liftInt :: (a -> Int -> b) -> (a -> IntN -> b)-liftInt f x = f x . fromIntegral--evalReverseBits :: Bits b => b -> b-evalReverseBits b = revLoop b 0 (0 `asTypeOf` b)- where- bSz = bitSize b- revLoop b i n | i >= bSz = n- revLoop b i n | testBit b i = revLoop b (i+1) (setBit n (bSz - i - 1))- revLoop b i n | otherwise = revLoop b (i+1) n--evalBitScan :: Bits b => b -> WordN-evalBitScan b =- if isSigned b- then scanLoop b (testBit b (bitSize b - 1)) (bitSize b - 2) 0- else scanLoop b False (bitSize b - 1) 0- where- scanLoop b bit i n | i Prelude.< 0 = n- scanLoop b bit i n | testBit b i Prelude./= bit = n- scanLoop b bit i n | otherwise = scanLoop b bit (i-1) (n+1)--evalBitCount :: Bits b => b -> WordN-evalBitCount b = loop b (bitSize b - 1) 0- where- loop b i n | i Prelude.< 0 = n- loop b i n | testBit b i = loop b (i-1) (n+1)- loop b i n | otherwise = loop b (i-1) n--instance ExprEq BITS where exprEq = exprEqSem; exprHash = exprHashSem-instance Render BITS where renderPart = renderPartSem-instance ToTree BITS-instance Eval BITS where evaluate = evaluateSem-instance EvalBind BITS where evalBindSym = evalBindSymDefault-instance Sharable BITS--instance AlphaEq dom dom dom env => AlphaEq BITS BITS dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp BITS- where- sizeProp BAnd (WrapFull a :* WrapFull b :* Nil) = rangeAnd (infoSize a) (infoSize b)- sizeProp BOr (WrapFull a :* WrapFull b :* Nil) = rangeOr (infoSize a) (infoSize b)- sizeProp BXor (WrapFull a :* WrapFull b :* Nil) = rangeXor (infoSize a) (infoSize b)-- sizeProp ShiftLU (WrapFull a :* WrapFull b :* Nil) = rangeShiftLU (infoSize a) (infoSize b)- sizeProp ShiftRU (WrapFull a :* WrapFull b :* Nil) = rangeShiftRU (infoSize a) (infoSize b)-- sizeProp a args = sizePropDefault a args---instance (BITS :<: dom, Optimize dom dom) => Optimize BITS dom- where- constructFeatOpt BAnd (a :* b :* Nil)- | Just 0 <- viewLiteral a = return a- | Just x <- viewLiteral a, isAllOnes x = return b- | Just 0 <- viewLiteral b = return b- | Just x <- viewLiteral b, isAllOnes x = return a-- constructFeatOpt BOr (a :* b :* Nil)- | Just 0 <- viewLiteral a = return b- | Just x <- viewLiteral a, isAllOnes x = return a- | Just 0 <- viewLiteral b = return a- | Just x <- viewLiteral b, isAllOnes x = return b-- constructFeatOpt BXor (a :* b :* Nil)- | Just 0 <- viewLiteral a = return b- | Just x <- viewLiteral a, isAllOnes x = constructFeat Complement (b :* Nil)- | Just 0 <- viewLiteral b = return a- | Just x <- viewLiteral b, isAllOnes x = constructFeat Complement (a :* Nil)-- constructFeatOpt ShiftLU args = optZero ShiftLU args- constructFeatOpt ShiftRU args = optZero ShiftRU args- constructFeatOpt ShiftL args = optZero ShiftL args- constructFeatOpt ShiftR args = optZero ShiftR args- constructFeatOpt RotateLU args = optZero RotateLU args- constructFeatOpt RotateRU args = optZero RotateRU args- constructFeatOpt RotateL args = optZero RotateL args- constructFeatOpt RotateR args = optZero RotateR args-- constructFeatOpt feat args = constructFeatUnOpt feat args-- constructFeatUnOpt = constructFeatUnOptDefault---isAllOnes :: Bits a => a -> Bool-isAllOnes x = x Prelude.== complement 0--optZero f (a :* b :* Nil)- | Just 0 <- viewLiteral b = return a- | otherwise = constructFeatUnOpt f (a :* b :* Nil)-
− Feldspar/Core/Constructs/Complex.hs
@@ -1,111 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Complex-where--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Data.Complex--import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data COMPLEX a- where- MkComplex :: (Type a, RealFloat a) => COMPLEX (a :-> a :-> Full (Complex a))- RealPart :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)- ImagPart :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)- Conjugate :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full (Complex a))- MkPolar :: (Type a, RealFloat a) => COMPLEX (a :-> a :-> Full (Complex a))- Magnitude :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)- Phase :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)- Cis :: (Type a, RealFloat a) => COMPLEX (a :-> Full (Complex a))--instance WitnessCons COMPLEX- where- witnessCons MkComplex = ConsWit- witnessCons RealPart = ConsWit- witnessCons ImagPart = ConsWit- witnessCons Conjugate = ConsWit- witnessCons MkPolar = ConsWit- witnessCons Magnitude = ConsWit- witnessCons Phase = ConsWit- witnessCons Cis = ConsWit--instance WitnessSat COMPLEX- where- type SatContext COMPLEX = TypeCtx- witnessSat MkComplex = SatWit- witnessSat RealPart = SatWit- witnessSat ImagPart = SatWit- witnessSat Conjugate = SatWit- witnessSat MkPolar = SatWit- witnessSat Magnitude = SatWit- witnessSat Phase = SatWit- witnessSat Cis = SatWit--instance MaybeWitnessSat TypeCtx COMPLEX- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic COMPLEX- where- semantics MkComplex = Sem "complex" (:+)- semantics RealPart = Sem "creal" realPart- semantics ImagPart = Sem "cimag" imagPart- semantics Conjugate = Sem "conjugate" conjugate- semantics MkPolar = Sem "mkPolar" mkPolar- semantics Magnitude = Sem "magnitude" magnitude- semantics Phase = Sem "phase" phase- semantics Cis = Sem "cis" cis--instance ExprEq COMPLEX where exprEq = exprEqSem; exprHash = exprHashSem-instance Render COMPLEX where renderPart = renderPartSem-instance ToTree COMPLEX-instance Eval COMPLEX where evaluate = evaluateSem-instance EvalBind COMPLEX where evalBindSym = evalBindSymDefault-instance Sharable COMPLEX-instance SizeProp COMPLEX where sizeProp = sizePropDefault--instance AlphaEq dom dom dom env => AlphaEq COMPLEX COMPLEX dom env- where- alphaEqSym = alphaEqSymDefault--instance (COMPLEX :<: dom, Optimize dom dom) => Optimize COMPLEX dom- where- constructFeatUnOpt = constructFeatUnOptDefault- -- TODO Optimize e.g.- --- -- complex (realPart a) (imagPart a) ==> a- -- conjugate . conjugate ==> id-
− Feldspar/Core/Constructs/Condition.hs
@@ -1,77 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Condition- ( module Language.Syntactic.Constructs.Condition- ) where----import Language.Syntactic-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Condition--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Logic----instance Sharable (Condition TypeCtx)--instance SizeProp (Condition TypeCtx)- where- sizeProp cond@Condition (_ :* WrapFull t :* WrapFull f :* Nil)- | TypeWit <- fromSatWit $ witnessSat cond- = infoSize t \/ infoSize f--instance (Condition TypeCtx :<: dom, Logic :<: dom, Optimize dom dom) =>- Optimize (Condition TypeCtx) dom- where- constructFeatOpt Condition (c :* t :* f :* Nil)- | Just c' <- viewLiteral c = return $ if c' then t else f-- constructFeatOpt Condition (c :* t :* f :* Nil)- | alphaEq t f = return t-- constructFeatOpt cond@Condition ((op :$ c) :* t :* f :* Nil)- | Just (_,Not) <- prjDecor op- = constructFeat cond (c :* f :* t :* Nil)-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-- -- TODO Propagate size information from the condition to the branches. For- -- example- --- -- condition (x<10) (min x 20) x ==> x-
− Feldspar/Core/Constructs/ConditionM.hs
@@ -1,112 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.ConditionM- ( ConditionM (..)- ) where--import Data.Map--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Logic--import Feldspar.Lattice--data ConditionM m a- where- ConditionM :: (Monad m, Type a) =>- ConditionM m (Bool :-> m a :-> m a :-> Full (m a))- -- TODO Can't we just use `Condition` instead?--instance WitnessCons (ConditionM m)- where- witnessCons ConditionM = ConsWit--instance MaybeWitnessSat TypeCtx (ConditionM m)- where- maybeWitnessSat _ _ = Nothing--instance Semantic (ConditionM m)- where- semantics ConditionM = Sem "if" ifM- where- ifM cond e t = if cond then e else t--instance ExprEq (ConditionM m) where exprEq = exprEqSem; exprHash = exprHashSem-instance Render (ConditionM m) where renderPart = renderPartSem-instance ToTree (ConditionM m)-instance Eval (ConditionM m) where evaluate = evaluateSem-instance EvalBind (ConditionM m) where evalBindSym = evalBindSymDefault-instance Sharable (ConditionM m)- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance AlphaEq dom dom dom env =>- AlphaEq (ConditionM m) (ConditionM m) dom env- where- alphaEqSym = alphaEqSymDefault--instance LatticeSize1 m => SizeProp (ConditionM m)- where- sizeProp ConditionM (_ :* WrapFull t :* WrapFull f :* Nil) =- mergeSize t (infoSize t) (infoSize f)--instance ( ConditionM m :<: dom- , Logic :<: dom- , Optimize dom dom- , LatticeSize1 m- )- => Optimize (ConditionM m) dom- where- constructFeatOpt ConditionM (c :* t :* f :* Nil)- | Just c' <- viewLiteral c = return $ if c' then t else f-- constructFeatOpt ConditionM (_ :* t :* f :* Nil)- | alphaEq t f = return t-- constructFeatOpt cond@ConditionM ((op :$ c) :* t :* f :* Nil)- | Just (_, Not) <- prjDecor op- = constructFeat cond (c :* f :* t :* Nil)-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt ConditionM args@(_ :* t :* _ :* Nil)- | Info {infoType = tType} <- getInfo t- = constructFeatUnOptDefaultTyp tType ConditionM args-- -- TODO Propagate size information from the condition to the branches. For- -- example- --- -- condition (x<10) (min x 20) x ==> x-
− Feldspar/Core/Constructs/Conversion.hs
@@ -1,129 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Conversion- ( Conversion (..)- ) where--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data Conversion a- where- F2I :: (Type a, Integral a) => Conversion (Float :-> Full a)- I2N :: (Type a, Type b, Integral a, Num b- ,Size a ~ Range a- ) =>- Conversion (a :-> Full b)- B2I :: (Type a, Integral a) => Conversion (Bool :-> Full a)- Round :: (Type a, Integral a) => Conversion (Float :-> Full a)- Ceiling :: (Type a, Integral a) => Conversion (Float :-> Full a)- Floor :: (Type a, Integral a) => Conversion (Float :-> Full a)--rangeToSize :: Lattice (Size a) => TypeRep a -> Range Integer -> Size a-rangeToSize (IntType _ _) r = rangeProp r-rangeToSize _ _ = universal--rangeProp :: forall a . (Bounded a, Integral a) => Range Integer -> Range a-rangeProp (Range l u)- | withinBounds l && withinBounds u- = range (fromIntegral l) (fromIntegral u)- | otherwise = range minBound maxBound- where withinBounds i = toInteger (minBound :: a) <= i &&- i <= toInteger (maxBound :: a)--instance WitnessCons Conversion- where- witnessCons F2I = ConsWit- witnessCons I2N = ConsWit- witnessCons B2I = ConsWit- witnessCons Round = ConsWit- witnessCons Ceiling = ConsWit- witnessCons Floor = ConsWit--instance WitnessSat Conversion- where- type SatContext Conversion = TypeCtx- witnessSat F2I = SatWit- witnessSat I2N = SatWit- witnessSat B2I = SatWit- witnessSat Round = SatWit- witnessSat Ceiling = SatWit- witnessSat Floor = SatWit--instance MaybeWitnessSat TypeCtx Conversion- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Conversion- where- semantics F2I = Sem "f2i" truncate- semantics I2N = Sem "i2n" (fromInteger.toInteger)- semantics B2I = Sem "b2i" (\b -> if b then 1 else 0)- semantics Round = Sem "round" round- semantics Ceiling = Sem "ceiling" ceiling- semantics Floor = Sem "floor" floor--instance ExprEq Conversion where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Conversion where renderPart = renderPartSem-instance Eval Conversion where evaluate = evaluateSem-instance ToTree Conversion-instance EvalBind Conversion where evalBindSym = evalBindSymDefault-instance Sharable Conversion--instance AlphaEq dom dom dom env => AlphaEq Conversion Conversion dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp Conversion- where- sizeProp F2I _ = universal- sizeProp i2n@I2N (WrapFull a :* Nil)- = rangeToSize (resultType i2n) (mapMonotonic toInteger (infoSize a))- sizeProp B2I _ = universal- sizeProp Round _ = universal- sizeProp Ceiling _ = universal- sizeProp Floor _ = universal--instance (Conversion :<: dom, Optimize dom dom) => Optimize Conversion dom- where- constructFeatOpt i2n@I2N (a :* Nil)- | Just TypeEq <- typeEq (resultType i2n) (infoType $ getInfo a)- = return a- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Eq.hs
@@ -1,105 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Eq-where--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Literal--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data EQ a- where- Equal :: (Type a, Eq a) => EQ (a :-> a :-> Full Bool)- NotEqual :: (Type a, Eq a) => EQ (a :-> a :-> Full Bool)--instance WitnessCons EQ- where- witnessCons Equal = ConsWit- witnessCons NotEqual = ConsWit--instance WitnessSat EQ- where- type SatContext EQ = TypeCtx- witnessSat Equal = SatWit- witnessSat NotEqual = SatWit--instance MaybeWitnessSat TypeCtx EQ- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic EQ- where- semantics Equal = Sem "(==)" (==)- semantics NotEqual = Sem "(/=)" (/=)--instance ExprEq EQ where exprEq = exprEqSem; exprHash = exprHashSem-instance Render EQ where renderPart = renderPartSem-instance ToTree EQ-instance Eval EQ where evaluate = evaluateSem-instance EvalBind EQ where evalBindSym = evalBindSymDefault-instance SizeProp EQ where sizeProp = sizePropDefault-instance Sharable EQ--instance AlphaEq dom dom dom env => AlphaEq EQ EQ dom env- where- alphaEqSym = alphaEqSymDefault--instance (EQ :<: dom, Optimize dom dom) => Optimize EQ dom- where- constructFeatOpt Equal (a :* b :* Nil)- | alphaEq a b- = return $ literalDecor True-- constructFeatOpt Equal (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `disjoint` rb- = return $ literalDecor False-- constructFeatOpt NotEqual (a :* b :* Nil)- | alphaEq a b- = return $ literalDecor False-- constructFeatOpt NotEqual (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `disjoint` rb- = return $ literalDecor True-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Error.hs
@@ -1,90 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Error where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data Error a- where- Undefined :: Type a => Error (Full a)- Assert :: Type a => String -> Error (Bool :-> a :-> Full a)--instance WitnessCons Error- where- witnessCons Undefined = ConsWit- witnessCons (Assert _) = ConsWit--instance WitnessSat Error- where- type SatContext Error = TypeCtx- witnessSat Undefined = SatWit- witnessSat (Assert _) = SatWit--instance MaybeWitnessSat TypeCtx Error- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Error- where- semantics Undefined = Sem "undefined" undefined- semantics (Assert msg) = Sem "assert"- (\cond a -> if cond then a else error ("Assert failed: " ++ msg))--instance Render Error- where- render Undefined = "undefined"- render (Assert msg) = "assert " ++ show msg--instance ExprEq Error where exprEq = exprEqSem; exprHash = exprHashSem-instance ToTree Error-instance Eval Error where evaluate = evaluateSem-instance EvalBind Error where evalBindSym = evalBindSymDefault-instance SizeProp Error where sizeProp = sizePropDefault-instance Sharable Error--instance AlphaEq dom dom dom env => AlphaEq Error Error dom env- where- alphaEqSym = alphaEqSymDefault--instance (Error :<: dom, Optimize dom dom) => Optimize Error dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/FFI.hs
@@ -1,86 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.FFI where--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data FFI a- where- ForeignImport :: ( Type (DenResult a)- , Signature a- )- => String -> Denotation a -> FFI a--instance Semantic FFI- where- semantics (ForeignImport name f) = Sem name f--instance ExprEq FFI where exprEq = exprEqSem; exprHash = exprHashSem-instance Render FFI where renderPart = renderPartSem-instance ToTree FFI-instance Eval FFI where evaluate = evaluateSem-instance EvalBind FFI where evalBindSym = evalBindSymDefault-instance Sharable FFI--instance WitnessCons FFI- where- witnessCons (ForeignImport _ _) = ConsWit--instance WitnessSat FFI- where- type SatContext FFI = TypeCtx- witnessSat (ForeignImport _ _) = SatWit--instance MaybeWitnessSat ctx FFI- where- maybeWitnessSat _ _ = Nothing--instance AlphaEq dom dom dom env => AlphaEq FFI FFI dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp FFI- where- sizeProp = sizePropDefault--instance ( FFI :<: dom- , Optimize dom dom- )- => Optimize FFI dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Floating.hs
@@ -1,146 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Floating- ( FLOATING (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data FLOATING a- where- Exp :: (Type a, Floating a) => FLOATING (a :-> Full a)- Sqrt :: (Type a, Floating a) => FLOATING (a :-> Full a)- Log :: (Type a, Floating a) => FLOATING (a :-> Full a)- Pow :: (Type a, Floating a) => FLOATING (a :-> a :-> Full a)- LogBase :: (Type a, Floating a) => FLOATING (a :-> a :-> Full a)- Sin :: (Type a, Floating a) => FLOATING (a :-> Full a)- Tan :: (Type a, Floating a) => FLOATING (a :-> Full a)- Cos :: (Type a, Floating a) => FLOATING (a :-> Full a)- Asin :: (Type a, Floating a) => FLOATING (a :-> Full a)- Atan :: (Type a, Floating a) => FLOATING (a :-> Full a)- Acos :: (Type a, Floating a) => FLOATING (a :-> Full a)- Sinh :: (Type a, Floating a) => FLOATING (a :-> Full a)- Tanh :: (Type a, Floating a) => FLOATING (a :-> Full a)- Cosh :: (Type a, Floating a) => FLOATING (a :-> Full a)- Asinh :: (Type a, Floating a) => FLOATING (a :-> Full a)- Atanh :: (Type a, Floating a) => FLOATING (a :-> Full a)- Acosh :: (Type a, Floating a) => FLOATING (a :-> Full a)--instance WitnessCons FLOATING- where- witnessCons Exp = ConsWit- witnessCons Sqrt = ConsWit- witnessCons Log = ConsWit- witnessCons Pow = ConsWit- witnessCons LogBase = ConsWit- witnessCons Sin = ConsWit- witnessCons Tan = ConsWit- witnessCons Cos = ConsWit- witnessCons Asin = ConsWit- witnessCons Atan = ConsWit- witnessCons Acos = ConsWit- witnessCons Sinh = ConsWit- witnessCons Tanh = ConsWit- witnessCons Cosh = ConsWit- witnessCons Asinh = ConsWit- witnessCons Atanh = ConsWit- witnessCons Acosh = ConsWit--instance WitnessSat FLOATING- where- type SatContext FLOATING = TypeCtx- witnessSat Exp = SatWit- witnessSat Sqrt = SatWit- witnessSat Log = SatWit- witnessSat Pow = SatWit- witnessSat LogBase = SatWit- witnessSat Sin = SatWit- witnessSat Tan = SatWit- witnessSat Cos = SatWit- witnessSat Asin = SatWit- witnessSat Atan = SatWit- witnessSat Acos = SatWit- witnessSat Sinh = SatWit- witnessSat Tanh = SatWit- witnessSat Cosh = SatWit- witnessSat Asinh = SatWit- witnessSat Atanh = SatWit- witnessSat Acosh = SatWit--instance MaybeWitnessSat TypeCtx FLOATING- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic FLOATING- where- semantics Exp = Sem "exp" Prelude.exp- semantics Sqrt = Sem "sqrt" Prelude.sqrt- semantics Log = Sem "log" Prelude.log- semantics Pow = Sem "(**)" (Prelude.**)- semantics LogBase = Sem "logBase" Prelude.logBase- semantics Sin = Sem "sin" Prelude.sin- semantics Tan = Sem "tan" Prelude.tan- semantics Cos = Sem "cos" Prelude.cos- semantics Asin = Sem "asin" Prelude.asin- semantics Atan = Sem "atan" Prelude.atan- semantics Acos = Sem "acos" Prelude.acos- semantics Sinh = Sem "sinh" Prelude.sinh- semantics Tanh = Sem "tanh" Prelude.tanh- semantics Cosh = Sem "cosh" Prelude.cosh- semantics Asinh = Sem "asinh" Prelude.asinh- semantics Atanh = Sem "atanh" Prelude.atanh- semantics Acosh = Sem "acosh" Prelude.acosh--instance ExprEq FLOATING where exprEq = exprEqSem; exprHash = exprHashSem-instance Render FLOATING where renderPart = renderPartSem-instance ToTree FLOATING-instance Eval FLOATING where evaluate = evaluateSem-instance EvalBind FLOATING where evalBindSym = evalBindSymDefault-instance SizeProp FLOATING where sizeProp = sizePropDefault-instance Sharable FLOATING--instance AlphaEq dom dom dom env => AlphaEq FLOATING FLOATING dom env- where- alphaEqSym = alphaEqSymDefault--instance (FLOATING :<: dom, Optimize dom dom) => Optimize FLOATING dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Fractional.hs
@@ -1,85 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Fractional- ( FRACTIONAL (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data FRACTIONAL a- where- DivFrac :: (Type a, Fractional a) => FRACTIONAL (a :-> a :-> Full a)--instance WitnessCons FRACTIONAL- where- witnessCons DivFrac = ConsWit--instance WitnessSat FRACTIONAL- where- type SatContext FRACTIONAL = TypeCtx- witnessSat DivFrac = SatWit--instance MaybeWitnessSat TypeCtx FRACTIONAL- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic FRACTIONAL- where- semantics DivFrac = Sem "(/)" (/)--instance ExprEq FRACTIONAL where exprEq = exprEqSem; exprHash = exprHashSem-instance Render FRACTIONAL where renderPart = renderPartSem-instance ToTree FRACTIONAL-instance Eval FRACTIONAL where evaluate = evaluateSem-instance EvalBind FRACTIONAL where evalBindSym = evalBindSymDefault-instance SizeProp FRACTIONAL where sizeProp = sizePropDefault-instance Sharable FRACTIONAL--instance AlphaEq dom dom dom env => AlphaEq FRACTIONAL FRACTIONAL dom env- where- alphaEqSym = alphaEqSymDefault--instance (FRACTIONAL :<: dom, Optimize dom dom) => Optimize FRACTIONAL dom- where- constructFeatOpt DivFrac (a :* b :* Nil)- | Just 1 <- viewLiteral b = return a-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Integral.hs
@@ -1,210 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Integral- ( INTEGRAL (..)- ) where----import Data.Bits--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Condition--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Bits-import Feldspar.Core.Constructs.Eq-import Feldspar.Core.Constructs.Ord-import Feldspar.Core.Constructs.Num----data INTEGRAL a- where- Quot :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)- Rem :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)- Div :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)- Mod :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)- Exp :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)--instance WitnessCons INTEGRAL- where- witnessCons Quot = ConsWit- witnessCons Rem = ConsWit- witnessCons Div = ConsWit- witnessCons Mod = ConsWit- witnessCons Exp = ConsWit--instance WitnessSat INTEGRAL- where- type SatContext INTEGRAL = TypeCtx- witnessSat Quot = SatWit- witnessSat Rem = SatWit- witnessSat Div = SatWit- witnessSat Mod = SatWit- witnessSat Exp = SatWit--instance MaybeWitnessSat TypeCtx INTEGRAL- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic INTEGRAL- where- semantics Quot = Sem "quot" quot- semantics Rem = Sem "rem" rem- semantics Div = Sem "div" div- semantics Mod = Sem "mod" mod- semantics Exp = Sem "(^)" (^)--instance ExprEq INTEGRAL where exprEq = exprEqSem; exprHash = exprHashSem-instance Render INTEGRAL where renderPart = renderPartSem-instance ToTree INTEGRAL-instance Eval INTEGRAL where evaluate = evaluateSem-instance EvalBind INTEGRAL where evalBindSym = evalBindSymDefault-instance Sharable INTEGRAL--instance AlphaEq dom dom dom env => AlphaEq INTEGRAL INTEGRAL dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp INTEGRAL- where- sizeProp Quot (WrapFull a :* WrapFull b :* Nil) = rangeQuot (infoSize a) (infoSize b)- sizeProp Rem (WrapFull a :* WrapFull b :* Nil) = rangeRem (infoSize a) (infoSize b)- sizeProp Div (WrapFull a :* WrapFull b :* Nil) = rangeDiv (infoSize a) (infoSize b)- sizeProp Mod (WrapFull a :* WrapFull b :* Nil) = rangeMod (infoSize a) (infoSize b)- sizeProp Exp (WrapFull a :* WrapFull b :* Nil) = rangeExp (infoSize a) (infoSize b)--instance- ( INTEGRAL :<: dom- , BITS :<: dom- , NUM :<: dom- , EQ :<: dom- , ORD :<: dom- , Condition TypeCtx :<: dom- , Optimize dom dom- , Optimize (Condition TypeCtx) dom- ) =>- Optimize INTEGRAL dom- where- constructFeatOpt Quot (a :* b :* Nil)- | Just 1 <- viewLiteral b = return a-- constructFeatOpt Quot (a :* b :* Nil)- | Just b' <- viewLiteral b- , b' > 0- , isPowerOfTwo b'- , let l = log2 b'- , let lLit = literalDecor l- = if isNatural $ infoSize $ getInfo a- then constructFeat ShiftR (a :* lLit :* Nil)- else do- aIsNeg <- constructFeat LTH (a :* literalDecor 0 :* Nil)- a' <- constructFeat Add (a :* literalDecor (2^l-1) :* Nil)- negCase <- constructFeat ShiftR (a' :* lLit :* Nil)- posCase <- constructFeat ShiftR (a :* lLit :* Nil)- constructFeat (Condition `withContext` typeCtx)- (aIsNeg :* negCase :* posCase :* Nil)- -- TODO This rule should also fire when `b` is `2^l` but not a literal.- -- TODO Make a case for `isNegative $ infoSize $ getInfo a`. Note that- -- `isNegative /= (not . isNatural)`- -- TODO Or maybe both `isNegative` and ``isPositive` are handled by the- -- size-based optimization of `Condition`?-- constructFeatOpt Rem (a :* b :* Nil)- | rangeLess sza szb- , isNatural sza- = return a- where- sza = infoSize $ getInfo a- szb = infoSize $ getInfo b-- constructFeatOpt Div (a :* b :* Nil)- | Just 1 <- viewLiteral b = return a-- constructFeatOpt Div (a :* b :* Nil)- | Just b' <- viewLiteral b- , b' > 0- , isPowerOfTwo b'- = constructFeat ShiftR (a :* literalDecor (log2 b') :* Nil)-- constructFeatOpt Div (a :* b :* Nil)- | sameSign (infoSize (getInfo a)) (infoSize (getInfo b))- = constructFeat Quot (a :* b :* Nil)-- constructFeatOpt Mod (a :* b :* Nil)- | rangeLess sza szb- , isNatural sza- = return a- where- sza = infoSize $ getInfo a- szb = infoSize $ getInfo b-- constructFeatOpt Mod (a :* b :* Nil)- | sameSign (infoSize (getInfo a)) (infoSize (getInfo b))- = constructFeat Rem (a :* b :* Nil)-- constructFeatOpt Exp (a :* b :* Nil)- | Just 1 <- viewLiteral a = return $ literalDecor 1- | Just 0 <- viewLiteral a = return $ literalDecor 0- | Just 1 <- viewLiteral b = return a- | Just 0 <- viewLiteral b = return $ literalDecor 1-- constructFeatOpt Exp (a :* b :* Nil)- | Just (-1) <- viewLiteral a = do- bLSB <- constructFeat BAnd (b :* literalDecor 1 :* Nil)- bIsEven <- constructFeat Equal (bLSB :* literalDecor 0 :* Nil) -- TODO Use testBit? (remove EQ :<: dom and import)- constructFeat (Condition `withContext` typeCtx)- (bIsEven :* literalDecor 1 :* literalDecor (-1) :* Nil)-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault---- Auxiliary functions---- shouldn't be used for negative numbers-isPowerOfTwo :: Bits a => a -> Bool-isPowerOfTwo x = x .&. (x - 1) == 0 && not (x == 0)--log2 :: (BoundedInt a, Integral b) => a -> b-log2 v | v <= 1 = 0-log2 v = 1 + log2 (shiftR v 1)--sameSign :: BoundedInt a => Range a -> Range a -> Bool-sameSign ra rb- = isNatural ra && isNatural rb- || isNegative ra && isNegative rb-
− Feldspar/Core/Constructs/Literal.hs
@@ -1,60 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}---- | Interpretation of basic syntactic constructs--module Feldspar.Core.Constructs.Literal- ( module Language.Syntactic.Constructs.Literal- ) where----import Language.Syntactic-import Language.Syntactic.Constructs.Literal--import Feldspar.Core.Types-import Feldspar.Core.Interpretation----instance Sharable (Literal TypeCtx)- -- Will not be shared anyway, because it's a terminal--instance SizeProp (Literal TypeCtx)- where- sizeProp lit@(Literal a) Nil- | TypeWit <- fromSatWit $ witnessSat lit- = sizeOf a--instance (Literal TypeCtx :<: dom, Optimize dom dom) =>- Optimize (Literal TypeCtx) dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Logic.hs
@@ -1,123 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Logic- ( Logic (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Eq-import Feldspar.Core.Constructs.Ord---data Logic a- where- And :: Logic (Bool :-> Bool :-> Full Bool)- Or :: Logic (Bool :-> Bool :-> Full Bool)- Not :: Logic (Bool :-> Full Bool)--instance WitnessCons Logic- where- witnessCons And = ConsWit- witnessCons Or = ConsWit- witnessCons Not = ConsWit--instance WitnessSat Logic- where- type SatContext Logic = TypeCtx- witnessSat And = SatWit- witnessSat Or = SatWit- witnessSat Not = SatWit--instance MaybeWitnessSat TypeCtx Logic- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Logic- where- semantics And = Sem "(&&)" (&&)- semantics Or = Sem "(||)" (||)- semantics Not = Sem "not" not--instance ExprEq Logic where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Logic where renderPart = renderPartSem-instance ToTree Logic-instance Eval Logic where evaluate = evaluateSem-instance EvalBind Logic where evalBindSym = evalBindSymDefault-instance SizeProp Logic where sizeProp = sizePropDefault-instance Sharable Logic--instance AlphaEq dom dom dom env => AlphaEq Logic Logic dom env- where- alphaEqSym = alphaEqSymDefault--instance ( Logic :<: dom- , EQ :<: dom- , ORD :<: dom- , Optimize dom dom- )- => Optimize Logic dom- where- constructFeatOpt And (a :* b :* Nil)- | Just True <- viewLiteral a = return b- | Just False <- viewLiteral a = return a- | Just True <- viewLiteral b = return a- | Just False <- viewLiteral b = return b- | a `alphaEq` b = return a-- constructFeatOpt Or (a :* b :* Nil)- | Just True <- viewLiteral a = return a- | Just False <- viewLiteral a = return b- | Just True <- viewLiteral b = return b- | Just False <- viewLiteral b = return a- | a `alphaEq` b = return a-- constructFeatOpt Not ((not :$ a) :* Nil)- | Just (_,Not) <- prjDecor not = return a-- constructFeatOpt Not ((op :$ a :$ b) :* Nil)- | Just (_,Equal) <- prjDecor op = constructFeat NotEqual (a :* b :* Nil)- | Just (_,NotEqual) <- prjDecor op = constructFeat Equal (a :* b :* Nil)- | Just (_,LTH) <- prjDecor op = constructFeat GTE (a :* b :* Nil)- | Just (_,GTH) <- prjDecor op = constructFeat LTE (a :* b :* Nil)- | Just (_,LTE) <- prjDecor op = constructFeat GTH (a :* b :* Nil)- | Just (_,GTE) <- prjDecor op = constructFeat LTH (a :* b :* Nil)-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Loop.hs
@@ -1,212 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Loop-where--import Control.Monad (forM_, when)--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Binding-import Feldspar.Core.Constructs.Literal--data LoopM m a- where- While :: (Size (m ()) ~ AnySize) => LoopM m (m Bool :-> m a :-> Full (m ()))- For :: (Size (m ()) ~ AnySize) => LoopM m (Length :-> (Index -> m a) :-> Full (m ()))--data Loop a- where- ForLoop :: Type a => Loop (Length :-> a :-> (Index -> a -> a) :-> Full a)- WhileLoop :: Type a => Loop (a :-> (a -> Bool) :-> (a -> a) :-> Full a)--instance WitnessCons (LoopM m)- where- witnessCons While = ConsWit- witnessCons For = ConsWit--instance WitnessCons Loop- where- witnessCons ForLoop = ConsWit- witnessCons WhileLoop = ConsWit--instance WitnessSat Loop- where- type SatContext Loop = TypeCtx- witnessSat ForLoop = SatWit- witnessSat WhileLoop = SatWit--instance MaybeWitnessSat TypeCtx (LoopM m)- where- maybeWitnessSat _ _ = Nothing--instance MaybeWitnessSat TypeCtx Loop- where- maybeWitnessSat = maybeWitnessSatDefault--instance Monad m => Semantic (LoopM m)- where- semantics While = Sem "while" while- where- while cond body = do- c <- cond- when c (body >> while cond body)- semantics For = Sem "for" for- where- for 0 _ = return ()- for l body = forM_ [0..l-1] body--instance Semantic Loop- where- semantics ForLoop = Sem "forLoop" forLoop- where- forLoop 0 init _ = init- forLoop l init body = foldl (flip body) init [0..l-1]- semantics WhileLoop = Sem "whileLoop" whileLoop- where- whileLoop init cond body = go init- where- go st | cond st = go $ body st- | otherwise = st--instance Monad m => ExprEq (LoopM m) where exprEq = exprEqSem; exprHash = exprHashSem-instance Monad m => Render (LoopM m) where renderPart = renderPartSem-instance Monad m => ToTree (LoopM m)-instance Monad m => Eval (LoopM m) where evaluate = evaluateSem-instance Monad m => EvalBind (LoopM m) where evalBindSym = evalBindSymDefault-instance Sharable (LoopM m)- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance ExprEq Loop where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Loop where renderPart = renderPartSem-instance ToTree Loop-instance Eval Loop where evaluate = evaluateSem-instance EvalBind Loop where evalBindSym = evalBindSymDefault-instance Sharable Loop--instance (AlphaEq dom dom dom env, Monad m) =>- AlphaEq (LoopM m) (LoopM m) dom env- where- alphaEqSym = alphaEqSymDefault--instance AlphaEq dom dom dom env => AlphaEq Loop Loop dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp (LoopM m)- where- sizeProp While _ = AnySize- sizeProp For _ = AnySize--instance SizeProp Loop- where- sizeProp ForLoop (_ :* _ :* WrapFull step :* Nil) = infoSize step- sizeProp WhileLoop (_ :* _ :* WrapFull step :* Nil) = infoSize step----instance ( MonadType m- , LoopM m :<: dom- , Lambda TypeCtx :<: dom- , WitnessCons (LoopM m)- , MaybeWitnessSat TypeCtx dom- , Optimize dom dom- )- => Optimize (LoopM m) dom- where- optimizeFeat for@For (len :* step :* Nil) = do- len' <- optimizeM len- let szI = infoSize (getInfo len')- ixRange = rangeByRange 0 (szI-1)- step' <- optimizeFunction optimizeM (mkInfo ixRange) step- case getInfo step' of- Info{} -> constructFeat for (len' :* step' :* Nil)-- optimizeFeat a args = optimizeFeatDefault a args-- constructFeatUnOpt While args = constructFeatUnOptDefaultTyp voidTypeRep While args- constructFeatUnOpt For args = constructFeatUnOptDefaultTyp voidTypeRep For args--instance ( Variable TypeCtx :<: dom- , Lambda TypeCtx :<: dom- , Loop :<: dom- , Optimize dom dom- , AlphaEq dom dom dom [(VarId, VarId)]- )- => Optimize Loop dom- where- optimizeFeat ForLoop (len :* init :* step :* Nil) = do- len' <- optimizeM len- init' <- optimizeM init- let szI = infoSize (getInfo len')- ixRange = Range 0 (upperBound szI-1)- step' <- optimizeFunction- (optimizeFunctionFix optimizeM (getInfo init'))- (mkInfo ixRange)- step- constructFeat ForLoop (len' :* init' :* step' :* Nil)-- optimizeFeat WhileLoop (init :* cond :* body :* Nil) = do- init' <- optimizeM init- let info = getInfo init'- body' <- optimizeFunctionFix optimizeM info body- let info' = info { infoSize = infoSize (getInfo body') }- cond' <- optimizeFunction optimizeM info' cond- constructFeat WhileLoop (init' :* cond' :* body' :* Nil)-- constructFeatOpt ForLoop (len :* init :* step :* Nil)- | Just 0 <- viewLiteral len = return init- | Just 1 <- viewLiteral len = do- let len' = stripDecor len -- TODO strip since betaReduce can't handle decorations- init' = stripDecor init- step' = stripDecor step- optimizeM $ betaReduce typeCtx init' $ betaReduce typeCtx (appSymCtx typeCtx $ Literal 0) step'- -- TODO add an optional unroll limit?-- -- ForLoop len init (const id) ==> init- constructFeatOpt ForLoop (len :* init :* step :* Nil)- | alphaEq step' (fun `asTypeOf` step') = optimizeM $ stripDecor init- where- step' = stripDecor step- fun = appSymCtx typeCtx (Lambda 0) $ appSymCtx typeCtx (Lambda 1) $ appSymCtx typeCtx (Variable 1)-- -- TODO ForLoop len init (flip (const f)) ==> step (len - 1) init- -- This optimization requires that the len > 0-- constructFeatOpt feat args = constructFeatUnOpt feat args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Mutable.hs
@@ -1,170 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Mutable- ( module Feldspar.Core.Constructs.Mutable- , module Language.Syntactic.Constructs.Monad- )-where--import Data.Map-import Data.Typeable-import System.IO.Unsafe--import Data.Proxy--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Monad-import Language.Syntactic.Frontend.Monad--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Binding--data Mutable a- where- Run :: Type a => Mutable (Mut a :-> Full a)--instance WitnessCons Mutable- where- witnessCons Run = ConsWit--instance WitnessSat Mutable- where- type SatContext Mutable = TypeCtx- witnessSat Run = SatWit--instance MaybeWitnessSat TypeCtx Mutable- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Mutable- where- semantics Run = Sem "runMutable" unsafePerformIO--instance ExprEq Mutable where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Mutable where renderPart = renderPartSem-instance ToTree Mutable-instance Eval Mutable where evaluate = evaluateSem-instance EvalBind Mutable where evalBindSym = evalBindSymDefault-instance Sharable Mutable- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance AlphaEq dom dom dom env => AlphaEq Mutable Mutable dom env- where- alphaEqSym = alphaEqSymDefault--instance Sharable (MONAD Mut)- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance SizeProp (MONAD Mut)- where- sizeProp Return (WrapFull a :* Nil) = infoSize a- sizeProp Bind (_ :* WrapFull f :* Nil) = infoSize f- sizeProp Then (_ :* WrapFull b :* Nil) = infoSize b- sizeProp When _ = AnySize--instance SizeProp Mutable- where- sizeProp Run (WrapFull a :* Nil) = infoSize a--monadProxy :: Proxy (Mut a)-monadProxy = Proxy--instance (MONAD Mut :<: dom, Optimize dom dom) => Optimize (MONAD Mut) dom- where- optimizeFeat bnd@Bind (ma :* f :* Nil) = do- ma' <- optimizeM ma- case getInfo ma' of- Info (MutType ty) sz vs src -> do- f' <- optimizeFunction optimizeM (Info ty sz vs src) f- case getInfo f' of- Info{} -> constructFeat bnd (ma' :* f' :* Nil)-- optimizeFeat a args = optimizeFeatDefault a args-- constructFeatOpt Bind (ma :* (lam :$ (Sym (Decor _ ret) :$ var)) :* Nil)- | Just (_,Lambda v1) <- prjDecorCtx typeCtx lam- , Just Return <- prjMonad monadProxy ret- , Just (_,Variable v2) <- prjDecorCtx typeCtx var- , v1 == v2- , Just ma' <- gcast ma- = return ma'-- constructFeatOpt Bind (ma :* (lam :$ body) :* Nil)- | Just (_,Lambda v) <- prjDecorCtx typeCtx lam- , v `notMember` vars- = constructFeat Then (ma :* body :* Nil)- where- vars = infoVars $ getInfo body-- -- return x >> mb ==> mb- constructFeatOpt Then ((Sym (Decor _ ret) :$ _) :* mb :* Nil)- | Just Return <- prjMonad monadProxy ret- = return mb-- -- ma >> return () ==> ma- constructFeatOpt Then (ma :* (Sym (Decor info ret) :$ u) :* Nil)- | Just Return <- prjMonad monadProxy ret- , Just TypeEq <- typeEq (infoType $ getInfo ma) (MutType UnitType)- , Just TypeEq <- typeEq (infoType $ info) (MutType UnitType)- , Just () <- viewLiteral u- = return ma-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt Return args@(a :* Nil)- | Info {infoType = t} <- getInfo a- = constructFeatUnOptDefaultTyp (MutType t) Return args-- constructFeatUnOpt Bind args@(_ :* f :* Nil)- | Info {infoType = FunType _ t} <- getInfo f- = constructFeatUnOptDefaultTyp t Bind args- -- TODO The match on `FunType` is total with the current definition of- -- `TypeRep`, but there's no guarantee this will remain true in the- -- future. One way around that would be to match `f` against- -- `Lambda`, but that is also a partial match (at least possibly, in- -- the future). Another option would be to add a context parameter to- -- `MONAD` to be able to add the constraint `Type a`.-- constructFeatUnOpt Then args@(_ :* mb :* Nil)- | Info {infoType = t} <- getInfo mb- = constructFeatUnOptDefaultTyp t Then args-- constructFeatUnOpt When args =- constructFeatUnOptDefaultTyp voidTypeRep When args--instance (Mutable :<: dom, Optimize dom dom) => Optimize Mutable dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/MutableArray.hs
@@ -1,103 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.MutableArray-where--import Control.Monad-import Data.Array.IO--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data MutableArray a- where- NewArr :: Type a => MutableArray (Length :-> a :-> Full (Mut (MArr a)))- NewArr_ :: Type a => MutableArray (Length :-> Full (Mut (MArr a)))- GetArr :: Type a => MutableArray (MArr a :-> Index :-> Full (Mut a))- SetArr :: MutableArray (MArr a :-> Index :-> a :-> Full (Mut ()))- ArrLength :: MutableArray (MArr a :-> Full (Mut Length))- -- TODO Should be pure?--instance WitnessCons MutableArray- where- witnessCons NewArr = ConsWit- witnessCons NewArr_ = ConsWit- witnessCons GetArr = ConsWit- witnessCons SetArr = ConsWit- witnessCons ArrLength = ConsWit--instance MaybeWitnessSat ctx MutableArray- where- maybeWitnessSat _ _ = Nothing--instance Semantic MutableArray- where- semantics NewArr = Sem "newMArr" (\l -> newArray (0,l-1))- semantics NewArr_ = Sem "newMArr_" (\l -> newArray_ (0,l-1))- semantics GetArr = Sem "getMArr" readArray- semantics SetArr = Sem "setMArr" writeArray- semantics ArrLength = Sem "arrLength" (getBounds >=> \(l,u) -> return (u-l+1))--instance ExprEq MutableArray where exprEq = exprEqSem; exprHash = exprHashSem-instance Render MutableArray where renderPart = renderPartSem-instance ToTree MutableArray-instance Eval MutableArray where evaluate = evaluateSem-instance EvalBind MutableArray where evalBindSym = evalBindSymDefault-instance Sharable MutableArray- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance AlphaEq dom dom dom env => AlphaEq MutableArray MutableArray dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp MutableArray- where- sizeProp NewArr (WrapFull len :* a :* Nil) = infoSize len :> universal- sizeProp NewArr_ (WrapFull len :* Nil) = infoSize len :> universal- sizeProp GetArr _ = universal- sizeProp SetArr _ = universal- sizeProp ArrLength (WrapFull arr :* Nil) = len- where- len :> _ = infoSize arr--instance (MutableArray :<: dom, Optimize dom dom) => Optimize MutableArray dom- where- constructFeatUnOpt NewArr args = constructFeatUnOptDefaultTyp (MutType $ MArrType typeRep) NewArr args- constructFeatUnOpt NewArr_ args = constructFeatUnOptDefaultTyp (MutType $ MArrType typeRep) NewArr_ args- constructFeatUnOpt GetArr args = constructFeatUnOptDefaultTyp (MutType typeRep) GetArr args- constructFeatUnOpt SetArr args = constructFeatUnOptDefaultTyp (MutType typeRep) SetArr args- constructFeatUnOpt ArrLength args = constructFeatUnOptDefaultTyp (MutType typeRep) ArrLength args-
− Feldspar/Core/Constructs/MutableReference.hs
@@ -1,91 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.MutableReference-where--import Data.IORef--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data MutableReference a- where- NewRef :: Type a => MutableReference (a :-> Full (Mut (IORef a)))- GetRef :: Type a => MutableReference (IORef a :-> Full (Mut a))- SetRef :: Type a => MutableReference (IORef a :-> a :-> Full (Mut ()))--instance WitnessCons MutableReference- where- witnessCons NewRef = ConsWit- witnessCons GetRef = ConsWit- witnessCons SetRef = ConsWit--instance MaybeWitnessSat ctx MutableReference- where- maybeWitnessSat _ _ = Nothing--instance Semantic MutableReference- where- semantics NewRef = Sem "newRef" newIORef- semantics GetRef = Sem "getRef" readIORef- semantics SetRef = Sem "setRef" writeIORef--instance ExprEq MutableReference where exprEq = exprEqSem; exprHash = exprHashSem-instance Render MutableReference where renderPart = renderPartSem-instance ToTree MutableReference-instance Eval MutableReference where evaluate = evaluateSem-instance EvalBind MutableReference where evalBindSym = evalBindSymDefault-instance Sharable MutableReference- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance AlphaEq dom dom dom env =>- AlphaEq MutableReference MutableReference dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp MutableReference- where- sizeProp NewRef _ = universal- sizeProp GetRef _ = universal- sizeProp SetRef _ = universal--instance (MutableReference :<: dom, Optimize dom dom) =>- Optimize MutableReference dom- where- constructFeatUnOpt NewRef args = constructFeatUnOptDefaultTyp (MutType $ RefType typeRep) NewRef args- constructFeatUnOpt GetRef args = constructFeatUnOptDefaultTyp (MutType typeRep) GetRef args- constructFeatUnOpt SetRef args = constructFeatUnOptDefaultTyp (MutType typeRep) SetRef args-
− Feldspar/Core/Constructs/MutableToPure.hs
@@ -1,98 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.MutableToPure- ( MutableToPure (..)- ) where--import qualified Control.Exception as C-import Data.Array.MArray-import Data.Array.IArray-import System.IO.Unsafe--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation--data MutableToPure a where- RunMutableArray :: Type a => MutableToPure (Mut (MArr a) :-> Full [a])- WithArray :: Type b => MutableToPure (MArr a :-> ([a] -> Mut b) :-> Full (Mut b))--instance WitnessCons MutableToPure- where- witnessCons RunMutableArray = ConsWit- witnessCons WithArray = ConsWit--instance MaybeWitnessSat TypeCtx MutableToPure- where- maybeWitnessSat _ RunMutableArray = Just SatWit- maybeWitnessSat _ _ = Nothing--instance Semantic MutableToPure- where- semantics RunMutableArray = Sem "runMutableArray" runMutableArrayEval- semantics WithArray = Sem "withArray" withArrayEval--runMutableArrayEval :: forall i a . Mut (MArr a) -> [a]-runMutableArrayEval m = unsafePerformIO $- do marr <- m- iarr <- unsafeFreeze marr- return (elems (iarr :: Array WordN a))--withArrayEval :: forall i a b. MArr a -> ([a] -> Mut b) -> Mut b-withArrayEval ma f- = do a <- f (elems (unsafePerformIO $ freeze ma :: Array WordN a))- C.evaluate a--instance ExprEq MutableToPure where exprEq = exprEqSem; exprHash = exprHashSem-instance Render MutableToPure where renderPart = renderPartSem-instance ToTree MutableToPure-instance Eval MutableToPure where evaluate = evaluateSem-instance EvalBind MutableToPure where evalBindSym = evalBindSymDefault-instance Sharable MutableToPure--instance AlphaEq dom dom dom env => AlphaEq MutableToPure MutableToPure dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp MutableToPure- where- sizeProp RunMutableArray _ = universal- sizeProp WithArray _ = universal--instance (MutableToPure :<: dom, Optimize dom dom) => Optimize MutableToPure dom- where- constructFeatUnOpt RunMutableArray args = constructFeatUnOptDefaultTyp typeRep RunMutableArray args- constructFeatUnOpt WithArray args = constructFeatUnOptDefaultTyp (MutType typeRep) WithArray args-
− Feldspar/Core/Constructs/Num.hs
@@ -1,218 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Num- ( NUM (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data NUM a- where- Abs :: (Type a, Num a, Num (Size a)) => NUM (a :-> Full a)- Sign :: (Type a, Num a, Num (Size a)) => NUM (a :-> Full a)- Add :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)- Sub :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)- Mul :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)--instance WitnessCons NUM- where- witnessCons Abs = ConsWit- witnessCons Sign = ConsWit- witnessCons Add = ConsWit- witnessCons Sub = ConsWit- witnessCons Mul = ConsWit--instance WitnessSat NUM- where- type SatContext NUM = TypeCtx- witnessSat Abs = SatWit- witnessSat Sign = SatWit- witnessSat Add = SatWit- witnessSat Sub = SatWit- witnessSat Mul = SatWit--instance MaybeWitnessSat TypeCtx NUM- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic NUM- where- semantics Abs = Sem "abs" abs- semantics Sign = Sem "signum" signum- semantics Add = Sem "(+)" (+)- semantics Sub = Sem "(-)" (-)- semantics Mul = Sem "(*)" (*)--instance ExprEq NUM where exprEq = exprEqSem; exprHash = exprHashSem-instance Render NUM where renderPart = renderPartSem-instance ToTree NUM-instance Eval NUM where evaluate = evaluateSem-instance EvalBind NUM where evalBindSym = evalBindSymDefault-instance Sharable NUM--instance AlphaEq dom dom dom env => AlphaEq NUM NUM dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp NUM- where- sizeProp Abs (WrapFull a :* Nil) = abs (infoSize a)- sizeProp Sign (WrapFull a :* Nil) = signum (infoSize a)- sizeProp Add (WrapFull a :* WrapFull b :* Nil) = infoSize a + infoSize b- sizeProp Sub (WrapFull a :* WrapFull b :* Nil) = infoSize a - infoSize b- sizeProp Mul (WrapFull a :* WrapFull b :* Nil) = infoSize a * infoSize b----instance (NUM :<: dom, Optimize dom dom) => Optimize NUM dom- where- constructFeatOpt Abs (a :* Nil)- | RangeSet r <- infoRange (getInfo a)- , isNatural r- = return a-- constructFeatOpt Sign (a :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , 0 `rangeLess` ra- = return (literalDecor 1)-- constructFeatOpt Sign (a :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , ra `rangeLess` 0- = return (literalDecor (-1))-- constructFeatOpt Add (a :* b :* Nil)- | Just 0 <- viewLiteral b = return a- | Just 0 <- viewLiteral a = return b-- constructFeatOpt Add (a :* (op :$ b :$ c) :* Nil)- | Just a' <- viewLiteral a- , Just (_,Add) <- prjDecor op- , Just c' <- viewLiteral c- = constructFeat Add (b :* literalDecor (a'+c') :* Nil)-- constructFeatOpt Add (a :* (op :$ b :$ c) :* Nil)- | Just a' <- viewLiteral a- , Just (_,Sub) <- prjDecor op- , Just c' <- viewLiteral c- = constructFeat Add (b :* literalDecor (a'-c') :* Nil)-- constructFeatOpt Add ((op :$ a :$ b) :* c :* Nil)- | Just c' <- viewLiteral c- , Just (_,Add) <- prjDecor op- , Just b' <- viewLiteral b- = constructFeat Add (a :* literalDecor (b'+c') :* Nil)-- constructFeatOpt Add ((op :$ a :$ b) :* c :* Nil)- | Just c' <- viewLiteral c- , Just (_,Sub) <- prjDecor op- , Just b' <- viewLiteral b- = constructFeat Add (a :* literalDecor (c'-b') :* Nil)-- constructFeatOpt Add ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)- | Just (_,Add) <- prjDecor op1- , Just (_,Add) <- prjDecor op2- , Just b' <- viewLiteral b- , Just d' <- viewLiteral d- = do- ac <- constructFeat Add (a :* c :* Nil)- constructFeat Add (ac :* literalDecor (b'+d') :* Nil)-- constructFeatOpt Sub (a :* b :* Nil)- | Just 0 <- viewLiteral b = return a- | alphaEq a b = return $ literalDecor 0-- constructFeatOpt Mul (a :* b :* Nil)- | Just 0 <- viewLiteral a = return a- | Just 1 <- viewLiteral a = return b- | Just 0 <- viewLiteral b = return b- | Just 1 <- viewLiteral b = return a-- constructFeatOpt Mul (a :* (op :$ b :$ c) :* Nil)- | Just a' <- viewLiteral a- , Just (_,Mul) <- prjDecor op- , Just c' <- viewLiteral c- = constructFeat Mul (b :* literalDecor (a'*c') :* Nil)-- constructFeatOpt Mul ((op :$ a :$ b) :* c :* Nil)- | Just c' <- viewLiteral c- , Just (_,Mul) <- prjDecor op- , Just b' <- viewLiteral b- = constructFeat Mul (a :* literalDecor (b'*c') :* Nil)-- constructFeatOpt Mul ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)- | Just (_,Mul) <- prjDecor op1- , Just (_,Mul) <- prjDecor op2- , Just b' <- viewLiteral b- , Just d' <- viewLiteral d- = do- ac <- constructFeat Mul (a :* c :* Nil)- constructFeat Mul (ac :* literalDecor (b'*d') :* Nil)-- -- Cases to make sure literals end up to the right:- constructFeatOpt Add (a :* b :* Nil)- | Just a' <- viewLiteral a = constructFeatUnOpt Add (b :* a :* Nil)-- constructFeatOpt Mul (a :* b :* Nil)- | Just a' <- viewLiteral a = constructFeatUnOpt Mul (b :* a :* Nil)-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault---- TODO Improve algebraic simplification------ The current implementation is quite incomplete and it only deals with merging--- literals, so it can't cancel out variables; e.g.------ (x+x)-x ===> x------ It would be better to optimize a whole arithmetic expression at once. Gather--- all variables in one list, all literals in one list and all non-arithmetic--- sub-terms in one list. Then make a new optimized expression by combining the--- three lists.------ However, doing this compositionally will probably lead to a lot of--- re-traversals of the same sub-terms, so the optimization framework will--- probably have to be modified so that arithmetic optimization only happens at--- feasible places (i.e. arithmetic sub-terms whose parents are not arithmetic--- expressions).-
− Feldspar/Core/Constructs/Ord.hs
@@ -1,205 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Ord- ( ORD (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data ORD a- where- LTH :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)- GTH :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)- LTE :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)- GTE :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)- Min :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full a)- Max :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full a)--instance WitnessCons ORD- where- witnessCons LTH = ConsWit- witnessCons GTH = ConsWit- witnessCons LTE = ConsWit- witnessCons GTE = ConsWit- witnessCons Min = ConsWit- witnessCons Max = ConsWit--instance WitnessSat ORD- where- type SatContext ORD = TypeCtx- witnessSat LTH = SatWit- witnessSat GTH = SatWit- witnessSat LTE = SatWit- witnessSat GTE = SatWit- witnessSat Min = SatWit- witnessSat Max = SatWit--instance MaybeWitnessSat TypeCtx ORD- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic ORD- where- semantics LTH = Sem "(<)" (<)- semantics GTH = Sem "(>)" (>)- semantics LTE = Sem "(<=)" (<=)- semantics GTE = Sem "(>=)" (>=)- semantics Min = Sem "min" min- semantics Max = Sem "max" max--instance ExprEq ORD where exprEq = exprEqSem; exprHash = exprHashSem-instance Render ORD where renderPart = renderPartSem-instance ToTree ORD-instance Eval ORD where evaluate = evaluateSem-instance EvalBind ORD where evalBindSym = evalBindSymDefault-instance Sharable ORD--instance AlphaEq dom dom dom env => AlphaEq ORD ORD dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp ORD- where- sizeProp Min (WrapFull a :* WrapFull b :* Nil) = min (infoSize a) (infoSize b)- sizeProp Max (WrapFull a :* WrapFull b :* Nil) = max (infoSize a) (infoSize b)- sizeProp a args = sizePropDefault a args----instance- ( ORD :<: dom- , MaybeWitnessSat TypeCtx dom- , Optimize dom dom- ) =>- Optimize ORD dom- where- constructFeatOpt LTH (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLess` rb- = return (literalDecor True)-- constructFeatOpt LTH (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLessEq` ra- = return (literalDecor False)-- constructFeatOpt GTH (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLess` ra- = return (literalDecor True)-- constructFeatOpt GTH (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLessEq` rb- = return (literalDecor False)-- constructFeatOpt LTE (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLessEq` rb- = return (literalDecor True)-- constructFeatOpt LTE (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLess` ra- = return (literalDecor False)-- constructFeatOpt LTE (a :* b :* Nil)- | alphaEq a b- = return $ literalDecor True-- constructFeatOpt GTE (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLessEq` ra- = return (literalDecor True)-- constructFeatOpt GTE (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLess` rb- = return (literalDecor False)-- constructFeatOpt GTE (a :* b :* Nil)- | alphaEq a b- = return $ literalDecor True-- constructFeatOpt Min (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLessEq` rb- = return a-- constructFeatOpt Min (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLessEq` ra- = return b-- constructFeatOpt Min (a :* b :* Nil)- | alphaEq a b- = return a-- constructFeatOpt Max (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , ra `rangeLessEq` rb- = return b-- constructFeatOpt Max (a :* b :* Nil)- | RangeSet ra <- infoRange (getInfo a)- , RangeSet rb <- infoRange (getInfo b)- , rb `rangeLessEq` ra- = return a-- constructFeatOpt Max (a :* b :* Nil)- | alphaEq a b- = return a-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Par.hs
@@ -1,196 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Par where--import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Binding.HigherOrder-import Language.Syntactic.Constructs.Monad--import qualified Control.Monad.Par as CMP-import qualified Control.Monad.Par.Internal as CMP--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation-import Feldspar.Core.Constructs.Binding--import Data.Map-import Data.Proxy-import Data.Typeable--data ParFeature a- where- ParRun :: Type a => ParFeature (Par a :-> Full a)- ParNew :: Type a => ParFeature (Full (Par (IV a)))- ParGet :: Type a => ParFeature (IV a :-> Full (Par a))- ParPut :: Type a => ParFeature (IV a :-> a :-> Full (Par ()))- ParFork :: ParFeature (Par () :-> Full (Par ()))- ParYield :: ParFeature (Full (Par ()))--instance Semantic ParFeature- where- semantics ParRun = Sem "runPar" CMP.runPar- semantics ParNew = Sem "new" CMP.new- semantics ParGet = Sem "get" CMP.get- semantics ParPut = Sem "put" CMP.put_- semantics ParFork = Sem "fork" CMP.fork- semantics ParYield = Sem "yield" CMP.yield--instance ExprEq ParFeature where exprEq = exprEqSem; exprHash = exprHashSem-instance Render ParFeature where renderPart = renderPartSem-instance ToTree ParFeature-instance Eval ParFeature where evaluate = evaluateSem-instance EvalBind ParFeature where evalBindSym = evalBindSymDefault-instance Sharable ParFeature- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance WitnessCons ParFeature- where- witnessCons ParRun = ConsWit- witnessCons ParNew = ConsWit- witnessCons ParGet = ConsWit- witnessCons ParPut = ConsWit- witnessCons ParFork = ConsWit- witnessCons ParYield = ConsWit--instance WitnessSat ParFeature- where- type SatContext ParFeature = TypeCtx- witnessSat ParRun = SatWit--instance MaybeWitnessSat ctx ParFeature- where- maybeWitnessSat _ _ = Nothing--instance AlphaEq dom dom dom env => AlphaEq ParFeature ParFeature dom env- where- alphaEqSym = alphaEqSymDefault--instance Sharable (MONAD Par)- -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'--instance SizeProp ParFeature- where- sizeProp ParRun (WrapFull a :* Nil) = infoSize a- sizeProp ParNew _ = universal- sizeProp ParGet _ = universal- sizeProp ParPut _ = universal- sizeProp ParFork _ = universal- sizeProp ParYield _ = universal--instance ( MONAD Par :<: dom- , ParFeature :<: dom- , Optimize dom dom- )- => Optimize ParFeature dom- where- constructFeatUnOpt ParRun args = constructFeatUnOptDefault ParRun args- constructFeatUnOpt ParNew args = constructFeatUnOptDefaultTyp (ParType $ IVarType typeRep) ParNew args- constructFeatUnOpt ParGet args = constructFeatUnOptDefaultTyp (ParType typeRep) ParGet args- constructFeatUnOpt ParPut args = constructFeatUnOptDefaultTyp (ParType typeRep) ParPut args- constructFeatUnOpt ParFork args = constructFeatUnOptDefaultTyp (ParType typeRep) ParFork args- constructFeatUnOpt ParYield args = constructFeatUnOptDefaultTyp (ParType typeRep) ParYield args--monadProxy :: Proxy (Par a)-monadProxy = Proxy--instance SizeProp (MONAD Par)- where- sizeProp Return (WrapFull a :* Nil) = infoSize a- sizeProp Bind (_ :* WrapFull f :* Nil) = infoSize f- sizeProp Then (_ :* WrapFull b :* Nil) = infoSize b- sizeProp When _ = AnySize--instance (MONAD Par :<: dom, Optimize dom dom) => Optimize (MONAD Par) dom- where- optimizeFeat bnd@Bind (ma :* f :* Nil) = do- ma' <- optimizeM ma- case getInfo ma' of- Info (ParType ty) sz vs src -> do- f' <- optimizeFunction optimizeM (Info ty sz vs src) f- case getInfo f' of- Info{} -> constructFeat bnd (ma' :* f' :* Nil)-- optimizeFeat a args = optimizeFeatDefault a args-- constructFeatOpt Bind (ma :* (lam :$ (Sym (Decor _ ret) :$ var)) :* Nil)- | Just (_,Lambda v1) <- prjDecorCtx typeCtx lam- , Just Return <- prjMonad monadProxy ret- , Just (_,Variable v2) <- prjDecorCtx typeCtx var- , v1 == v2- , Just ma' <- gcast ma- = return ma'-- constructFeatOpt Bind (ma :* (lam :$ body) :* Nil)- | Just (_,Lambda v) <- prjDecorCtx typeCtx lam- , v `notMember` vars- = constructFeat Then (ma :* body :* Nil)- where- vars = infoVars $ getInfo body-- -- return x >> mb ==> mb- constructFeatOpt Then ((Sym (Decor _ ret) :$ _) :* mb :* Nil)- | Just Return <- prjMonad monadProxy ret- = return mb-- -- ma >> return () ==> ma- constructFeatOpt Then (ma :* (Sym (Decor info ret) :$ u) :* Nil)- | Just Return <- prjMonad monadProxy ret- , Just TypeEq <- typeEq (infoType $ getInfo ma) (ParType UnitType)- , Just TypeEq <- typeEq (infoType $ info) (ParType UnitType)- , Just () <- viewLiteral u- = return ma-- constructFeatOpt a args = constructFeatUnOpt a args-- constructFeatUnOpt Return args@(a :* Nil)- | Info {infoType = t} <- getInfo a- = constructFeatUnOptDefaultTyp (ParType t) Return args-- constructFeatUnOpt Bind args@(_ :* f :* Nil)- | Info {infoType = FunType _ t} <- getInfo f- = constructFeatUnOptDefaultTyp t Bind args- -- TODO The match on `FunType` is total with the current definition of- -- `TypeRep`, but there's no guarantee this will remain true in the- -- future. One way around that would be to match `f` against- -- `Lambda`, but that is also a partial match (at least possibly, in- -- the future). Another option would be to add a context parameter to- -- `MONAD` to be able to add the constraint `Type a`.-- constructFeatUnOpt Then args@(_ :* mb :* Nil)- | Info {infoType = t} <- getInfo mb- = constructFeatUnOptDefaultTyp t Then args-- constructFeatUnOpt When args =- constructFeatUnOptDefaultTyp voidTypeRep When args-
− Feldspar/Core/Constructs/Save.hs
@@ -1,83 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Save where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data Save a- where- Save :: Type a => Save (a :-> Full a)--instance WitnessCons Save- where- witnessCons Save = ConsWit--instance WitnessSat Save- where- type SatContext Save = TypeCtx- witnessSat Save = SatWit--instance MaybeWitnessSat TypeCtx Save- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Save- where- semantics Save = Sem "save" id--instance ExprEq Save where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Save where renderPart = renderPartSem-instance ToTree Save-instance Eval Save where evaluate = evaluateSem-instance EvalBind Save where evalBindSym = evalBindSymDefault-instance Sharable Save--instance AlphaEq dom dom dom env => AlphaEq Save Save dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp Save- where- sizeProp Save (WrapFull a :* Nil) = infoSize a--instance (Save :<: dom, Optimize dom dom) => Optimize Save dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/SizeProp.hs
@@ -1,93 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.SizeProp where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Literal--import Feldspar.Lattice-import Feldspar.Core.Types-import Feldspar.Core.Interpretation----data PropSize a- where- PropSize :: (Type a, Type b) =>- (Size a -> Size b) -> PropSize (a :-> b :-> Full b)--instance WitnessCons PropSize- where- witnessCons (PropSize _) = ConsWit--instance WitnessSat PropSize- where- type SatContext PropSize = TypeCtx- witnessSat (PropSize _) = SatWit--instance MaybeWitnessSat TypeCtx PropSize- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic PropSize- where- semantics (PropSize _) = Sem "propSize" (const id)--instance ExprEq PropSize where exprEq = exprEqSem; exprHash = exprHashSem-instance Render PropSize where renderPart = renderPartSem-instance ToTree PropSize-instance Eval PropSize where evaluate = evaluateSem-instance EvalBind PropSize where evalBindSym = evalBindSymDefault-instance Sharable PropSize--instance SizeProp PropSize- where- sizeProp (PropSize prop) (WrapFull a :* WrapFull b :* Nil) =- prop (infoSize a) /\ infoSize b--instance AlphaEq dom dom dom env => AlphaEq PropSize PropSize dom env- where- alphaEqSym = alphaEqSymDefault--instance (PropSize :<: dom, Optimize dom dom) => Optimize PropSize dom- where- constructFeatOpt (PropSize prop) (a :* b :* Nil) =- return $ updateDecor (f (prop (infoSize $ getInfo a))) b- where- f :: Lattice (Size b) => Size b -> Info b -> Info b- f newSize info = info {infoSize = infoSize info /\ newSize}-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/SourceInfo.hs
@@ -1,81 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.SourceInfo- ( module Language.Syntactic.Constructs.Identity- , module Language.Syntactic.Constructs.Decoration- , SourceInfo1 (..)- ) where---import Language.Syntactic-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Decoration-import Language.Syntactic.Constructs.Identity--import Feldspar.Core.Types-import Feldspar.Core.Interpretation------ | Kind @* -> *@ version of 'SourceInfo'-data SourceInfo1 a = SourceInfo1 SourceInfo--instance AlphaEq dom dom dom env =>- AlphaEq- (Decor SourceInfo1 (Identity TypeCtx))- (Decor SourceInfo1 (Identity TypeCtx))- dom- env- where- alphaEqSym = alphaEqSymDefault--instance Sharable (Decor SourceInfo1 (Identity TypeCtx))- where- sharable _ = True--instance SizeProp (Identity TypeCtx)- where- sizeProp Id (WrapFull a :* Nil) = infoSize a--instance SizeProp (Decor SourceInfo1 (Identity TypeCtx))- where- sizeProp = sizeProp . decorExpr--instance (Decor SourceInfo1 (Identity TypeCtx) :<: dom, Optimize dom dom) =>- Optimize (Decor SourceInfo1 (Identity TypeCtx)) dom- where- optimizeFeat (Decor (SourceInfo1 src) Id) (a :* Nil) =- localSource src $ optimizeM a-- constructFeatOpt (Decor (SourceInfo1 src) Id) (a :* Nil) = return a-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Trace.hs
@@ -1,90 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Trace- ( Trace (..)- ) where----import Language.Syntactic-import Language.Syntactic.Interpretation.Semantics-import Language.Syntactic.Constructs.Binding--import Feldspar.Core.Types-import Feldspar.Core.Interpretation--import Debug.Trace--data Trace a- where- Trace :: Type a => Trace (IntN :-> a :-> Full a)- -- TODO Seems a more suitable definition might be- --- -- Trace :: Type a => IntN -> Trace (a :-> Full a)- --- -- since the front-end function will always make a literal for the label.--instance WitnessCons Trace- where- witnessCons Trace = ConsWit--instance WitnessSat Trace- where- type SatContext Trace = TypeCtx- witnessSat Trace = SatWit--instance MaybeWitnessSat TypeCtx Trace- where- maybeWitnessSat = maybeWitnessSatDefault--instance Semantic Trace- where- semantics Trace = Sem "trace" (\i a -> trace (show i ++ ":" ++ show a) a)--instance ExprEq Trace where exprEq = exprEqSem; exprHash = exprHashSem-instance Render Trace where renderPart = renderPartSem-instance ToTree Trace-instance Eval Trace where evaluate = evaluateSem-instance EvalBind Trace where evalBindSym = evalBindSymDefault-instance Sharable Trace--instance AlphaEq dom dom dom env => AlphaEq Trace Trace dom env- where- alphaEqSym = alphaEqSymDefault--instance SizeProp Trace- where- sizeProp Trace (WrapFull _ :* WrapFull a :* Nil) = infoSize a--instance (Trace :<: dom, Optimize dom dom) => Optimize Trace dom- where- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Constructs/Tuple.hs
@@ -1,326 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Constructs.Tuple- ( module Language.Syntactic.Constructs.Tuple- ) where---import Data.Maybe-import Data.Typeable (gcast)-import Data.Tuple.Select--import Language.Syntactic-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Tuple--import Feldspar.Core.Types-import Feldspar.Core.Interpretation----instance Sharable (Tuple TypeCtx)--instance SizeProp (Tuple TypeCtx)- where- sizeProp tup@Tup2 (a :* b :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- = (infoSize ia, infoSize ib)- sizeProp tup@Tup3 (a :* b :* c :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- , WrapFull ic <- c- = ( infoSize ia- , infoSize ib- , infoSize ic- )- sizeProp tup@Tup4 (a :* b :* c :* d :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- , WrapFull ic <- c- , WrapFull id <- d- = ( infoSize ia- , infoSize ib- , infoSize ic- , infoSize id- )- sizeProp tup@Tup5 (a :* b :* c :* d :* e :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- , WrapFull ic <- c- , WrapFull id <- d- , WrapFull ie <- e- = ( infoSize ia- , infoSize ib- , infoSize ic- , infoSize id- , infoSize ie- )- sizeProp tup@Tup6 (a :* b :* c :* d :* e :* g :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- , WrapFull ic <- c- , WrapFull id <- d- , WrapFull ie <- e- , WrapFull ig <- g- = ( infoSize ia- , infoSize ib- , infoSize ic- , infoSize id- , infoSize ie- , infoSize ig- )- sizeProp tup@Tup7 (a :* b :* c :* d :* e :* g :* h :* Nil)- | WrapFull ia <- a- , WrapFull ib <- b- , WrapFull ic <- c- , WrapFull id <- d- , WrapFull ie <- e- , WrapFull ig <- g- , WrapFull ih <- h- = ( infoSize ia- , infoSize ib- , infoSize ic- , infoSize id- , infoSize ie- , infoSize ig- , infoSize ih- )--instance Sharable (Select TypeCtx)- where- sharable _ = False--sel1Size :: (Sel1' a ~ b) => TypeRep a -> (Size a -> Size b)-sel1Size (Tup2Type _ _) = sel1-sel1Size (Tup3Type _ _ _) = sel1-sel1Size (Tup4Type _ _ _ _) = sel1-sel1Size (Tup5Type _ _ _ _ _) = sel1-sel1Size (Tup6Type _ _ _ _ _ _) = sel1-sel1Size (Tup7Type _ _ _ _ _ _ _) = sel1--sel2Size :: (Sel2' a ~ b) => TypeRep a -> (Size a -> Size b)-sel2Size (Tup2Type _ _) = sel2-sel2Size (Tup3Type _ _ _) = sel2-sel2Size (Tup4Type _ _ _ _) = sel2-sel2Size (Tup5Type _ _ _ _ _) = sel2-sel2Size (Tup6Type _ _ _ _ _ _) = sel2-sel2Size (Tup7Type _ _ _ _ _ _ _) = sel2--sel3Size :: (Sel3' a ~ b) => TypeRep a -> (Size a -> Size b)-sel3Size (Tup3Type _ _ _) = sel3-sel3Size (Tup4Type _ _ _ _) = sel3-sel3Size (Tup5Type _ _ _ _ _) = sel3-sel3Size (Tup6Type _ _ _ _ _ _) = sel3-sel3Size (Tup7Type _ _ _ _ _ _ _) = sel3--sel4Size :: (Sel4' a ~ b) => TypeRep a -> (Size a -> Size b)-sel4Size (Tup4Type _ _ _ _) = sel4-sel4Size (Tup5Type _ _ _ _ _) = sel4-sel4Size (Tup6Type _ _ _ _ _ _) = sel4-sel4Size (Tup7Type _ _ _ _ _ _ _) = sel4--sel5Size :: (Sel5' a ~ b) => TypeRep a -> (Size a -> Size b)-sel5Size (Tup5Type _ _ _ _ _) = sel5-sel5Size (Tup6Type _ _ _ _ _ _) = sel5-sel5Size (Tup7Type _ _ _ _ _ _ _) = sel5--sel6Size :: (Sel6' a ~ b) => TypeRep a -> (Size a -> Size b)-sel6Size (Tup6Type _ _ _ _ _ _) = sel6-sel6Size (Tup7Type _ _ _ _ _ _ _) = sel6--sel7Size :: (Sel7' a ~ b) => TypeRep a -> (Size a -> Size b)-sel7Size (Tup7Type _ _ _ _ _ _ _) = sel7--instance SizeProp (Select TypeCtx)- where- sizeProp sel@Sel1 (WrapFull ia :* Nil) =- sel1Size (infoType ia) (infoSize ia)- sizeProp sel@Sel2 (WrapFull ia :* Nil) =- sel2Size (infoType ia) (infoSize ia)- sizeProp sel@Sel3 (WrapFull ia :* Nil) =- sel3Size (infoType ia) (infoSize ia)- sizeProp sel@Sel4 (WrapFull ia :* Nil) =- sel4Size (infoType ia) (infoSize ia)- sizeProp sel@Sel5 (WrapFull ia :* Nil) =- sel5Size (infoType ia) (infoSize ia)- sizeProp sel@Sel6 (WrapFull ia :* Nil) =- sel6Size (infoType ia) (infoSize ia)- sizeProp sel@Sel7 (WrapFull ia :* Nil) =- sel7Size (infoType ia) (infoSize ia)---- | Compute a witness that a symbol and an expression have the same result type-tupEq :: Type (DenResult a) =>- sym a -> ASTF (Decor Info dom) b -> Maybe (TypeEq (DenResult a) b)-tupEq _ b = typeEq typeRep (infoType $ getInfo b)--instance- ( Tuple TypeCtx :<: dom- , Select TypeCtx :<: dom- , Optimize dom dom- ) =>- Optimize (Tuple TypeCtx) dom- where- constructFeatOpt tup@Tup2 (s1 :* s2 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , alphaEq a b- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt tup@Tup3 (s1 :* s2 :* s3 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , (prjDecorCtx typeCtx -> Just (_,Sel3)) :$ c <- s3- , alphaEq a b- , alphaEq a c- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt tup@Tup4 (s1 :* s2 :* s3 :* s4 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , (prjDecorCtx typeCtx -> Just (_,Sel3)) :$ c <- s3- , (prjDecorCtx typeCtx -> Just (_,Sel4)) :$ d <- s4- , alphaEq a b- , alphaEq a c- , alphaEq a d- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt tup@Tup5 (s1 :* s2 :* s3 :* s4 :* s5 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , (prjDecorCtx typeCtx -> Just (_,Sel3)) :$ c <- s3- , (prjDecorCtx typeCtx -> Just (_,Sel4)) :$ d <- s4- , (prjDecorCtx typeCtx -> Just (_,Sel5)) :$ e <- s5- , alphaEq a b- , alphaEq a c- , alphaEq a d- , alphaEq a e- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt tup@Tup6 (s1 :* s2 :* s3 :* s4 :* s5 :* s6 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , (prjDecorCtx typeCtx -> Just (_,Sel3)) :$ c <- s3- , (prjDecorCtx typeCtx -> Just (_,Sel4)) :$ d <- s4- , (prjDecorCtx typeCtx -> Just (_,Sel5)) :$ e <- s5- , (prjDecorCtx typeCtx -> Just (_,Sel6)) :$ f <- s6- , alphaEq a b- , alphaEq a c- , alphaEq a d- , alphaEq a e- , alphaEq a f- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt tup@Tup7 (s1 :* s2 :* s3 :* s4 :* s5 :* s6 :* s7 :* Nil)- | (prjDecorCtx typeCtx -> Just (_,Sel1)) :$ a <- s1- , (prjDecorCtx typeCtx -> Just (_,Sel2)) :$ b <- s2- , (prjDecorCtx typeCtx -> Just (_,Sel3)) :$ c <- s3- , (prjDecorCtx typeCtx -> Just (_,Sel4)) :$ d <- s4- , (prjDecorCtx typeCtx -> Just (_,Sel5)) :$ e <- s5- , (prjDecorCtx typeCtx -> Just (_,Sel6)) :$ f <- s6- , (prjDecorCtx typeCtx -> Just (_,Sel7)) :$ g <- s7- , alphaEq a b- , alphaEq a c- , alphaEq a d- , alphaEq a e- , alphaEq a f- , alphaEq a g- , TypeWit <- fromSatWit $ witnessSat tup- , Just TypeEq <- tupEq tup a- = return a-- constructFeatOpt feat args = constructFeatUnOpt feat args-- constructFeatUnOpt = constructFeatUnOptDefault---instance- ( Select TypeCtx :<: dom- , Tuple TypeCtx :<: dom- , Optimize dom dom- ) =>- Optimize (Select TypeCtx) dom- where- constructFeatOpt Sel1 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup2)) :$ a :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup3)) :$ a :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup4)) :$ a :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup5)) :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ a :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ a :$ _ :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a-- constructFeatOpt Sel2 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup2)) :$ _ :$ a) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup3)) :$ _ :$ a :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup4)) :$ _ :$ a :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup5)) :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ _ :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ a :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a-- constructFeatOpt Sel3 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup3)) :$ _ :$ _ :$ a) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup4)) :$ _ :$ _ :$ a :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup5)) :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ _ :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ _ :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a-- constructFeatOpt Sel4 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup4)) :$ _ :$ _ :$ _ :$ a) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup5)) :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ _ :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ _ :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a-- constructFeatOpt Sel5 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup5)) :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ _ :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ _ :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a-- constructFeatOpt Sel6 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup6)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a-- constructFeatOpt Sel7 (t :* Nil)- | ((prjDecorCtx typeCtx -> Just (_,Tup7)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a-- constructFeatOpt feat args = constructFeatUnOpt feat args-- constructFeatUnOpt = constructFeatUnOptDefault-
− Feldspar/Core/Frontend.hs
@@ -1,270 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}-{-# LANGUAGE OverlappingInstances #-}--module Feldspar.Core.Frontend- ( module Data.Patch- , Syntactic- , Internal-- , FeldDomainAll- , Data- , Syntax-- , module Frontend-- , reifyFeld- , showExpr- , printExpr- , showAST- , drawAST- , showDecor- , drawDecor- , eval- , evalTarget- , desugar- , sugar- , resugar-- -- * QuickCheck- , (===>)- , (===)-- -- * Type constraints- , tData- , tArr1- , tArr2- , tM- ) where----import Control.Monad.State-import Test.QuickCheck--import Data.Patch--import Language.Syntactic hiding- (desugar, sugar, resugar, printExpr, showAST, drawAST)-import qualified Language.Syntactic as Syntactic-import qualified Language.Syntactic.Constructs.Decoration as Syntactic-import Language.Syntactic.Constructs.Binding-import Language.Syntactic.Constructs.Binding.HigherOrder-import Language.Syntactic.Sharing.SimpleCodeMotion--import Feldspar.Lattice-import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Interpretation hiding (showDecor, drawDecor)-import Feldspar.Core.Constructs-import Feldspar.Core.Frontend.Array as Frontend-import Feldspar.Core.Frontend.Binding as Frontend-import Feldspar.Core.Frontend.Bits as Frontend-import Feldspar.Core.Frontend.Complex as Frontend-import Feldspar.Core.Frontend.Condition as Frontend-import Feldspar.Core.Frontend.ConditionM as Frontend-import Feldspar.Core.Frontend.Conversion as Frontend-import Feldspar.Core.Frontend.Eq as Frontend-import Feldspar.Core.Frontend.Error as Frontend-import Feldspar.Core.Frontend.FFI as Frontend-import Feldspar.Core.Frontend.Floating as Frontend-import Feldspar.Core.Frontend.Fractional as Frontend-import Feldspar.Core.Frontend.Integral as Frontend-import Feldspar.Core.Frontend.Literal as Frontend-import Feldspar.Core.Frontend.Logic as Frontend-import Feldspar.Core.Frontend.Loop as Frontend-import Feldspar.Core.Frontend.Mutable as Frontend-import Feldspar.Core.Frontend.MutableArray as Frontend-import Feldspar.Core.Frontend.MutableReference as Frontend-import Feldspar.Core.Frontend.MutableToPure as Frontend-import Feldspar.Core.Frontend.Par as Frontend-import Feldspar.Core.Frontend.Num as Frontend-import Feldspar.Core.Frontend.Ord as Frontend-import Feldspar.Core.Frontend.Save as Frontend-import Feldspar.Core.Frontend.SizeProp as Frontend-import Feldspar.Core.Frontend.SourceInfo as Frontend-import Feldspar.Core.Frontend.Trace as Frontend-import Feldspar.Core.Frontend.Tuple as Frontend---bindDict :: BindDict- TypeCtx- (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain))-bindDict = BindDict- { prjVariable = \a -> case a of- Decor _ (prjCtx typeCtx -> Just (Variable v)) -> Just v- _ -> Nothing-- , prjLambda = \a -> case a of- Decor _ (prjCtx typeCtx -> Just (Lambda v)) -> Just v- _ -> Nothing-- , injVariable = injVar- , injLambda = injLam- , injLet = injLt- }--injVar :: forall a . Sat TypeCtx a- => ASTF (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) a- -> VarId- -> (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) (Full a)-injVar a v- | TypeWit <- witness :: Witness TypeCtx a- = Decor (getInfo a) (inj (Variable v `withContext` typeCtx))--injLam :: forall a b . (Sat TypeCtx a, Sat TypeCtx b)- => ASTF (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) b- -> VarId- -> (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) (b :-> Full (a -> b))-injLam b v- | TypeWit <- witness :: Witness TypeCtx a- , TypeWit <- witness :: Witness TypeCtx b- = Decor- ((mkInfoTy (FunType typeRep typeRep)) {infoSize = infoSize (getInfo b)})- (inj (Lambda v `withContext` typeCtx))--injLt :: forall a b . (Sat TypeCtx a, Sat TypeCtx b)- => ASTF (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) b- -> (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) (a :-> (a -> b) :-> Full b)-injLt b- | TypeWit <- witness :: Witness TypeCtx b- = Decor (getInfo b) (inj (letBind typeCtx))------ | Reification and optimization of a Feldspar program-reifyFeld :: Syntactic a FeldDomainAll- => BitWidth n- -> a- -> ASTF (Decor Info (Lambda TypeCtx :+: Variable TypeCtx :+: FeldDomain)) (Internal a)-reifyFeld n = flip evalState 0 .- ( return- <=< codeMotion bindDict sharableDecor- . optimize- . targetSpecialization n- <=< reifyM- . Syntactic.desugar- )- -- Note that it's important to do 'codeMotion' after 'optimize'. There may be- -- sub-expressions that appear more than once in the original program, but- -- where 'optimize' removes all but one occurrence. If 'codeMotion' was run- -- first, these sub-expressions would be let bound, preventing subsequent- -- optimizations.--showExpr :: Syntactic a FeldDomainAll => a -> String-showExpr = render . reifyFeld N32--printExpr :: Syntactic a FeldDomainAll => a -> IO ()-printExpr = Syntactic.printExpr . reifyFeld N32--showAST :: Syntactic a FeldDomainAll => a -> String-showAST = Syntactic.showAST . reifyFeld N32--drawAST :: Syntactic a FeldDomainAll => a -> IO ()-drawAST = Syntactic.drawAST . reifyFeld N32---- | Draw a syntax tree decorated with type and size information-showDecor :: Syntactic a FeldDomainAll => a -> String-showDecor = Syntactic.showDecor . reifyFeld N32---- | Draw a syntax tree decorated with type and size information-drawDecor :: Syntactic a FeldDomainAll => a -> IO ()-drawDecor = Syntactic.drawDecor . reifyFeld N32--eval :: Syntactic a FeldDomainAll => a -> Internal a-eval = evalBind . reifyFeld N32--evalTarget- :: ( Syntactic a FeldDomainAll- , BoundedInt (GenericInt U n)- , BoundedInt (GenericInt S n)- )- => BitWidth n -> a -> Internal a-evalTarget n = evalBind . reifyFeld n- -- TODO This doesn't work yet, because 'targetSpecialization' is not- -- implemented--desugar :: Syntax a => a -> Data (Internal a)-desugar = Syntactic.resugar--sugar :: Syntax a => Data (Internal a) -> a-sugar = Syntactic.resugar--resugar :: (Syntax a, Syntax b, Internal a ~ Internal b) => a -> b-resugar = Syntactic.resugar--------------------------------------------------------------------------------------- * QuickCheck-----------------------------------------------------------------------------------instance (Type a, Arbitrary a) => Arbitrary (Data a)- where- arbitrary = fmap value arbitrary--instance Testable (Data Bool)- where- property = property . eval--(===>) :: Testable prop => Data Bool -> prop -> Property-a ===> b = eval a ==> b---class Equal a- where- (===) :: a -> a -> Property--instance (Prelude.Eq a, Show a) => Equal a- where- x === y = printTestCase ("Evaluated property: " ++ show x ++ " === " ++ show y)- $ property (x Prelude.== y)--instance (Show a, Arbitrary a, Equal b) => Equal (a -> b)- where- f === g = property (\x -> f x === g x)-------------------------------------------------------------------------------------- * Type annotations-----------------------------------------------------------------------------------tData :: Patch a a -> Patch (Data a) (Data a)-tData _ = id--tArr1 :: Patch a a -> Patch (Data [a]) (Data [a])-tArr1 _ = id--tArr2 :: Patch a a -> Patch (Data [[a]]) (Data [[a]])-tArr2 _ = id--tM :: Patch a a -> Patch (M a) (M a)-tM _ = id-
− Feldspar/Core/Frontend/Array.hs
@@ -1,63 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Array-where--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Array-import Feldspar.Core.Frontend.Tuple--import Language.Syntactic--parallel :: Type a => Data Length -> (Data Index -> Data a) -> Data [a]-parallel = sugarSym Parallel--sequential :: (Type a, Syntax s) =>- Data Length -> s -> (Data Index -> s -> (Data a,s)) -> Data [a]-sequential = sugarSym Sequential--append :: Type a => Data [a] -> Data [a] -> Data [a]-append = sugarSym Append--getLength :: Type a => Data [a] -> Data Length-getLength = sugarSym GetLength---- | Change the length of the vector to the supplied value. If the supplied--- length is greater than the old length, the new elements will have undefined--- value.-setLength :: Type a => Data Length -> Data [a] -> Data [a]-setLength = sugarSym SetLength--getIx :: Type a => Data [a] -> Data Index -> Data a-getIx = sugarSym GetIx--setIx :: Type a => Data [a] -> Data Index -> Data a -> Data [a]-setIx = sugarSym SetIx-
− Feldspar/Core/Frontend/Binding.hs
@@ -1,43 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Binding where----import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs.Binding-import Feldspar.Core.Constructs----share :: (Syntax a, Syntax b) => a -> (a -> b) -> b-share = sugarSym (letBind typeCtx)-
− Feldspar/Core/Frontend/Bits.hs
@@ -1,122 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Bits-where--import Prelude hiding (Integral(..))--import Data.Int-import Data.Word--import Language.Syntactic--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Bits-import Feldspar.Core.Frontend.Integral--import qualified Data.Bits as B--infixl 5 .<<.,.>>.-infixl 4 ⊕---- TODO Make (Size a ~ Range a) a super-class constraint when going to newer GHC-class (Type a, B.Bits a, Integral a, Bounded a) => Bits a- where- -- Logical operations- (.&.) :: (Size a ~ Range a) => Data a -> Data a -> Data a- (.&.) = sugarSym BAnd- (.|.) :: (Size a ~ Range a) => Data a -> Data a -> Data a- (.|.) = sugarSym BOr- xor :: (Size a ~ Range a) => Data a -> Data a -> Data a- xor = sugarSym BXor- complement :: (Size a ~ Range a) => Data a -> Data a- complement = sugarSym Complement-- -- Bitwise operations- bit :: (Size a ~ Range a) => Data Index -> Data a- bit = sugarSym Bit- setBit :: (Size a ~ Range a) => Data a -> Data Index -> Data a- setBit = sugarSym SetBit- clearBit :: (Size a ~ Range a) => Data a -> Data Index -> Data a- clearBit = sugarSym ClearBit- complementBit :: (Size a ~ Range a) => Data a -> Data Index -> Data a- complementBit = sugarSym ComplementBit- testBit :: (Size a ~ Range a) => Data a -> Data Index -> Data Bool- testBit = sugarSym TestBit-- -- Movement operations- shiftLU :: (Size a ~ Range a) => Data a -> Data Index -> Data a- shiftLU = sugarSym ShiftLU- shiftRU :: (Size a ~ Range a) => Data a -> Data Index -> Data a- shiftRU = sugarSym ShiftRU- shiftL :: (Size a ~ Range a) => Data a -> Data IntN -> Data a- shiftL = sugarSym ShiftL- shiftR :: (Size a ~ Range a) => Data a -> Data IntN -> Data a- shiftR = sugarSym ShiftR- rotateLU :: (Size a ~ Range a) => Data a -> Data Index -> Data a- rotateLU = sugarSym RotateLU- rotateRU :: (Size a ~ Range a) => Data a -> Data Index -> Data a- rotateRU = sugarSym RotateRU- rotateL :: (Size a ~ Range a) => Data a -> Data IntN -> Data a- rotateL = sugarSym RotateL- rotateR :: (Size a ~ Range a) => Data a -> Data IntN -> Data a- rotateR = sugarSym RotateR- reverseBits :: (Size a ~ Range a) => Data a -> Data a- reverseBits = sugarSym ReverseBits-- bitScan :: (Size a ~ Range a) => Data a -> Data Index- bitScan = sugarSym BitScan- bitCount :: (Size a ~ Range a) => Data a -> Data Index- bitCount = sugarSym BitCount-- bitSize :: (Size a ~ Range a) => Data a -> Data Index- bitSize = sugarSym BitSize- isSigned :: (Size a ~ Range a) => Data a -> Data Bool- isSigned = sugarSym IsSigned--(⊕) :: (Bits a, Size a ~ Range a) => Data a -> Data a -> Data a-(⊕) = xor-(.<<.) :: (Bits a, Size a ~ Range a) => Data a -> Data Index -> Data a-(.<<.) = shiftLU-(.>>.) :: (Bits a, Size a ~ Range a) => Data a -> Data Index -> Data a-(.>>.) = shiftRU--instance Bits Word8-instance Bits Word16-instance Bits Word32-instance Bits Word64-instance Bits WordN-instance Bits Int8-instance Bits Int16-instance Bits Int32-instance Bits Int64-instance Bits IntN-
− Feldspar/Core/Frontend/Complex.hs
@@ -1,75 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Complex-where--import Data.Complex (Complex)--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Complex-import Feldspar.Core.Frontend.Num--import Language.Syntactic--complex :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)-complex = sugarSym MkComplex--realPart :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a-realPart = sugarSym RealPart--imagPart :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a-imagPart = sugarSym ImagPart--conjugate :: (Numeric a, RealFloat a) => Data (Complex a) -> Data (Complex a)-conjugate = sugarSym Conjugate--mkPolar :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)-mkPolar = sugarSym MkPolar--cis :: (Numeric a, RealFloat a) => Data a -> Data (Complex a)-cis = sugarSym Cis--magnitude :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a-magnitude = sugarSym Magnitude--phase :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a-phase = sugarSym Phase--polar :: (Numeric a, RealFloat a) => Data (Complex a) -> (Data a, Data a)-polar c = (magnitude c, phase c)--infixl 6 +.--(+.) :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)-(+.) = complex--iunit :: (Numeric a, RealFloat a) => Data (Complex a)-iunit = 0 +. 1-
− Feldspar/Core/Frontend/Condition.hs
@@ -1,48 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Condition where----import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs.Condition-import Feldspar.Core.Constructs----condition :: (Syntax a) => Data Bool -> a -> a -> a-condition = sugarSymCtx typeCtx Condition--(?) :: (Syntax a) => Data Bool -> (a, a) -> a-c ? (t, e) = condition c t e--infix 1 ?-
− Feldspar/Core/Frontend/ConditionM.hs
@@ -1,42 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.ConditionM where----import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs.ConditionM-import Feldspar.Core.Constructs--import Feldspar.Core.Frontend.Mutable--ifM :: Syntax a => Data Bool -> M a -> M a -> M a-ifM = sugarSym ConditionM
− Feldspar/Core/Frontend/Conversion.hs
@@ -1,67 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Conversion-where--import Prelude hiding (Integral)--import Language.Syntactic--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Conversion-import Feldspar.Core.Frontend.Integral-import Feldspar.Core.Frontend.Num--i2f :: (Integral a, Size a ~ Range a) => Data a -> Data Float-i2f = i2n--f2i :: Integral a => Data Float -> Data a-f2i = sugarSym F2I--i2n :: (Integral a, Numeric b, Size a ~ Range a) => Data a -> Data b-i2n = sugarSym I2N--b2i :: Integral a => Data Bool -> Data a-b2i = sugarSym B2I--truncate :: Integral a => Data Float -> Data a-truncate = f2i--round :: Integral a => Data Float -> Data a-round = sugarSym Round--ceiling :: Integral a => Data Float -> Data a-ceiling = sugarSym Ceiling--floor :: Integral a => Data Float -> Data a-floor = sugarSym Floor--
− Feldspar/Core/Frontend/Eq.hs
@@ -1,77 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Eq-where--import qualified Prelude as P--import Data.Int-import Data.Word-import Data.Complex--import Language.Syntactic--import Feldspar.Prelude-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Eq--infix 4 ==-infix 4 /=---- | Redefinition of the standard 'P.Eq' class for Feldspar-class (Type a) => Eq a- where- (==) :: Data a -> Data a -> Data Bool- (==) = sugarSym Equal- (/=) :: Data a -> Data a -> Data Bool- (/=) = sugarSym NotEqual--instance Eq ()-instance Eq Bool-instance Eq Float-instance Eq Word8-instance Eq Word16-instance Eq Word32-instance Eq Word64-instance Eq WordN-instance Eq Int8-instance Eq Int16-instance Eq Int32-instance Eq Int64-instance Eq IntN--instance (Eq a, Eq b) => Eq (a,b)-instance (Eq a, Eq b, Eq c) => Eq (a,b,c)-instance (Eq a, Eq b, Eq c, Eq d) => Eq (a,b,c,d)-instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a,b,c,d,e)-instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) => Eq (a,b,c,d,e,f)-instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) => Eq (a,b,c,d,e,f,g)--instance (Eq a, RealFloat a) => Eq (Complex a)
− Feldspar/Core/Frontend/Error.hs
@@ -1,55 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Error where----import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Error-import Feldspar.Core.Frontend.Literal----undef :: Syntax a => a-undef = sugarSym Undefined---- | Assert that the condition holds or fail with message-assertMsg :: Syntax a => String -> Data Bool -> a -> a-assertMsg = sugarSym . Assert---- | Assert that the condition holds, the conditions string representation is used as the message-assert :: Syntax a => Data Bool -> a -> a-assert cond = assertMsg (show cond) cond--err :: Syntax a => String -> a-err msg = assertMsg msg false undef-
− Feldspar/Core/Frontend/FFI.hs
@@ -1,45 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.FFI where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.FFI--foreignImport :: ( Type (DenResult a)- , Signature a- , SyntacticN c b- , ApplySym a b dom- , FFI :<: dom- )- => String -> Denotation a -> c-foreignImport name f = sugarSym (ForeignImport name f)-
− Feldspar/Core/Frontend/Floating.hs
@@ -1,85 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Floating where--import qualified Prelude-import Prelude (Float)-import Data.Complex--import Language.Syntactic--import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Floating-import Feldspar.Core.Frontend.Literal-import Feldspar.Core.Frontend.Fractional---- Make new class, with "Data" in all the types--infixr 8 **--class (Fraction a, Prelude.Floating a) => Floating a where- pi :: Data a- pi = value Prelude.pi- exp :: Data a -> Data a- exp = sugarSym Exp- sqrt :: Data a -> Data a- sqrt = sugarSym Sqrt- log :: Data a -> Data a- log = sugarSym Log- (**) :: Data a -> Data a -> Data a- (**) = sugarSym Pow- logBase :: Data a -> Data a -> Data a- logBase = sugarSym LogBase- sin :: Data a -> Data a- sin = sugarSym Sin- tan :: Data a -> Data a- tan = sugarSym Tan- cos :: Data a -> Data a- cos = sugarSym Cos- asin :: Data a -> Data a- asin = sugarSym Asin- atan :: Data a -> Data a- atan = sugarSym Atan- acos :: Data a -> Data a- acos = sugarSym Acos- sinh :: Data a -> Data a- sinh = sugarSym Sinh- tanh :: Data a -> Data a- tanh = sugarSym Tanh- cosh :: Data a -> Data a- cosh = sugarSym Cosh- asinh :: Data a -> Data a- asinh = sugarSym Asinh- atanh :: Data a -> Data a- atanh = sugarSym Atanh- acosh :: Data a -> Data a- acosh = sugarSym Acosh--instance Floating Float-instance (Fraction a, Prelude.RealFloat a) => Floating (Complex a)
− Feldspar/Core/Frontend/Fractional.hs
@@ -1,62 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Fractional-where--import Data.Complex--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Fractional--import Feldspar.Core.Frontend.Literal-import Feldspar.Core.Frontend.Num---- | Fractional types. The relation to the standard 'Fractional' class is------ @instance `Fration` a => `Fractional` (`Data` a)@-class (Fractional a, Numeric a) => Fraction a- where- fromRationalFrac :: Rational -> Data a- fromRationalFrac = value . fromRational-- divFrac :: Data a -> Data a -> Data a- divFrac = sugarSym DivFrac--instance Fraction Float--instance (Fraction a, RealFloat a) => Fraction (Complex a)--instance (Fraction a) => Fractional (Data a)- where- fromRational = fromRationalFrac- (/) = divFrac-
− Feldspar/Core/Frontend/Integral.hs
@@ -1,84 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Integral-where--import qualified Prelude as P--import Data.Int-import Data.Word--import Language.Syntactic--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Integral--import Feldspar.Core.Frontend.Condition-import Feldspar.Core.Frontend.Eq-import Feldspar.Core.Frontend.Logic-import Feldspar.Core.Frontend.Num-import Feldspar.Core.Frontend.Ord--import Feldspar.Core.Frontend.Num---- TODO Make (Size a ~ Range a) a super-class constraint when going to newer GHC-class (Ord a, Numeric a, BoundedInt a, P.Integral a) => Integral a- where- quot :: (Size a ~ Range a) => Data a -> Data a -> Data a- quot = sugarSym Quot- rem :: (Size a ~ Range a) => Data a -> Data a -> Data a- rem = sugarSym Rem- div :: (Size a ~ Range a) => Data a -> Data a -> Data a- div = divSem- mod :: (Size a ~ Range a) => Data a -> Data a -> Data a- mod = sugarSym Mod- (^) :: (Size a ~ Range a) => Data a -> Data a -> Data a- (^) = sugarSym Exp---- TODO: This is a short-term hack because the compiler doesn't compile--- the Div construct correctly. So we give the semantics of div in terms of--- quot directly, and never use the Div construct. In the long term the--- compiler should be fixed, but it involves writing type corrector plugins--- and this solution was quicker.-divSem x y = (x > 0 && y < 0 || x < 0 && y > 0) && rem x y /= 0 ?- (quot x y P.- 1,quot x y)--instance Integral Word8-instance Integral Word16-instance Integral Word32-instance Integral Word64-instance Integral WordN-instance Integral Int8-instance Integral Int16-instance Integral Int32-instance Integral Int64-instance Integral IntN-
− Feldspar/Core/Frontend/Literal.hs
@@ -1,55 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Literal where----import Language.Syntactic-import Feldspar.Core.Types-import Feldspar.Core.Constructs.Literal-import Feldspar.Core.Constructs---value :: Syntax a => Internal a -> a-value = sugarSymCtx typeCtx . Literal--false :: Data Bool-false = value False--true :: Data Bool-true = value True--instance Syntactic () FeldDomainAll- where- type Internal () = ()- desugar = appSymCtx typeCtx . Literal- sugar _ = ()--instance Syntax ()-
− Feldspar/Core/Frontend/Logic.hs
@@ -1,62 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Logic-where--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Logic-import Feldspar.Core.Frontend.Literal-import Feldspar.Core.Frontend.Condition--import Language.Syntactic--infixr 3 &&-infixr 3 &&*-infixr 2 ||-infixr 2 ||*--not :: Data Bool -> Data Bool-not = sugarSym Not--(&&) :: Data Bool -> Data Bool -> Data Bool-(&&) = sugarSym And--(||) :: Data Bool -> Data Bool -> Data Bool-(||) = sugarSym Or----- | Lazy conjunction, second argument only evaluated if necessary-(&&*) :: Data Bool -> Data Bool -> Data Bool-a &&* b = a ? (b,false)---- | Lazy disjunction, second argument only evaluated if necessary-(||*) :: Data Bool -> Data Bool -> Data Bool-a ||* b = a ? (true,b)-
− Feldspar/Core/Frontend/Loop.hs
@@ -1,51 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Loop-where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Loop--import Feldspar.Core.Frontend.Mutable--forLoop :: Syntax a => Data Length -> a -> (Data Index -> a -> a) -> a-forLoop = sugarSym ForLoop--whileLoop :: Syntax a => a -> (a -> Data Bool) -> (a -> a) -> a-whileLoop = sugarSym WhileLoop--forM :: (Syntax a) => Data Length -> (Data Index -> M a) -> M ()-forM = sugarSym For--whileM :: Syntax a => M (Data Bool) -> M a -> M ()-whileM = sugarSym While-
− Feldspar/Core/Frontend/Mutable.hs
@@ -1,65 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Mutable-where--import Prelude hiding (not)--import Data.Typeable--import Language.Syntactic-import Language.Syntactic.Frontend.Monad--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Loop-import Feldspar.Core.Frontend.Num-import Feldspar.Core.Frontend.Logic-import Feldspar.Core.Frontend.Tuple-import qualified Feldspar.Core.Constructs.Mutable as Feature-import qualified Feldspar.Core.Constructs.MutableReference as Feature-import qualified Feldspar.Core.Constructs.MutableArray as Feature--newtype M a = M { unM :: Mon TypeCtx FeldDomain Mut a }- deriving (Functor, Monad)--instance Syntax a => Syntactic (M a) FeldDomainAll- where- type Internal (M a) = Mut (Internal a)- desugar = desugar . unM- sugar = M . sugar--runMutable :: (Syntax a) => M a -> a-runMutable = sugarSym Feature.Run--when :: Data Bool -> M () -> M ()-when = sugarSym Feature.When--unless :: Data Bool -> M () -> M ()-unless = when . not
− Feldspar/Core/Frontend/MutableArray.hs
@@ -1,78 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.MutableArray-where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Loop-import Feldspar.Core.Constructs.MutableArray-import Feldspar.Core.Frontend.Mutable--newArr :: Type a => Data Length -> Data a -> M (Data (MArr a))-newArr = sugarSym NewArr--newArr_ :: Type a => Data Length -> M (Data (MArr a))-newArr_ = sugarSym NewArr_--newListArr :: Type a => [Data a] -> M (Data (MArr a))-newListArr es = error "newListArr: unimplemented" -- TODO--getArr :: Type a => Data (MArr a) -> Data Index -> M (Data a)-getArr = sugarSym GetArr--setArr :: Type a => Data (MArr a) -> Data Index -> Data a -> M ()-setArr = sugarSym SetArr--modifyArr :: Type a- => Data (MArr a) -> Data Index -> (Data a -> Data a) -> M ()-modifyArr arr i f = getArr arr i >>= setArr arr i . f--arrLength :: Type a => Data (MArr a) -> M (Data Length)-arrLength = sugarSym ArrLength--mapArray :: Type a => (Data a -> Data a) -> Data (MArr a) -> M (Data (MArr a))-mapArray f arr = do- len <- arrLength arr- forArr len (flip (modifyArr arr) f)- return arr--forArr :: Syntax a => Data Length -> (Data Index -> M a) -> M ()-forArr = sugarSym For--swap :: Syntax a- => Data (MArr (Internal a)) -> Data Index -> Data Index -> M ()-swap a i1 i2 = do- tmp1 <- getArr a i1- tmp2 <- getArr a i2- setArr a i1 tmp2 :: M ()- setArr a i2 tmp1 :: M ()-
− Feldspar/Core/Frontend/MutableReference.hs
@@ -1,62 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.MutableReference-where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.MutableReference-import Feldspar.Core.Frontend.Mutable--import Data.IORef--newtype Ref a = Ref { unRef :: Data (IORef (Internal a)) }--instance Syntax a => Syntactic (Ref a) FeldDomainAll- where- type Internal (Ref a) = IORef (Internal a)- desugar = desugar . unRef- sugar = Ref . sugar--instance Syntax a => Syntax (Ref a)--newRef :: Syntax a => a -> M (Ref a)-newRef = sugarSym NewRef--getRef :: Syntax a => Ref a -> M a-getRef = sugarSym GetRef--setRef :: Syntax a => Ref a -> a -> M ()-setRef = sugarSym SetRef--modifyRef :: Syntax a => Ref a -> (a -> a) -> M ()-modifyRef r f = getRef r >>= setRef r . f-
− Feldspar/Core/Frontend/MutableToPure.hs
@@ -1,57 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.MutableToPure where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.MutableToPure-import Feldspar.Core.Frontend.Array-import Feldspar.Core.Frontend.Loop-import Feldspar.Core.Frontend.Mutable-import Feldspar.Core.Frontend.MutableArray---withArray :: (Type a, Syntax b) => Data (MArr a) -> (Data [a] -> M b) -> M b-withArray = sugarSym WithArray--runMutableArray :: Type a => M (Data (MArr a)) -> Data [a]-runMutableArray = sugarSym RunMutableArray--freezeArray :: Type a => Data (MArr a) -> M (Data [a])-freezeArray marr = withArray marr return--thawArray :: Type a => Data [a] -> M (Data (MArr a))-thawArray arr = do- marr <- newArr_ (getLength arr)- forM (getLength arr) (\ix ->- setArr marr ix (getIx arr ix)- )- return marr
− Feldspar/Core/Frontend/Num.hs
@@ -1,82 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Num where--import Data.Complex-import Data.Int-import Data.Word--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Num-import Feldspar.Core.Frontend.Literal---class (Type a, Num a, Num (Size a)) => Numeric a- where- fromIntegerNum :: Integer -> Data a- fromIntegerNum = value . fromInteger- absNum :: Data a -> Data a- absNum = sugarSym Abs- signumNum :: Data a -> Data a- signumNum = sugarSym Sign- addNum :: Data a -> Data a -> Data a- addNum = sugarSym Add- subNum :: Data a -> Data a -> Data a- subNum = sugarSym Sub- mulNum :: Data a -> Data a -> Data a- mulNum = sugarSym Mul--instance Numeric Word8-instance Numeric Word16-instance Numeric Word32-instance Numeric Word64-instance Numeric WordN-instance Numeric Int8-instance Numeric Int16-instance Numeric Int32-instance Numeric Int64-instance Numeric IntN--instance Numeric Float--instance (Type a, RealFloat a) => Numeric (Complex a)--instance (Numeric a) => Num (Data a)- where- fromInteger = fromIntegerNum- abs = absNum- signum = signumNum- (+) = addNum- (-) = subNum- (*) = mulNum--
− Feldspar/Core/Frontend/Ord.hs
@@ -1,86 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Frontend.Ord where----import qualified Prelude--import Data.Complex-import Data.Int-import Data.Word--import Language.Syntactic--import Feldspar.Prelude-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Ord-import Feldspar.Core.Frontend.Eq--infix 4 <-infix 4 >-infix 4 <=-infix 4 >=---- | Redefinition of the standard 'Prelude.Ord' class for Feldspar-class (Eq a, Prelude.Ord a, Prelude.Ord (Size a)) => Ord a where- (<) :: Data a -> Data a -> Data Bool- (<) = sugarSym LTH- (>) :: Data a -> Data a -> Data Bool- (>) = sugarSym GTH-- (<=) :: Data a -> Data a -> Data Bool- (<=) = sugarSym LTE- (>=) :: Data a -> Data a -> Data Bool- (>=) = sugarSym GTE-- min :: Data a -> Data a -> Data a- min = sugarSym Min- max :: Data a -> Data a -> Data a- max = sugarSym Max--instance Ord ()-instance Ord Bool-instance Ord Word8-instance Ord Int8-instance Ord Word16-instance Ord Int16-instance Ord Word32-instance Ord Int32-instance Ord Word64-instance Ord Int64-instance Ord WordN-instance Ord IntN-instance Ord Float---- TODO Should there be more instances?-
− Feldspar/Core/Frontend/Par.hs
@@ -1,59 +0,0 @@------ Copyright (c) 2009-2011, 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.Core.Frontend.Par where--import Language.Syntactic-import Language.Syntactic.Frontend.Monad (Mon(..))--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Par-import Feldspar.Core.Frontend.Literal ()--import Data.Typeable--newtype P a = P { unP :: Mon TypeCtx FeldDomain Par a }- deriving (Functor, Monad)--instance Syntax a => Syntactic (P a) FeldDomainAll- where- type Internal (P a) = Par (Internal a)- desugar = desugar . unP- sugar = P . sugar--newtype IVar a = IVar { unIVar :: Data (IV (Internal a)) }--instance Syntax a => Syntactic (IVar a) FeldDomainAll- where- type Internal (IVar a) = IV (Internal a)- desugar = desugar . unIVar- sugar = IVar . sugar--instance Syntax a => Syntax (IVar a)-
− Feldspar/Core/Frontend/Save.hs
@@ -1,60 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | Tracing execution of Feldspar expressions--module Feldspar.Core.Frontend.Save where----import Language.Syntactic--import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Save------ | An identity function that guarantees that the result will be computed as a--- sub-result of the whole program. This is useful to prevent certain--- optimizations.------ Exception: Currently constant folding does not respect 'save'.-save :: Syntax a => a -> a-save = sugarSym Save- -- TODO Make constant folding respect `save`. This could be done by adding a- -- field to `Info` saying whether or not each node contains `save`.-- -- TODO It would be nice if `save` could take a `String` argument that would- -- be used in the back-end to identify the saved value (e.g. used as the- -- variable name).---- | Equivalent to 'save'. When applied to a lazy data structure, 'force' (and--- 'save') has the effect of forcing evaluation of the whole structure.-force :: Syntax a => a -> a-force = save-
− Feldspar/Core/Frontend/SizeProp.hs
@@ -1,80 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | The functions in this module can be used to help size inference (which, in--- turn, helps deriving upper bounds of array sizes and helps optimization).--module Feldspar.Core.Frontend.SizeProp where----import Language.Syntactic--import Feldspar.Range-import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.SizeProp-import Feldspar.Core.Frontend.Literal------ | An identity function affecting the abstract size information used during--- optimization. The application of a 'SizeCap' is a /guarantee/ (by the caller)--- that the argument is within a certain size (determined by the creator of the--- 'SizeCap', e.g. 'sizeProp').------ /Warning: If the guarantee is not fulfilled, optimizations become unsound!/------ In general, the size of the resulting value is the intersection of the cap--- size and the size obtained by ordinary size inference. That is, a 'SizeCap'--- can only make the size more precise, not less precise.-type SizeCap a = Data a -> Data a---- | @sizeProp prop a b@: A guarantee that @b@ is within the size @(prop sa)@,--- where @sa@ is the size of @a@.-sizeProp :: (Syntax a, Type b) =>- (Size (Internal a) -> Size b) -> a -> SizeCap b-sizeProp = sugarSym . PropSize---- | A guarantee that the argument is within the given size-cap :: Type a => Size a -> SizeCap a-cap sz = sizeProp (const sz) (Data $ desugar ())---- | @notAbove a b@: A guarantee that @b <= a@ holds-notAbove :: (Type a, Bounded a, Size a ~ Range a) => Data a -> SizeCap a-notAbove = sizeProp (\r -> Range minBound (upperBound r))---- | @notBelow a b@: A guarantee that @b >= a@ holds-notBelow :: (Type a, Bounded a, Size a ~ Range a) => Data a -> SizeCap a-notBelow = sizeProp (\r -> Range (lowerBound r) maxBound)---- | @between l u a@: A guarantee that @l <= a <= u@ holds-between :: (Type a, Bounded a, Size a ~ Range a) =>- Data a -> Data a -> SizeCap a-between l u = notBelow l . notAbove u-
− Feldspar/Core/Frontend/SourceInfo.hs
@@ -1,54 +0,0 @@------ Copyright (c) 2009-2011, 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 OverlappingInstances #-}---- | Source-code annotations--module Feldspar.Core.Frontend.SourceInfo where----import QuickAnnotate--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs.SourceInfo-import Feldspar.Core.Constructs------ | Annotate an expression with information about its source code-sourceData :: Type a => SourceInfo1 a -> Data a -> Data a-sourceData info = sugarSym (Decor info (Id `withContext` typeCtx))--instance Type a => Annotatable (Data a)- where- annotate = sourceData . SourceInfo1-
− Feldspar/Core/Frontend/Trace.hs
@@ -1,45 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | Tracing execution of Feldspar expressions--module Feldspar.Core.Frontend.Trace where--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs-import Feldspar.Core.Constructs.Trace-import Feldspar.Core.Frontend.Num----- | Tracing execution of an expression. Semantically, this is the identity--- function, but a back end may treat this function specially, for example write--- its arguments to a log.-trace :: Numeric a => Int -> Data a -> Data a-trace label = sugarSym Trace (fromIntegral label :: Data IntN)
− Feldspar/Core/Frontend/Tuple.hs
@@ -1,264 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Frontend.Tuple where----import QuickAnnotate--import Language.Syntactic--import Feldspar.Core.Types-import Feldspar.Core.Constructs.Tuple-import Feldspar.Core.Constructs-import Feldspar.Core.Frontend.SourceInfo----instance- ( Syntax a- , Syntax b- ) =>- Syntactic (a,b) FeldDomainAll- where- type Internal (a,b) =- ( Internal a- , Internal b- )-- desugar = desugarTup2 typeCtx- sugar = sugarTup2 typeCtx--instance- ( Syntax a- , Syntax b- , Syntax c- ) =>- Syntactic (a,b,c) FeldDomainAll- where- type Internal (a,b,c) =- ( Internal a- , Internal b- , Internal c- )-- desugar = desugarTup3 typeCtx- sugar = sugarTup3 typeCtx--instance- ( Syntax a- , Syntax b- , Syntax c- , Syntax d- ) =>- Syntactic (a,b,c,d) FeldDomainAll- where- type Internal (a,b,c,d) =- ( Internal a- , Internal b- , Internal c- , Internal d- )-- desugar = desugarTup4 typeCtx- sugar = sugarTup4 typeCtx--instance- ( Syntax a- , Syntax b- , Syntax c- , Syntax d- , Syntax e- ) =>- Syntactic (a,b,c,d,e) FeldDomainAll- where- type Internal (a,b,c,d,e) =- ( Internal a- , Internal b- , Internal c- , Internal d- , Internal e- )-- desugar = desugarTup5 typeCtx- sugar = sugarTup5 typeCtx--instance- ( Syntax a- , Syntax b- , Syntax c- , Syntax d- , Syntax e- , Syntax f- ) =>- Syntactic (a,b,c,d,e,f) FeldDomainAll- where- type Internal (a,b,c,d,e,f) =- ( Internal a- , Internal b- , Internal c- , Internal d- , Internal e- , Internal f- )-- desugar = desugarTup6 typeCtx- sugar = sugarTup6 typeCtx--instance- ( Syntax a- , Syntax b- , Syntax c- , Syntax d- , Syntax e- , Syntax f- , Syntax g- ) =>- Syntactic (a,b,c,d,e,f,g) FeldDomainAll- where- type Internal (a,b,c,d,e,f,g) =- ( Internal a- , Internal b- , Internal c- , Internal d- , Internal e- , Internal f- , Internal g- )-- desugar = desugarTup7 typeCtx- sugar = sugarTup7 typeCtx--instance (Syntax a, Syntax b) => Syntax (a,b)-instance (Syntax a, Syntax b, Syntax c) => Syntax (a,b,c)-instance (Syntax a, Syntax b, Syntax c, Syntax d) => Syntax (a,b,c,d)-instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e) => Syntax (a,b,c,d,e)-instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e, Syntax f) => Syntax (a,b,c,d,e,f)-instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e, Syntax f, Syntax g) => Syntax (a,b,c,d,e,f,g)----instance- ( Annotatable a- , Annotatable b- ) =>- Annotatable (a,b)- where- annotate info (a,b) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- )--instance- ( Annotatable a- , Annotatable b- , Annotatable c- ) =>- Annotatable (a,b,c)- where- annotate info (a,b,c) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- , annotate (info ++ " (tuple element 3)") c- )--instance- ( Annotatable a- , Annotatable b- , Annotatable c- , Annotatable d- ) =>- Annotatable (a,b,c,d)- where- annotate info (a,b,c,d) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- , annotate (info ++ " (tuple element 3)") c- , annotate (info ++ " (tuple element 4)") d- )--instance- ( Annotatable a- , Annotatable b- , Annotatable c- , Annotatable d- , Annotatable e- ) =>- Annotatable (a,b,c,d,e)- where- annotate info (a,b,c,d,e) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- , annotate (info ++ " (tuple element 3)") c- , annotate (info ++ " (tuple element 4)") d- , annotate (info ++ " (tuple element 5)") e- )--instance- ( Annotatable a- , Annotatable b- , Annotatable c- , Annotatable d- , Annotatable e- , Annotatable f- ) =>- Annotatable (a,b,c,d,e,f)- where- annotate info (a,b,c,d,e,f) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- , annotate (info ++ " (tuple element 3)") c- , annotate (info ++ " (tuple element 4)") d- , annotate (info ++ " (tuple element 5)") e- , annotate (info ++ " (tuple element 6)") f- )--instance- ( Annotatable a- , Annotatable b- , Annotatable c- , Annotatable d- , Annotatable e- , Annotatable f- , Annotatable g- ) =>- Annotatable (a,b,c,d,e,f,g)- where- annotate info (a,b,c,d,e,f,g) =- ( annotate (info ++ " (tuple element 1)") a- , annotate (info ++ " (tuple element 2)") b- , annotate (info ++ " (tuple element 3)") c- , annotate (info ++ " (tuple element 4)") d- , annotate (info ++ " (tuple element 5)") e- , annotate (info ++ " (tuple element 6)") f- , annotate (info ++ " (tuple element 7)") g- )-
− Feldspar/Core/Interpretation.hs
@@ -1,398 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}---- | Defines different interpretations of Feldspar programs--module Feldspar.Core.Interpretation- ( module Language.Syntactic.Constructs.Decoration-- , targetSpecialization- , Sharable (..)- , sharableDecor- , SizeProp (..)- , sizePropDefault- , resultType- , SourceInfo- , Info (..)- , mkInfo- , mkInfoTy- , infoRange- , LatticeSize1 (..)- , viewLiteral- , literalDecor- , constFold- , SomeInfo (..)- , Env (..)- , localVar- , localSource- , Opt- , Optimize (..)- , constructFeat- , optimizeM- , optimize- , constructFeatUnOptDefaultTyp- , constructFeatUnOptDefault- , optimizeFeatDefault- ) where----import Control.Monad.Reader-import Control.Monad.Writer-import Data.Map as Map--- import Data.Set as Set-import Data.Typeable (Typeable)--import Language.Syntactic-import Language.Syntactic.Constructs.Decoration-import Language.Syntactic.Constructs.Literal-import Language.Syntactic.Constructs.Binding-import qualified Language.Syntactic.Constructs.Binding.Optimize as Synt -- For Haddock--import Feldspar.Lattice-import Feldspar.Core.Types--------------------------------------------------------------------------------------- * Target specialization------------------------------------------------------------------------------------- | Specialize the program for a target platform with the given native bit--- width-targetSpecialization :: BitWidth n -> ASTF dom a -> ASTF dom a--- TODO targetSpecialization :: BitWidth n -> ASTF dom a -> ASTF dom (TargetType n a)-targetSpecialization _ = id--------------------------------------------------------------------------------------- * Code motion-----------------------------------------------------------------------------------class Sharable dom- where- sharable :: dom a -> Bool- sharable _ = True--instance (Sharable sub1, Sharable sub2) => Sharable (sub1 :+: sub2)- where- sharable (InjL a) = sharable a- sharable (InjR a) = sharable a--sharableDecor :: Sharable dom => Decor info dom a -> Bool-sharableDecor = sharable . decorExpr--------------------------------------------------------------------------------------- * Size propagation------------------------------------------------------------------------------------- | Forwards size propagation-class SizeProp feature- where- -- | Size propagation for a symbol given a list of argument sizes- sizeProp :: feature a -> Args (WrapFull Info) a -> Size (DenResult a)---- | Convenient default implementation of 'sizeProp'-sizePropDefault :: (WitnessSat feature, SatContext feature ~ TypeCtx) =>- feature a -> Args (WrapFull Info) a -> Size (DenResult a)-sizePropDefault a _- | TypeWit <- fromSatWit $ witnessSat a = universal--------------------------------------------------------------------------------------- * Optimization and type/size inference------------------------------------------------------------------------------------- | Compute a type representation of a symbol's result type-resultType :: Type (DenResult a) => c a -> TypeRep (DenResult a)-resultType _ = typeRep--type Bag a = Map a Integer- -- TODO Currently just used as a set. We should either switch back to- -- `Data.Set` or provide a proper bag interface. For example,- -- `Data.Map.member` doesn't do the right thing on a bag, since it should- -- return false also if the key maps to the value 0.---- | Information about the source code of an expression-type SourceInfo = String---- | Type and size information of a Feldspar program-data Info a- where- Info- :: Show (Size a)- => { infoType :: TypeRep a- , infoSize :: Size a- , infoVars :: Bag VarId- , infoSource :: SourceInfo- }- -> Info a--instance Render Info- where- render i@(Info {}) = show (infoType i) ++ szStr ++ srcStr- where- szStr = case show (infoSize i) of- "()" -> "" -- TODO AnySize- str -> " | " ++ str-- srcStr = case infoSource i of- "" -> ""- src -> " | " ++ src--instance Eq (Size a) => Eq (Info a)- where- ia == ib = infoSize ia == infoSize ib- -- TODO--mkInfo :: Type a => Size a -> Info a-mkInfo sz = Info typeRep sz Map.empty ""--mkInfoTy :: (Show (Size a), Lattice (Size a)) => TypeRep a -> Info a-mkInfoTy t = Info t universal Map.empty ""--infoRange :: Type a => Info a -> RangeSet a-infoRange = sizeToRange . infoSize---- | This class is used to allow constructs to be abstract in the monad. Its--- purpose is similar to that of 'MonadType'.-class LatticeSize1 m- where- mergeSize :: Lattice (Size a) =>- Info (m a) -> Size (m a) -> Size (m a) -> Size (m a)- -- TODO Is this class needed? See comment to `MonadType`.--instance LatticeSize1 Mut- where- mergeSize _ = (\/)---- | 'Info' with hidden result type-data SomeInfo- where- SomeInfo :: Typeable a => Info a -> SomeInfo--data Env = Env- { varEnv :: [(VarId, SomeInfo)]- , sourceEnv :: SourceInfo- }---- | Initial environment-initEnv :: Env-initEnv = Env [] ""---- | Insert a variable into the environment-localVar :: Typeable b => VarId -> Info b -> Opt a -> Opt a-localVar v info = local $ \env -> env {varEnv = (v, SomeInfo info):varEnv env}---- | Change the 'SourceInfo' environment-localSource :: SourceInfo -> Opt a -> Opt a-localSource src = local $ \env -> env {sourceEnv = src}---- | It the expression is a literal, its value is returned, otherwise 'Nothing'-viewLiteral :: (Literal TypeCtx :<: dom) => ASTF (Decor info dom) a -> Maybe a-viewLiteral (prjDecorCtx typeCtx -> Just (_,Literal a)) = Just a-viewLiteral _ = Nothing---- | Construct a 'Literal' decorated with 'Info'-literalDecorSrc :: (Type a, Literal TypeCtx :<: dom) =>- SourceInfo -> a -> ASTF (Decor Info dom) a-literalDecorSrc src a = injDecor- ((mkInfo (sizeOf a)) {infoSource = src})- (Literal a `withContext` typeCtx)---- | Construct a 'Literal' decorated with 'Info'-literalDecor :: (Type a, Literal TypeCtx :<: dom) =>- a -> ASTF (Decor Info dom) a-literalDecor = literalDecorSrc ""- -- Note: This function could get the 'SourceInfo' from the environment and- -- insert it in the 'infoSource' field. But then it needs to be monadic which- -- makes optimizations uglier.---- | Replaces an expression with a literal if the type permits, otherwise--- returns the expression unchanged.-constFold :: (MaybeWitnessSat TypeCtx dom, Literal TypeCtx :<: dom) =>- SourceInfo -> ASTF (Decor Info dom) a -> a -> ASTF (Decor Info dom) a-constFold src expr a- | Just TypeWit <- fromSatWit `fmap` maybeWitnessSat typeCtx expr- = literalDecorSrc src a-constFold _ expr _ = expr---- | Environment for optimization-type Opt = Reader Env---- | Basic optimization of a feature------ This optimization is similar to 'Synt.Optimize', but it also performs size--- inference. Size inference has to be done simultaneously with other--- optimizations in order to avoid iterating the phases. (Size information may--- help optimization and optimization may help size inference.)-class- ( WitnessCons feature- , MaybeWitnessSat TypeCtx dom- , AlphaEq dom dom (Decor Info dom) [(VarId, VarId)]- , EvalBind dom- , Literal TypeCtx :<: dom- , Variable TypeCtx :<: dom- , Lambda TypeCtx :<: dom- ) =>- Optimize feature dom- where- -- | Top-down and bottom-up optimization of a feature- optimizeFeat- :: Optimize dom dom- => feature a- -> Args (AST dom) a- -> Opt (ASTF (Decor Info dom) (DenResult a))- optimizeFeat = optimizeFeatDefault-- -- | Optimized construction of an expression from a symbol and its optimized- -- arguments- --- -- Note: This function should normally not be called directly. Instead, use- -- 'constructFeat' which has more accurate propagation of 'Info'.- constructFeatOpt- :: feature a- -> Args (AST (Decor Info dom)) a- -> Opt (ASTF (Decor Info dom) (DenResult a))- constructFeatOpt = constructFeatUnOpt-- -- | Unoptimized construction of an expression from a symbol and its- -- optimized arguments- constructFeatUnOpt- :: feature a- -> Args (AST (Decor Info dom)) a- -> Opt (ASTF (Decor Info dom) (DenResult a))---- TODO Optimization should throw an error when the size of a node is--- over-constrained. It can only happen if there's a bug in the general--- size inference, or if the user has stated invalid size constraints. In--- both cases it may lead to incorrect optimizations, so throwing an error--- seems preferable.---- | Optimized construction of an expression from a symbol and its optimized--- arguments-constructFeat :: Optimize feature dom- => feature a- -> Args (AST (Decor Info dom)) a- -> Opt (ASTF (Decor Info dom) (DenResult a))-constructFeat a args = do- aUnOpt <- constructFeatUnOpt a args- aOpt <- constructFeatOpt a args- return $ updateDecor (const $ getInfo aUnOpt) aOpt- -- This function uses `constructFeatOpt` for optimization and- -- `constructFeatUnOpt` for propagation of `Info`. This is because- -- `constructFeatOpt` may forget size constraints added by `SizeProp`. It is- -- reasonable to assume that `aUnOpt` has at least as accurate `Info` as- -- `aOpt`, so we just replace the `Info` with the one from `aUnOpt`. Another- -- option would have been to meet the two lattices.--instance (Optimize sub1 dom, Optimize sub2 dom) =>- Optimize (sub1 :+: sub2) dom- where- optimizeFeat (InjL a) = optimizeFeat a- optimizeFeat (InjR a) = optimizeFeat a-- constructFeatOpt (InjL a) = constructFeatOpt a- constructFeatOpt (InjR a) = constructFeatOpt a-- constructFeatUnOpt (InjL a) = constructFeatUnOpt a- constructFeatUnOpt (InjR a) = constructFeatUnOpt a---- | Optimization of an expression------ In addition to running 'optimizeFeat', this function performs constant--- folding on all closed expressions, provided that the type permits making a--- literal.-optimizeM :: Optimize dom dom => ASTF dom a -> Opt (ASTF (Decor Info dom) a)-optimizeM a = do- aOpt <- transformNode optimizeFeat a- let vars = infoVars $ getInfo aOpt- value = evalBind aOpt- src = infoSource $ getInfo aOpt- if Map.null vars- then return $ constFold src aOpt value- else return aOpt- -- TODO singleton range --> literal- -- literal --> singleton range---- | Optimization of an expression. This function runs 'optimizeM' and extracts--- the result.-optimize :: Optimize dom dom => ASTF dom a -> ASTF (Decor Info dom) a-optimize = flip runReader initEnv . optimizeM---- | Convenient default implementation of 'constructFeatUnOpt'. Uses 'sizeProp'--- to propagate size.-constructFeatUnOptDefaultTyp- :: ( feature :<: dom- , WitnessCons feature- , SizeProp feature- , Show (Size (DenResult a))- )- => TypeRep (DenResult a)- -> feature a- -> Args (AST (Decor Info dom)) a- -> Opt (ASTF (Decor Info dom) (DenResult a))-constructFeatUnOptDefaultTyp typ feat args- | ConsWit <- witnessCons feat- = do- src <- asks sourceEnv- let sz = sizeProp feat $ mapArgs (WrapFull . getInfo) args- vars = Map.unions $ listArgs (infoVars . getInfo) args- return $ appArgs (injDecor (Info typ sz vars src) feat) args---- | Like 'constructFeatUnOptDefaultTyp' but without an explicit 'TypeRep'-constructFeatUnOptDefault- :: ( feature :<: dom- , WitnessCons feature- , WitnessSat feature- , SatContext feature ~ TypeCtx- , SizeProp feature- )- => feature a- -> Args (AST (Decor Info dom)) a- -> Opt (ASTF (Decor Info dom) (DenResult a))-constructFeatUnOptDefault feat- | ConsWit <- witnessCons feat- , TypeWit <- fromSatWit $ witnessSat feat- = constructFeatUnOptDefaultTyp typeRep feat---- | Convenient default implementation of 'optimizeFeat'-optimizeFeatDefault :: (Optimize feature dom, Optimize dom dom)- => feature a- -> Args (AST dom) a- -> Opt (ASTF (Decor Info dom) (DenResult a))-optimizeFeatDefault feat args- | ConsWit <- witnessCons feat- = constructFeat feat =<< mapArgsM optimizeM args-
− Feldspar/Core/Types.hs
@@ -1,831 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Core.Types where----import Control.Monad-import Data.Array.IO-import Data.Bits-import Data.Complex-import Data.Int-import Data.IORef-import Data.List-import Data.Typeable (Typeable, gcast)-import Data.Word-import Test.QuickCheck-import qualified Control.Monad.Par as MonadPar--import Data.Patch--import Data.Proxy--import Data.Typeable (Typeable1)--import Language.Syntactic--import Feldspar.Lattice-import Feldspar.Range--------------------------------------------------------------------------------------- * Heterogenous lists------------------------------------------------------------------------------------- | Heterogeneous list-data a :> b = a :> b- deriving (Eq, Ord, Show)--infixr 5 :>--instance (Lattice a, Lattice b) => Lattice (a :> b)- where- empty = empty :> empty- universal = universal :> universal- (a1:>a2) \/ (b1:>b2) = (a1 \/ b1) :> (a2 \/ b2)- (a1:>a2) /\ (b1:>b2) = (a1 /\ b1) :> (a2 /\ b2)--------------------------------------------------------------------------------------- * Integers------------------------------------------------------------------------------------- | Target-dependent unsigned integers-newtype WordN = WordN Word32- deriving- ( Eq, Ord, Num, Enum, Ix, Real, Integral, Bits, Bounded, Typeable- , Arbitrary )---- | Target-dependent signed integers-newtype IntN = IntN Int32- deriving- ( Eq, Ord, Num, Enum, Ix, Real, Integral, Bits, Bounded, Typeable- , Arbitrary )--instance Show WordN- where- show (WordN a) = show a--instance Show IntN- where- show (IntN a) = show a---- | Type representation of 8 bits-data N8---- | Type representation of 16 bits-data N16---- | Type representation of 32 bits-data N32---- | Type representation of 64 bits-data N64---- | Type representation of the native number of bits on the target-data NNative---- | Witness for 'N8', 'N16', 'N32', 'N64' or 'NNative'-data BitWidth n- where- N8 :: BitWidth N8- N16 :: BitWidth N16- N32 :: BitWidth N32- N64 :: BitWidth N64- NNative :: BitWidth NNative--bitWidth :: BitWidth n -> String-bitWidth N8 = "8"-bitWidth N16 = "16"-bitWidth N32 = "32"-bitWidth N64 = "64"-bitWidth NNative = "N"---- | Type representation of \"unsigned\"-data U---- | Type representation of \"signed\"-data S---- | Witness for 'U' or 'S'-data Signedness s- where- U :: Signedness U- S :: Signedness S--signedness :: Signedness s -> String-signedness U = "Word"-signedness S = "Int"---- | A generalization of unsigned and signed integers. The first parameter--- represents the signedness and the sectond parameter the number of bits.-type family GenericInt s n-type instance GenericInt U N8 = Word8-type instance GenericInt S N8 = Int8-type instance GenericInt U N16 = Word16-type instance GenericInt S N16 = Int16-type instance GenericInt U N32 = Word32-type instance GenericInt S N32 = Int32-type instance GenericInt U N64 = Word64-type instance GenericInt S N64 = Int64-type instance GenericInt U NNative = WordN-type instance GenericInt S NNative = IntN--type family WidthOf a-type instance WidthOf Word8 = N8-type instance WidthOf Int8 = N8-type instance WidthOf Word16 = N16-type instance WidthOf Int16 = N16-type instance WidthOf Word32 = N32-type instance WidthOf Int32 = N32-type instance WidthOf Word64 = N64-type instance WidthOf Int64 = N64-type instance WidthOf WordN = NNative-type instance WidthOf IntN = NNative--type family SignOf a-type instance SignOf Word8 = U-type instance SignOf Int8 = S-type instance SignOf Word16 = U-type instance SignOf Int16 = S-type instance SignOf Word32 = U-type instance SignOf Int32 = S-type instance SignOf Word64 = U-type instance SignOf Int64 = S-type instance SignOf WordN = U-type instance SignOf IntN = S--fromWordN :: BitWidth n -> WordN -> GenericInt U n-fromWordN N8 = fromInteger . toInteger-fromWordN N16 = fromInteger . toInteger-fromWordN N32 = fromInteger . toInteger-fromWordN N64 = fromInteger . toInteger-fromWordN NNative = id- -- TODO Check that the number fits--fromIntN :: BitWidth n -> IntN -> GenericInt S n-fromIntN N8 = fromInteger . toInteger-fromIntN N16 = fromInteger . toInteger-fromIntN N32 = fromInteger . toInteger-fromIntN N64 = fromInteger . toInteger-fromIntN NNative = id- -- TODO Check that the number fits--genericLen :: BitWidth n -> [a] -> GenericInt U n-genericLen N8 = genericLength-genericLen N16 = genericLength-genericLen N32 = genericLength-genericLen N64 = genericLength-genericLen NNative = genericLength--type Length = WordN-type Index = WordN--------------------------------------------------------------------------------------- * Arrays------------------------------------------------------------------------------------- | Array whose length is represented by an @n@-bit word-data TargetArr n a = TargetArr (GenericInt U n) [a]-------------------------------------------------------------------------------------- * Monadic Types------------------------------------------------------------------------------------- | This class is used to allow constructs to be abstract in the monad-class MonadType m- where- voidTypeRep :: TypeRep (m ())- -- TODO Since the `Mut` monad is already abstract, this class is probably only- -- needed if we want to be able to use monadic constructs with different- -- monad types.--------------------------------------------------------------------------------------- * Mutable data------------------------------------------------------------------------------------- TODO Make newtypes?---- | Monad for manipulation of mutable data-type Mut = IO---- | Mutable references-instance Show (IORef a)- where- show _ = "IORef"---- | Mutable arrays-type MArr a = IOArray Index a--instance Show (MArr a)- where- show _ = "MArr"--instance MonadType Mut- where- voidTypeRep = MutType UnitType-------------------------------------------------------------------------------------- * Par Monad------------------------------------------------------------------------------------- | Monad for parallel constructs-type Par = MonadPar.Par--deriving instance Typeable1 Par---- | Immutable references-type IV = MonadPar.IVar--deriving instance Typeable1 IV--instance Show (IV a)- where- show _ = "IVar"--instance Eq (IV a)- where- a == b = False--instance MonadType Par- where- voidTypeRep = ParType UnitType------------------------------------------------------------------------------------- * Type representation------------------------------------------------------------------------------------- | Representation of supported types-data TypeRep a- where- UnitType :: TypeRep ()- BoolType :: TypeRep Bool- IntType :: ( BoundedInt (GenericInt s n)- , Size (GenericInt s n) ~ Range (GenericInt s n)- ) =>- Signedness s -> BitWidth n -> TypeRep (GenericInt s n)- FloatType :: TypeRep Float- ComplexType :: RealFloat a => TypeRep a -> TypeRep (Complex a)- ArrayType :: TypeRep a -> TypeRep [a]- TargetArrType :: BitWidth n -> TypeRep a -> TypeRep (TargetArr n a)- Tup2Type :: TypeRep a -> TypeRep b -> TypeRep (a,b)- Tup3Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep (a,b,c)- Tup4Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep (a,b,c,d)- Tup5Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep (a,b,c,d,e)- Tup6Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep f -> TypeRep (a,b,c,d,e,f)- Tup7Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep f -> TypeRep g -> TypeRep (a,b,c,d,e,f,g)- FunType :: TypeRep a -> TypeRep b -> TypeRep (a -> b)- MutType :: TypeRep a -> TypeRep (Mut a)- RefType :: TypeRep a -> TypeRep (IORef a)- MArrType :: TypeRep a -> TypeRep (MArr a)- ParType :: TypeRep a -> TypeRep (Par a)- IVarType :: TypeRep a -> TypeRep (IV a)- -- TODO `MArrType` Should have a target-specialized version. Or perhaps- -- use a single type with a flag to distinguish between immutable and- -- mutable arrays.--instance Show (TypeRep a)- where- show UnitType = "()"- show BoolType = "Bool"- show (IntType s n) = signedness s ++ bitWidth n- show FloatType = "Float"- show (ComplexType t) = "(Complex " ++ show t ++ ")"- show (ArrayType t) = "[" ++ show t ++ "]"- show (TargetArrType _ t) = "[" ++ show t ++ "]"- show (Tup2Type ta tb) = showTup [show ta, show tb]- show (Tup3Type ta tb tc) = showTup [show ta, show tb, show tc]- show (Tup4Type ta tb tc td) = showTup [show ta, show tb, show tc, show td]- show (Tup5Type ta tb tc td te) = showTup [show ta, show tb, show tc, show td, show te]- show (Tup6Type ta tb tc td te tf) = showTup [show ta, show tb, show tc, show td, show te, show tf]- show (Tup7Type ta tb tc td te tf tg) = showTup [show ta, show tb, show tc, show td, show te, show tf, show tg]- show (FunType ta tb) = show ta ++ " -> " ++ show tb- show (MutType ta) = unwords ["Mut", show ta]- show (RefType ta) = unwords ["Ref", show ta]- show (MArrType ta) = unwords ["MArr", show ta]- show (ParType ta) = unwords ["Par", show ta]- show (IVarType ta) = unwords ["IVar", show ta]--argType :: TypeRep (a -> b) -> TypeRep a-argType (FunType ta _) = ta--resType :: TypeRep (a -> b) -> TypeRep b-resType (FunType _ tb) = tb---- | Type equality witness-data TypeEq a b- where- TypeEq :: TypeEq a a--defaultSize :: TypeRep a -> Size a-defaultSize UnitType = universal-defaultSize BoolType = universal-defaultSize (IntType s n) = universal-defaultSize FloatType = universal-defaultSize (ComplexType t) = universal-defaultSize (ArrayType t) = universal :> defaultSize t---defaultSize (TargetArrType n t) = universal :> defaultSize t -- TODO-defaultSize (Tup2Type ta tb) = ( defaultSize ta- , defaultSize tb- )-defaultSize (Tup3Type ta tb tc) = ( defaultSize ta- , defaultSize tb- , defaultSize tc- )-defaultSize (Tup4Type ta tb tc td) = ( defaultSize ta- , defaultSize tb- , defaultSize tc- , defaultSize td- )-defaultSize (Tup5Type ta tb tc td te) = ( defaultSize ta- , defaultSize tb- , defaultSize tc- , defaultSize td- , defaultSize te- )-defaultSize (Tup6Type ta tb tc td te tf) = ( defaultSize ta- , defaultSize tb- , defaultSize tc- , defaultSize td- , defaultSize te- , defaultSize tf- )-defaultSize (Tup7Type ta tb tc td te tf tg) = ( defaultSize ta- , defaultSize tb- , defaultSize tc- , defaultSize td- , defaultSize te- , defaultSize tf- , defaultSize tg- )-defaultSize (FunType ta tb) = defaultSize tb-defaultSize (MutType ta) = defaultSize ta-defaultSize (RefType ta) = defaultSize ta-defaultSize (MArrType ta) = universal :> defaultSize ta-defaultSize (ParType ta) = defaultSize ta-defaultSize (IVarType ta) = defaultSize ta---- | Type equality on 'Signedness'-signEq :: Signedness s1 -> Signedness s2 -> Maybe (TypeEq s1 s2)-signEq U U = Just TypeEq-signEq S S = Just TypeEq-signEq _ _ = Nothing---- | Type equality on 'BitWidth'-widthEq :: BitWidth n1 -> BitWidth n2 -> Maybe (TypeEq n1 n2)-widthEq N8 N8 = Just TypeEq-widthEq N16 N16 = Just TypeEq-widthEq N32 N32 = Just TypeEq-widthEq N64 N64 = Just TypeEq-widthEq NNative NNative = Just TypeEq-widthEq _ _ = Nothing---- | Type equality on 'TypeRep'-typeEq :: TypeRep a -> TypeRep b -> Maybe (TypeEq a b)-typeEq UnitType UnitType = Just TypeEq-typeEq BoolType BoolType = Just TypeEq-typeEq (IntType s1 n1) (IntType s2 n2) = do- TypeEq <- signEq s1 s2- TypeEq <- widthEq n1 n2- return TypeEq-typeEq FloatType FloatType = Just TypeEq-typeEq (ComplexType t1) (ComplexType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (ArrayType t1) (ArrayType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (TargetArrType n1 t1) (TargetArrType n2 t2) = do- TypeEq <- widthEq n1 n2- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (Tup2Type a1 b1) (Tup2Type a2 b2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- return TypeEq-typeEq (Tup3Type a1 b1 c1) (Tup3Type a2 b2 c2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- TypeEq <- typeEq c1 c2- return TypeEq-typeEq (Tup4Type a1 b1 c1 d1) (Tup4Type a2 b2 c2 d2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- TypeEq <- typeEq c1 c2- TypeEq <- typeEq d1 d2- return TypeEq-typeEq (Tup5Type a1 b1 c1 d1 e1) (Tup5Type a2 b2 c2 d2 e2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- TypeEq <- typeEq c1 c2- TypeEq <- typeEq d1 d2- TypeEq <- typeEq e1 e2- return TypeEq-typeEq (Tup6Type a1 b1 c1 d1 e1 f1) (Tup6Type a2 b2 c2 d2 e2 f2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- TypeEq <- typeEq c1 c2- TypeEq <- typeEq d1 d2- TypeEq <- typeEq e1 e2- TypeEq <- typeEq f1 f2- return TypeEq-typeEq (Tup7Type a1 b1 c1 d1 e1 f1 g1) (Tup7Type a2 b2 c2 d2 e2 f2 g2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- TypeEq <- typeEq c1 c2- TypeEq <- typeEq d1 d2- TypeEq <- typeEq e1 e2- TypeEq <- typeEq f1 f2- TypeEq <- typeEq g1 g2- return TypeEq-typeEq (FunType a1 b1) (FunType a2 b2) = do- TypeEq <- typeEq a1 a2- TypeEq <- typeEq b1 b2- return TypeEq-typeEq (MutType t1) (MutType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (RefType t1) (RefType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (MArrType a1) (MArrType a2) = do- TypeEq <- typeEq a1 a2- return TypeEq-typeEq (ParType t1) (ParType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq-typeEq (IVarType t1) (IVarType t2) = do- TypeEq <- typeEq t1 t2- return TypeEq--typeEq _ _ = Nothing--showTup :: [String] -> String-showTup as = "(" ++ concat (intersperse "," as) ++ ")"--type family TargetType n a-type instance TargetType n () = ()-type instance TargetType n Bool = Bool-type instance TargetType n Word8 = Word8-type instance TargetType n Int8 = Int8-type instance TargetType n Word16 = Word16-type instance TargetType n Int16 = Int16-type instance TargetType n Word32 = Word32-type instance TargetType n Int32 = Int32-type instance TargetType n Word64 = Word64-type instance TargetType n Int64 = Int64-type instance TargetType n WordN = GenericInt U n-type instance TargetType n IntN = GenericInt S n-type instance TargetType n Float = Float-type instance TargetType n (Complex a) = Complex (TargetType n a)-type instance TargetType n [a] = TargetArr n (TargetType n a)-type instance TargetType n (a,b) = (TargetType n a, TargetType n b)-type instance TargetType n (a,b,c) = (TargetType n a, TargetType n b, TargetType n c)-type instance TargetType n (a,b,c,d) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d)-type instance TargetType n (a,b,c,d,e) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e)-type instance TargetType n (a,b,c,d,e,f) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e, TargetType n f)-type instance TargetType n (a,b,c,d,e,f,g) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e, TargetType n f, TargetType n g)-type instance TargetType n (IORef a) = IORef (TargetType n a)-type instance TargetType n (MArr a) = MArr (TargetType n a)-type instance TargetType n (IV a) = IV (TargetType n a)---- | The set of supported types-class (Eq a, Show a, Typeable a, Show (Size a), Lattice (Size a)) => Type a- where- -- | Gives the type representation a value.- typeRep :: TypeRep a- sizeOf :: a -> Size a- toTarget :: BitWidth n -> a -> TargetType n a--instance Type () where typeRep = UnitType; sizeOf _ = AnySize; toTarget _ = id-instance Type Bool where typeRep = BoolType; sizeOf _ = AnySize; toTarget _ = id-instance Type Word8 where typeRep = IntType U N8; sizeOf = singletonRange; toTarget _ = id-instance Type Int8 where typeRep = IntType S N8; sizeOf = singletonRange; toTarget _ = id-instance Type Word16 where typeRep = IntType U N16; sizeOf = singletonRange; toTarget _ = id-instance Type Int16 where typeRep = IntType S N16; sizeOf = singletonRange; toTarget _ = id-instance Type Word32 where typeRep = IntType U N32; sizeOf = singletonRange; toTarget _ = id-instance Type Int32 where typeRep = IntType S N32; sizeOf = singletonRange; toTarget _ = id-instance Type Word64 where typeRep = IntType U N64; sizeOf = singletonRange; toTarget _ = id-instance Type Int64 where typeRep = IntType S N64; sizeOf = singletonRange; toTarget _ = id-instance Type WordN where typeRep = IntType U NNative; sizeOf = singletonRange; toTarget = fromWordN-instance Type IntN where typeRep = IntType S NNative; sizeOf = singletonRange; toTarget = fromIntN-instance Type Float where typeRep = FloatType; sizeOf _ = AnySize; toTarget _ = id--instance (Type a, RealFloat a) => Type (Complex a)- where- typeRep = ComplexType typeRep- sizeOf _ = AnySize- toTarget n (r :+ i) = error "TODO" -- toTarget n r :+ toTarget n i--instance Type a => Type [a]- where- typeRep = ArrayType typeRep- sizeOf as = singletonRange (genericLength as) :> unions (map sizeOf as)- toTarget n as = TargetArr (genericLen n as) $ map (toTarget n) as--instance (Type a, Type b) => Type (a,b)- where- typeRep = Tup2Type typeRep typeRep-- sizeOf (a,b) =- ( sizeOf a- , sizeOf b- )-- toTarget n (a,b) =- ( toTarget n a- , toTarget n b- )--instance (Type a, Type b, Type c) => Type (a,b,c)- where- typeRep = Tup3Type typeRep typeRep typeRep-- sizeOf (a,b,c) =- ( sizeOf a- , sizeOf b- , sizeOf c- )-- toTarget n (a,b,c) =- ( toTarget n a- , toTarget n b- , toTarget n c- )--instance (Type a, Type b, Type c, Type d) => Type (a,b,c,d)- where- typeRep = Tup4Type typeRep typeRep typeRep typeRep-- sizeOf (a,b,c,d) =- ( sizeOf a- , sizeOf b- , sizeOf c- , sizeOf d- )-- toTarget n (a,b,c,d) =- ( toTarget n a- , toTarget n b- , toTarget n c- , toTarget n d- )--instance (Type a, Type b, Type c, Type d, Type e) => Type (a,b,c,d,e)- where- typeRep = Tup5Type typeRep typeRep typeRep typeRep typeRep-- sizeOf (a,b,c,d,e) =- ( sizeOf a- , sizeOf b- , sizeOf c- , sizeOf d- , sizeOf e- )-- toTarget n (a,b,c,d,e) =- ( toTarget n a- , toTarget n b- , toTarget n c- , toTarget n d- , toTarget n e- )--instance (Type a, Type b, Type c, Type d, Type e, Type f) => Type (a,b,c,d,e,f)- where- typeRep = Tup6Type typeRep typeRep typeRep typeRep typeRep typeRep-- sizeOf (a,b,c,d,e,f) =- ( sizeOf a- , sizeOf b- , sizeOf c- , sizeOf d- , sizeOf e- , sizeOf f- )-- toTarget n (a,b,c,d,e,f) =- ( toTarget n a- , toTarget n b- , toTarget n c- , toTarget n d- , toTarget n e- , toTarget n f- )--instance (Type a, Type b, Type c, Type d, Type e, Type f, Type g) => Type (a,b,c,d,e,f,g)- where- typeRep = Tup7Type typeRep typeRep typeRep typeRep typeRep typeRep typeRep-- sizeOf (a,b,c,d,e,f,g) =- ( sizeOf a- , sizeOf b- , sizeOf c- , sizeOf d- , sizeOf e- , sizeOf f- , sizeOf g- )-- toTarget n (a,b,c,d,e,f,g) =- ( toTarget n a- , toTarget n b- , toTarget n c- , toTarget n d- , toTarget n e- , toTarget n f- , toTarget n g- )--instance (Type a, Show (IORef a)) => Type (IORef a)- where- typeRep = RefType typeRep-- sizeOf _ = universal-- toTarget = error "toTarget: IORef" -- TODO Requires IO--instance Type a => Type (MArr a)- where- typeRep = MArrType typeRep-- sizeOf _ = universal-- toTarget = error "toTarget: MArr" -- TODO Requires IO--instance Type a => Type (IV a)- where- typeRep = IVarType typeRep-- sizeOf _ = universal-- toTarget = error "toTarget: IVar" -- TODO Requires IO--typeRepByProxy :: Type a => Proxy a -> TypeRep a-typeRepByProxy _ = typeRep------ | Context for supported types-data TypeCtx--instance Type a => Sat TypeCtx a- where- data Witness TypeCtx a = Type a => TypeWit- witness = TypeWit--typeCtx :: Proxy TypeCtx-typeCtx = Proxy--------------------------------------------------------------------------------------- * Sized types-----------------------------------------------------------------------------------data AnySize = AnySize- deriving (Eq, Show, Ord)--anySizeFun :: AnySize -> AnySize-anySizeFun AnySize = AnySize--anySizeFun2 :: AnySize -> AnySize -> AnySize-anySizeFun2 AnySize AnySize = AnySize--instance Num AnySize- where- fromInteger _ = AnySize- abs = anySizeFun- signum = anySizeFun- (+) = anySizeFun2- (-) = anySizeFun2- (*) = anySizeFun2--instance Lattice AnySize- where- empty = AnySize- universal = AnySize- (\/) = anySizeFun2- (/\) = anySizeFun2--type family Size a--type instance Size () = AnySize-type instance Size Bool = AnySize-type instance Size Word8 = Range Word8-type instance Size Int8 = Range Int8-type instance Size Word16 = Range Word16-type instance Size Int16 = Range Int16-type instance Size Word32 = Range Word32-type instance Size Int32 = Range Int32-type instance Size Word64 = Range Word64-type instance Size Int64 = Range Int64-type instance Size WordN = Range WordN-type instance Size IntN = Range IntN-type instance Size Float = AnySize-type instance Size (Complex a) = AnySize-type instance Size [a] = Range Length :> Size a-type instance Size (TargetArr n a) = Range (GenericInt U n) :> Size a-type instance Size (a,b) = (Size a, Size b)-type instance Size (a,b,c) = (Size a, Size b, Size c)-type instance Size (a,b,c,d) = (Size a, Size b, Size c, Size d)-type instance Size (a,b,c,d,e) = (Size a, Size b, Size c, Size d, Size e)-type instance Size (a,b,c,d,e,f) = (Size a, Size b, Size c, Size d, Size e, Size f)-type instance Size (a,b,c,d,e,f,g) = (Size a, Size b, Size c, Size d, Size e, Size f, Size g)-type instance Size (a -> b) = Size b-type instance Size (Mut a) = Size a-type instance Size (IORef a) = Size a-type instance Size (MArr a) = Range Length :> Size a-type instance Size (Par a) = Size a-type instance Size (IV a) = Size a---- Note: The instance------ Size (a -> b) = Size b------ might seem strange. In general, the size of a function result depends on the--- size of the argument, so it might be more natural to have------ Size (a -> b) = Size a -> Size b------ However, this doesn't really work with the `optimize` function, since--- optimization is done simultaneously with size inference, and the two--- influence each other. The result of optimization is an optimized expression--- decorated with a size. If the expression is of function type, the size of the--- argument has to be provided before optimizing the function body. Yet, the--- result will be decorated by a value of type `Size a -> Size b`, which--- suggests that we do not yet know the size of the argument.------ So instead, we represent the size of a function as the size of its result,--- which means that the size of a function is only valid in a given context.------ | A generalization of 'Range' that serves two purposes: (1) Adding an extra--- 'Universal' constructor to support unbounded types ('Range' can only--- represent bounded ranges), and (2) pack a 'BoundedInt' constraint with the--- 'RangeSet' constructor. This is what allows 'sizeToRange' to be defined as a--- total function with 'Type' as the only constraint.-data RangeSet a- where- RangeSet :: BoundedInt a => Range a -> RangeSet a- Universal :: RangeSet a---- | Cast a 'Size' to a 'RangeSet'-sizeToRange :: forall a . Type a => Size a -> RangeSet a-sizeToRange sz = case typeRep :: TypeRep a of- IntType _ _ -> RangeSet sz- _ -> Universal---tIntN :: Patch IntN IntN-tIntN = id--tWordN :: Patch WordN WordN-tWordN = id--tIndex :: Patch Index Index-tIndex = id--tLength :: Patch Length Length-tLength = id--tArr :: Patch a a -> Patch [a] [a]-tArr _ = id-
− Feldspar/FixedPoint.hs
@@ -1,251 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}-module Feldspar.FixedPoint- ( Fix(..), Fixable(..)- , freezeFix, freezeFix', unfreezeFix, unfreezeFix'- , (?!), fixFold- )-where--import qualified Prelude-import Feldspar hiding (sugar,desugar)-import Feldspar.Core.Constructs-import Feldspar.Vector--import Language.Syntactic--import Data.Ratio---- | Abstract real number type with exponent and mantissa-data Fix a =- Fix- { exponent :: Data IntN- , mantissa :: Data a- }- deriving (Prelude.Eq,Prelude.Show)--instance- ( Integral a- , Bits a- , Prelude.Real a- , Size a ~ Range a- ) => Num (Fix a)- where- fromInteger n = Fix 0 (Prelude.fromInteger n)- (+) = fixAddition- (*) = fixMultiplication- negate = fixNegate- abs = fixAbsolute- signum = fixSignum--instance- ( Integral a- , Bits a- , Prelude.Real a- , Size a ~ Range a- ) => Fractional (Fix a)- where- (/) = fixDiv'- recip = fixRecip'- fromRational = fixfromRational--fixAddition :: (Integral a, Bits a, Prelude.Real a, Size a ~ Range a) => Fix a -> Fix a -> Fix a-fixAddition f1@(Fix e1 m1) f2@(Fix e2 m2) = Fix e m- where- e = max e1 e2- m = mantissa (fix e f1) + mantissa (fix e f2)--fixMultiplication :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a -> Fix a-fixMultiplication f1@(Fix e1 m1) f2@(Fix e2 m2) = Fix e m- where- e = e1 + e2- m = m1 * m2--fixNegate :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a-fixNegate f1@(Fix e1 m1) = Fix e1 m- where- m = negate m1--fixAbsolute :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a-fixAbsolute f1@(Fix e1 m1) = Fix e1 m- where- m = abs m1--fixSignum :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a-fixSignum f1@(Fix e1 m1) = Fix 0 m- where- m = signum m1--fixFromInteger :: (Integral a, Bits a, Prelude.Real a) => Integer -> Fix a-fixFromInteger i = Fix 0 m- where- m = fromInteger i--fixDiv' :: (Integral a, Bits a, Prelude.Real a, Size a ~ Range a)- => Fix a -> Fix a -> Fix a-fixDiv' f1@(Fix e1 m1) f2@(Fix e2 m2) = Fix e m- where- e = e1-e2- m = div m1 m2--fixRecip' :: forall a . (Integral a, Bits a, Prelude.Real a, Size a ~ Range a)- => Fix a -> Fix a-fixRecip' f@(Fix e m) = Fix (e + (value $ wordLength (T :: T a) - 1)) (div sh m)- where- sh :: Data a- sh = (1::Data a) .<<. (value $ fromInteger $ toInteger $ wordLength (T :: T a) - 1)--fixfromRational :: forall a . (Integral a, Size a ~ Range a) =>- Prelude.Rational -> Fix a-fixfromRational inp = Fix exponent mantissa- where- inpAsFloat :: Float- inpAsFloat = fromRational inp- intPart :: Float- intPart = fromRational $ toRational $ (Prelude.floor inpAsFloat)- intPartWidth :: IntN- intPartWidth = Prelude.ceiling $ Prelude.logBase 2 intPart- fracPartWith :: IntN- fracPartWith = (wordLength (T :: T a)) - intPartWidth - 2- mantissa = value $ Prelude.floor $ inpAsFloat * 2.0 Prelude.** fromRational (toRational fracPartWith)- exponent = negate $ value fracPartWith--instance (Type a) => Syntactic (Fix a) FeldDomainAll where- type Internal (Fix a) = (IntN, a)- desugar = desugar . freezeFix- sugar = unfreezeFix . sugar--instance (Type a) => Syntax (Fix a)---- | Converts an abstract real number to a pair of exponent and mantissa-freezeFix :: (Type a) => Fix a -> (Data IntN,Data a)-freezeFix (Fix e m) = (e,m)---- | Converts an abstract real number to fixed point integer with given exponent-freezeFix' :: (Bits a, Size a ~ Range a) => IntN -> Fix a -> Data a-freezeFix' e f = mantissa $ fix (value e) f---- | Converts a pair of exponent and mantissa to an abstract real number-unfreezeFix :: (Type a) => (Data IntN, Data a) -> Fix a-unfreezeFix (e,m) = Fix e m---- | Converts a fixed point integer with given exponent to an abstract real number-unfreezeFix' :: IntN -> Data a -> Fix a-unfreezeFix' e m = Fix (value e) m---- This function cannot be implemented now as we don't have access to range--- information while building the tree anymore.-{--significantBits :: forall a . (Type a, Num a, Ord a, Size a ~ Range a, Prelude.Real a) => Data a -> IntN-significantBits x = IntN $ fromInteger $ toInteger $ (Prelude.floor mf)+1- where- r :: Range a- r = dataSize x- m :: a- m = Prelude.max (Prelude.abs $ lowerBound r) (Prelude.abs $ upperBound r)- mf :: Float- mf = logBase 2 $ fromRational $ toRational m--}-{--setSignificantBits :: forall a . (Type a, Num a, Ord a, Size a ~ Range a, Prelude.Real a) => a -> Data a -> Data a-setSignificantBits sb x = resizeData r x- where- r :: Range a- r = Range 0 sb--}-wordLength :: forall a . (Integral a, Prelude.Real a) => T a -> IntN-wordLength x = (Prelude.ceiling $ Prelude.logBase 2 $ fromRational $ toRational (maxBound :: a)) + 1--wordLength' :: forall a . (Integral a, Prelude.Real a) => a -> IntN-wordLength' x = swl- where- b :: a- wl :: IntN- swl :: IntN- b = maxBound::a- wl = Prelude.ceiling $ Prelude.logBase 2 $ fromRational $ toRational b- swl = wl + 1---- | Operations to get and set exponent-class (Splittable t) => Fixable t where- fix :: Data IntN -> t -> t- getExp :: t -> Data IntN--instance (Bits a, Size a ~ Range a) => Fixable (Fix a) where- fix e' (Fix e m) = Fix e' $ e' > e ? (m .>>. i2n (e' - e), m .<<. i2n (e - e'))- getExp = Feldspar.FixedPoint.exponent--instance Fixable (Data Float) where- fix = const id- getExp = const $ fromInteger $ toInteger $ Feldspar.exponent (0.0 :: Float)--data T a = T---- | Operations to split data into dynamic and static parts-class (Syntax (Dynamic t)) => Splittable t where- type Static t- type Dynamic t- store :: t -> (Static t, Dynamic t)- retrieve :: (Static t, Dynamic t) -> t- patch :: Static t -> t -> t- common :: t -> t -> Static t--instance (Type a) => Splittable (Data a) where- type Static (Data a) = ()- type Dynamic (Data a) = Data a- store x = ((),x)- retrieve = snd- patch = const id- common _ _ = ()--instance (Bits a, Size a ~ Range a) => Splittable (Fix a) where- type Static (Fix a) = Data IntN- type Dynamic (Fix a) = Data a- store f = (Feldspar.FixedPoint.exponent f, mantissa f)- retrieve = uncurry Fix- patch = fix- common f g = max (Feldspar.FixedPoint.exponent f) (Feldspar.FixedPoint.exponent g)---- | A version of vector fold for fixed point algorithms-fixFold :: forall a b . (Splittable a) => (a -> b -> a) -> a -> Vector b -> a-fixFold fun ini vec = retrieve (static, fold fun' ini' vec)- where- static = fst $ store ini- ini' = snd $ store ini- fun' st el = snd $ store $ patch static $ retrieve (static,st) `fun` el---- | A version of branching for fixed point algorithms-infix 1 ?!-(?!) :: forall a . (Syntax a, Splittable a) => Data Bool -> (a,a) -> a-cond ?! (x,y) = retrieve (comm, cond ? (x',y'))- where- comm = common x y- x' = snd $ store $ patch comm x- y' = snd $ store $ patch comm y
− Feldspar/Lattice.hs
@@ -1,196 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | General operations on sets--module Feldspar.Lattice where----import Data.Lens.Common------ | Lattice types-class Eq a => Lattice a- where- empty :: a- universal :: a- -- | Union- (\/) :: a -> a -> a- -- | Intersection- (/\) :: a -> a -> a--instance Lattice ()- where- empty = ()- universal = ()- () \/ () = ()- () /\ () = ()---- | Lattice product-instance (Lattice a, Lattice b) => Lattice (a,b)- where- empty = (empty,empty)- universal = (universal,universal)- (a1,a2) \/ (b1,b2) = (a1 \/ b1, a2 \/ b2)- (a1,a2) /\ (b1,b2) = (a1 /\ b1, a2 /\ b2)---- | Three-way product-instance (Lattice a, Lattice b, Lattice c) => Lattice (a,b,c)- where- empty = (empty,empty,empty)- universal = (universal,universal,universal)- (a1,a2,a3) \/ (b1,b2,b3) = (a1 \/ b1, a2 \/ b2, a3 \/ b3)- (a1,a2,a3) /\ (b1,b2,b3) = (a1 /\ b1, a2 /\ b2, a3 /\ b3)---- | Four-way product-instance (Lattice a, Lattice b, Lattice c, Lattice d) => Lattice (a,b,c,d)- where- empty = (empty,empty,empty,empty)- universal = (universal,universal,universal,universal)- (a1,a2,a3,a4) \/ (b1,b2,b3,b4) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4)- (a1,a2,a3,a4) /\ (b1,b2,b3,b4) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4)---- | Five-way product-instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e) => Lattice (a,b,c,d,e)- where- empty = (empty,empty,empty,empty,empty)- universal = (universal,universal,universal,universal,universal)- (a1,a2,a3,a4,a5) \/ (b1,b2,b3,b4,b5) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5)- (a1,a2,a3,a4,a5) /\ (b1,b2,b3,b4,b5) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5)---- | Six-way product-instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e, Lattice f) => Lattice (a,b,c,d,e,f)- where- empty = (empty,empty,empty,empty,empty,empty)- universal = (universal,universal,universal,universal,universal,universal)- (a1,a2,a3,a4,a5,a6) \/ (b1,b2,b3,b4,b5,b6) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5, a6 \/ b6)- (a1,a2,a3,a4,a5,a6) /\ (b1,b2,b3,b4,b5,b6) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5, a6 /\ b6)---- | Seven-way product-instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e, Lattice f, Lattice g) => Lattice (a,b,c,d,e,f,g)- where- empty = (empty,empty,empty,empty,empty,empty,empty)- universal = (universal,universal,universal,universal,universal,universal,universal)- (a1,a2,a3,a4,a5,a6,a7) \/ (b1,b2,b3,b4,b5,b6,b7) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5, a6 \/ b6, a7 \/ b7)- (a1,a2,a3,a4,a5,a6,a7) /\ (b1,b2,b3,b4,b5,b6,b7) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5, a6 /\ b6, a7 /\ b7)--unions :: Lattice a => [a] -> a-unions = foldr (\/) empty--intersections :: Lattice a => [a] -> a-intersections = foldr (/\) universal------ * Computing fixed points---- | Generalization of 'fixedPoint' to functions whose argument and result--- contain (i.e has a lens to) a common lattice-lensedFixedPoint :: Lattice lat =>- Lens a lat -> Lens b lat -> (a -> b) -> (a -> b)-lensedFixedPoint aLens bLens f a- | aLat == bLat = (bLens ^= aLat) b- | otherwise = lensedFixedPoint aLens bLens f a'- where- aLat = a ^! aLens- b = f a- bLat = (b ^! bLens) \/ aLat- a' = (aLens ^= bLat) a---- | Generalization of 'indexedFixedPoint' to functions whose argument and--- result contain (i.e has a lens to) a common lattice-lensedIndexedFixedPoint :: Lattice lat =>- Lens a lat -> Lens b lat -> (Int -> a -> b) -> (a -> (b,Int))-lensedIndexedFixedPoint aLens bLens f a = go 0 f a- where- go i f a- | aLat == bLat = ((bLens ^= aLat) b, i)- | otherwise = go (i+1) f a'- where- aLat = a ^! aLens- b = f i a- bLat = (b ^! bLens) \/ aLat- a' = (aLens ^= bLat) a---- | Take the fixed point of a function. The second argument is an initial--- element. A sensible default for the initial element is 'empty'.------ The function is not required to be monotonic. It is made monotonic internally--- by always taking the union of the result and the previous value.-fixedPoint :: Lattice a => (a -> a) -> a -> a-fixedPoint = lensedFixedPoint (iso id id) (iso id id)---- | Much like 'fixedPoint' but keeps track of the number of iterations--- in the fixed point iteration. Useful for defining widening operators.-indexedFixedPoint :: Lattice a => (Int -> a -> a) -> a -> (a,Int)-indexedFixedPoint = lensedIndexedFixedPoint (iso id id) (iso id id)---- | The type of widening operators. A widening operator modifies a--- function that is subject to fixed point analysis. A widening--- operator introduces approximations in order to guarantee (fast)--- termination of the fixed point analysis.-type Widening a = (Int -> a -> a) -> (Int -> a -> a)---- | A widening operator which defaults to 'universal' when the number of--- iterations goes over the specified value.-cutOffAt :: Lattice a => Int -> Widening a-cutOffAt n f i a | i >= n = universal- | otherwise = f i a---- | A bounded version of 'lensedFixedPoint'. It will always do at least one--- iteration regardless of the provided bound (in order to return something of--- the right type).-boundedLensedFixedPoint :: Lattice lat =>- Int -> Lens a lat -> Lens b lat -> (a -> b) -> (a -> (b,Int))-boundedLensedFixedPoint n aLens bLens f a = go 0 f a- where- go i f a- | aLat == bLat = ((bLens ^= aLat) b, i)- | i >= n-1 = ((bLens ^= universal) b, i)- | otherwise = go (i+1) f a'- where- aLat = a ^! aLens- b = f a- bLat = (b ^! bLens) \/ aLat- a' = (aLens ^= bLat) a- -- Note: This function achieves a similar effect to- -- `indexedFixedPoint (cutOffAt n ...)`. The difference is that it works for- -- lensed fixed points. It would be possible to define a version of `cutOffAt`- -- that works for lensed fixed points, but such an operator would be less- -- efficient since it would have to apply the argument function in the base- -- case as well as the recursive case (in order to return something of the- -- right type). This means that there would always be one extra unnecessary- -- iteration. In particular, it would not be possible to get a meaningful- -- result from performing a single iteration. To only perform a single- -- iteration, the cut-off function would have to "fail" immediately, which- -- means that the whole fixed point iteration would also "fail". (A- -- single-iteration fixed point is an important special case as it avoids- -- exponential blowup when performing several nested iterations.)-
− Feldspar/Matrix.hs
@@ -1,226 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}---- | Operations on matrices (doubly-nested parallel vectors). All operations in--- this module assume rectangular matrices.--module Feldspar.Matrix where----import qualified Prelude as P-import Data.List (genericLength)-import qualified Data.TypeLevel as TL--import Feldspar.Prelude-import Feldspar.Core-import Feldspar.Wrap-import Feldspar.Vector.Internal----type Matrix a = Vector2 a--tMat :: Patch a a -> Patch (Matrix a) (Matrix a)-tMat = tVec2------ | Converts a matrix to a core array.-freezeMatrix :: Type a => Matrix a -> Data [[a]]-freezeMatrix = freezeVector . map freezeVector---- | Converts a core array to a matrix.-thawMatrix :: Type a => Data [[a]] -> Matrix a-thawMatrix = map thawVector . thawVector---- | Converts a core array to a matrix. The first length argument is the number--- of rows (outer vector), and the second argument is the number of columns--- (inner vector).-thawMatrix' :: Type a => Length -> Length -> Data [[a]] -> Matrix a-thawMatrix' y x = map (thawVector' x) . (thawVector' y)--unfreezeMatrix :: Type a => Data [[a]] -> Matrix a-unfreezeMatrix = thawMatrix-{-# DEPRECATED unfreezeMatrix "Please use `thawMatrix` instead." #-}--unfreezeMatrix' :: Type a => Length -> Length -> Data [[a]] -> Matrix a-unfreezeMatrix' = thawMatrix'-{-# DEPRECATED unfreezeMatrix' "Please use `thawMatrix'` instead." #-}---- | Constructs a matrix. The elements are stored in a core array.-matrix :: Type a => [[a]] -> Matrix a-matrix = value---- | Constructing a matrix from an index function.------ @indexedMat m n ixf@:------ * @m@ is the number of rows.------ * @n@ is the number of columns.------ * @ifx@ is a function mapping indexes to elements (first argument is row--- index; second argument is column index).-indexedMat- :: Data Length- -> Data Length- -> (Data Index -> Data Index -> Data a)- -> Matrix a-indexedMat m n idx = indexed m $ \k -> indexed n $ \l -> idx k l---- | Transpose of a matrix. Assumes that the number of rows is > 0.-transpose :: Type a => Matrix a -> Matrix a-transpose a = indexedMat (length $ head a) (length a) $ \y x -> a ! x ! y- -- TODO This assumes that (head a) can be used even if a is empty.---- | Concatenates the rows of a matrix.-flatten :: Type a => Matrix a -> Vector (Data a)-flatten matr = Indexed (m*n) ixf Empty- where- m = length matr- n = (m==0) ? (0, length (head matr))-- ixf i = matr ! y ! x- where- y = i `div` n- x = i `mod` n- -- TODO Should use linear indexing---- | The diagonal vector of a square matrix. It happens to work if the number of--- rows is less than the number of columns, but not the other way around (this--- would require some overhead).-diagonal :: Type a => Matrix a -> Vector (Data a)-diagonal m = zipWith (!) m (0 ... (length m - 1))--distributeL :: (a -> b -> c) -> a -> Vector b -> Vector c-distributeL f = map . f--distributeR :: (a -> b -> c) -> Vector a -> b -> Vector c-distributeR = flip . distributeL . flip----class Mul a b- where- type Prod a b-- -- | General multiplication operator- (***) :: a -> b -> Prod a b--instance Numeric a => Mul (Data a) (Data a)- where- type Prod (Data a) (Data a) = Data a- (***) = (*)--instance Numeric a => Mul (Data a) (Vector1 a)- where- type Prod (Data a) (Vector1 a) = Vector1 a- (***) = distributeL (***)--instance Numeric a => Mul (Vector1 a) (Data a)- where- type Prod (Vector1 a) (Data a) = Vector1 a- (***) = distributeR (***)--instance Numeric a => Mul (Data a) (Matrix a)- where- type Prod (Data a) (Matrix a) = Matrix a- (***) = distributeL (***)--instance Numeric a => Mul (Matrix a) (Data a)- where- type Prod (Matrix a) (Data a) = Matrix a- (***) = distributeR (***)--instance Numeric a => Mul (Vector1 a) (Vector1 a)- where- type Prod (Vector1 a) (Vector1 a) = Data a- (***) = scalarProd--instance Numeric a => Mul (Vector1 a) (Matrix a)- where- type Prod (Vector1 a) (Matrix a) = (Vector1 a)- vec *** mat = distributeL (***) vec (transpose mat)--instance Numeric a => Mul (Matrix a) (Vector1 a)- where- type Prod (Matrix a) (Vector1 a) = (Vector1 a)- (***) = distributeR (***)--instance Numeric a => Mul (Matrix a) (Matrix a)- where- type Prod (Matrix a) (Matrix a) = (Matrix a)- (***) = distributeR (***)------ | Matrix multiplication-mulMat :: Numeric a => Matrix a -> Matrix a -> Matrix a-mulMat = (***)----class Syntax a => ElemWise a- where- type Scalar a-- -- | Operator for general element-wise multiplication- elemWise :: (Scalar a -> Scalar a -> Scalar a) -> a -> a -> a--instance Type a => ElemWise (Data a)- where- type Scalar (Data a) = Data a- elemWise = id--instance (ElemWise a, Syntax (Vector a)) => ElemWise (Vector a)- where- type Scalar (Vector a) = Scalar a- elemWise = zipWith . elemWise--(.+) :: (ElemWise a, Num (Scalar a)) => a -> a -> a-(.+) = elemWise (+)--(.-) :: (ElemWise a, Num (Scalar a)) => a -> a -> a-(.-) = elemWise (-)--(.*) :: (ElemWise a, Num (Scalar a)) => a -> a -> a-(.*) = elemWise (*)---- * Wrapping for matrices--instance (Type a) => Wrap (Matrix a) (Data [[a]]) where- wrap = freezeMatrix--instance (Wrap t u, Type a, TL.Nat row, TL.Nat col) => Wrap (Matrix a -> t) (Data' (row,col) [[a]] -> u) where- wrap f = \(Data' d) -> wrap $ f $ thawMatrix' row' col' d where- row' = fromInteger $ toInteger $ TL.toInt (undefined :: row)- col' = fromInteger $ toInteger $ TL.toInt (undefined :: col)-
− Feldspar/Option.hs
@@ -1,114 +0,0 @@------ Copyright (c) 2009-2011, 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.Option where----import qualified Prelude-import Control.Monad--import Language.Syntactic--import Feldspar hiding (sugar,desugar,resugar)----data Option a = Option { isSome :: Data Bool, fromSome :: a }--instance Syntax a => Syntactic (Option a) FeldDomainAll- where- type Internal (Option a) = (Bool, Internal a)- desugar = desugar . desugarOption . fmap resugar- sugar = fmap resugar . sugarOption . sugar--instance Syntax a => Syntax (Option a)--instance Functor Option- where- fmap f opt = opt {fromSome = f (fromSome opt)}--instance Monad Option- where- return = some- a >>= f = b { isSome = isSome a ? (isSome b, false) }- where- b = f (fromSome a)------ | One-layer desugaring of 'Option'-desugarOption :: Type a => Option (Data a) -> Data (Bool,a)-desugarOption a = resugar (isSome a, fromSome a)---- | One-layer sugaring of 'Option'-sugarOption :: Type a => Data (Bool,a) -> Option (Data a)-sugarOption (resugar -> (valid,a)) = Option valid a--some :: a -> Option a-some = Option true--none :: Syntax a => Option a-none = Option false (err "fromSome: none")--option :: Syntax b => b -> (a -> b) -> Option a -> b-option noneCase someCase opt = isSome opt ?- ( someCase (fromSome opt)- , noneCase- )--oplus :: Syntax a => Option a -> Option a -> Option a-oplus a b = isSome a ? (a,b)--------------------------------------------------------------------------------------- * Conditional choice operator------------------------------------------------------------------------------------- http://zenzike.com/posts/2011-08-01-the-conditional-choice-operator---- | Conditional choice operator. Can be used together with '<?' to write--- guarded choices as follows:------ > prog :: Data Index -> Data Index--- > prog a--- > = a+1 <? a==0--- > ?> a+2 <? a==1--- > ?> a+3 <? a==2--- > ?> a+4 <? a==3--- > ?> a+5-(?>) :: Data Bool -> a -> Option a-cond ?> a = Option (not cond) a--(<?) :: Syntax a => a -> Option a -> a-a <? b = option a id b--infixr 0 <?-infixr 0 ?>-
− Feldspar/Par.hs
@@ -1,94 +0,0 @@------ Copyright (c) 2009-2011, 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.Par- ( P- , IVar- , runPar- , new- , get- , put- , fork- , yield- , spawn- , pval- , parMap- , parMapM- )-where--import Language.Syntactic--import Feldspar.Core.Constructs (Syntax(..))-import Feldspar.Core.Constructs.Par-import Feldspar.Core.Frontend.Par--runPar :: Syntax a => P a -> a-runPar = sugarSym ParRun--new :: Syntax a => P (IVar a)-new = sugarSym ParNew--get :: Syntax a => IVar a -> P a-get = sugarSym ParGet--put :: Syntax a => IVar a -> a -> P ()-put = sugarSym ParPut--fork :: P () -> P ()-fork = sugarSym ParFork--yield :: P ()-yield = sugarSym ParYield--spawn :: Syntax a => P a -> P (IVar a)-spawn p = do- r <- new- fork (p >>= put r)- return r--pval a = spawn (return a)--parMap f xs = mapM (pval . f) xs >>= mapM get--parMapM f xs = mapM (spawn . f) xs >>= mapM get--{--divConq :: (prob -> Bool) -- indivisible?- -> (prob -> [prob]) -- split into subproblems- -> ([sol] -> [sol]) -- join solutions- -> (prob -> sol) -- solve a (sub)problem- -> (prob -> sol)--}-divConq indiv split join f prob = go prob- where- go prob | indiv prob = return (f prob)- | otherwise = do- sols <- parMapM go (split prob)- return (join sols)-
− Feldspar/Prelude.hs
@@ -1,77 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | Reexports a minimal subset of the "Prelude" to open up for reusing--- "Prelude" identifiers in Feldspar--module Feldspar.Prelude- ( module Prelude- ) where----import Prelude- ( Bool (..)- , Double- , Float- , Int- , IO- , Integer- , Maybe (..)- , String-- , Bounded (..)- , Fractional (..)- , Functor (..)- , Monad (..)- , Num (..)- , Read (..)- , RealFloat (..)- , Show (..)-- , (.)- , ($)- , asTypeOf- , const- , curry- , flip- , fst- , id- , otherwise- , print- , putStr- , putStrLn- , readFile- , snd- , toInteger- , toRational- , uncurry- , undefined- , writeFile- )-
− Feldspar/Range.hs
@@ -1,1035 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}---- | Bounded integer ranges--module Feldspar.Range where------ TODO This module should be broken up into smaller pieces. Since most--- functions seem to be useful not only for Feldspar, it would probably be good--- to make a separate package. In any case, the modules should go under--- `Data.Range`. If there are functions that are very Feldspar specific, these--- should go into `Feldspar.Core.Constructs.*` (or whereever suitable).----import Data.Bits-import Data.Int-import Data.Word-import Data.Typeable-import System.Random -- Should maybe be exported from QuickCheck-import Test.QuickCheck hiding ((.&.))-import qualified Test.QuickCheck as QC-import Text.Printf--import Feldspar.Lattice--------------------------------------------------------------------------------------- * Definition------------------------------------------------------------------------------------- | A bounded range of values of type @a@-data Range a = Range- { lowerBound :: a- , upperBound :: a- }- deriving (Eq, Show)---- | Convenience alias for bounded integers-class (Ord a, Num a, Bounded a, Integral a, Bits a) => BoundedInt a-instance (Ord a, Num a, Bounded a, Integral a, Bits a) => BoundedInt a---- | A convenience function for defining range propagation.--- @handleSign propU propS@ chooses @propU@ for unsigned types and--- @propS@ for signed types.-handleSign :: forall a b . BoundedInt a =>- (Range a -> b) -> (Range a -> b) -> (Range a -> b)-handleSign u s- | isSigned (undefined::a) = s- | otherwise = u---- | Shows a bound.-showBound :: BoundedInt a => a -> String-showBound a- | a `elem` [maxBound,minBound] = "*"- | otherwise = show a---- | A textual representation of ranges.-showRange :: BoundedInt a => Range a -> String-showRange r@(Range l u)- | isEmpty r = "[]"- | isSingleton r = show u- | otherwise = "[" ++ showBound l ++ "," ++ showBound u ++ "]"---- | Requires a monotonic function-mapMonotonic :: (a -> b) -> Range a -> Range b-mapMonotonic f (Range l u) = Range (f l) (f u)---- | Requires a monotonic function-mapMonotonic2 :: (a -> b -> c) -> Range a -> Range b -> Range c-mapMonotonic2 f (Range l1 u1) (Range l2 u2) = Range (f l1 l2) (f u1 u2)--------------------------------------------------------------------------------------- * Lattice operations-----------------------------------------------------------------------------------instance BoundedInt a => Lattice (Range a)- where- empty = emptyRange- universal = fullRange- (\/) = rangeUnion- (/\) = rangeIntersection---- | The range containing no elements-emptyRange :: BoundedInt a => Range a-emptyRange = Range maxBound minBound---- | The range containing all elements of a type-fullRange :: BoundedInt a => Range a-fullRange = Range minBound maxBound---- | Construct a range-range :: a -> a -> Range a-range = Range---- | The range containing one element-singletonRange :: a -> Range a-singletonRange a = Range a a---- | The range from @0@ to the maximum element-naturalRange :: BoundedInt a => Range a-naturalRange = Range 0 maxBound---- | The range from the smallest negative element to @-1@.--- Undefined for unsigned types-negativeRange :: forall a . BoundedInt a => Range a-negativeRange- | isSigned (undefined::a) = Range minBound (-1)- | otherwise = emptyRange---- | The size of a range. Beware that the size may not always be representable--- for signed types. For instance--- @rangeSize (range minBound maxBound) :: Int@ gives a nonsense answer.-rangeSize :: BoundedInt a => Range a -> a-rangeSize (Range l u) = u-l+1---- | Checks if the range is empty-isEmpty :: BoundedInt a => Range a -> Bool-isEmpty (Range l u) = u < l---- | Checks if the range contains all values of the type-isFull :: BoundedInt a => Range a -> Bool-isFull = (==fullRange)---- | Checks is the range contains exactly one element-isSingleton :: BoundedInt a => Range a -> Bool-isSingleton (Range l u) = l==u---- | @r1 \`isSubRangeOf\` r2@ checks is all the elements in @r1@ are included--- in @r2@-isSubRangeOf :: BoundedInt a => Range a -> Range a -> Bool-isSubRangeOf r1@(Range l1 u1) r2@(Range l2 u2)- | isEmpty r1 = True- | isEmpty r2 = False- | otherwise = (l1>=l2) && (u1<=u2)---- | Checks whether a range is a sub-range of the natural numbers.-isNatural :: BoundedInt a => Range a -> Bool-isNatural = (`isSubRangeOf` naturalRange)---- | Checks whether a range is a sub-range of the negative numbers.-isNegative :: BoundedInt a => Range a -> Bool-isNegative = (`isSubRangeOf` negativeRange)---- | @a \`inRange\` r@ checks is @a@ is an element of the range @r@.-inRange :: BoundedInt a => a -> Range a -> Bool-inRange a r = singletonRange a `isSubRangeOf` r---- | A convenience function for defining range propagation. If the input--- range is empty then the result is also empty.-rangeOp :: BoundedInt a => (Range a -> Range a) -> (Range a -> Range a)-rangeOp f r = if isEmpty r then r else f r---- | See 'rangeOp'.-rangeOp2 :: BoundedInt a =>- (Range a -> Range a -> Range a) -> (Range a -> Range a -> Range a)-rangeOp2 f r1 r2- | isEmpty r1 = r1- | isEmpty r2 = r2- | otherwise = f r1 r2---- | Union on ranges.-rangeUnion :: BoundedInt a => Range a -> Range a -> Range a-r1 `rangeUnion` r2- | isEmpty r1 = r2- | isEmpty r2 = r1- | otherwise = union r1 r2- where- union (Range l1 u1) (Range l2 u2) = Range (min l1 l2) (max u1 u2)---- | Intersection on ranges.-rangeIntersection :: BoundedInt a => Range a -> Range a -> Range a-rangeIntersection = rangeOp2 intersection- where- intersection (Range l1 u1) (Range l2 u2) = Range (max l1 l2) (min u1 u2)---- | @disjoint r1 r2@ returns true when @r1@ and @r2@ have no elements in--- common.-disjoint :: BoundedInt a => Range a -> Range a -> Bool-disjoint r1 r2 = isEmpty (r1 /\ r2)---- | @rangeGap r1 r2@ returns a range of all the elements between @r1@ and--- @r2@ including the boundary elements. If @r1@ and @r2@ have elements in--- common the result is an empty range.-rangeGap :: BoundedInt a => Range a -> Range a -> Range a-rangeGap = rangeOp2 gap- where- gap (Range l1 u1) (Range l2 u2)- | u1 < l2 = range u1 l2- | u2 < l1 = range u2 l1- gap _ _ = emptyRange- -- If the result is non-empty, it will include the boundary elements from the- -- two ranges.---- | @r1 \`rangeLess\` r2:@------ Checks if all elements of @r1@ are less than all elements of @r2@.-rangeLess :: BoundedInt a => Range a -> Range a -> Bool-rangeLess r1 r2- | isEmpty r1 || isEmpty r2 = True-rangeLess (Range _ u1) (Range l2 _) = u1 < l2---- | @r1 \`rangeLessEq\` r2:@------ Checks if all elements of @r1@ are less than or equal to all elements of--- @r2@.-rangeLessEq :: BoundedInt a => Range a -> Range a -> Bool-rangeLessEq (Range _ u1) (Range l2 _) = u1 <= l2--------------------------------------------------------------------------------------- * Propagation------------------------------------------------------------------------------------- | @rangeByRange ra rb@: Computes the range of the following set------ > {x | a <- ra, b <- rb, x <- Range a b}-rangeByRange :: BoundedInt a => Range a -> Range a -> Range a-rangeByRange r1 r2- | isEmpty r1 = emptyRange- | isEmpty r2 = emptyRange- | otherwise = Range (lowerBound r1) (upperBound r2)---- | Implements 'fromInteger' as a 'singletonRange', and implements correct--- range propagation for arithmetic operations.-instance BoundedInt a => Num (Range a)- where- fromInteger = singletonRange . fromInteger- abs = rangeAbs- signum = rangeSignum- negate = rangeNeg- (+) = rangeAdd- (*) = rangeMul---- | Propagates range information through @abs@.-rangeAbs :: BoundedInt a => Range a -> Range a-rangeAbs = rangeOp $ \r -> case r of- Range l u- | isNatural r -> r- | r == singletonRange minBound -> r- | minBound `inRange` r -> range minBound maxBound- | isNegative r -> range (abs u) (abs l)- | otherwise -> range 0 (abs l `max` abs u)---- | Propagates range information through 'signum'.-rangeSignum :: BoundedInt a => Range a -> Range a-rangeSignum = handleSign rangeSignumUnsigned rangeSignumSigned---- | Signed case for 'rangeSignum'.-rangeSignumSigned :: BoundedInt a => Range a -> Range a-rangeSignumSigned = rangeOp sign- where- sign r- | range (-1) 1 `isSubRangeOf` r = range (-1) 1- | range (-1) 0 `isSubRangeOf` r = range (-1) 0- | range 0 1 `isSubRangeOf` r = range 0 1- | inRange 0 r = 0- | isNatural r = 1- | isNegative r = -1---- | Unsigned case for 'rangeSignum'.-rangeSignumUnsigned :: BoundedInt a => Range a -> Range a-rangeSignumUnsigned = rangeOp sign- where- sign r- | r == singletonRange 0 = r- | not (0 `inRange` r) = singletonRange 1- | otherwise = range 0 1---- | Propagates range information through negation.-rangeNeg :: BoundedInt a => Range a -> Range a-rangeNeg = handleSign rangeNegUnsigned rangeNegSigned---- | Unsigned case for 'rangeNeg'.-rangeNegUnsigned :: BoundedInt a => Range a -> Range a-rangeNegUnsigned (Range l u)- | l == 0 && u /= 0 = fullRange- | otherwise = range (-u) (-l)--- Code from Hacker's Delight---- | Signed case for 'rangeNeg'.-rangeNegSigned :: BoundedInt a => Range a -> Range a-rangeNegSigned (Range l u)- | l == minBound && u == minBound = singletonRange minBound- | l == minBound = fullRange- | otherwise = range (-u) (-l)--- Code from Hacker's Delight---- | Propagates range information through addition.-rangeAdd :: BoundedInt a => Range a -> Range a -> Range a-rangeAdd = handleSign rangeAddUnsigned rangeAddSigned---- | Unsigned case for 'rangeAdd'.-rangeAddUnsigned :: BoundedInt a => Range a -> Range a -> Range a-rangeAddUnsigned (Range l1 u1) (Range l2 u2)- | s >= l1 && t < u1 = fullRange- | otherwise = range s t- where- s = l1 + l2- t = u1 + u2--- Code from Hacker's Delight---- | Signed case for 'rangeAdd'.-rangeAddSigned :: BoundedInt a => Range a -> Range a -> Range a-rangeAddSigned (Range l1 u1) (Range l2 u2)- | (u .|. v) < 0 = fullRange- | otherwise = range s t- where- s = l1 + l2- t = u1 + u2- u = l1 .&. l2 .&. complement s .&.- complement (u1 .&. u2 .&. complement t)- v = ((xor l1 l2) .|. complement (xor l1 s)) .&.- (complement u1 .&. complement u2 .&. t)--- Code from Hacker's Delight---- | Propagates range information through subtraction.-rangeSub :: BoundedInt a => Range a -> Range a -> Range a-rangeSub = handleSign rangeSubUnsigned (-)---- | Unsigned case for 'rangeSub'.-rangeSubUnsigned :: BoundedInt a => Range a -> Range a -> Range a-rangeSubUnsigned (Range l1 u1) (Range l2 u2)- | s > l1 && t <= u1 = fullRange- | otherwise = range s t- where- s = l1 - u2- t = u1 - l2- -- Note: This is more accurate than the default definition using 'negate',- -- because 'negate' always overflows for unsigned numbers.- -- Code from Hacker's Delight---- | Saturating unsigned subtraction-subSat :: BoundedInt a => a -> a -> a-subSat a b = a - min a b---- | Range propagation for 'subSat'-rangeSubSat :: BoundedInt a => Range a -> Range a -> Range a-rangeSubSat r1 r2 = Range- (subSat (lowerBound r1) (upperBound r2))- (subSat (upperBound r1) (lowerBound r2))---- | Propagates range information through multiplication-rangeMul :: BoundedInt a => Range a -> Range a -> Range a-rangeMul = handleSign rangeMulUnsigned rangeMulSigned---- | Signed case for 'rangeMul'.-rangeMulSigned :: forall a . BoundedInt a => Range a -> Range a -> Range a-rangeMulSigned r1 r2- | r1 == singletonRange 0 || r2 == singletonRange 0 = singletonRange 0- -- The following case is important because the 'maxAbs' function doesn't- -- work for 'minBound' on signed numbers.- | lowerBound r1 == minBound || lowerBound r2 == minBound- = range minBound maxBound- | bits (maxAbs r1) + bits (maxAbs r2) <= bitSize (undefined :: a) - 1- = range (minimum [b1,b2,b3,b4]) (maximum [b1,b2,b3,b4])- | otherwise = range minBound maxBound- where maxAbs (Range l u) = max (abs l) (abs u)- b1 = lowerBound r1 * lowerBound r2- b2 = lowerBound r1 * upperBound r2- b3 = upperBound r1 * lowerBound r2- b4 = upperBound r1 * upperBound r2---- | Unsigned case for 'rangeMul'.-rangeMulUnsigned :: forall a . BoundedInt a => Range a -> Range a -> Range a-rangeMulUnsigned r1 r2- | bits (upperBound r1) + bits (upperBound r2)- <= bitSize (undefined :: a)- = mapMonotonic2 (*) r1 r2- | otherwise = universal---- | Returns the position of the highest bit set to 1. Counting starts at 1.--- Beware! It doesn't terminate for negative numbers.-bits :: Bits b => b -> Int-bits b = loop b 0- where loop 0 c = c- loop n c = loop (n `shiftR` 1) (c+1)---- | Propagates range information through exponentiation.-rangeExp :: BoundedInt a => Range a -> Range a -> Range a-rangeExp = handleSign rangeExpUnsigned rangeExpSigned---- | Unsigned case for 'rangeExp'.-rangeExpUnsigned :: BoundedInt a => Range a -> Range a -> Range a-rangeExpUnsigned m@(Range l1 u1) e@(Range l2 u2)- | toInteger (bits u1) * toInteger u2 > toInteger (bitSize l1) + 1 = universal- | toInteger u1 ^ toInteger u2 > toInteger (maxBound `asTypeOf` l1) = universal- | 0 `inRange` m && 0 `inRange` e = range 0 (max b1 b2)- | otherwise = range b1 b2- where b1 = (l1 ^ l2)- b2 = (u1 ^ u2)---- | Sigend case for 'rangeExp'-rangeExpSigned :: BoundedInt a => Range a -> Range a -> Range a-rangeExpSigned m e | m == singletonRange (-1) = range (-1) 1-rangeExpSigned _ _ = universal---- | Propagates range information through '.|.'.-rangeOr :: forall a . BoundedInt a => Range a -> Range a -> Range a-rangeOr = handleSign rangeOrUnsignedAccurate (\_ _ -> universal)---- | Cheap and inaccurate range propagation for '.|.' on unsigned numbers.-rangeOrUnsignedCheap :: BoundedInt a => Range a -> Range a -> Range a-rangeOrUnsignedCheap (Range l1 u1) (Range l2 u2) =- range (max l1 l2) (maxPlus u1 u2)--- Code from Hacker's Delight.---- | @a \`maxPlus\` b@ adds @a@ and @b@ but if the addition overflows then--- 'maxBound' is returned.-maxPlus :: BoundedInt a => a -> a -> a-maxPlus b d = if sum < b then maxBound- else sum- where sum = b + d---- | Accurate lower bound for '.|.' on unsigned numbers.-minOrUnsigned :: BoundedInt a => a -> a -> a -> a -> a-minOrUnsigned a b c d = loop (bit (bitSize a - 1))- where loop 0 = a .|. c- loop m- | complement a .&. c .&. m > 0 =- let temp = (a .|. m) .&. negate m- in if temp <= b- then temp .|. c- else loop (shiftR m 1)- | a .&. complement c .&. m > 0 =- let temp = (c .|. m) .&. negate m- in if temp <= d- then a .|. temp- else loop (shiftR m 1)- | otherwise = loop (shiftR m 1)--- Code from Hacker's Delight.---- | Accurate upper bound for '.|.' on unsigned numbers.-maxOrUnsigned :: BoundedInt a => a -> a -> a -> a -> a-maxOrUnsigned a b c d = loop (bit (bitSize a - 1))- where loop 0 = b .|. d- loop m- | b .&. d .&. m > 0 =- let temp = (b - m) .|. (m - 1)- in if temp >= a- then temp .|. d- else let temp = (d - m) .|. (m - 1)- in if temp >= c- then b .|. temp- else loop (shiftR m 1)- | otherwise = loop (shiftR m 1)--- Code from Hacker's Delight.---- | Accurate range propagation through '.|.' for unsigned types.-rangeOrUnsignedAccurate :: BoundedInt a => Range a -> Range a -> Range a-rangeOrUnsignedAccurate (Range l1 u1) (Range l2 u2) =- range (minOrUnsigned l1 u1 l2 u2) (maxOrUnsigned l1 u1 l2 u2)--- Code from Hacker's Delight.---- | Propagating range information through '.&.'.-rangeAnd :: forall a . BoundedInt a => Range a -> Range a -> Range a-rangeAnd = handleSign rangeAndUnsignedCheap (\_ _ -> universal)---- | Cheap and inaccurate range propagation for '.&.' on unsigned numbers.-rangeAndUnsignedCheap :: BoundedInt a => Range a -> Range a -> Range a-rangeAndUnsignedCheap (Range l1 u1) (Range l2 u2) = range 0 (min u1 u2)--- Code from Hacker's Delight.---- | Propagating range information through 'xor'.-rangeXor :: forall a . BoundedInt a => Range a -> Range a -> Range a-rangeXor = handleSign rangeXorUnsigned (\_ _ -> universal)---- | Unsigned case for 'rangeXor'.-rangeXorUnsigned :: BoundedInt a => Range a -> Range a -> Range a-rangeXorUnsigned (Range l1 u1) (Range l2 u2) = range 0 (maxPlus u1 u2)--- Code from Hacker's Delight.---- | Propagating range information through 'shiftLU'.-rangeShiftLU :: (BoundedInt a, BoundedInt b) => Range a -> Range b -> Range a-rangeShiftLU = handleSign rangeShiftLUUnsigned (\_ _ -> universal)--- TODO: improve accuracy---- | Unsigned case for 'rangeShiftLU'.-rangeShiftLUUnsigned (Range l1 u1) (Range l2 u2)- | toInteger (bits u1) + fromIntegral u2 > toInteger (bitSize u1) = universal-rangeShiftLUUnsigned (Range l1 u1) (Range l2 u2)- = range (shiftL l1 (fromIntegral l2)) (shiftL u1 (fromIntegral u2))---- | Propagating range information through 'shiftRU'.-rangeShiftRU :: (BoundedInt a, BoundedInt b) => Range a -> Range b -> Range a-rangeShiftRU = handleSign rangeShiftRUUnsigned (\_ _ -> universal)--- TODO: improve accuracy---- | Unsigned case for 'rangeShiftRU'.-rangeShiftRUUnsigned (Range l1 u1) (Range l2 u2)- = range (correctShiftRU l1 u2) (correctShiftRU u1 l2)---- | This is a replacement fror Haskell's shiftR. If we carelessly use--- Haskell's variant then we will get left shifts for very large shift values.-correctShiftRU :: (Bits a, BoundedInt b) => a -> b -> a-correctShiftRU a i | i > fromIntegral (maxBound :: Int) = 0-correctShiftRU a i = shiftR a (fromIntegral i)---- | Propagates range information through 'max'.-rangeMax :: BoundedInt a => Range a -> Range a -> Range a-rangeMax r1 r2- | isEmpty r1 = r2- | isEmpty r2 = r1- | r1 `rangeLess` r2 = r2- | r2 `rangeLess` r1 = r1- | otherwise = mapMonotonic2 max r1 r2---- | Analogous to 'rangeMax'-rangeMin :: BoundedInt a => Range a -> Range a -> Range a-rangeMin r1 r2- | isEmpty r1 = r2- | isEmpty r2 = r1- | r1 `rangeLess` r2 = r1- | r2 `rangeLess` r1 = r2- | otherwise = mapMonotonic2 min r1 r2--instance BoundedInt a => Ord (Range a)- where- compare = error "compare: I don't make sense for (Range a)"- min = rangeMin- max = rangeMax---- | Propagates range information through 'mod'.--- Note that we assume Haskell semantics for 'mod'.-rangeMod :: BoundedInt a => Range a -> Range a -> Range a-rangeMod d r- | isSigned (lowerBound d) &&- minBound `inRange` d && (-1) `inRange` r = fullRange- | d `rangeLess` r && isNatural r && isNatural d = d- | isNatural r = range 0 (pred (upperBound r))- | r `rangeLess` d && isNeg r && isNeg d = d- | isNeg r = range (succ (lowerBound r)) 0- where- isNeg = (`isSubRangeOf` negs)- negs = negativeRange \/ 0-rangeMod d (Range l u) = Range (succ l) (pred u)---- | Propagates range information through 'rem'.--- Note that we assume Haskell semantics for 'rem'.-rangeRem :: BoundedInt a => Range a -> Range a -> Range a-rangeRem d r- | isSigned (lowerBound d) &&- minBound `inRange` d && (-1) `inRange` r = fullRange- | d `rangeLessAbs` r && isNatural d = d- | isNatural d = range 0 (pred (upperBound (abs r)))- | d `absRangeLessAbs` r && isNeg d = d- | isNeg d = range (negate (upperBound (abs r))) 0- where- isNeg = (`isSubRangeOf` negs)- negs = negativeRange \/ 0-rangeRem d r@(Range l u)- | abs l >= abs u || l == minBound = range (succ $ negate $ abs l) (predAbs l)- | otherwise = range (succ $ negate $ abs u) (predAbs u)--predAbs l | l == minBound = abs (succ l)- | otherwise = pred (abs l)--rangeDiv :: BoundedInt a => Range a -> Range a -> Range a-rangeDiv = handleSign rangeDivU (\_ _ -> universal)--rangeDivU :: BoundedInt a => Range a -> Range a -> Range a-rangeDivU (Range l1 u1) (Range l2 u2) | l2 == 0 || u2 == 0 = universal-rangeDivU (Range l1 u1) (Range l2 u2) = Range (l1 `quot` u2) (u1 `quot`l2)---- | Propagates range information through 'quot'.-rangeQuot :: BoundedInt a => Range a -> Range a -> Range a-rangeQuot = handleSign rangeQuotU (\_ _ -> universal)---- | Unsigned case for 'rangeQuot'.-rangeQuotU :: BoundedInt a => Range a -> Range a -> Range a-rangeQuotU (Range l1 u1) (Range l2 u2) | l2 == 0 || u2 == 0 = universal-rangeQuotU (Range l1 u1) (Range l2 u2) = Range (l1 `quot` u2) (u1 `quot` l2)---- | Writing @d \`rangeLess\` abs r@ doesn't mean what you think it does because--- 'r' may contain minBound which doesn't have a positive representation.--- Instead, this function should be used.-rangeLessAbs d r- | r == singletonRange minBound- = lowerBound d /= minBound- | lowerBound r == minBound- = d `rangeLess` (abs (range (succ (lowerBound r)) (upperBound r)))- | otherwise = d `rangeLess` (abs r)---- | Similar to 'rangeLessAbs' but replaces the expression--- @abs d \`rangeLess\` abs r@ instead.-absRangeLessAbs d r- | lowerBound d == minBound = False- | otherwise = abs d `rangeLessAbs` r-------------------------------------------------------------------------------------- * Products of ranges-----------------------------------------------------------------------------------{- These functions are used to compute the ranges of DefaultInt and- DefaultWord. The size information of these two types is the union of the- sizes for all possible IntX/WordX that we support as defaults -}--liftR :: (BoundedInt b, BoundedInt c, BoundedInt d) =>- (forall a. (BoundedInt a) => Range a) -> (Range b,Range c,Range d)-liftR r = (r,r,r)--binopR :: (BoundedInt a, BoundedInt b, BoundedInt c) =>- (forall a. BoundedInt a => Range a -> Range a -> Range a) ->- (Range a, Range b, Range c) ->- (Range a, Range b, Range c) ->- (Range a, Range b, Range c)-binopR bop (a1,b1,c1) (a2,b2,c2)- = (bop a1 a2, bop b1 b2, bop c1 c2)---mapR :: (BoundedInt a, BoundedInt b, BoundedInt c) =>- (forall a . BoundedInt a => Range a -> Range a) ->- (Range a, Range b, Range c) ->- (Range a, Range b, Range c)-mapR f (a,b,c) = (f a, f b, f c)--approx :: (BoundedInt a, BoundedInt b, BoundedInt c, BoundedInt d)- => (Range a, Range b, Range c) -> Range d-approx (r1,r2,r3) | isFull r1 || isFull r2 || isFull r3- = fullRange-approx (r1,r2,r3) = mapMonotonic fromIntegral r1 \/- mapMonotonic fromIntegral r2 \/- mapMonotonic fromIntegral r3--instance (BoundedInt a, BoundedInt b, BoundedInt c) =>- Num (Range a,Range b,Range c) where- (+) = binopR (+)- (-) = binopR (-)- (*) = binopR (*)- signum = mapR rangeSignum- fromInteger i = liftR (fromInteger i)- abs = mapR abs- negate = mapR negate--------------------------------------------------------------------------------------- * Testing-----------------------------------------------------------------------------------instance (BoundedInt a, Arbitrary a) => Arbitrary (Range a)- where- arbitrary = do- [bound1,bound2] <- vectorOf 2 $ oneof- [ arbitrary- , elements [minBound,-1,0,1,maxBound]]- frequency- [ (10, return $- Range (min bound1 bound2) (max bound1 bound2))- , (1 , return $- Range (max bound1 bound2) (min bound1 bound2)) -- Empty- , (1 , return $- Range bound1 bound1) -- Singleton- ]-- shrink (Range x y) =- [ Range x' y | x' <- shrink x ] ++- [ Range x y' | y' <- shrink y ]--instance Random Word32 where- random g = (fromIntegral i,g')- where (i :: Int,g') = random g- randomR (l,u) g = (fromIntegral i,g')- where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g--instance Random Int8 where- random g = (fromIntegral i,g')- where (i :: Int,g') = random g- randomR (l,u) g = (fromIntegral i,g')- where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g--instance Random Word8 where- random g = (fromIntegral i,g')- where (i :: Int,g') = random g- randomR (l,u) g = (fromIntegral i,g')- where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g---fromRange :: BoundedInt a => Random a => Range a -> Gen a-fromRange r- | isEmpty r = error "fromRange: empty range"- | otherwise = choose (lowerBound r, upperBound r)--rangeTy :: Range t -> t -> Range t-rangeTy r t = r---- | Applies a (monadic) function to all the types we are interested in testing--- with for Feldspar.------ Example usage: 'atAllTypes (quickCheck . prop_mul)'-atAllTypes :: (Monad m) =>- (forall t . (BoundedInt t, Random t, Arbitrary t, Typeable t) =>- t -> m a)- -> m ()-atAllTypes test = sequence_ [test (undefined :: Int)- ,test (undefined :: Int8)- ,test (undefined :: Word32)- ,test (undefined :: Word8)- ]---- | Test if a operation is "strict" wrt. empty ranges-prop_isStrict1 t op ra = isEmpty ra ==> isEmpty (op ra)- where _ = ra `rangeTy` t---- | Test if an operation is "strict" wrt. empty ranges-prop_isStrict2 t op ra rb =- isEmpty ra || isEmpty rb ==> isEmpty (op ra rb)- where _ = ra `rangeTy` t---- TODO Think about strictness of range operations (in the sense of `isStrict1`--- and `isStrict2`). Probably all range propagation operations should be strict,--- but many of them are currently not:------ *Feldspar.Range> quickCheck (prop_isStrict2 (undefined :: Int) (+))--- *** Failed! Falsifiable (after 1 test and 1 shrink):--- Range {lowerBound = 0, upperBound = 1}--- Range {lowerBound = 1, upperBound = 0}--------------------------------------------------------------------------------------- ** Lattice operations-----------------------------------------------------------------------------------prop_empty t = isEmpty (emptyRange `rangeTy` t)--prop_full t = isFull (fullRange `rangeTy` t)--prop_isEmpty t r = isEmpty r ==> (upperBound r < lowerBound (r `rangeTy` t))--prop_singletonRange t a = isSingleton (singletonRange (a `asTypeOf` t))--prop_singletonSize t r = isSingleton (r `rangeTy` t) ==> (rangeSize r == 1)--prop_emptySubRange1 t r1 r2 =- isEmpty (r1 `rangeTy` t) ==> (not (isEmpty r2) ==>- not (r2 `isSubRangeOf` r1))--prop_emptySubRange2 t r1 r2 =- isEmpty (r1 `rangeTy` t) ==> (not (isEmpty r2) ==> (r1 `isSubRangeOf` r2))--prop_rangeGap t r1 r2 =- (isEmpty gap1 && isEmpty gap2) || (gap1 == gap2)- where- gap1 = rangeGap r1 r2- gap2 = rangeGap r2 r1- _ = r1 `rangeTy` t--prop_union1 t x r1 r2 =- ((x `inRange` r1) || (x `inRange` r2)) ==> (x `inRange` (r1\/r2))- where _ = x `asTypeOf` t--prop_union2 t x r1 r2 =- (x `inRange` (r1\/r2)) ==>- ((x `inRange` r1) || (x `inRange` r2) || (x `inRange` rangeGap r1 r2))- where _ = x `asTypeOf` t--prop_union3 t r1 r2 = (r1 `rangeTy` t) `isSubRangeOf` (r1\/r2)-prop_union4 t r1 r2 = (r2 `rangeTy` t) `isSubRangeOf` (r1\/r2)---prop_intersect1 t x r1 r2 =- ((x `inRange` r1) && (x `inRange` r2)) ==> (x `inRange` (r1/\r2))- where _ = x `asTypeOf` t-prop_intersect2 t x r1 r2 =- (x `inRange` (r1/\r2)) ==> ((x `inRange` r1) && (x `inRange` r2))- where _ = x `asTypeOf` t--prop_intersect3 t r1 r2 = (r1/\r2) `isSubRangeOf` (r1 `rangeTy` t)-prop_intersect4 t r1 r2 = (r1/\r2) `isSubRangeOf` (r2 `rangeTy` t)--prop_intersect5 t r1 r2 =- isEmpty r1 || isEmpty r2 ==> isEmpty (r1/\r2)- where _ = r1 `rangeTy` t--prop_disjoint t x r1 r2 =- disjoint r1 r2 ==> (x `inRange` r1) ==> not (x `inRange` r2)- where _ = x `asTypeOf` t---prop_rangeLess1 t r1 r2 =- rangeLess r1 r2 ==> disjoint r1 (r2 `rangeTy` t)--prop_rangeLess2 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- forAll (fromRange r1) $ \x ->- forAll (fromRange r2) $ \y ->- rangeLess r1 r2 ==> x < y- where _ = r1 `rangeTy` t--prop_rangeLessEq t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- forAll (fromRange r1) $ \x ->- forAll (fromRange r2) $ \y ->- rangeLessEq r1 r2 ==> x <= y- where _ = r1 `rangeTy` t-------------------------------------------------------------------------------------- ** Propagation-----------------------------------------------------------------------------------prop_propagation1 :: (BoundedInt t, Random t) =>- t -> (forall a . Num a => a -> a) -> Range t -> Property-prop_propagation1 t op r =- not (isEmpty r) ==>- forAll (fromRange r) $ \x ->- op x `inRange` op r---- | This function is useful for range propagation functions like--- 'rangeMax', 'rangeMod' etc.--- It takes two ranges, picks an element out of either ranges and--- checks if applying the operation to the individual elements is in--- the resulting range after range propagation.------ The third argument is a precondition that is satisfied before the test is--- run. A good example is to make sure that the second argument is non-zero--- when testing division.-rangePropagationSafetyPre :: (Random t, BoundedInt t, BoundedInt a) =>- t ->- (t -> t -> a) -> (Range t -> Range t -> Range a) ->- (t -> t -> Bool) ->- Range t -> Range t -> Property-rangePropagationSafetyPre t op rop pre r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- forAll (fromRange r1) $ \v1 ->- forAll (fromRange r2) $ \v2 ->- pre v1 v2 ==>- op v1 v2 `inRange` rop r1 r2--rangePropagationSafetyPre2 ::- (Random t, BoundedInt t, Random t2, BoundedInt t2, BoundedInt a) =>- t -> t2 ->- (t -> t2 -> a) -> (Range t -> Range t2 -> Range a) ->- (t -> t2 -> Bool) ->- Range t -> Range t2 -> Property-rangePropagationSafetyPre2 t1 t2 op rop pre r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- forAll (fromRange r1) $ \v1 ->- forAll (fromRange r2) $ \v2 ->- pre v1 v2 ==>- op v1 v2 `inRange` rop r1 r2--rangePropagationSafety t op rop = rangePropagationSafetyPre t op rop noPre- where- noPre _ _ = True--rangePropSafety1 t op rop ran =- not (isEmpty ran) ==>- forAll (fromRange ran) $ \val ->- op val `inRange` rop ran- where _ = ran `rangeTy` t--prop_propagation2- :: (BoundedInt t, Random t) => t -> (forall a . Num a => a -> a -> a)- -> Range t -> Range t -> Property-prop_propagation2 t op r1 r2 = rangePropagationSafety t op op r1 r2--prop_rangeByRange1 t ra rb =- forAll (fromRange ra) $ \a ->- forAll (fromRange rb) $ \b ->- forAll (fromRange (Range a b)) $ \x ->- not (isEmpty ra) && not (isEmpty rb) && not (isEmpty (Range a b)) ==>- inRange x (rangeByRange ra rb)- where _ = ra `rangeTy` t--prop_rangeByRange2 t = prop_isStrict2 t rangeByRange--prop_fromInteger t a = isSingleton (fromInteger a `rangeTy` t)--prop_abs t = prop_propagation1 t abs-prop_sign t = prop_propagation1 t signum-prop_neg t = prop_propagation1 t negate-prop_add t = prop_propagation2 t (+)-prop_sub t = prop_propagation2 t (-)-prop_mul t = prop_propagation2 t (*)--prop_exp t = rangePropagationSafetyPre t (^) rangeExp (\_ e -> e >= 0)--prop_mulU t = rangePropagationSafety t (*) rangeMulUnsigned--prop_subSat t = rangePropagationSafety t subSat rangeSubSat--prop_isNegative t r =- not (isEmpty r) && not (r == Range minBound minBound) ==>- isNegative r ==> not (isNegative $ negate r)- where _ = rangeTy r t--prop_abs2 t r =- lowerBound r /= (minBound `asTypeOf` t) ==> isNatural (abs r)--prop_or t = rangePropagationSafety t (.|.) rangeOr--prop_and t = rangePropagationSafety t (.&.) rangeAnd--prop_xor t = rangePropagationSafety t xor rangeXor--prop_shiftLU t1 t2- = rangePropagationSafetyPre2 t1 t2 fixShiftL rangeShiftLU (\_ _ -> True)- where fixShiftL a b = shiftL a (fromIntegral b)--prop_shiftRU t1 t2- = rangePropagationSafetyPre2 t1 t2 fixShiftR rangeShiftRU (\_ _ -> True)- where fixShiftR a b = correctShiftRU a b--prop_rangeMax1 t r1 = rangeMax r1 r1 == (r1 `rangeTy` t)--prop_rangeMax2 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- upperBound r1 <= upperBound max && upperBound r2 <= upperBound max- where- max = rangeMax r1 (r2 `rangeTy` t)--prop_rangeMax3 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- lowerBound (rangeMax r1 r2) == max (lowerBound r1) (lowerBound r2)- where _ = r1 `rangeTy` t--prop_rangeMax4 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- rangeMax r1 r2 == rangeMax r2 r1- where _ = r1 `rangeTy` t--prop_rangeMax5 t r1 r2 =- (isEmpty r1 && not (isEmpty r2) ==>- rangeMax r1 r2 == r2)- QC..&.- (isEmpty r2 && not (isEmpty r1) ==>- rangeMax r1 r2 == r1)- where _ = r1 `rangeTy` t--prop_rangeMax6 t v1 v2 =- max v1 v2 `inRange` rangeMax (singletonRange v1) (singletonRange v2)- where _ = v1 `asTypeOf` t--prop_rangeMax7 a r1 r2 =- rangePropagationSafety a max rangeMax r1 r2--prop_rangeMin1 t r1 = rangeMin r1 r1 == (r1 `rangeTy` t)--prop_rangeMin2 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- lowerBound min <= lowerBound r1 && lowerBound min <= lowerBound r2- where- min = rangeMin r1 (r2 `rangeTy` t)--prop_rangeMin3 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- upperBound (rangeMin r1 r2) == min (upperBound r1) (upperBound r2)- where _ = r1 `rangeTy` t--prop_rangeMin4 t r1 r2 =- not (isEmpty r1) && not (isEmpty r2) ==>- rangeMin r1 r2 == rangeMin r2 r1- where _ = r1 `rangeTy` t--prop_rangeMin5 t r1 r2 =- (isEmpty r1 && not (isEmpty r2) ==>- rangeMin r1 r2 == r2)- QC..&.- (isEmpty r2 && not (isEmpty r1) ==>- rangeMin r1 r2 == r1)- where _ = r1 `rangeTy` t--prop_rangeMin6 t v1 v2 =- min v1 v2 `inRange` rangeMin (singletonRange v1) (singletonRange v2)- where _ = v1 `asTypeOf` t--prop_rangeMin7 t r1 r2 =- rangePropagationSafety t min rangeMin r1 r2--prop_rangeMod1 t v1 v2 =- v2 /= 0 ==>- mod v1 v2 `inRange` rangeMod (singletonRange v1) (singletonRange v2)- where _ = v1 `asTypeOf` t--prop_rangeMod2 t =- rangePropagationSafetyPre t mod rangeMod divPre--prop_rangeMod3 t =- isFull $ rangeMod (singletonRange (minBound `asTypeOf` t))- (singletonRange (-1))--prop_rangeRem t =- rangePropagationSafetyPre t rem rangeRem divPre--prop_rangeRem1 t =- isFull $ rangeRem (singletonRange (minBound `asTypeOf` t))- (singletonRange (-1))--prop_rangeQuot t =- rangePropagationSafetyPre t quot rangeQuot divPre--prop_rangeQuot1 t =- isFull $ rangeQuot (singletonRange (minBound `asTypeOf` t))- (singletonRange (-1))---- | Precondition for division like operators.--- Avoids division by zero and arithmetic overflow.-divPre v1 v2 = v2 /= 0 && not (v1 == minBound && v2 == (-1))-
− Feldspar/Repa.hs
@@ -1,339 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}-module Feldspar.Repa where--import qualified Prelude as P--import Language.Syntactic.Syntax-import Feldspar hiding (desugar,sugar,resugar)---- | * Shapes--infixl 3 :.-data Z = Z-data tail :. head = tail :. head--type DIM0 = Z-type DIM1 = DIM0 :. Data Length-type DIM2 = DIM1 :. Data Length-type DIM3 = DIM2 :. Data Length--class Shape sh where- -- | Get the number of dimentsions in a shape- dim :: sh -> Int- -- | The shape of an array of size zero, with a particular dimension- zeroDim :: sh- -- | The shape of an array with size one, with a particular dimension- unitDim :: sh- -- | Get the total number of elements in an array with this shape.- size :: sh -> Data Length- -- | Index into flat, linear, row-major representation- toIndex :: sh -> sh -> Data Index- -- | Inverse of `toIndex`.- fromIndex :: sh -> Data Index -> sh- -- | The intersection of two dimensions.- intersectDim :: sh -> sh -> sh- -- | Check whether an index is within a given shape.- -- @inRange l u i@ checks that 'i' fits between 'l' and 'u'.- inRange :: sh -> sh -> sh -> Data Bool- -- | Turn a shape into a list. Used in the 'Syntactic' instance.- toList :: sh -> [Data Length]- -- | Reconstruct a shape. Used in the 'Syntactic' instance.- toShape :: Int -> Data [Length] -> sh--instance Shape Z where- dim Z = 0- zeroDim = Z- unitDim = Z- size Z = 1- toIndex _ _ = 0- fromIndex _ _ = Z- intersectDim _ _ = Z- inRange Z Z Z = true- toList _ = []- toShape _ _ = Z--instance Shape sh => Shape (sh :. Data Length) where- dim (sh :. _) = dim sh + 1- zeroDim = zeroDim :. 0- unitDim = unitDim :. 1- size (sh :. i) = size sh * i- toIndex (sh1 :. sh2) (sh1' :. sh2') = toIndex sh1 sh1' * sh2 + sh2'- fromIndex (ds :. d) ix- = fromIndex ds (ix `quot` d) :. (ix `rem` d)- intersectDim (sh1 :. n1) (sh2 :. n2)- = (intersectDim sh1 sh2 :. (min n1 n2))- inRange (shL :. l) (shU :. u) (sh :. i)- = l <= i && i < u && inRange shL shU sh- toList (sh :. i) = i : toList sh- toShape i arr- = toShape (i+1) arr :. (arr ! (P.fromIntegral i))---- | * Slices--data All = All-data Any sh = Any--type family FullShape ss-type instance FullShape Z = Z-type instance FullShape (Any sh) = sh-type instance FullShape (sl :. Data Length) = FullShape sl :. Data Length-type instance FullShape (sl :. All) = FullShape sl :. Data Length--type family SliceShape ss-type instance SliceShape Z = Z-type instance SliceShape (Any sh) = sh-type instance SliceShape (sl :. Data Length) = SliceShape sl-type instance SliceShape (sl :. All) = SliceShape sl :. Data Length--class Slice ss where- sliceOfFull :: ss -> FullShape ss -> SliceShape ss- fullOfSlice :: ss -> SliceShape ss -> FullShape ss--instance Slice Z where- sliceOfFull Z Z = Z- fullOfSlice Z Z = Z--instance Slice (Any sh) where- sliceOfFull Any sh = sh- fullOfSlice Any sh = sh--instance Slice sl => Slice (sl :. Data Length) where- sliceOfFull (fsl :. _) (ssl :. _) = sliceOfFull fsl ssl- fullOfSlice (fsl :. n) ssl = fullOfSlice fsl ssl :. n--instance Slice sl => Slice (sl :. All) where- sliceOfFull (fsl :. All) (ssl :. s)- = sliceOfFull fsl ssl :. s- fullOfSlice (fsl :. All) (ssl :. s)- = fullOfSlice fsl ssl :. s------ | * Vectors--data Vector sh a = Vector sh (sh -> a)-type DVector sh a = Vector sh (Data a)--instance (Shape sh, Syntax a) => Syntactic (Vector sh a) FeldDomainAll- where- type Internal (Vector sh a) = ([Length],[Internal a])- desugar = desugar . freezeVector . map resugar- sugar = map resugar . thawVector . sugar--instance (Shape sh, Syntax a) => Syntax (Vector sh a)---- | * Fuctions---- | Store a vector in an array.-fromVector :: (Shape sh, Type a) => DVector sh a -> Data [a]-fromVector vec = parallel (size ext) (\ix -> vec !: fromIndex ext ix)- where ext = extent vec---- | Restore a vector from an array-toVector :: (Shape sh, Type a) => sh -> Data [a] -> DVector sh a-toVector sh arr = Vector sh (\ix -> arr ! toIndex ix sh)--freezeVector :: (Shape sh, Type a) => DVector sh a -> (Data [Length], Data [a])-freezeVector v = (shapeArr, fromVector v)- where shapeArr = fromList (toList $ extent v)--fromList :: Type a => [Data a] -> Data [a]-fromList ls = loop 1 (parallel (value len) (const (P.head ls)))- where loop i arr- | i P.< len = loop (i+1) (setIx arr (value i) (ls P.!! (P.fromIntegral i)))- | otherwise = arr- len = P.fromIntegral $ P.length ls--thawVector :: (Shape sh, Type a) => (Data [Length], Data [a]) -> DVector sh a-thawVector (l,arr) = toVector (toShape 0 l) arr---- | Store a vector in memory. Use this function instead of 'force' if--- possible as it is both much more safe and faster.-memorize :: (Shape sh, Type a) => DVector sh a -> DVector sh a-memorize vec = toVector (extent vec) (fromVector vec)---- | The shape and size of the vector-extent :: Vector sh a -> sh-extent (Vector sh _) = sh---- | Change shape and transform elements of a vector. This function is the--- most general way of manipulating a vector.-traverse :: (Shape sh, Shape sh') =>- Vector sh a -> (sh -> sh') -> ((sh -> a) -> sh' -> a')- -> Vector sh' a'-traverse (Vector sh ixf) shf elemf- = Vector (shf sh) (elemf ixf)---- | Duplicates part of a vector along a new dimension.-replicate :: (Slice sl, Shape (FullShape sl)- ,Shape (SliceShape sl))- => sl -> Vector (SliceShape sl) a- -> Vector (FullShape sl) a-replicate sl vec- = backpermute (fullOfSlice sl (extent vec))- (sliceOfFull sl) vec---- | Extracts a slice from a vector.-slice :: (Slice sl- ,Shape (FullShape sl)- ,Shape (SliceShape sl))- => Vector (FullShape sl) a- -> sl -> Vector (SliceShape sl) a-slice vec sl- = backpermute (sliceOfFull sl (extent vec))- (fullOfSlice sl) vec---- | Change the shape of a vector. This function is potentially unsafe, the--- new shape need to have fewer or equal number of elements compared to--- the old shape.-reshape :: (Shape sh, Shape sh') => sh -> Vector sh' a -> Vector sh a-reshape sh' (Vector sh ixf)- = Vector sh' (ixf . fromIndex sh . toIndex sh')---- | A scalar (zero dimensional) vector-unit :: a -> Vector Z a-unit a = Vector Z (const a)---- | Index into a vector-(!:) :: (Shape sh) => Vector sh a -> sh -> a-(Vector _ ixf) !: ix = ixf ix---- | Extract the diagonal of a two dimensional vector-diagonal :: Vector DIM2 a -> Vector DIM1 a-diagonal vec = backpermute (Z :. width) (\ (_ :. x) -> Z :. x :. x) vec- where _ :. height :. width = extent vec---- | Change the shape of a vector.-backpermute :: (Shape sh, Shape sh') =>- sh' -> (sh' -> sh) -> Vector sh a -> Vector sh' a-backpermute sh perm vec = traverse vec (const sh) (. perm)---- | Map a function on all the elements of a vector-map :: (a -> b) -> Vector sh a -> Vector sh b-map f (Vector sh ixf) = Vector sh (f . ixf)---- | Combines the elements of two vectors. The size of the resulting vector--- will be the intersection of the two argument vectors.-zip :: (Shape sh) => Vector sh a -> Vector sh b -> Vector sh (a,b)-zip = zipWith (\a b -> (a,b))---- | Combines the elements of two vectors pointwise using a function.--- The size of the resulting vector will be the intersection of the--- two argument vectors.-zipWith :: (Shape sh) =>- (a -> b -> c) -> Vector sh a -> Vector sh b -> Vector sh c-zipWith f arr1 arr2 = Vector (intersectDim (extent arr1) (extent arr2))- (\ix -> f (arr1 !: ix) (arr2 !: ix))---- | Reduce a vector along its last dimension-fold :: (Shape sh, Syntax a) =>- (a -> a -> a)- -> a- -> Vector (sh :. Data Length) a- -> Vector sh a-fold f x vec = Vector sh ixf- where sh :. n = extent vec- ixf i = forLoop n x (\ix s -> f s (vec !: (i :. ix)))---- Here's another version of fold which has a little bit more freedom--- when it comes to choosing the initial element when folding---- | A generalization of 'fold' which allows for different initial--- values when starting to fold.-fold' :: (Shape sh, Syntax a) =>- (a -> a -> a)- -> Vector sh a- -> Vector (sh :. Data Length) a- -> Vector sh a-fold' f x vec = Vector sh ixf- where sh :. n = extent vec- ixf i = forLoop n (x!:i) (\ix s -> f s (vec !: (i :. ix)))---- | Summing a vector along its last dimension-sum :: (Shape sh, Type a, Numeric a) =>- DVector (sh :. Data Length) a -> DVector sh a-sum = fold (+) 0---- | Enumerating a vector-(...) :: Data Index -> Data Index -> DVector DIM1 Index-from ... to = Vector (Z :. (to - from + 1)) (\(Z :. ix) -> ix + from)---- This one should generalize to arbitrary shapes------ Laplace--stencil :: DVector DIM2 Float -> DVector DIM2 Float-stencil vec- = traverse vec id update- where- _ :. height :. width = extent vec-- update get d@(sh :. i :. j)- = isBoundary i j ?- (get d- , (get (sh :. (i-1) :. j)- + get (sh :. i :. (j-1))- + get (sh :. (i+1) :. j)- + get (sh :. i :. (j+1))) / 4)-- isBoundary i j- = (i == 0) || (i >= width - 1)- || (j == 0) || (j >= height - 1)--laplace :: Data Length -> DVector DIM2 Float -> DVector DIM2 Float-laplace steps vec = toVector (extent vec) $- forLoop steps (fromVector vec) (\ix ->- fromVector . stencil . toVector (extent vec)- )----- Matrix Multiplication--transpose2D :: Vector DIM2 e -> Vector DIM2 e-transpose2D vec- = backpermute new_extent swap vec- where swap (Z :. i :. j) = Z :. j :. i- new_extent = swap (extent vec)---- | Matrix multiplication-mmMult :: (Type e, Numeric e) =>- DVector DIM2 e -> DVector DIM2 e- -> DVector DIM2 e-mmMult vA vB- = sum (zipWith (*) vaRepl vbRepl)- where- tmp = transpose2D vB- vaRepl = replicate (Z :. All :. colsB :. All) vA- vbRepl = replicate (Z :. rowsA :. All :. All) vB- (Z :. colsA :. rowsA) = extent vA- (Z :. colsB :. rowsB) = extent vB
− Feldspar/Stream.hs
@@ -1,493 +0,0 @@------ Copyright (c) 2009-2011, 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.Stream- (Stream- ,head- ,tail- ,map,mapNth- ,maps- ,intersperse- ,interleave- ,downsample- ,duplicate- ,scan, scan1- ,mapAccum- ,iterate- ,repeat- ,unfold- ,drop- ,zip,zipWith- ,unzip- ,take- ,splitAt- ,cycle- ,streamAsVector, streamAsVectorSize- ,recurrenceO, recurrenceI, recurrenceIO- ,iir,fir- )- where--import qualified Prelude as P--import Control.Arrow--import Feldspar-import Feldspar.Vector.Internal- (Vector, Vector1- ,freezeVector,thawVector,indexed- ,sum,length,replicate,reverse,scalarProd)---- | Infinite streams.-data Stream a where- Stream :: Syntax state => (state -> M a) -> M state -> Stream a--type instance Elem (Stream a) = a-type instance CollIndex (Stream a) = Data Index---- | Take the first element of a stream-head :: Syntax a => Stream a -> a-head (Stream next init) = runMutable (init >>= next)---- | Drop the first element of a stream-tail :: Syntax a => Stream a -> Stream a-tail (Stream next init) = Stream next (init >>= \st -> next st >> return st)---- | 'map f str' transforms every element of the stream 'str' using the--- function 'f'-map :: (Syntax a, Syntax b) =>- (a -> b) -> Stream a -> Stream b-map f (Stream next init) = Stream newNext init- where newNext st = do a <- next st- return (f a)---- | 'mapNth f n k str' transforms every 'n'th element with offset 'k'--- of the stream 'str' using the function 'f'-mapNth :: (Syntax a) =>- (a -> a) -> Data Index -> Data Index -> Stream a -> Stream a-mapNth f n k (Stream next init) = Stream newNext newInit- where- newInit = do st <- init- r <- newRef (0 :: Data WordN)- return (st,r)- newNext (st,r) = do a <- next st- i <- getRef r- setRef r ((i+1) `mod` n)- return (i==k?(f a,a))---- | 'maps fs str' uses one of the functions from 'fs' successively to modify--- the elements of 'str'-maps :: (Syntax a) =>- [a -> a] -> Stream a -> Stream a-maps fs (Stream next init) = Stream newNext newInit- where- newInit = do- r <- newRef (0 :: Data Index)- st <- init- return (r,st)- newNext (r,st) = do- a <- next st- i <- getRef r- setRef r ((i+1) `mod` P.fromIntegral (P.length fs))- return $- (P.foldr (\ (k,f) r ->- i==(P.fromIntegral k)?(f a,r)))- a (P.zip [1..] fs)---- | 'intersperse a str' inserts an 'a' between each element of the stream--- 'str'.-intersperse :: Syntax a => a -> Stream a -> Stream a-intersperse a (Stream next init) = Stream newNext newInit- where- newInit = do st <- init- r <- newRef true- return (st,r)- newNext (st,r) = do b <- getRef r- setRef r (not b)- ifM b (next st) (return a)---- | Create a new stream by alternating between the elements from--- the two input streams-interleave :: Syntax a => Stream a -> Stream a -> Stream a-interleave (Stream next1 init1) (Stream next2 init2)- = Stream next init- where- init = do st1 <- init1- st2 <- init2- r <- newRef true- return (r,st1,st2)- next (r,st1,st2) = do b <- getRef r- setRef r (not b)- ifM b (next1 st1) (next2 st2)---- | 'downsample n str' takes every 'n'th element of the input stream-downsample :: Syntax a => Data Index -> Stream a -> Stream a-downsample n (Stream next init) = Stream newNext init- where newNext st = do forM (n-1) (\_ -> next st)- next st---- | 'duplicate n str' stretches the stream by duplicating the elements 'n' times-duplicate :: Syntax a => Data Index -> Stream a -> Stream a-duplicate n (Stream next init) = Stream newNext newInit- where- newInit = do st <- init- a <- next st- r1 <- newRef a- r2 <- newRef (1 :: Data Index)- return (st,r1,r2)- newNext (st,r1,r2) = do i <- getRef r2- setRef r2 ((i+1)`mod`n)- ifM (i==0)- (do a <- next st- setRef r1 a- return a)- (getRef r1)---- | 'scan f a str' produces a stream by successively applying 'f' to--- each element of the input stream 'str' and the previous element of--- the output stream.-scan :: Syntax a => (a -> b -> a) -> a -> Stream b -> Stream a-scan f a (Stream next init) = Stream newNext newInit- where- newInit = do st <- init- r <- newRef a- return (st,r)- newNext (st,r) = do a <- next st- acc <- getRef r- setRef r (f acc a)- return acc----- | A scan but without an initial element.-scan1 :: Syntax a => (a -> a -> a) -> Stream a -> Stream a-scan1 f (Stream next init)- = Stream newNext newInit- where- newInit = do- st <- init- a <- next st- r <- newRef a- return (st,r)- newNext (st,r) = do- a <- getRef r- b <- next st- let c = f a b- setRef r c- return c---- | Maps a function over a stream using an accumulator.-mapAccum :: (Syntax acc, Syntax b) =>- (acc -> a -> (acc,b)) -> acc -> Stream a -> Stream b-mapAccum f acc (Stream next init)- = Stream newNext newInit- where- newInit = do- st <- init- r <- newRef acc- return (st,r)- newNext (st,r) = do- acc <- getRef r- a <- next st- let (acc',b) = f acc a- setRef r acc'- return b---- | Iteratively applies a function to a starting element. All the successive--- results are used to create a stream.------ @iterate f a == [a, f a, f (f a), f (f (f a)) ...]@-iterate :: Syntax a => (a -> a) -> a -> Stream a-iterate f a = Stream next init- where- init = newRef a- next r = do a <- getRef r- setRef r (f a)- return a---- | Repeat an element indefinitely.------ @repeat a = [a, a, a, ...]@-repeat :: Syntax a => a -> Stream a-repeat a = Stream next (return ())- where next _ = return a---- | @unfold f acc@ creates a new stream by successively applying 'f' to--- to the accumulator 'acc'.-unfold :: (Syntax a, Syntax c) => (c -> (a,c)) -> c -> Stream a-unfold next init = Stream newNext newInit- where- newInit = newRef init- newNext r = do c <- getRef r- let (a,c') = next c- setRef r c'- return a---- | Drop a number of elements from the front of a stream-drop :: Syntax a => Data Length -> Stream a -> Stream a-drop i (Stream next init) = Stream next newInit- where newInit = do st <- init- forM i (\_ -> next st)- return st---- | Pairs together two streams into one.-zip :: Stream a -> Stream b -> Stream (a,b)-zip (Stream next1 init1) (Stream next2 init2) = Stream next init- where- init = do st1 <- init1- st2 <- init2- return (st1,st2)- next (st1,st2) = do a <- next1 st1- b <- next2 st2- return (a,b)---- | Pairs together two streams using a function to combine the--- corresponding elements.-zipWith :: Syntax c => (a -> b -> c) -> Stream a -> Stream b -> Stream c-zipWith f (Stream next1 init1) (Stream next2 init2) = Stream next init- where- init = do st1 <- init1- st2 <- init2- return (st1,st2)- next (st1,st2) = do a <- next1 st1- b <- next2 st2- return (f a b)---- | Given a stream of pairs, split it into two stream.-unzip :: (Syntax a, Syntax b) => Stream (a,b) -> (Stream a, Stream b)-unzip stream = (map fst stream, map snd stream)--instance Syntax a => Indexed (Stream a) where- (Stream next init) ! n = runMutable $ do- st <- init- forM (n-1) (\_ -> next st)- next st---- | 'take n str' allocates 'n' elements from the stream 'str' into a--- core array.-take :: (Type a) => Data Length -> Stream (Data a) -> Data [a]-take n (Stream next init)- = runMutableArray $ do- marr <- newArr_ n- st <- init- forM n $ \ix -> do- a <- next st- setArr marr ix a- return marr---- | 'splitAt n str' allocates 'n' elements from the stream 'str' into a--- core array and returns the rest of the stream continuing from--- element 'n+1'.-splitAt :: (Type a) =>- Data Length -> Stream (Data a) -> (Data [a], Stream (Data a))-splitAt n stream = (take n stream,drop n stream)---- | Loops through a vector indefinitely to produce a stream.-cycle :: Syntax a => Vector a -> Stream a-cycle vec = Stream next init- where- init = newRef (0 :: Data Index)- next r = do i <- getRef r- setRef r ((i + 1) `rem` length vec)- return (vec ! i)--unsafeVectorToStream :: Syntax a => Vector a -> Stream a-unsafeVectorToStream vec = Stream next init- where- init = newRef (0 :: Data Index)- next r = do i <- getRef r- setRef r (i + 1)- return (vec ! i)---- | A convenience function for translating an algorithm on streams to an algorithm on vectors.--- The result vector will have the same length as the input vector.--- It is important that the stream function doesn't drop any elements of--- the input stream.------ This function allocates memory for the output vector.-streamAsVector :: (Type a, Type b) =>- (Stream (Data a) -> Stream (Data b))- -> (Vector (Data a) -> Vector (Data b))-streamAsVector f v = thawVector $ take (length v) $ f $ unsafeVectorToStream v---- | Similar to 'streamAsVector' except the size of the output array is computed by the second argument--- which is given the size of the input vector as a result.-streamAsVectorSize :: (Type a, Type b) =>- (Stream (Data a) -> Stream (Data b)) -> (Data Length -> Data Length)- -> (Vector (Data a) -> Vector (Data b))-streamAsVectorSize f s v = thawVector $ take (s $ length v) $ f $ cycle v---- | A combinator for descibing recurrence equations, or feedback loops.--- The recurrence equation may refer to previous outputs of the stream,--- but only as many as the length of the input stream--- It uses memory proportional to the input vector.------ For exaple one can define the fibonacci sequence as follows:------ > fib = recurrenceO (vector [0,1]) (\fib -> fib!0 + fib!1)------ The expressions @fib!0@ and @fib!1@ refer to previous elements in the--- stream defined one step back and two steps back respectively.-recurrenceO :: Type a =>- Vector1 a ->- (Vector1 a -> Data a) ->- Stream (Data a)-recurrenceO initV mkExpr = Stream next init- where- len = length initV- init = do- buf <- thawArray (freezeVector initV)- r <- newRef (0 :: Data Index)- return (buf,r)-- next (buf,r) = do- ix <- getRef r- setRef r (ix + 1)- a <- withArray buf- (\ibuf -> return $ mkExpr- (indexed len (\i -> getIx ibuf ((i + ix) `rem` len))))- result <- getArr buf (ix `rem` len)- setArr buf (ix `rem` len) a- return result---- | A recurrence combinator with input. The function 'recurrenceI' is--- similar to 'recurrenceO'. The difference is that that it has an input--- stream, and that the recurrence equation may only refer to previous--- inputs, it may not refer to previous outputs.------ The sliding average of a stream can easily be implemented using--- 'recurrenceI'.------ > slidingAvg :: Data WordN -> Stream (Data WordN) -> Stream (Data WordN)--- > slidingAvg n str = recurrenceI (replicate n 0) str--- > (\input -> sum input `quot` n)-recurrenceI :: (Type a, Type b) =>- Vector1 a -> Stream (Data a) ->- (Vector1 a -> Data b) ->- Stream (Data b)-recurrenceI ii stream mkExpr- = recurrenceIO ii stream (value []) (\i o -> mkExpr i)---- | 'recurrenceIO' is a combination of 'recurrenceO' and 'recurrenceI'. It--- has an input stream and the recurrence equation may refer both to--- previous inputs and outputs.------ 'recurrenceIO' is used when defining the 'iir' filter.-recurrenceIO :: (Type a, Type b) =>- Vector1 a -> Stream (Data a) -> Vector1 b ->- (Vector1 a -> Vector1 b -> Data b) ->- Stream (Data b)-recurrenceIO ii (Stream nxt int) io mkExpr- = Stream next init- where- lenI = length ii- lenO = length io- init = do- ibuf <- thawArray (freezeVector ii)- obuf <- thawArray (freezeVector io)- st <- int- r <- newRef (0 :: Data Index)- return (ibuf,obuf,st,r)- next (ibuf,obuf,st,r) = do- ix <- getRef r- setRef r (ix + 1)- a <- nxt st- when (lenI /= 0) $ setArr ibuf (ix `rem` lenI) a- b <- withArray ibuf (\ibuf ->- withArray obuf (\obuf ->- return $ mkExpr- (indexed lenI (\i -> getIx ibuf ((i + ix) `rem` lenI)))- (indexed lenO (\i -> getIx obuf ((i + ix - 1) `rem` lenO)))- ))- ifM (lenO /= 0)- (do o <- getArr obuf (ix `rem` lenO)- setArr obuf (ix `rem` lenO) b- return o)- (return b)---- | Similar to 'recurrenceIO' but takes two input streams.-recurrenceIIO :: (Type a, Type b, Type c) =>- Vector1 a -> Stream (Data a) -> Vector1 b -> Stream (Data b) ->- Vector1 c ->- (Vector1 a -> Vector1 b -> Vector1 c -> Data c) ->- Stream (Data c)-recurrenceIIO i1 (Stream next1 init1) i2 (Stream next2 init2) io mkExpr- = Stream next init- where- len1 = length i1- len2 = length i2- lenO = length io- init = do- ibuf1 <- thawArray (freezeVector i1)- st1 <- init1- ibuf2 <- thawArray (freezeVector i2)- st2 <- init2- obuf <- thawArray (freezeVector io)- c <- newRef (0 :: Data Index)- return (ibuf1,st1,ibuf2,st2,obuf,c)- next (ibuf1,st1,ibuf2,st2,obuf,c) = do- ix <- getRef c- setRef c (ix + 1)- a <- next1 st1- b <- next2 st2- when (len1 /= 0) $ setArr ibuf1 (ix `rem` len1) a- when (len2 /= 0) $ setArr ibuf2 (ix `rem` len2) b- out <- withArray ibuf1 (\ibuf1 ->- withArray ibuf2 (\ibuf2 ->- withArray obuf (\obuf ->- return $ mkExpr (indexed len1 (\i -> getIx ibuf1 ((i + ix) `rem` len1)))- (indexed len2 (\i -> getIx ibuf2 ((i + ix) `rem` len2)))- (indexed lenO (\i -> getIx obuf ((i + ix) `rem` lenO)))- )))- ifM (lenO /= 0)- (do o <- getArr obuf (ix `rem` lenO)- setArr obuf (ix `rem` lenO) out- return o)- (return out)--slidingAvg :: Data WordN -> Stream (Data WordN) -> Stream (Data WordN)-slidingAvg n str = recurrenceI (replicate n 0) str- (\input -> sum input `quot` n)---- | A fir filter on streams-fir :: Vector1 Float ->- Stream (Data Float) -> Stream (Data Float)-fir b input =- recurrenceI (replicate (length b) 0) input- (\input -> scalarProd b input)---- | An iir filter on streams-iir :: Data Float -> Vector1 Float -> Vector1 Float ->- Stream (Data Float) -> Stream (Data Float)-iir a0 a b input =- recurrenceIO (replicate (length b) 0) input- (replicate (length a) 0)- (\input output -> 1 / a0 *- ( scalarProd b input- - scalarProd a output)- )-
− Feldspar/Vector.hs
@@ -1,65 +0,0 @@------ Copyright (c) 2009-2011, 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.------- | A module for /virtual vectors/. Many of the functions defined here are--- imitations of Haskell's list operations, and to a first approximation they--- behave accordingly.------ A virtual vector is normally guaranteed not to be present in the generated--- code. The only exceptions are:------ * when it is explicitly forced using the functions 'force' or 'desugar'------ * when it is the input or output of a program------ * when it is accessed by a function outside the "Feldspar.Vector" API, for--- example, 'condition' or 'forLoop'------ Note also that most operations only introduce a small constant overhead on--- the vector. The exceptions are------ * 'fold'------ * 'fold1'------ * Functions that introduce storage (see above)------ * \"Folding\" functions: 'sum', 'maximum', etc.------ These functions introduce overhead that is linear in the length of the--- vector.--module Feldspar.Vector- ( module Feldspar.Vector.Internal- ) where----import Feldspar -- For Haddock-import Feldspar.Vector.Internal hiding (freezeVector)-
− Feldspar/Vector/Internal.hs
@@ -1,345 +0,0 @@------ Copyright (c) 2009-2011, 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 #-}--module Feldspar.Vector.Internal where----import qualified Prelude-import Control.Arrow ((&&&))-import qualified Data.TypeLevel as TL-import Test.QuickCheck--import QuickAnnotate--import Language.Syntactic--import Feldspar.Range (rangeSubSat)-import Feldspar hiding (sugar,desugar,resugar)-import Feldspar.Wrap--------------------------------------------------------------------------------------- * Types------------------------------------------------------------------------------------- | Symbolic vector-data Vector a- = Empty- | Indexed- { segmentLength :: Data Length- , segmentIndex :: Data Index -> a- , continuation :: Vector a- }--type instance Elem (Vector a) = a-type instance CollIndex (Vector a) = Data Index-type instance CollSize (Vector a) = Data Length---- | Non-nested vector-type DVector a = Vector (Data a)-{-# DEPRECATED DVector "Please use `Vector1` instead." #-}---- | Non-nested vector-type Vector1 a = Vector (Data a)---- | Two-level nested vector-type Vector2 a = Vector (Vector (Data a))--instance Syntax a => Syntactic (Vector a) FeldDomainAll- where- type Internal (Vector a) = [Internal a]- desugar = desugar . freezeVector . map resugar- sugar = map resugar . thawVector . sugar--instance Syntax a => Syntax (Vector a)--instance (Syntax a, Show (Internal a)) => Show (Vector a)- where- show = show . eval--------------------------------------------------------------------------------------- * Construction/conversion-----------------------------------------------------------------------------------indexed :: Data Length -> (Data Index -> a) -> Vector a-indexed 0 _ = Empty-indexed l idxFun = Indexed l idxFun Empty---- | Breaks up a segmented vector into a list of single-segment vectors.-segments :: Vector a -> [Vector a]-segments Empty = []-segments (Indexed l ixf cont) = Indexed l ixf Empty : segments cont- -- Note: Important to use `Indexed` instead of `indexed` since we need to- -- guarantee that each vector has a single segment.--length :: Vector a -> Data Length-length Empty = 0-length vec = Prelude.foldr (+) 0 $ Prelude.map segmentLength $ segments vec---- | Converts a segmented vector to a vector with a single segment.-mergeSegments :: Syntax a => Vector a -> Vector a-mergeSegments vec = Indexed (length vec) (ixFun (segments vec)) Empty- -- Note: Important to use `Indexed` instead of `indexed` since we need to- -- guarantee that the result has a single segment.- where- ixFun [] = \i -> err "indexing in empty vector"- ixFun (Indexed l ixf _ : vs) = case vs of- [] -> ixf- _ -> \i -> (i<l) ? (ixf i, ixFun vs (i-l))---- | Converts a non-nested vector to a core vector.-freezeVector :: Type a => Vector (Data a) -> Data [a]-freezeVector vec = help True vec- where- help _ Empty = value []- help opt (Indexed l ixf cont) = parallel l ixf `append` help False cont---- | Converts a non-nested core array to a vector.-thawVector :: Type a => Data [a] -> Vector (Data a)-thawVector arr = indexed (getLength arr) (getIx arr)--thawVector' :: Type a => Length -> Data [a] -> Vector (Data a)-thawVector' len arr = thawVector $ setLength (value len) arr--unfreezeVector :: Type a => Data [a] -> Vector (Data a)-unfreezeVector = thawVector-{-# DEPRECATED unfreezeVector "Please use `thawVector` instead." #-}--unfreezeVector' :: Type a => Length -> Data [a] -> Vector (Data a)-unfreezeVector' = thawVector'-{-# DEPRECATED unfreezeVector' "Please use `thawVector'` instead." #-}--------------------------------------------------------------------------------------- * Operations-----------------------------------------------------------------------------------instance Syntax a => Indexed (Vector a)- where- (!) = segmentIndex . mergeSegments--instance Syntax a => Sized (Vector a)- where- collSize = length- setCollSize = newLen--instance CollMap (Vector a) (Vector a)- where- collMap = map---- | Change the length of the vector to the supplied value. If the supplied--- length is greater than the old length, the new elements will have undefined--- value. The resulting vector has only one segment.-newLen :: Syntax a => Data Length -> Vector a -> Vector a-newLen l vec = (mergeSegments vec) {segmentLength = l}--(++) :: Vector a -> Vector a -> Vector a-Empty ++ v = v-v ++ Empty = v-Indexed l ixf cont ++ v = Indexed l ixf (cont ++ v)--infixr 5 ++--take :: Data Length -> Vector a -> Vector a-take _ Empty = Empty-take n (Indexed l ixf cont) = indexed nHead ixf ++ take nCont cont- where- nHead = min l n- nCont = sizeProp (uncurry rangeSubSat) (n,l) $ n - min l n--drop :: Data Length -> Vector a -> Vector a-drop _ Empty = Empty-drop n (Indexed l ixf cont) = indexed nHead (ixf . (+n)) ++ drop nCont cont- where- nHead = sizeProp (uncurry rangeSubSat) (l,n) $ l - min l n- nCont = sizeProp (uncurry rangeSubSat) (n,l) $ n - min l n--splitAt :: Data Index -> Vector a -> (Vector a, Vector a)-splitAt n vec = (take n vec, drop n vec)--head :: Syntax a => Vector a -> a-head = (!0)--last :: Syntax a => Vector a -> a-last vec = vec ! (length vec - 1)--tail :: Vector a -> Vector a-tail = drop 1--init :: Vector a -> Vector a-init vec = take (length vec - 1) vec--tails :: Vector a -> Vector (Vector a)-tails vec = indexed (length vec + 1) (\n -> drop n vec)--inits :: Vector a -> Vector (Vector a)-inits vec = indexed (length vec + 1) (\n -> take n vec)--inits1 :: Vector a -> Vector (Vector a)-inits1 = tail . inits---- | Permute a single-segment vector-permute' :: (Data Length -> Data Index -> Data Index) -> (Vector a -> Vector a)-permute' _ Empty = Empty-permute' perm (Indexed l ixf Empty) = indexed l (ixf . perm l)---- | Permute a vector-permute :: Syntax a =>- (Data Length -> Data Index -> Data Index) -> (Vector a -> Vector a)-permute perm = permute' perm . mergeSegments--reverse :: Syntax a => Vector a -> Vector a-reverse = permute $ \l i -> l-1-i- -- TODO Can be optimized (reversing each segment separately, and then- -- reversing the segment order)--rotateVecL :: Syntax a => Data Index -> Vector a -> Vector a-rotateVecL ix = permute $ \l i -> (i + ix) `rem` l--rotateVecR :: Syntax a => Data Index -> Vector a -> Vector a-rotateVecR ix = reverse . rotateVecL ix . reverse--replicate :: Data Length -> a -> Vector a-replicate n a = Indexed n (const a) Empty---- | @enumFromTo m n@: Enumerate the indexes from @m@ to @n@------ In order to enumerate a different type, use 'i2n', e.g:------ > map i2n (10...20) :: Vector1 Word8-enumFromTo :: Data Index -> Data Index -> Vector (Data Index)-enumFromTo 1 n = indexed n (+1)-enumFromTo m n = indexed l (+m)- where- l = (n<m) ? (0, n-m+1)- -- TODO The first case avoids the comparison when `m` is 1. However, it- -- cover the case when `m` is a complicated expression that is later- -- optimized to the literal 1. The same holds for other such- -- optimizations in this module.- --- -- Perhaps we need a language construct that lets the user supply a- -- custom optimization rule (similar to `sizeProp`)? `sizeProp` could- -- probably be expressed in terms of this more general construct.---- | @enumFrom m@: Enumerate the indexes from @m@ to 'maxBound'-enumFrom :: Data Index -> Vector (Data Index)-enumFrom = flip enumFromTo (value maxBound)---- | See 'enumFromTo'-(...) :: Data Index -> Data Index -> Vector (Data Index)-(...) = enumFromTo--map :: (a -> b) -> Vector a -> Vector b-map _ Empty = Empty-map f (Indexed l ixf cont) = Indexed l (f . ixf) $ map f cont---- | Zipping a single-segment vector-zip1 :: Vector a -> Vector b -> Vector (a,b)-zip1 Empty _ = Empty-zip1 _ Empty = Empty-zip1 (Indexed l1 ixf1 Empty) (Indexed l2 ixf2 Empty) =- indexed (min l1 l2) (ixf1 &&& ixf2)--zip :: (Syntax a, Syntax b) => Vector a -> Vector b -> Vector (a,b)-zip vec1 vec2 = zip1 (mergeSegments vec1) (mergeSegments vec2)--unzip :: Vector (a,b) -> (Vector a, Vector b)-unzip Empty = (Empty, Empty)-unzip (Indexed l ixf cont) =- (Indexed l (fst.ixf) cont1, Indexed l (snd.ixf) cont2)- where- (cont1,cont2) = unzip cont--zipWith :: (Syntax a, Syntax b) =>- (a -> b -> c) -> Vector a -> Vector b -> Vector c-zipWith f aVec bVec = map (uncurry f) $ zip aVec bVec---- | Corresponds to the standard 'foldl'.-fold :: (Syntax a) => (a -> b -> a) -> a -> Vector b -> a-fold _ x Empty = x-fold f x (Indexed l ixf cont) =- fold f (forLoop l x $ \ix s -> f s (ixf ix)) cont---- | Corresponds to the standard 'foldl1'.-fold1 :: Syntax a => (a -> a -> a) -> Vector a -> a-fold1 f a = fold f (head a) (tail a)--sum :: (Syntax a, Num a) => Vector a -> a-sum = fold (+) 0--maximum :: Ord a => Vector (Data a) -> Data a-maximum = fold1 max--minimum :: Ord a => Vector (Data a) -> Data a-minimum = fold1 min---- | Scalar product of two vectors-scalarProd :: (Syntax a, Num a) => Vector a -> Vector a -> a-scalarProd a b = sum (zipWith (*) a b)--------------------------------------------------------------------------------------- Misc.-----------------------------------------------------------------------------------tVec :: Patch a a -> Patch (Vector a) (Vector a)-tVec _ = id--tVec1 :: Patch a a -> Patch (Vector (Data a)) (Vector (Data a))-tVec1 _ = id--tVec2 :: Patch a a -> Patch (Vector (Vector (Data a))) (Vector (Vector (Data a)))-tVec2 _ = id--instance (Arbitrary (Internal a), Syntax a) => Arbitrary (Vector a)- where- arbitrary = fmap value arbitrary--instance (Type a) => Wrap (Vector (Data a)) (Data [a]) where- wrap v = freezeVector v--instance (Wrap t u, Type a, TL.Nat s) => Wrap (DVector a -> t) (Data' s [a] -> u) where- wrap f = \(Data' d) -> wrap $ f $ thawVector $ setLength s' d where- s' = fromInteger $ toInteger $ TL.toInt (undefined :: s)--instance Annotatable a => Annotatable (Vector a)- where- annotate info Empty = Empty- annotate info (Indexed len ixf cont) = Indexed- (annotate (info Prelude.++ " (vector length)") len)- (annotate (info Prelude.++ " (vector element)") . ixf)- (annotate info cont)-
− Feldspar/Wrap.hs
@@ -1,70 +0,0 @@------ Copyright (c) 2009-2011, 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 "Data.TypeLevel.Num.Aliases" is re-exported because--- wrappers use type level numbers frequently-module Feldspar.Wrap ( Wrap(..), Data'(..), module Data.TypeLevel.Num.Aliases, D0, D1, D2, D3, D4, D5, D6, D7, D8, D9) where---import Feldspar.Core.Constructs-import Feldspar.Core.Types--import Language.Syntactic--import Data.TypeLevel.Num.Aliases-import Data.TypeLevel.Num.Reps (D0, D1, D2, D3, D4, D5, D6, D7, D8, D9 )----- | Wrapping Feldspar functions-class Wrap t w where- wrap :: t -> w---- | Basic instances to handle @Data a@ input and output.--- Other instances are located in the concerned libraries.-instance Wrap (Data a) (Data a) where- wrap = id--instance (Wrap t u) => Wrap (Data a -> t) (Data a -> u) where- wrap f = \x -> wrap $ f x---- | Extended 'Data' to be used in wrappers-data Data' s a =- Data'- { unData' :: Data a- }---- Syntactic instance for 'Data''--instance Type a => Syntactic (Data' s a) FeldDomainAll- where- type Internal (Data' s a) = a- desugar = desugar . unData'- sugar = Data' . sugar--instance Type a => Syntax (Data' s a)-
LICENSE view
@@ -1,3 +1,5 @@+Copyright (c) 2012, Emil Axelsson, Gergely Dévai, Anders Persson and+ Josef Svenningsson Copyright (c) 2009-2011, ERICSSON AB All rights reserved.
+ examples/Examples/Simple/Basics.hs view
@@ -0,0 +1,41 @@+module Examples.Simple.Basics where++import qualified Prelude+import Feldspar++-- Identity function for 32 bit integers.+example1 :: Data Int32 -> Data Int32+example1 = id++-- Constant function+example2 :: Data Int32+example2 = 2++-- A constant core vector+example3 :: Data [Int32]+example3 = value [42,1,2,3]++-- Examples showing some of the integer and boolean operations:++example4 :: Data Int32 -> Data Int32+example4 x = negate x++example5 :: Data Int32 -> Data Int32 -> Data Int32+example5 x y = x + y++example6 :: Data Int32 -> Data Int32 -> Data Bool+example6 x y = x == y++example7 :: Data Bool+example7 = 2 /= (2 :: Data Int32) -- Type of numeric literals sometimes have to be written explicitly.++example8 :: Data Bool -> Data Bool+example8 b = not b++-- Examples on using conditionals:++example9 :: Data Int32 -> Data Int32+example9 a = condition (a<5) (3*(a+20)) (30*(a+20))++example10 :: Data Int32 -> Data Int32+example10 a = condition (a<5) (3*(a+a)) (30*(a+a))
feldspar-language.cabal view
@@ -1,35 +1,43 @@ name: feldspar-language-version: 0.5.0.1+version: 0.6.0.2 synopsis: A functional embedded language for DSP and parallelism description: Feldspar (Functional Embedded Language for DSP and PARallelism) is an embedded DSL for describing digital signal processing algorithms. This package contains the language front-end and an interpreter. category: Language-copyright: Copyright (c) 2009-2011, ERICSSON AB+copyright: Copyright (c) 2012 Emil Axelsson, Gergely Dévai,+ Anders Persson, Josef Svenningsson+ Copyright (c) 2009-2011, ERICSSON AB author: Functional programming group at Chalmers University of Technology maintainer: Emil Axelsson <emax@chalmers.se>+ Anders Persson <anders.cj.persson@gmail.com> license: BSD3 license-file: LICENSE stability: experimental-homepage: http://feldspar.inf.elte.hu/feldspar/+homepage: https://feldspar.github.com+bug-reports: https://github.com/feldspar/feldspar-language/issues build-type: Simple-cabal-version: >= 1.6-tested-with: GHC==7.0+cabal-version: >= 1.14+tested-with: GHC==7.6.1, GHC==7.4.2 extra-source-files:- Examples/Simple/*.hs,- Examples/Effects/*.hs,- Examples/Math/*.hs- CEFP/cefpNotes.hs+ examples/Examples/Simple/Basics.hs +source-repository head+ type: git+ location: git://github.com/feldspar/feldspar-language.git+ library exposed-modules: Feldspar.Prelude Feldspar.Lattice Feldspar.Range+ Feldspar.Algorithm.CRC+ Feldspar.Algorithm.FFT Feldspar.Core.Types Feldspar.Core.Interpretation+ Feldspar.Core.Interpretation.Typed Feldspar.Core.Constructs.Array Feldspar.Core.Constructs.Binding Feldspar.Core.Constructs.Bits@@ -41,6 +49,7 @@ Feldspar.Core.Constructs.Error Feldspar.Core.Constructs.Floating Feldspar.Core.Constructs.Fractional+ Feldspar.Core.Constructs.Future Feldspar.Core.Constructs.Integral Feldspar.Core.Constructs.Literal Feldspar.Core.Constructs.Logic@@ -49,6 +58,7 @@ Feldspar.Core.Constructs.MutableArray Feldspar.Core.Constructs.MutableReference Feldspar.Core.Constructs.MutableToPure+ Feldspar.Core.Constructs.NoInline Feldspar.Core.Constructs.Par Feldspar.Core.Constructs.Num Feldspar.Core.Constructs.Ord@@ -70,6 +80,7 @@ Feldspar.Core.Frontend.Error Feldspar.Core.Frontend.Floating Feldspar.Core.Frontend.Fractional+ Feldspar.Core.Frontend.Future Feldspar.Core.Frontend.Integral Feldspar.Core.Frontend.Literal Feldspar.Core.Frontend.Logic@@ -78,9 +89,11 @@ Feldspar.Core.Frontend.MutableArray Feldspar.Core.Frontend.MutableReference Feldspar.Core.Frontend.MutableToPure+ Feldspar.Core.Frontend.NoInline Feldspar.Core.Frontend.Par Feldspar.Core.Frontend.Num Feldspar.Core.Frontend.Ord+ Feldspar.Core.Frontend.Select Feldspar.Core.Frontend.SizeProp Feldspar.Core.Frontend.SourceInfo Feldspar.Core.Frontend.Trace@@ -92,35 +105,37 @@ Feldspar.Core Feldspar.BitVector Feldspar.FixedPoint+ Feldspar.Future Feldspar.Matrix Feldspar.Option Feldspar.Repa Feldspar.Stream Feldspar.Vector.Internal Feldspar.Vector+ Feldspar.Vector.Push Feldspar.Wrap Feldspar.Par Feldspar + default-language: Haskell2010+ build-depends:- array,- base >= 4 && < 4.4,- containers,- data-hash == 0.1.*,- data-lens == 2.0.*,- monad-par,- mtl,- QuickCheck >= 2.4 && < 3,- patch-combinators == 0.1.*,- random,- syntactic == 0.8.*,- tagged == 0.2.*,- tuple == 0.2.*,- type-level >= 0.2.4,- monad-par >= 0.1 && < 0.2,- QuickAnnotate+ array >= 0.4 && < 0.5,+ base >= 4 && < 4.7,+ containers >= 0.4 && < 0.6,+ data-hash >= 0.1 && < 0.3,+ data-lens >= 2.10 && < 2.11,+ mtl >= 2.0 && < 2.2,+ QuickCheck >= 2.5 && < 3,+ patch-combinators >= 0.1 && < 0.2,+ syntactic >= 1.4 && < 1.5,+ tagged >= 0.4 && < 0.5,+ tuple >= 0.2 && < 0.3,+ type-level >= 0.2.4 && < 0.3,+ monad-par >= 0.3 && < 0.4,+ QuickAnnotate >= 0.6 && < 0.7 - extensions:+ other-extensions: DeriveDataTypeable EmptyDataDecls FlexibleInstances@@ -138,5 +153,64 @@ TypeSynonymInstances ViewPatterns + hs-source-dirs: src examples+ ghc-options: -fcontext-stack=100++test-suite range+ type: exitcode-stdio-1.0++ hs-source-dirs: tests++ main-is: RangeTest.hs++ other-modules:+ Feldspar.Range.Test++ default-language: Haskell2010++ build-depends:+ feldspar-language,+ base >= 4 && < 4.7,+ random >= 1 && <2,+ QuickCheck >= 2.4 && <3,+ test-framework >= 0.6 && < 0.7,+ test-framework-quickcheck2 >= 0.2 && < 0.3++test-suite semantics+ type: exitcode-stdio-1.0++ hs-source-dirs: tests examples++ main-is: SemanticsTest.hs++ other-modules:+ Feldspar.Vector.Test+ SemanticsTest++ default-language: Haskell2010++ build-depends:+ feldspar-language,+ base >= 4 && < 4.7,+ QuickCheck >= 2.4 && < 3,+ test-framework >= 0.6 && < 0.7,+ test-framework-th >= 0.2 && < 0.3,+ test-framework-quickcheck2 >= 0.2 && < 0.3++test-suite decoration+ type: exitcode-stdio-1.0++ hs-source-dirs: tests examples++ main-is: DecorationTests.hs++ default-language: Haskell2010++ build-depends:+ feldspar-language,+ base >= 4 && < 4.7,+ bytestring >= 0.9 && < 0.11,+ test-framework >= 0.6 && < 0.7,+ test-framework-golden >= 1.1 && < 1.2
+ src/Feldspar.hs view
@@ -0,0 +1,45 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | Interface to the essential parts of the Feldspar language. High-level+-- libraries have to be imported separately.++module Feldspar+ ( module Feldspar.Prelude+ , module Feldspar.Core+ ) where++++import qualified Prelude+ -- In order to be able to use the Feldspar module in GHCi without getting name+ -- clashes.++import Feldspar.Prelude+import Feldspar.Core+
+ src/Feldspar/Algorithm/CRC.hs view
@@ -0,0 +1,87 @@+--+-- Copyright (c) 2009-2011, 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.Algorithm.CRC where++import qualified Prelude++import Feldspar+import Feldspar.Vector++tstBit :: Bits a => Data a -> Data Index -> Data Bool+tstBit w b = w .&. (1 .<<. b) /= 0++makeCrcTable :: (Bits a) => Data a -> Vector1 a+makeCrcTable polynomial = indexed 256 $ \i -> forLoop 8 (i2n i .<<. (sz - 8)) step+ where+ sz = bitSize polynomial+ step _ r = let r' = r .<<. 1+ in condition (tstBit r (sz-1)) (r' `xor` polynomial) r'++-- | Calculate the normal form CRC using a table+crcNormal :: (Bits a)+ => Vector1 a -> Data a -> Vector1 Word8 -> Data a+crcNormal table initial xs = fold step initial xs+ where+ sz = bitSize initial+ step crc a = (table ! i2n ((i2n (crc .>>. (sz - 8)) .&. 0xFF) `xor` a)) `xor` (crc .<<. 8)++-- | Calculate the reflected form CRC using a table+-- needs reflected tables+crcReflected :: (Bits a)+ => Vector1 a -> Data a -> Vector1 Word8 -> Data a+crcReflected table = fold step+ where+ step crc a = (table ! i2n ((crc `xor` i2n a) .&. 0xFF)) `xor` (crc .>>. 8)++-- | Calculate normal form CRC from a polynominal+crcNaive :: (Bits a) => Data a -> Data a -> Vector1 Word8 -> Data a+crcNaive = crcNormal . makeCrcTable++-- Future work+--+data CRC a = CRC { name :: String+ , width :: Index+ , poly :: a+ , init :: a+ , reflectIn :: Bool+ , reflectOut :: Bool+ , xorOut :: a+ }++crc16 :: CRC (Data Word16)+crc16 = CRC "CRC-16" 16 0x8005 0x0000 True True 0x0000++-- | Reflect the bottom b bits of value t+reflect :: (Bits a) => Data a -> Data Length -> Data a+reflect t b = forLoop b t $ \i v -> let mask = bit ((b-1)-i) in condition (testBit t i) (v .|. mask) (v .&. complement mask)++-- References+-- The functions in this module are inspired by the follow guide+-- http://www.ross.net/crc/download/crc_v3.txt+
+ src/Feldspar/Algorithm/FFT.hs view
@@ -0,0 +1,102 @@+--+-- Copyright (c) 2009-2011, 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.Algorithm.FFT+ ( fft+ , ifft+ )+ where++import qualified Prelude as P++import Feldspar+import Feldspar.Vector++-- | Radix-2 Decimation-In-Frequeny Fast Fourier Transformation of the given complex vector+-- The given vector must be power-of-two sized, (for example 2, 4, 8, 16, 32, etc.)+fft :: Vector1 (Complex Float) -> Vector1 (Complex Float)+fft v = newLen (length v) $ bitRev steps $ fftCore steps v+ where steps = ilog2 (length v) - 1++-- | Radix-2 Decimation-In-Frequeny Inverse Fast Fourier Transformation of the given complex vector+-- The given vector must be power-of-two sized, (for example 2, 4, 8, 16, 32, etc.)+ifft :: Vector1 (Complex Float) -> Vector1 (Complex Float)+ifft v = newLen (length v) $ bitRev steps $ ifftCore steps v+ where steps = ilog2 (length v) - 1++fftCore :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float)+fftCore n = composeOn stage (reverse (0...n))+ where+ stage k (Indexed l ixf Empty) = indexed l ixf'+ where+ ixf' i = condition (testBit i k) (twid * (b - a)) (a+b)+ where+ a = ixf i+ b = ixf (i `xor` k2)+ twid = cis (-pi * i2f (lsbs k i) / i2f k2)+ k2 = 1 .<<. k++ifftCore :: Data Index -> Vector1 (Complex Float) -> Vector1 (Complex Float)+ifftCore n = map (/ complex (i2f (2^(n+1))) 0) . composeOn stage (reverse (0...n))+ where+ stage k (Indexed l ixf Empty) = indexed l ixf'+ where+ ixf' i = condition (testBit i k) (twid * (b - a)) (a+b)+ where+ a = ixf i+ b = ixf (i `xor` k2)+ twid = cis (pi * i2f (lsbs k i) / i2f k2)+ k2 = 1 .<<. k++bitRev :: Type a => Data Index -> Vector1 a -> Vector1 a+bitRev n = composeOn riffle (1...n)++riffle :: Syntax a => Data Index -> Vector a -> Vector a+riffle k = permute (const $ rotBit k)++-- Helper functions+composeOn :: (Syntax a) => (b -> a -> a) -> Vector b -> a -> a+composeOn = flip . fold . flip++rotBit :: Data Index -> Data Index -> Data Index+rotBit 0 _ = P.error "rotBit: k should be at least 1"+rotBit k i = lefts .|. rights+ where+ ir = i .>>. 1+ rights = ir .&. oneBits k+ lefts = (((ir .>>. k) .<<. 1) .|. (i .&. 1)) .<<. k++oneBits :: (Bits a) => Data Index -> Data a+oneBits n = complement (allOnes .<<. n)++allOnes :: (Bits a) => Data a+allOnes = complement 0++lsbs :: Bits a => Data Index -> Data a -> Data a+lsbs k i = i .&. oneBits k+
+ src/Feldspar/BitVector.hs view
@@ -0,0 +1,386 @@+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | A 'Vector' interface to packed sequences of bits+--+module Feldspar.BitVector where++import qualified Prelude+import Data.Word+import Data.List (inits)+import Data.Proxy+import qualified Data.TypeLevel as TL++import Language.Syntactic hiding (fold)++import Feldspar.Wrap+import Feldspar.Prelude+import Feldspar hiding (sugar, desugar, resugar)+import qualified Feldspar.Vector as Vec++-- * Types and classes++-- | A 'Unit' is the internal representation of a 'BitVector'+class (Type w, Numeric w, Bits w, Integral w) => Unit w+ where+ width :: Proxy w -> Length++instance Unit Word8+ where+ width _ = 8++instance Unit Word16+ where+ width _ = 16++instance Unit Word32+ where+ width _ = 32++data BitVector w+ = BitVector+ { segments :: [Segment w]+ }++data Segment w+ = Segment+ { numUnits :: Data Length+ , elements :: Data Index -> Data w+ }++-- * Feldspar integration of BitVector++type instance Elem (BitVector w) = Data Bool+type instance CollIndex (BitVector w) = Data Index+type instance CollSize (BitVector w) = Data Length++instance (Unit a) => Syntactic (BitVector a)+ where+ type Domain (BitVector a) = FeldDomainAll+ type Internal (BitVector a) = [a]+ desugar = desugar . freezeBitVector+ sugar = unfreezeBitVector . sugar++instance (Unit a) => Syntax (BitVector a)++-- * Operations++length :: forall w . (Unit w) => BitVector w -> Data Length+length bv = Prelude.sum $ Prelude.map segmentLen $ segments bv+ where+ segmentLen s = numUnits s * w+ w = value $ width (Proxy :: Proxy w)++numOfUnits :: (Unit w) => BitVector w -> Data Length+numOfUnits bv = Prelude.sum $ Prelude.map numUnits $ segments bv++freezeBitVector :: forall w . (Unit w) => BitVector w -> Data [w]+freezeBitVector bv = freezeSegments $ segments bv+ where+ freezeSegments segs = case segs of+ [] -> value []+ (s:ss) -> parallel (numUnits s) (elements s) `append` freezeSegments ss++unfreezeBitVector :: forall w . (Unit w) => Data [w] -> BitVector w+unfreezeBitVector ws = BitVector [Segment (getLength ws) (ws!)]++{- TODO+-- | Variant of `unfreezeBitVector` with additional static size information.+unfreezeBitVector' :: forall w . (Unit w) => Length -> Data [w] -> BitVector w+unfreezeBitVector' len arr = unfreezeBitVector $ cap (r :> elemSize) arr+ where+ (_ :> elemSize) = dataSize arr+ singleton :: a -> Range a+ singleton x = Range x x+ r = (singleton (fromIntegral len),singleton (fromIntegral len)+ ,singleton (fromIntegral len))+-}++-- | Transforms a bool vector to a bitvector.+-- Length of the vector has to be divisible by the wordlength,+-- otherwise booleans at the end will be dropped.+fromVector :: forall w . (Unit w, Size w ~ Range w) => Vec.Vector (Data Bool) -> BitVector w+fromVector v = BitVector+ { segments = [Segment wl (loop w)]+ -- TODO: Should Vector segments be transformed to BitVector segments+ -- for the sake of efficiency?+ }+ where+ w = value $ width (Proxy :: Proxy w)+ wl = Vec.length v `div` w+ loop n ix = forLoop n 0 $ \i st ->+ st `shiftLU` 1 .|. (v ! (w * ix + i) ? (1,0))++toVector :: forall w . (Unit w, Size w ~ Range w) => BitVector w -> Vec.Vector (Data Bool)+toVector bv = Vec.indexed (length bv) (bv!)++instance (Unit w, Size w ~ Range w) => Indexed (BitVector w)+ where+ bv ! i = help 0 (segments bv)+ where+ help _ [] = false+ -- XXX Should be an error here...+ help accum [s] = ixf s accum i+ help accum (s:ss) = i < accum + numUnits s * w ?+ ( ixf s accum i+ , help (accum + numUnits s * w) ss+ )+ w = value $ width (Proxy :: Proxy w)+ ixf s accum ix = testBit (elements s ((ix - accum) `div` w)) (w - 1 - ((ix - accum) `mod` w))++fromBits :: forall w . (Unit w) => [Bool] -> BitVector w+fromBits bs = unfreezeBitVector $ value xs+ where+ xs = [ conv (Proxy :: Proxy w) $ Prelude.take w (Prelude.drop (i*w) bs) | i <- [0..Prelude.length bs `Prelude.div` w Prelude.- 1]]+ w = fromInteger $ toInteger $ width (Proxy :: Proxy w)+ conv :: (Unit w) => Proxy w -> [Bool] -> w+ conv _ = Prelude.foldl (\n b -> if b then n Prelude.* 2 Prelude.+ 1 else n Prelude.* 2) 0++fromUnits :: (Unit w) => [w] -> BitVector w+fromUnits = unfreezeBitVector . value++replUnit :: (Unit w) => Data Length -> w -> BitVector w+replUnit n u = BitVector [Segment n $ const $ value u]++indexed :: (Unit w, Size w ~ Range w) =>+ Data Length -> (Data Index -> Data Bool) -> BitVector w+indexed l ixf = fromVector $ Vec.indexed l ixf++map :: (Unit w, Size w ~ Range w) =>+ (Data Bool -> Data Bool) -> BitVector w -> BitVector w+map f bv = boolFun1 f res+ where+ res f' = BitVector $+ Prelude.map (\s -> s{elements = f' . elements s}) $ segments bv++takeUnits :: forall w . (Unit w) =>+ Data Length -> BitVector w -> BitVector w+takeUnits len bv = help len [] $ segments bv+ where+ help _ acc [] = BitVector acc+ help n acc (s:ss) = n < numUnits s ?+ ( BitVector (acc Prelude.++ [s{numUnits = n}])+ , help (n - numUnits s) (acc Prelude.++ [s]) ss+ )++dropUnits :: forall w . (Unit w) =>+ Data Length -> BitVector w -> BitVector w+dropUnits len bv = help len $ segments bv+ where+ help _ [] = BitVector []+ help n (s:ss) = n < numUnits s ?+ ( BitVector $ s':ss+ , help (n - numUnits s) ss+ )+ where+ s' = Segment+ { numUnits = numUnits s - n+ , elements = \i -> elements s (i + n)+ }++(++) :: forall w . (Unit w) =>+ BitVector w -> BitVector w -> BitVector w+(BitVector ss) ++ (BitVector zs) = BitVector $ ss Prelude.++ zs++drop :: forall w . (Unit w, Size w ~ Range w) =>+ Data Length -> Data w -> BitVector w -> BitVector w+drop len end bv = dropSegments len $ segments bv+ where+ w = value $ width (Proxy :: Proxy w)+ dropSegments _ [] = BitVector []+ dropSegments n (s:ss) = n < sLen ?+ ( dropUnits n s ss+ , dropSegments (n - sLen) ss+ )+ where+ sLen = numUnits s * w+ dropUnits n s ss = dropBits bitsToDrop (s':ss)+ where+ s' = Segment+ { numUnits = numUnits s - wordsToDrop+ , elements = \i -> elements s (i + wordsToDrop)+ }+ wordsToDrop = n `div` w+ bitsToDrop = n `mod` w+ dropBits _ [] = BitVector []+ dropBits n (s:ss) = n > 0 ?+ ( BitVector $ s' : segments bv'+ , BitVector (s:ss)+ )+ where+ s' = Segment+ { numUnits = numUnits s - 1+ , elements = \i ->+ (elements s i `shiftLU` n)+ .|.+ (elements s (i+1) `shiftRU` (w-n))+ }+ bv' = addBits (w - n) (elements s (numUnits s - 1) `shiftLU` n) ss+ addBits n bs [] = BitVector [Segment 1 $ const $ bs .|. (end `shiftRU` n)]+ addBits n bs (s:ss) = numUnits s > 0 ?+ ( BitVector $ s' : segments bv'+ , addBits n bs ss+ )+ where+ s' = Segment+ { numUnits = 1+ , elements = const $ bs .|. (elements s 0 `shiftRU` n)+ }+ bv' = dropBits (w - n) (s:ss)++fold :: forall w a. (Syntax a, Unit w, Size w ~ Range w) =>+ (a -> Data Bool -> a) -> a -> BitVector w -> a+fold _ ini (BitVector []) = ini+fold f ini (BitVector (s:ss)) = fold f (forLoop (numUnits s) ini f') $ BitVector ss+ where+ f' :: Data Index -> a -> a+ f' i st = Prelude.snd $ forLoop w (elements s i, st) f''+ f'' :: Data Index -> (Data w,a) -> (Data w,a)+ f'' _ (unit,st) = (unit `shiftLU` 1, f st $ testBit unit $ w-1)+ w = value $ width (Proxy :: Proxy w)++zipWith :: forall w. (Unit w, Size w ~ Range w) =>+ (Data Bool -> Data Bool -> Data Bool)+ -> BitVector w+ -> BitVector w+ -> BitVector w+zipWith f bv bw = boolFun2 f res+ where+ res f' = Prelude.foldl (++) (BitVector [])+ [ zipSegments f' s z | s <- segIdxs bv, z <- segIdxs bw ]+ segIdxs bvec = Prelude.zip (segments bvec) $+ Prelude.map (Prelude.sum . Prelude.map numUnits) $+ inits $ segments bvec+ zipSegments f' (s,sStart) (z,zStart) = BitVector+ [ Segment+ { numUnits = end - start+ , elements = \i ->+ f' (elements s (i+sOffset)) (elements z (i+zOffset))+ }+ ]+ where+ sEnd = sStart + numUnits s+ zEnd = zStart + numUnits z+ start = max sStart zStart+ end = min sEnd zEnd+ sOffset = start - sStart+ zOffset = start - zStart++head :: (Unit w, Size w ~ Range w) => BitVector w -> Data Bool+head = (!0)++tail :: forall w. (Unit w, Size w ~ Range w) => Data Bool -> BitVector w -> BitVector w+tail b = drop 1 (b2i b `shiftLU` (w - 1))+ where+ w = value $ width (Proxy :: Proxy w)++-- * Boolean functions extended to words++boolFun1 :: (Syntax t, Unit w, Size w ~ Range w) =>+ (Data Bool -> Data Bool)+ -> ((Data w -> Data w) -> t)+ -> t+boolFun1 f c = f true ?+ ( f false ? (c (const $ complement 0), c id)+ , f false ? (c complement, c (const 0))+ )++boolFun2 :: (Syntax t, Unit w, Size w ~ Range w) =>+ (Data Bool -> Data Bool -> Data Bool)+ -> ((Data w -> Data w -> Data w) -> t)+ -> t+boolFun2 f c =+ f true true ?+ ( f true false ?+ ( f false true ?+ ( f false false ?+ ( c $ \_ _ -> complement 0+ , c $ (.|.)+ )+ , f false false ?+ ( c $ \x y -> x .|. complement y+ , c $ \x _ -> x+ )+ )+ , f false true ?+ ( f false false ?+ ( c $ \x y -> complement x .|. y+ , c $ \_ y -> y+ )+ , f false false ?+ ( c $ \x y -> complement (x `xor` y)+ , c $ (.&.)+ )+ )+ )+ , f true false ?+ ( f false true ?+ ( f false false ?+ ( c $ \x y -> complement (x .&. y)+ , c $ \x y -> x `xor` y+ )+ , f false false ?+ ( c $ \_ y -> complement y+ , c $ \x y -> x .&. complement y+ )+ )+ , f false true ?+ ( f false false ?+ ( c $ \x _ -> complement x+ , c $ \x y -> complement x .&. y+ )+ , f false false ?+ ( c $ \x y -> complement (x .|. y)+ , c $ \_ _ -> 0+ )+ )+ )+ )++-- * Wrapping for bitvectors++instance (Unit w) => Wrap (BitVector w) (Data [w]) where+ wrap = freezeBitVector++instance (Wrap t u, Unit w, TL.Nat s) => Wrap (BitVector w -> t) (Data' s [w] -> u) where+ wrap f = \(Data' d) -> wrap $ f $ unfreezeBitVector $ setLength s' d where+ s' = fromInteger $ toInteger $ TL.toInt (undefined :: s)++-- * Patch combinators for bitvectors++tBV :: Patch w w -> Patch (BitVector w) (BitVector w)+tBV _ = id
+ src/Feldspar/Core.hs view
@@ -0,0 +1,58 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | The Feldspar core language++module Feldspar.Core+ (+ -- * Reexported standard modules+ Complex (..)+ , module Data.Int+ , module Data.Word++ -- * Feldspar types+ , Range (..)+ , BoundedInt+ , module Feldspar.Core.Types++ -- * Frontend+ , module Feldspar.Core.Frontend+ , module Feldspar.Core.Collection+ ) where++++import Data.Complex+import Data.Int hiding (Int)+import Data.Word++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Frontend+import Feldspar.Core.Collection+
+ src/Feldspar/Core/Collection.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.+--++-- | General interfaces to collections of data++module Feldspar.Core.Collection where++++-- | Collection element type+type family Elem a++-- | Collection index type+type family CollIndex a++-- | Collection size type+type family CollSize a++-- | Data structures that support indexing+class Indexed a+ where+ (!) :: a -> CollIndex a -> Elem a++infixl 9 !++-- | Sized data structures+class Sized a+ where+ collSize :: a -> CollSize a+ setCollSize :: CollSize a -> a -> a++-- | Mapping over collections+class CollMap a b+ where+ collMap :: (Elem a -> Elem b) -> a -> b+
+ src/Feldspar/Core/Constructs.hs view
@@ -0,0 +1,239 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++--+-- Copyright (c) 2009-2011, 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.Core.Constructs where++import Data.Typeable++import Language.Syntactic+import Language.Syntactic.Constructs.Binding.HigherOrder++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Array+import Feldspar.Core.Constructs.Binding+import Feldspar.Core.Constructs.Bits+import Feldspar.Core.Constructs.Complex+import Feldspar.Core.Constructs.Condition+import Feldspar.Core.Constructs.ConditionM+import Feldspar.Core.Constructs.Conversion+import Feldspar.Core.Constructs.Eq+import Feldspar.Core.Constructs.Error+import Feldspar.Core.Constructs.FFI+import Feldspar.Core.Constructs.Floating+import Feldspar.Core.Constructs.Fractional+import Feldspar.Core.Constructs.Future+import Feldspar.Core.Constructs.Integral+import Feldspar.Core.Constructs.Literal+import Feldspar.Core.Constructs.Logic+import Feldspar.Core.Constructs.Loop+import Feldspar.Core.Constructs.Mutable+import Feldspar.Core.Constructs.MutableArray+import Feldspar.Core.Constructs.MutableReference+import Feldspar.Core.Constructs.MutableToPure+import Feldspar.Core.Constructs.NoInline+import Feldspar.Core.Constructs.Par+import Feldspar.Core.Constructs.Num+import Feldspar.Core.Constructs.Ord+import Feldspar.Core.Constructs.Save+import Feldspar.Core.Constructs.SizeProp+import Feldspar.Core.Constructs.SourceInfo+import Feldspar.Core.Constructs.Trace+import Feldspar.Core.Constructs.Tuple++--------------------------------------------------------------------------------+-- * Domain+--------------------------------------------------------------------------------++type FeldSymbols+ = (Decor SourceInfo1 Identity :|| Type)+ :+: (Condition :|| Type)+ :+: (FFI :|| Type)+ :+: (Let :|| Type)+ :+: (Literal :|| Type)+ :+: (Select :|| Type)+ :+: (Tuple :|| Type)+ :+: (Array :|| Type)+ :+: (BITS :|| Type)+ :+: (COMPLEX :|| Type)+ :+: (Conversion :|| Type)+ :+: (EQ :|| Type)+ :+: (Error :|| Type)+ :+: (FLOATING :|| Type)+ :+: (FRACTIONAL :|| Type)+ :+: (FUTURE :|| Type)+ :+: (INTEGRAL :|| Type)+ :+: (Logic :|| Type)+ :+: (Loop :|| Type)+ :+: (NUM :|| Type)+ :+: (NoInline :|| Type)+ :+: (ORD :|| Type)+ :+: (PropSize :|| Type)+ :+: (Save :|| Type)+ :+: (Trace :|| Type)+ :+: ConditionM Mut+ :+: LoopM Mut+ :+: MONAD Mut+ :+: Mutable+ :+: MutableArray+ :+: MutableReference+ :+: MutableToPure+ :+: MONAD Par+ :+: ParFeature+ :+: Empty++-- TODO We are currently a bit inconsistent in that `Type` constraints are sometimes attached+-- separately using `(:||)` and sometimes baked into the symbol type. `Mutable` and+-- `MutableToPure` (at least) have `Type` baked in. Note that `(MutableToPure :|| Type)` would+-- currently not work, since `WithArray` has monadic result type.++type FeldDomain = FODomain FeldSymbols Typeable Type++type FeldDomainAll = HODomain FeldSymbols Typeable Type++--newtype FeldDomain a = FeldDomain (FeldSymbols a)+++--deriving instance (sym :<: FeldSymbols) => sym :<: FeldDomain+--deriving instance (Project sym FeldSymbols) => Project sym FeldDomain++----instance (InjectC sym FeldSymbols a) => InjectC sym FeldDomain a+---- where+---- injC = injC . FeldDomain++----instance Constrained FeldDomain+-- where+-- type Sat FeldDomain = Sat FeldSymbols+-- exprDict (FeldDomain a) = exprDict a++--deriving instance Equality FeldDomain+--deriving instance Render FeldDomain+--deriving instance ToTree FeldDomain+--deriving instance Eval FeldDomain+--deriving instance EvalBind FeldDomain++--instance VarEqEnv env => AlphaEq+-- FeldDomain+-- FeldDomain+-- ((Lambda :+: (Variable :+: ((FeldDomain :|| Eq) :| Show))) :|| Typeable)+-- env+-- where+-- alphaEqSym (FeldDomain a) aArgs (FeldDomain b) bArgs =+-- alphaEqSym a aArgs b bArgs++--instance AlphaEq+-- FeldDomain+-- FeldDomain+-- ((Lambda :+: (Variable :+: ((FeldDomain :|| Eq) :| Show))) :|| Typeable)+-- [(VarId, VarId)]+-- where+-- alphaEqSym (FeldDomain a) aArgs (FeldDomain b) bArgs =+-- alphaEqSym a aArgs b bArgs++{-+instance Equality dom => AlphaEq dom dom (Decor Info (dom :|| Typeable)) [(VarId,VarId)]+ where+ alphaEqSym = alphaEqSymDefault+-}++--deriving instance Sharable FeldDomain++{-+instance Optimize FeldDomain (Lambda TypeCtx :+: (Variable TypeCtx :+: FeldDomain))+ where+ optimizeFeat (FeldDomain a) = optimizeFeat a+ constructFeatOpt (FeldDomain a) = constructFeatOpt a+ constructFeatUnOpt (FeldDomain a) = constructFeatUnOpt a+-}+++++--------------------------------------------------------------------------------+-- * Front end+--------------------------------------------------------------------------------++newtype Data a = Data { unData :: ASTF FeldDomainAll a }++deriving instance Typeable1 Data++instance Type a => Syntactic (Data a)+ where+ type Domain (Data a) = FeldDomainAll+ type Internal (Data a) = a+ desugar = unData+ sugar = Data++-- | Specialization of the 'Syntactic' class for the Feldspar domain+class+ ( Syntactic a+ , Domain a ~ FeldDomainAll+ , Type (Internal a)+ ) =>+ Syntax a+ -- It would be possible to let 'Syntax' be an alias instead of giving separate+ -- instances for all types. However, this leads to horrible error messages.+ -- For example, if 'Syntax' is an alias, the following expression gives a huge+ -- type error:+ --+ -- > eval (forLoop 10 0 (const (+id)))+ --+ -- The type error is not very readable now either, but at least it fits on the+ -- screen.++instance Type a => Syntax (Data a)++instance Type a => Eq (Data a)+ where+ Data a == Data b = alphaEq (reify a) (reify b)++instance Type a => Show (Data a)+ where+ show (Data a) = render $ reify a++--c' :: (Type (DenResult sig)) => feature sig -> (feature :|| Type) sig+--c' = C'++sugarSymF :: ( ApplySym sig b dom+ , SyntacticN c b+ , InjectC (feature :|| Type) dom (DenResult sig)+ , Type (DenResult sig)+ )+ => feature sig -> c+sugarSymF sym = sugarSymC (c' sym)+
+ src/Feldspar/Core/Constructs/Array.hs view
@@ -0,0 +1,247 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Array+where++import Data.List+import Data.Map (notMember)++import Language.Syntactic+import Language.Syntactic.Constructs.Binding hiding (betaReduce)+import Language.Syntactic.Constructs.Binding.HigherOrder (CLambda)++import Feldspar.Range+import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Binding+import Feldspar.Core.Constructs.Num+import Feldspar.Core.Constructs.Ord++data Array a+ where+ Parallel :: Type a => Array (Length :-> (Index -> a) :-> Full [a])+ Sequential :: (Type a, Type st) =>+ Array (Length :-> st :-> (Index -> st -> (a,st)) :-> Full [a])+ Append :: Type a => Array ([a] :-> [a] :-> Full [a])+ GetIx :: Type a => Array ([a] :-> Index :-> Full a)+ SetIx :: Type a => Array ([a] :-> Index :-> a :-> Full [a])+ GetLength :: Type a => Array ([a] :-> Full Length)+ SetLength :: Type a => Array (Length :-> [a] :-> Full [a])++instance Semantic Array+ where+ semantics Append = Sem "(++)" (++)+ semantics GetIx = Sem "(!)" genericIndex+ semantics GetLength = Sem "getLength" genericLength+ semantics SetLength = Sem "setLength"+ (\n as -> genericTake n (as ++ repeat err))+ where+ err = error "reading uninitialized array element"++ semantics Parallel = Sem "parallel"+ (\len ixf -> genericTake len $ map ixf [0..])++ semantics Sequential = Sem "sequential"+ (\len i step -> genericTake len $+ snd $ mapAccumL (\a ix -> swap (step ix a)) i [0..])+ where swap (a,b) = (b,a)++ semantics SetIx = Sem "setIx" evalSetIx+ where+ evalSetIx as i v+ | i < len = genericTake i as ++ [v] ++ genericDrop (i+1) as+ | otherwise = error $ unwords+ [ "setIx: assigning index"+ , show i+ , "past the end of an array of length"+ , show len+ ]+ where+ len = genericLength as++instance Equality Array where equal = equalDefault; exprHash = exprHashDefault+instance Render Array where renderArgs = renderArgsDefault+instance ToTree Array+instance Eval Array where evaluate = evaluateDefault+instance EvalBind Array where evalBindSym = evalBindSymDefault++instance AlphaEq dom dom dom env => AlphaEq Array Array dom env+ where+ alphaEqSym = alphaEqSymDefault++instance Sharable Array+ where+ sharable GetIx = False+ sharable _ = True++instance SizeProp (Array :|| Type)+ where+ sizeProp (C' Parallel) (WrapFull len :* WrapFull ixf :* Nil) =+ infoSize len :> infoSize ixf+ sizeProp (C' Sequential) (WrapFull len :* _ :* WrapFull step :* Nil) =+ infoSize len :> fst (infoSize step)+ sizeProp (C' Append) (WrapFull arra :* WrapFull arrb :* Nil) =+ (alen + blen) :> (aelem \/ belem)+ where+ alen :> aelem = infoSize arra+ blen :> belem = infoSize arrb+ sizeProp (C' GetIx) (WrapFull arr :* _ :* Nil) = el+ where+ _ :> el = infoSize arr+ sizeProp (C' SetIx) (WrapFull arr :* _ :* WrapFull e :* Nil) =+ len :> (el \/ infoSize e)+ where+ len :> el = infoSize arr+ sizeProp (C' GetLength) (WrapFull arr :* Nil) = len+ where+ len :> _ = infoSize arr+ sizeProp (C' SetLength) (WrapFull len :* WrapFull arr :* Nil) =+ infoSize len :> el+ where+ _ :> el = infoSize arr++instance+ ( (Array :|| Type) :<: dom+ , (NUM :|| Type) :<: dom+ , (ORD :|| Type) :<: dom+ , (Variable :|| Type) :<: dom+ , CLambda Type :<: dom+ , OptimizeSuper dom+ ) =>+ Optimize (Array :|| Type) dom+ where+ optimizeFeat sym@(C' Parallel) (len :* ixf :* Nil) = do+ len' <- optimizeM len+ let szI = infoSize (getInfo len')+ ixRange = rangeByRange 0 (szI-1)+ ixf' <- optimizeFunction optimizeM (mkInfo ixRange) ixf+ constructFeat sym (len' :* ixf' :* Nil)++ optimizeFeat sym@(C' Sequential) (len :* inital :* step :* Nil) = do+ len' <- optimizeM len+ init' <- optimizeM inital+ let szI = infoSize (getInfo len')+ ixRange = rangeByRange 0 (szI-1)+ step' <- optimizeFunction+ optimizeM -- TODO (optimizeFunctionFix optimizeM (mkInfo universal))+ (mkInfo ixRange)+ step+ constructFeat sym (len' :* init' :* step' :* Nil)+ -- TODO Should use fixed-point iteration, but `optimizeFunctionFix` only+ -- works for functions of type `a -> a`.++ optimizeFeat a args = optimizeFeatDefault a args++ constructFeatOpt (C' Parallel) (len :* _ :* Nil)+ | Just 0 <- viewLiteral len+ = return $ literalDecor []+ -- TODO Optimize when length is one. This requires a way to create an+ -- uninitialized array of length one, and setting the first element.+ -- Use `betaReduce` to apply `ixf` to the literal 0.++ constructFeatOpt (C' Parallel) (len :* (lam :$ (gix :$ arr2 :$ ix)) :* Nil)+ | Just (SubConstr2 (Lambda v1)) <- prjLambda lam+ , Just (C' GetIx) <- prjF gix+ , Just (C' (Variable v2)) <- prjF ix+ , v1 == v2+ , v1 `notMember` infoVars (getInfo arr2)+ = constructFeat (c' SetLength) (len :* arr2 :* Nil)++ constructFeatOpt (C' Sequential) (len :* _ :* _ :* Nil)+ | Just 0 <- viewLiteral len+ = return $ literalDecor []+ -- TODO Optimize when length is one. This requires a way to create an+ -- uninitialized array of length one, and setting the first element.+ -- Use `betaReduce` to apply the step function.++ constructFeatOpt (C' Append) (a :* b :* Nil)+ | Just [] <- viewLiteral a = return b+ | Just [] <- viewLiteral b = return a++ constructFeatOpt (C' GetIx) ((op :$ _ :$ ixf) :* ix :* Nil)+ | Just (C' Parallel) <- prjF op+ = optimizeM $ betaReduce (stripDecor ix) (stripDecor ixf)+ -- TODO should not need to drop the decorations++ constructFeatOpt s@(C' GetIx) ((op :$ _ :$ arr) :* ix :* Nil)+ | Just (C' SetLength) <- prjF op+ = constructFeat s (arr :* ix :* Nil)++ constructFeatOpt (C' GetLength) (arr :* Nil)+ | Just as <- viewLiteral arr = return $ literalDecor $ genericLength as++ constructFeatOpt s@(C' GetLength) ((op :$ a :$ _ :$ _) :* Nil)+ | Just (C' Sequential) <- prjF op = return a+ | Just (C' SetIx) <- prjF op = constructFeat s (a :* Nil)++ constructFeatOpt sym@(C' GetLength) ((op :$ a :$ b) :* Nil)+ | Just (C' Append) <- prjF op = do+ aLen <- constructFeat sym (a :* Nil)+ bLen <- constructFeat sym (b :* Nil)+ constructFeatOpt (c' Add) (aLen :* bLen :* Nil)+ | Just (C' Parallel) <- prjF op = return a+ | Just (C' SetLength) <- prjF op = return a++ -- TODO remove this optimization when the singletonRange -> literal+ -- optimization in Feldspar.Core.Interpretation has been implemented+ constructFeatOpt (C' GetLength) (arr :* Nil)+ | len :> _ <- infoSize $ getInfo arr+ , isSingleton len+ = return $ literalDecor $ lowerBound len++ constructFeatOpt (C' SetLength) (len :* _ :* Nil)+ | Just 0 <- viewLiteral len = return $ literalDecor []++ constructFeatOpt (C' SetLength) ((getLength :$ arr') :* arr :* Nil)+ | Just (C' GetLength) <- prjF getLength+ , alphaEq arr arr'+ = return arr++ constructFeatOpt (C' SetLength) (len :* arr :* Nil)+ | rlen <- infoSize $ getInfo len+ , rarr :> _ <- infoSize $ getInfo arr+ , isSingleton rlen+ , isSingleton rarr+ , rlen == rarr+ = return arr++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Binding.hs view
@@ -0,0 +1,251 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Interpretation of binding constructs++module Feldspar.Core.Constructs.Binding+ ( module Language.Syntactic.Constructs.Binding+ , optimizeLambda+ , optimizeFunction+-- , optimizeFunctionFix+ , prjLambda+ , betaReduce+ , cLambda+ ) where++import Control.Monad.Reader+import Data.Maybe+import Data.Map+import Data.Typeable (Typeable, gcast)++import Data.Lens.Common+import Data.Proxy++import Language.Syntactic+import Language.Syntactic.Constructs.Binding hiding (subst,betaReduce)+import Language.Syntactic.Constructs.Binding.HigherOrder (CLambda)++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++instance Sharable Variable -- `codeMotion` will not share variables anyway+instance Sharable Lambda -- Will not be shared anyway because we disallow variables of `->` type+instance Sharable Let++-- | Should be a capture-avoiding substitution, but it is currently not correct.+--+-- Note: Variables with a different type than the new expression will be+-- silently ignored.+subst :: forall constr dom a b+ . ( Constrained dom+ , CLambda Type :<: dom+ , (Variable :|| Type) :<: dom+ )+ => VarId -- ^ Variable to be substituted+ -> ASTF (dom :|| Typeable) a -- ^ Expression to substitute for+ -> ASTF (dom :|| Typeable) b -- ^ Expression to substitute in+ -> ASTF (dom :|| Typeable) b+subst v new a = go a+ where+ go :: AST (dom :|| Typeable) c -> AST (dom :|| Typeable) c+ go a@((prjLambda -> Just (SubConstr2 (Lambda w))) :$ _)+ | v==w = a -- Capture+ go (f :$ a) = go f :$ go a+ go var+ | Just (C' (Variable w)) <- prjF var+ , v==w+ , Dict <- exprDictSub pTypeable new+ , Dict <- exprDictSub pTypeable var+ , Just new' <- gcast new+ = new'+ go a = a+ -- TODO Make it correct (may need to alpha-convert `new` before inserting it)+ -- TODO Should there be an error if `gcast` fails? (See note in Haddock+ -- comment.)++betaReduce+ :: ( Constrained dom+ , CLambda Type :<: dom+ , (Variable :|| Type) :<: dom+ )+ => ASTF (dom :|| Typeable) a -- ^ Argument+ -> ASTF (dom :|| Typeable) (a -> b) -- ^ Function to be reduced+ -> ASTF (dom :|| Typeable) b+betaReduce new (lam :$ body)+ | Just (SubConstr2 (Lambda v)) <- prjLambda lam = subst v new body++optimizeLambda :: ( CLambda Type :<: dom+ , OptimizeSuper dom)+ => (ASTF (dom :|| Typeable) b -> Opt (ASTF (Decor Info (dom :|| Typeable)) b)) -- ^ Optimization of the body+ -> Info a+ -> CLambda Type (b :-> Full (a -> b))+ -> Args (AST (dom :|| Typeable)) (b :-> Full (a -> b))+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (a -> b))+optimizeLambda opt info lam@(SubConstr2 (Lambda v)) (body :* Nil)+ | Dict <- exprDict body+ = do+ body' <- localVar v info $ opt body+ constructFeatUnOpt lam (body' :* Nil)++-- | Assumes that the expression is a 'Lambda'+optimizeFunction :: ( CLambda Type :<: dom+ , OptimizeSuper dom)+ => (ASTF (dom :|| Typeable) b -> Opt (ASTF (Decor Info (dom :|| Typeable)) b)) -- ^ Optimization of the body+ -> Info a+ -> (ASTF (dom :|| Typeable) (a -> b) -> Opt (ASTF (Decor Info (dom :|| Typeable)) (a -> b)))+optimizeFunction opt info a@(sym :$ body)+ | Dict <- exprDict a+ , Dict <- exprDict body+ , Just (lam@(SubConstr2 (Lambda v))) <- prjLambda sym+ = optimizeLambda opt info lam (body :* Nil)++{-+optimizeFunBody :: (Lambda TypeCtx :<: dom, Optimize dom dom, Typeable a)+ => (ASTF dom a -> Opt (ASTF (Decor Info dom) a)) -- ^ Optimization of the body+ -> Env -- ^ Environment (instead of using 'Opt')+ -> VarId -- ^ Bound variable+ -> ASTF dom a -- ^ Body+ -> Info a -- ^ 'Info' of bound variable+ -> ASTF (Decor Info dom) a+optimizeFunBody opt env v body info =+ flip runReader env $ localVar v info $ opt body++-- | Assumes that the expression is a 'Lambda'+optimizeFunctionFix+ :: forall dom a+ . (Lambda TypeCtx :<: dom, Optimize dom dom, Type a)+ => (ASTF dom a -> Opt (ASTF (Decor Info dom) a)) -- ^ Optimization of the body+ -> Info a+ -> (ASTF dom (a -> a) -> Opt (ASTF (Decor Info dom) (a -> a)))+optimizeFunctionFix opt info (lam :$ body)+ | Just (Lambda v) <- prjCtx typeCtx lam+ = do+ env <- ask++ let aLens :: Lens (Info a) (Size a)+ aLens = lens infoSize (\sz inf -> inf {infoSize = sz})++ let bLens :: Lens (ASTF (Decor Info dom) a) (Size a)+ bLens = lens (infoSize . getInfo)+ (\sz a -> updateDecor (\inf -> inf {infoSize = sz}) a)++ let body' = fst $ boundedLensedFixedPoint 1 aLens bLens+ (optimizeFunBody opt env v body)+ info+ -- Using 1 as bound is motivated by the fact that a higher number+ -- leads to exponential blowup when there are many nested+ -- iterations. Since it is probably uncommon to have very deeply+ -- nested loops, it might be fine to increase the bound. However+ -- it is not clear that we gain anything by doing so, other than+ -- in very special cases.++ constructFeatUnOpt (Lambda v `withContext` typeCtx) (body' :* Nil)++-}++instance ( (Variable :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (Variable :|| Type) dom+ where+ constructFeatUnOpt var@(C' (Variable v)) Nil+ = reader $ \env -> case Prelude.lookup v (varEnv env) of+ Nothing -> error $+ "optimizeFeat: can't get size of free variable: v" ++ show v+ Just (SomeInfo info) ->+ let info' = (fromJust $ gcast info) {infoVars = singleton v (SomeType $ infoType info) }+ in Sym $ Decor info' $ C' $ inj $ c' (Variable v)++instance ( CLambda Type :<: dom+ , OptimizeSuper dom)+ => Optimize (CLambda Type) dom+ where+ -- | Assigns a 'universal' size to the bound variable. This only makes sense+ -- for top-level lambdas. For other uses, use 'optimizeLambda' instead.++ optimizeFeat lam@(SubConstr2 (Lambda v))+ | Dict <- exprDict lam+ = optimizeLambda optimizeM (mkInfo universal) lam++ constructFeatUnOpt lam@(SubConstr2 (Lambda v)) (body :* Nil)+ | Dict <- exprDict lam+ , Info t sz vars _ <- getInfo body+ = do+ src <- asks sourceEnv+ let info = Info (FunType typeRep t) sz (delete v vars) src+ return $ (Sym $ Decor info $ C' $ inj lam) :$ body++instance SizeProp (Let :|| Type)+ where+ sizeProp (C' Let) (_ :* WrapFull f :* Nil) = infoSize f++instance+ ( (Let :|| Type) :<: dom+ , (Variable :|| Type) :<: dom+ , CLambda Type :<: dom+ , OptimizeSuper dom+ ) =>+ Optimize (Let :|| Type) dom+ where+ optimizeFeat lt@(C' Let) (a :* f :* Nil) = do+ a' <- optimizeM a+ f' <- optimizeFunction optimizeM (getInfo a') f+ case getInfo f' of+ Info{} -> constructFeat lt (a' :* f' :* Nil)+ -- TODO Why is this pattern match needed?++ constructFeatOpt (C' Let) (a :* (lam :$ var) :* Nil)+ | Just (C' (Variable v2)) <- prjF var+ , Just (SubConstr2 (Lambda v1)) <- prjLambda lam+ , v1 == v2+ = return $ fromJust $ gcast a++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x++prjLambda :: (Project (CLambda Type) dom)+ => dom sig -> Maybe (CLambda Type sig)+prjLambda = prj++cLambda :: Type a => VarId -> CLambda Type (b :-> Full (a -> b))+cLambda = SubConstr2 . Lambda+
+ src/Feldspar/Core/Constructs/Bits.hs view
@@ -0,0 +1,238 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Implementation of constructs and operations on 'Bits'+module Feldspar.Core.Constructs.Bits+ ( BITS (..)+ ) where++import Data.Typeable++import Language.Syntactic+import Language.Syntactic.Constructs.Literal+import Language.Syntactic.Constructs.Binding++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Logic+import Feldspar.Core.Constructs.Eq+import Feldspar.Core.Constructs.Ord++import Data.Bits++-- | Bits constructs+data BITS a+ where+ BAnd :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)+ BOr :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)+ BXor :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> a :-> Full a)+ Complement :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full a)++ Bit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (Index :-> Full a)+ SetBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ ClearBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ ComplementBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ TestBit :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full Bool)++ ShiftLU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ ShiftRU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ ShiftL :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)+ ShiftR :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)+ RotateLU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ RotateRU :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Index :-> Full a)+ RotateL :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)+ RotateR :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> IntN :-> Full a)+ ReverseBits :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full a)++ BitScan :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Index)+ BitCount :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Index)++ IsSigned :: (Type a, Bits a, BoundedInt a, Size a ~ Range a) => BITS (a :-> Full Bool)++instance Semantic BITS+ where+ semantics BAnd = Sem "(.&.)" (.&.)+ semantics BOr = Sem "(.|.)" (.|.)+ semantics BXor = Sem "xor" xor+ semantics Complement = Sem "complement" complement++ semantics Bit = Sem "bit" (bit . fromIntegral)+ semantics SetBit = Sem "setBit" (liftIntWord setBit)+ semantics ClearBit = Sem "clearBit" (liftIntWord clearBit)+ semantics ComplementBit = Sem "complementBit" (liftIntWord complementBit)+ semantics TestBit = Sem "testBit" (liftIntWord testBit)++ semantics ShiftLU = Sem "shiftL" (liftIntWord shiftL)+ semantics ShiftRU = Sem "shiftR" (liftIntWord shiftR)+ semantics ShiftL = Sem "shiftL" (liftInt shiftL)+ semantics ShiftR = Sem "shiftR" (liftInt shiftR)+ semantics RotateLU = Sem "rotateL" (liftIntWord rotateL)+ semantics RotateRU = Sem "rotateR" (liftIntWord rotateR)+ semantics RotateL = Sem "rotateL" (liftInt rotateL)+ semantics RotateR = Sem "rotateR" (liftInt rotateR)+ semantics ReverseBits = Sem "reverseBits" evalReverseBits++ semantics BitScan = Sem "bitScan" evalBitScan+ semantics BitCount = Sem "bitCount" evalBitCount++ semantics IsSigned = Sem "isSigned" isSigned++liftIntWord :: (a -> Int -> b) -> (a -> WordN -> b)+liftIntWord f x = f x . fromIntegral++liftInt :: (a -> Int -> b) -> (a -> IntN -> b)+liftInt f x = f x . fromIntegral++evalReverseBits :: (Num b, Bits b) => b -> b+evalReverseBits b = revLoop b 0 (0 `asTypeOf` b)+ where+ bSz = bitSize b+ revLoop x i n | i >= bSz = n+ | testBit x i = revLoop x (i+1) (setBit n (bSz - i - 1))+ | otherwise = revLoop x (i+1) n++evalBitScan :: Bits b => b -> WordN+evalBitScan b =+ if isSigned b+ then scanLoop b (testBit b (bitSize b - 1)) (bitSize b - 2) 0+ else scanLoop b False (bitSize b - 1) 0+ where+ scanLoop x t i n | i Prelude.< 0 = n+ | testBit x i Prelude./= t = n+ | otherwise = scanLoop x t (i-1) (n+1)++evalBitCount :: Bits b => b -> WordN+evalBitCount b = loop b (bitSize b - 1) 0+ where+ loop x i n | i Prelude.< 0 = n+ | testBit x i = loop x (i-1) (n+1)+ | otherwise = loop x (i-1) n++instance Equality BITS where equal = equalDefault; exprHash = exprHashDefault+instance Render BITS where renderArgs = renderArgsDefault+instance ToTree BITS+instance Eval BITS where evaluate = evaluateDefault+instance EvalBind BITS where evalBindSym = evalBindSymDefault+instance Sharable BITS++instance AlphaEq dom dom dom env => AlphaEq BITS BITS dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (BITS :|| Type)+ where+ sizeProp (C' BAnd) (WrapFull a :* WrapFull b :* Nil) = rangeAnd (infoSize a) (infoSize b)+ sizeProp (C' BOr) (WrapFull a :* WrapFull b :* Nil) = rangeOr (infoSize a) (infoSize b)+ sizeProp (C' BXor) (WrapFull a :* WrapFull b :* Nil) = rangeXor (infoSize a) (infoSize b)++ sizeProp (C' ShiftLU) (WrapFull a :* WrapFull b :* Nil) = rangeShiftLU (infoSize a) (infoSize b)+ sizeProp (C' ShiftRU) (WrapFull a :* WrapFull b :* Nil) = rangeShiftRU (infoSize a) (infoSize b)++ sizeProp (C' Complement) (WrapFull a :* Nil) = rangeComplement (infoSize a)++ sizeProp a@(C' _) args = sizePropDefault a args+++instance ( (BITS :|| Type) :<: dom+ , (Logic :|| Type) :<: dom+ , (EQ :|| Type) :<: dom+ , (ORD :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (BITS :|| Type) dom+ where+ constructFeatOpt (C' BAnd) (a :* b :* Nil)+ | Just 0 <- viewLiteral a = return a+ | Just x <- viewLiteral a, isAllOnes x = return b+ | Just 0 <- viewLiteral b = return b+ | Just x <- viewLiteral b, isAllOnes x = return a++ constructFeatOpt (C' BOr) (a :* b :* Nil)+ | Just 0 <- viewLiteral a = return b+ | Just x <- viewLiteral a, isAllOnes x = return a+ | Just 0 <- viewLiteral b = return a+ | Just x <- viewLiteral b, isAllOnes x = return b++ constructFeatOpt (C' BXor) (a :* b :* Nil)+ | Just 0 <- viewLiteral a = return b+ | Just x <- viewLiteral a, isAllOnes x = constructFeat (c' Complement) (b :* Nil)+ | Just 0 <- viewLiteral b = return a+ | Just x <- viewLiteral b, isAllOnes x = constructFeat (c' Complement) (a :* Nil)++ constructFeatOpt (C' BXor) ((xo :$ v1 :$ v2) :* v3 :* Nil)+ | Just (C' BXor) <- prjF xo+ , alphaEq v2 v3+ = return v1++ constructFeatOpt (C' TestBit) ((xo :$ v1 :$ v2) :* v3 :* Nil)+ | Just (C' BXor) <- prjF xo+ , Just a <- viewLiteral v2+ , Just b <- viewLiteral v3+ , a == 2 ^ b+ = do tb <- constructFeat (c' TestBit) (v1 :* v3 :* Nil)+ constructFeat (c' Not) (tb :* Nil)++ constructFeatOpt x@(C' ShiftLU) args = optZero x args+ constructFeatOpt x@(C' ShiftRU) args = optZero x args+ constructFeatOpt x@(C' ShiftL) args = optZero x args+ constructFeatOpt x@(C' ShiftR) args = optZero x args+ constructFeatOpt x@(C' RotateLU) args = optZero x args+ constructFeatOpt x@(C' RotateRU) args = optZero x args+ constructFeatOpt x@(C' RotateL) args = optZero x args+ constructFeatOpt x@(C' RotateR) args = optZero x args++ constructFeatOpt feat args = constructFeatUnOpt feat args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+++isAllOnes :: (Num a, Bits a) => a -> Bool+isAllOnes x = x Prelude.== complement 0++optZero :: ( Eq b, Num b+ , (Literal :|| Type) :<: dom+ , Typeable a+ , Optimize feature dom+ )+ => feature (a :-> (b :-> Full a))+ -> Args (AST (Decor Info (dom :|| Typeable))) (a :-> (b :-> Full a))+ -> Opt (AST (Decor Info (dom :|| Typeable)) (Full a))+optZero f (a :* b :* Nil)+ | Just 0 <- viewLiteral b = return a+ | otherwise = constructFeatUnOpt f (a :* b :* Nil)+
+ src/Feldspar/Core/Constructs/Complex.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Complex+where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Data.Complex++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data COMPLEX a+ where+ MkComplex :: (Type a, RealFloat a) => COMPLEX (a :-> a :-> Full (Complex a))+ RealPart :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)+ ImagPart :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)+ Conjugate :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full (Complex a))+ MkPolar :: (Type a, RealFloat a) => COMPLEX (a :-> a :-> Full (Complex a))+ Magnitude :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)+ Phase :: (Type a, RealFloat a) => COMPLEX (Complex a :-> Full a)+ Cis :: (Type a, RealFloat a) => COMPLEX (a :-> Full (Complex a))++instance Semantic COMPLEX+ where+ semantics MkComplex = Sem "complex" (:+)+ semantics RealPart = Sem "creal" realPart+ semantics ImagPart = Sem "cimag" imagPart+ semantics Conjugate = Sem "conjugate" conjugate+ semantics MkPolar = Sem "mkPolar" mkPolar+ semantics Magnitude = Sem "magnitude" magnitude+ semantics Phase = Sem "phase" phase+ semantics Cis = Sem "cis" cis++instance Equality COMPLEX where equal = equalDefault; exprHash = exprHashDefault+instance Render COMPLEX where renderArgs = renderArgsDefault+instance ToTree COMPLEX+instance Eval COMPLEX where evaluate = evaluateDefault+instance EvalBind COMPLEX where evalBindSym = evalBindSymDefault+instance Sharable COMPLEX++instance SizeProp (COMPLEX :|| Type)+ where+ sizeProp (C' s) = sizePropDefault s++instance AlphaEq dom dom dom env => AlphaEq COMPLEX COMPLEX dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ( (COMPLEX :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (COMPLEX :|| Type) dom+ where+ constructFeatOpt (C' MkComplex) ((rp :$ a) :* (ip :$ b) :* Nil)+ | Just (C' RealPart) <- prjF rp+ , Just (C' ImagPart) <- prjF ip+ , alphaEq a b+ = return a++ constructFeatOpt (C' RealPart) ((mkc :$ r :$ _) :* Nil)+ | Just (C' MkComplex) <- prjF mkc+ = return r++ constructFeatOpt (C' ImagPart) ((mkc :$ _ :$ i) :* Nil)+ | Just (C' MkComplex) <- prjF mkc+ = return i++ constructFeatOpt (C' MkPolar) ((mag :$ a) :* (ph :$ b) :* Nil)+ | Just (C' Magnitude) <- prjF mag+ , Just (C' Phase) <- prjF ph+ , alphaEq a b+ = return a++ constructFeatOpt (C' Magnitude) ((mkp :$ m :$ _) :* Nil)+ | Just (C' MkPolar) <- prjF mkp+ = return m++ constructFeatOpt (C' Phase) ((mkp :$ _ :$ p) :* Nil)+ | Just (C' MkPolar) <- prjF mkp+ = return p++ constructFeatOpt (C' Conjugate) ((conj :$ a) :* Nil)+ | Just (C' Conjugate) <- prjF conj+ = return a++ constructFeatOpt sym args = constructFeatUnOpt sym args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Condition.hs view
@@ -0,0 +1,82 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Condition+ ( module Language.Syntactic.Constructs.Condition+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Condition++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Logic++instance Sharable Condition++instance SizeProp (Condition :|| Type)+ where+ sizeProp (C' Condition) (_ :* WrapFull t :* WrapFull f :* Nil)+ = infoSize t \/ infoSize f++instance ( (Condition :|| Type) :<: dom+ , (Logic :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (Condition :|| Type) dom+ where+ constructFeatOpt (C' Condition) (c :* t :* f :* Nil)+ | Just c' <- viewLiteral c = return $ if c' then t else f++ constructFeatOpt (C' Condition) (_ :* t :* f :* Nil)+ | alphaEq t f = return t++ constructFeatOpt cond@(C' Condition) ((op :$ c) :* t :* f :* Nil)+ | Just (C' Not) <- prjF op+ = constructFeat cond (c :* f :* t :* Nil)++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x++ -- TODO Propagate size information from the condition to the branches. For+ -- example+ --+ -- condition (x<10) (min x 20) x ==> x+
+ src/Feldspar/Core/Constructs/ConditionM.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.ConditionM+ ( ConditionM (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Logic++data ConditionM m a+ where+ ConditionM :: (Monad m, Type a) =>+ ConditionM m (Bool :-> m a :-> m a :-> Full (m a))+ -- TODO Can't we just use `Condition` instead?++instance Semantic (ConditionM m)+ where+ semantics ConditionM = Sem "if" ifM+ where+ ifM cond e t = if cond then e else t++instance Equality (ConditionM m) where equal = equalDefault; exprHash = exprHashDefault+instance Render (ConditionM m) where renderArgs = renderArgsDefault+instance ToTree (ConditionM m)+instance Eval (ConditionM m) where evaluate = evaluateDefault+instance EvalBind (ConditionM m) where evalBindSym = evalBindSymDefault+instance Sharable (ConditionM m)+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance AlphaEq dom dom dom env =>+ AlphaEq (ConditionM m) (ConditionM m) dom env+ where+ alphaEqSym = alphaEqSymDefault++instance LatticeSize1 m => SizeProp (ConditionM m)+ where+ sizeProp ConditionM (_ :* WrapFull t :* WrapFull f :* Nil) =+ mergeSize t (infoSize t) (infoSize f)++instance ( ConditionM m :<: dom+ , (Logic :|| Type) :<: dom+ , OptimizeSuper dom+ , LatticeSize1 m+ )+ => Optimize (ConditionM m) dom+ where+ constructFeatOpt ConditionM (c :* t :* f :* Nil)+ | Just c' <- viewLiteral c = return $ if c' then t else f++ constructFeatOpt ConditionM (_ :* t :* f :* Nil)+ | alphaEq t f = return t++ constructFeatOpt cond@ConditionM ((op :$ c) :* t :* f :* Nil)+ | Just (C' Not) <- prjF op+ = constructFeat cond (c :* f :* t :* Nil)++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt ConditionM args@(_ :* t :* _ :* Nil)+ | Info {infoType = tType} <- getInfo t+ = constructFeatUnOptDefaultTyp tType ConditionM args++ -- TODO Propagate size information from the condition to the branches. For+ -- example+ --+ -- condition (x<10) (min x 20) x ==> x+
+ src/Feldspar/Core/Constructs/Conversion.hs view
@@ -0,0 +1,117 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Conversion+ ( Conversion (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Range+import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data Conversion a+ where+ F2I :: (Type a, Integral a) => Conversion (Float :-> Full a)+ I2N :: (Type a, Type b, Integral a, Num b+ ,Size a ~ Range a+ ) =>+ Conversion (a :-> Full b)+ B2I :: (Type a, Integral a) => Conversion (Bool :-> Full a)+ Round :: (Type a, Integral a) => Conversion (Float :-> Full a)+ Ceiling :: (Type a, Integral a) => Conversion (Float :-> Full a)+ Floor :: (Type a, Integral a) => Conversion (Float :-> Full a)++rangeToSize :: Lattice (Size a) => TypeRep a -> Range Integer -> Size a+rangeToSize (IntType _ _) r = rangeProp r+rangeToSize _ _ = universal++rangeProp :: forall a . (Bounded a, Integral a) => Range Integer -> Range a+rangeProp (Range l u)+ | withinBounds l && withinBounds u+ = range (fromIntegral l) (fromIntegral u)+ | otherwise = range minBound maxBound+ where withinBounds i = toInteger (minBound :: a) <= i &&+ i <= toInteger (maxBound :: a)++instance Semantic Conversion+ where+ semantics F2I = Sem "f2i" truncate+ semantics I2N = Sem "i2n" (fromInteger.toInteger)+ semantics B2I = Sem "b2i" (\b -> if b then 1 else 0)+ semantics Round = Sem "round" round+ semantics Ceiling = Sem "ceiling" ceiling+ semantics Floor = Sem "floor" floor++instance Equality Conversion where equal = equalDefault; exprHash = exprHashDefault+instance Render Conversion where renderArgs = renderArgsDefault+instance Eval Conversion where evaluate = evaluateDefault+instance ToTree Conversion+instance EvalBind Conversion where evalBindSym = evalBindSymDefault+instance Sharable Conversion++instance AlphaEq dom dom dom env => AlphaEq Conversion Conversion dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (Conversion :|| Type)+ where+ sizeProp (C' F2I) _ = universal+ sizeProp (C' i2n@I2N) (WrapFull a :* Nil)+ = rangeToSize (resultType i2n) (mapMonotonic toInteger (infoSize a))+ sizeProp (C' B2I) _ = universal+ sizeProp (C' Round) _ = universal+ sizeProp (C' Ceiling) _ = universal+ sizeProp (C' Floor) _ = universal++instance ( (Conversion :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (Conversion :|| Type) dom+ where+ constructFeatOpt (C' i2n@I2N) (a :* Nil)+ | Just TypeEq <- typeEq (resultType i2n) (infoType $ getInfo a)+ = return a++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt a@(C' _) = constructFeatUnOptDefault a+
+ src/Feldspar/Core/Constructs/Eq.hs view
@@ -0,0 +1,99 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Implementation of Equality constructs++module Feldspar.Core.Constructs.Eq+where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++-- | Equality constructs+data EQ a+ where+ Equal :: (Type a, Eq a) => EQ (a :-> a :-> Full Bool)+ NotEqual :: (Type a, Eq a) => EQ (a :-> a :-> Full Bool)++instance Semantic EQ+ where+ semantics Equal = Sem "(==)" (==)+ semantics NotEqual = Sem "(/=)" (/=)++instance Equality EQ where equal = equalDefault; exprHash = exprHashDefault+instance Render EQ where renderArgs = renderArgsDefault+instance ToTree EQ+instance Eval EQ where evaluate = evaluateDefault+instance EvalBind EQ where evalBindSym = evalBindSymDefault+instance Sharable EQ++instance AlphaEq dom dom dom env => AlphaEq EQ EQ dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (EQ :|| Type)+ where sizeProp a@(C' _) = sizePropDefault a++instance ((EQ :|| Type) :<: dom, OptimizeSuper dom) => Optimize (EQ :|| Type) dom+ where+ constructFeatOpt (C' Equal) (a :* b :* Nil)+ | alphaEq a b+ = return $ literalDecor True++ constructFeatOpt (C' Equal) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `disjoint` rb+ = return $ literalDecor False++ constructFeatOpt (C' NotEqual) (a :* b :* Nil)+ | alphaEq a b+ = return $ literalDecor False++ constructFeatOpt (C' NotEqual) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `disjoint` rb+ = return $ literalDecor True++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Error.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Error where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data Error a+ where+ Undefined :: Type a => Error (Full a)+ Assert :: Type a => String -> Error (Bool :-> a :-> Full a)++instance Semantic Error+ where+ semantics Undefined = Sem "undefined" undefined+ semantics (Assert msg) = Sem "assert"+ (\cond a -> if cond then a else error ("Assert failed: " ++ msg))++instance Render Error+ where+ render Undefined = "undefined"+ render (Assert msg) = "assert " ++ show msg++instance Equality Error where equal = equalDefault; exprHash = exprHashDefault+instance ToTree Error+instance Eval Error where evaluate = evaluateDefault+instance EvalBind Error where evalBindSym = evalBindSymDefault+--instance SizeProp Error where sizeProp = sizePropDefault+instance Sharable Error++instance SizeProp (Error :|| Type)+ where+ sizeProp a@(C' _) = sizePropDefault a++instance AlphaEq dom dom dom env => AlphaEq Error Error dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ((Error :|| Type) :<: dom, Optimize dom dom)+ => Optimize (Error :|| Type) dom+ where+ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/FFI.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.FFI where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data FFI a+ where+ ForeignImport :: (Type (DenResult a))+ => String -> Denotation a -> FFI a++instance Semantic FFI+ where+ semantics (ForeignImport name f) = Sem name f++instance Equality FFI where equal = equalDefault; exprHash = exprHashDefault+instance Render FFI where renderArgs = renderArgsDefault+instance ToTree FFI+instance Eval FFI where evaluate = evaluateDefault+instance EvalBind FFI where evalBindSym = evalBindSymDefault+instance Sharable FFI++instance AlphaEq dom dom dom env => AlphaEq FFI FFI dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (FFI :|| Type)+ where+ sizeProp (C' s) = sizePropDefault s++instance ( (FFI :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (FFI :|| Type) dom+ where+ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Floating.hs view
@@ -0,0 +1,109 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Floating+ ( FLOATING (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data FLOATING a+ where+ Pi :: (Type a, Floating a) => FLOATING (Full a)+ Exp :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Sqrt :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Log :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Pow :: (Type a, Floating a) => FLOATING (a :-> a :-> Full a)+ LogBase :: (Type a, Floating a) => FLOATING (a :-> a :-> Full a)+ Sin :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Tan :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Cos :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Asin :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Atan :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Acos :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Sinh :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Tanh :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Cosh :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Asinh :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Atanh :: (Type a, Floating a) => FLOATING (a :-> Full a)+ Acosh :: (Type a, Floating a) => FLOATING (a :-> Full a)++instance Semantic FLOATING+ where+ semantics Pi = Sem "pi" Prelude.pi+ semantics Exp = Sem "exp" Prelude.exp+ semantics Sqrt = Sem "sqrt" Prelude.sqrt+ semantics Log = Sem "log" Prelude.log+ semantics Pow = Sem "(**)" (Prelude.**)+ semantics LogBase = Sem "logBase" Prelude.logBase+ semantics Sin = Sem "sin" Prelude.sin+ semantics Tan = Sem "tan" Prelude.tan+ semantics Cos = Sem "cos" Prelude.cos+ semantics Asin = Sem "asin" Prelude.asin+ semantics Atan = Sem "atan" Prelude.atan+ semantics Acos = Sem "acos" Prelude.acos+ semantics Sinh = Sem "sinh" Prelude.sinh+ semantics Tanh = Sem "tanh" Prelude.tanh+ semantics Cosh = Sem "cosh" Prelude.cosh+ semantics Asinh = Sem "asinh" Prelude.asinh+ semantics Atanh = Sem "atanh" Prelude.atanh+ semantics Acosh = Sem "acosh" Prelude.acosh++instance Equality FLOATING where equal = equalDefault; exprHash = exprHashDefault+instance Render FLOATING where renderArgs = renderArgsDefault+instance ToTree FLOATING+instance Eval FLOATING where evaluate = evaluateDefault+instance EvalBind FLOATING where evalBindSym = evalBindSymDefault+instance Sharable FLOATING++instance SizeProp (FLOATING :|| Type)+ where+ sizeProp (C' s) = sizePropDefault s++instance AlphaEq dom dom dom env => AlphaEq FLOATING FLOATING dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ( (FLOATING :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (FLOATING :|| Type) dom+ where+ constructFeatUnOpt a@(C' _) = constructFeatUnOptDefault a+
+ src/Feldspar/Core/Constructs/Fractional.hs view
@@ -0,0 +1,93 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Fractional+ ( FRACTIONAL (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Num++data FRACTIONAL a+ where+ DivFrac :: (Type a, Fractional a) => FRACTIONAL (a :-> a :-> Full a)++instance Semantic FRACTIONAL+ where+ semantics DivFrac = Sem "(/)" (/)++instance Equality FRACTIONAL where equal = equalDefault; exprHash = exprHashDefault+instance Render FRACTIONAL where renderArgs = renderArgsDefault+instance ToTree FRACTIONAL+instance Eval FRACTIONAL where evaluate = evaluateDefault+instance EvalBind FRACTIONAL where evalBindSym = evalBindSymDefault+instance Sharable FRACTIONAL++instance SizeProp (FRACTIONAL :|| Type)+ where+ sizeProp (C' s) = sizePropDefault s++instance AlphaEq dom dom dom env => AlphaEq FRACTIONAL FRACTIONAL dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ( (FRACTIONAL :|| Type) :<: dom+ , (NUM :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (FRACTIONAL :|| Type) dom+ where+ constructFeatOpt (C' DivFrac) (a :* b :* Nil)+ | Just 1 <- viewLiteral b = return a+ | alphaEq a b = return $ literalDecor 1++ constructFeatOpt (C' DivFrac) ((op :$ a :$ b) :* c :* Nil)+ | Just (C' Mul) <- prjF op+ , alphaEq b c+ = return a++ constructFeatOpt (C' DivFrac) ((op :$ a :$ b) :* c :* Nil)+ | Just (C' Mul) <- prjF op+ , alphaEq a c+ = return b++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Future.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Future where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Binding++data FUTURE a where+ MkFuture :: Type a => FUTURE (a :-> Full (FVal a))+ Await :: Type a => FUTURE (FVal a :-> Full a)++instance Semantic FUTURE+ where+ semantics MkFuture = Sem "future" FVal+ semantics Await = Sem "await" unFVal++instance Equality FUTURE where equal = equalDefault; exprHash = exprHashDefault+instance Render FUTURE where renderArgs = renderArgsDefault+instance ToTree FUTURE+instance Eval FUTURE where evaluate = evaluateDefault+instance EvalBind FUTURE where evalBindSym = evalBindSymDefault+instance Sharable FUTURE++instance AlphaEq dom dom dom env => AlphaEq FUTURE FUTURE dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (FUTURE :|| Type)+ where+ sizeProp (C' MkFuture) (WrapFull a :* Nil) = infoSize a+ sizeProp (C' Await) (WrapFull a :* Nil) = infoSize a++instance ( (FUTURE :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (FUTURE :|| Type) dom+ where+ constructFeatOpt (C' Await) ((op :$ a) :* Nil)+ | Just (C' MkFuture) <- prjF op+ = return a++ constructFeatOpt (C' MkFuture) ((op :$ a) :* Nil)+ | Just (C' Await) <- prjF op+ = return a++ constructFeatOpt feature args = constructFeatUnOpt feature args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Integral.hs view
@@ -0,0 +1,192 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Integral+ ( INTEGRAL (..)+ ) where++import Data.Bits++import Language.Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Condition++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Bits+import Feldspar.Core.Constructs.Eq+import Feldspar.Core.Constructs.Ord+import Feldspar.Core.Constructs.Num+import Feldspar.Core.Constructs.Logic++data INTEGRAL a+ where+ Quot :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)+ Rem :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)+ Div :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)+ Mod :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)+ Exp :: (Type a, BoundedInt a, Size a ~ Range a) => INTEGRAL (a :-> a :-> Full a)++instance Semantic INTEGRAL+ where+ semantics Quot = Sem "quot" quot+ semantics Rem = Sem "rem" rem+ semantics Div = Sem "div" div+ semantics Mod = Sem "mod" mod+ semantics Exp = Sem "(^)" (^)++instance Equality INTEGRAL where equal = equalDefault; exprHash = exprHashDefault+instance Render INTEGRAL where renderArgs = renderArgsDefault+instance ToTree INTEGRAL+instance Eval INTEGRAL where evaluate = evaluateDefault+instance EvalBind INTEGRAL where evalBindSym = evalBindSymDefault+instance Sharable INTEGRAL++instance AlphaEq dom dom dom env => AlphaEq INTEGRAL INTEGRAL dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (INTEGRAL :|| Type)+ where+ sizeProp (C' Quot) (WrapFull a :* WrapFull b :* Nil) = rangeQuot (infoSize a) (infoSize b)+ sizeProp (C' Rem) (WrapFull a :* WrapFull b :* Nil) = rangeRem (infoSize a) (infoSize b)+ sizeProp (C' Div) (WrapFull a :* WrapFull b :* Nil) = rangeDiv (infoSize a) (infoSize b)+ sizeProp (C' Mod) (WrapFull a :* WrapFull b :* Nil) = rangeMod (infoSize a) (infoSize b)+ sizeProp (C' Exp) (WrapFull a :* WrapFull b :* Nil) = rangeExp (infoSize a) (infoSize b)++instance+ ( (INTEGRAL :||Type) :<: dom+ , (BITS :||Type) :<: dom+ , (NUM :||Type) :<: dom+ , (EQ :||Type) :<: dom+ , (ORD :||Type) :<: dom+ , (Condition :||Type) :<: dom+ , (Logic :||Type) :<: dom+ , OptimizeSuper dom+ , Optimize (Condition :|| Type) dom+ ) =>+ Optimize (INTEGRAL :|| Type) dom+ where+ constructFeatOpt (C' Quot) (a :* b :* Nil)+ | Just 1 <- viewLiteral b = return a++ constructFeatOpt (C' Quot) (a :* b :* Nil)+ | Just b' <- viewLiteral b+ , b' > 0+ , isPowerOfTwo b'+ , let l = log2 b'+ , let lLit = literalDecor l+ = if isNatural $ infoSize $ getInfo a+ then constructFeat (c' ShiftR) (a :* lLit :* Nil)+ else do+ aIsNeg <- constructFeat (c' LTH) (a :* literalDecor 0 :* Nil)+ a' <- constructFeat (c' Add) (a :* literalDecor (2^l-1) :* Nil)+ negCase <- constructFeat (c' ShiftR) (a' :* lLit :* Nil)+ posCase <- constructFeat (c' ShiftR) (a :* lLit :* Nil)+ constructFeat (c' Condition)+ (aIsNeg :* negCase :* posCase :* Nil)+ -- TODO This rule should also fire when `b` is `2^l` but not a literal.+ -- TODO Make a case for `isNegative $ infoSize $ getInfo a`. Note that+ -- `isNegative /= (not . isNatural)`+ -- TODO Or maybe both `isNegative` and ``isPositive` are handled by the+ -- size-based optimization of `Condition`?++ constructFeatOpt (C' Rem) (a :* b :* Nil)+ | rangeLess sza szb+ , isNatural sza+ = return a+ where+ sza = infoSize $ getInfo a+ szb = infoSize $ getInfo b++ constructFeatOpt (C' Div) (a :* b :* Nil)+ | Just 1 <- viewLiteral b = return a++ constructFeatOpt (C' Div) (a :* b :* Nil)+ | Just b' <- viewLiteral b+ , b' > 0+ , isPowerOfTwo b'+ = constructFeat (c' ShiftR) (a :* literalDecor (log2 b') :* Nil)++ constructFeatOpt (C' Div) (a :* b :* Nil)+ | sameSign (infoSize (getInfo a)) (infoSize (getInfo b))+ = constructFeat (c' Quot) (a :* b :* Nil)++ constructFeatOpt (C' Mod) (a :* b :* Nil)+ | rangeLess sza szb+ , isNatural sza+ = return a+ where+ sza = infoSize $ getInfo a+ szb = infoSize $ getInfo b++ constructFeatOpt (C' Mod) (a :* b :* Nil)+ | sameSign (infoSize (getInfo a)) (infoSize (getInfo b))+ = constructFeat (c' Rem) (a :* b :* Nil)++ constructFeatOpt (C' Exp) (a :* b :* Nil)+ | Just 1 <- viewLiteral a = return $ literalDecor 1+ | Just 0 <- viewLiteral a = return $ literalDecor 0+ | Just 1 <- viewLiteral b = return a+ | Just 0 <- viewLiteral b = return $ literalDecor 1++ constructFeatOpt (C' Exp) (a :* b :* Nil)+ | Just (-1) <- viewLiteral a = do+ bLSB <- constructFeat (c' BAnd) (b :* literalDecor 1 :* Nil)+ bIsEven <- constructFeat (c' Equal) (bLSB :* literalDecor 0 :* Nil) -- TODO Use testBit? (remove EQ :<: dom and import)+ constructFeat (c' Condition)+ (bIsEven :* literalDecor 1 :* literalDecor (-1) :* Nil)++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x++-- Auxiliary functions++-- shouldn't be used for negative numbers+isPowerOfTwo :: (Num a, Bits a) => a -> Bool+isPowerOfTwo x = x .&. (x - 1) == 0 && (x /= 0)++log2 :: (BoundedInt a, Integral b) => a -> b+log2 v | v <= 1 = 0+log2 v = 1 + log2 (shiftR v 1)++sameSign :: BoundedInt a => Range a -> Range a -> Bool+sameSign ra rb+ = isNatural ra && isNatural rb+ || isNegative ra && isNegative rb+
+ src/Feldspar/Core/Constructs/Literal.hs view
@@ -0,0 +1,64 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Interpretation of basic syntactic constructs++module Feldspar.Core.Constructs.Literal+ ( module Language.Syntactic.Constructs.Literal+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Literal++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++import Data.Typeable+import Debug.Trace++instance Sharable Literal+ where+ sharable (Literal a) = typeRepTyCon (typeOf a) == typeRepTyCon (typeOf [()])++instance SizeProp (Literal :|| Type)+ where+ sizeProp lit@(C' (Literal a)) Nil = sizeOf a++instance ((Literal :|| Type) :<: dom, OptimizeSuper dom) =>+ Optimize (Literal :|| Type) dom+ where+ constructFeatUnOpt l@(C' _) = constructFeatUnOptDefault l+
+ src/Feldspar/Core/Constructs/Logic.hs view
@@ -0,0 +1,118 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Implementation of Logic constructs+--+module Feldspar.Core.Constructs.Logic+ ( Logic (..)+ ) where++++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Eq+import Feldspar.Core.Constructs.Ord+++-- | Logic constructs+data Logic a+ where+ And :: Logic (Bool :-> Bool :-> Full Bool)+ Or :: Logic (Bool :-> Bool :-> Full Bool)+ Not :: Logic (Bool :-> Full Bool)++instance Semantic Logic+ where+ semantics And = Sem "(&&)" (&&)+ semantics Or = Sem "(||)" (||)+ semantics Not = Sem "not" not++instance Equality Logic where equal = equalDefault; exprHash = exprHashDefault+instance Render Logic where renderArgs = renderArgsDefault+instance ToTree Logic+instance Eval Logic where evaluate = evaluateDefault+instance EvalBind Logic where evalBindSym = evalBindSymDefault+--instance SizeProp Logic where sizeProp = sizePropDefault+instance Sharable Logic++instance AlphaEq dom dom dom env => AlphaEq Logic Logic dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (Logic :|| Type)+ where+ sizeProp a@(C' _) args = sizePropDefault a args++instance ( (Logic :|| Type) :<: dom+ , (EQ :|| Type) :<: dom+ , (ORD :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (Logic :|| Type) dom+ where+ constructFeatOpt (C' And) (a :* b :* Nil)+ | Just True <- viewLiteral a = return b+ | Just False <- viewLiteral a = return a+ | Just True <- viewLiteral b = return a+ | Just False <- viewLiteral b = return b+ | a `alphaEq` b = return a++ constructFeatOpt (C' Or) (a :* b :* Nil)+ | Just True <- viewLiteral a = return a+ | Just False <- viewLiteral a = return b+ | Just True <- viewLiteral b = return b+ | Just False <- viewLiteral b = return a+ | a `alphaEq` b = return a++ constructFeatOpt (C' Not) ((op :$ a) :* Nil)+ | Just (C' Not) <- prjF op = return a++ constructFeatOpt (C' Not) ((op :$ a :$ b) :* Nil)+ | Just (C' Equal) <- prjF op = constructFeat (c' NotEqual) (a :* b :* Nil)+ | Just (C' NotEqual) <- prjF op = constructFeat (c' Equal) (a :* b :* Nil)+ | Just (C' LTH) <- prjF op = constructFeat (c' GTE) (a :* b :* Nil)+ | Just (C' GTH) <- prjF op = constructFeat (c' LTE) (a :* b :* Nil)+ | Just (C' LTE) <- prjF op = constructFeat (c' GTH) (a :* b :* Nil)+ | Just (C' GTE) <- prjF op = constructFeat (c' LTH) (a :* b :* Nil)++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Loop.hs view
@@ -0,0 +1,203 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Loop+where++import Data.Typeable++import Control.Monad (forM_, when)++import Language.Syntactic+import Language.Syntactic.Constructs.Binding hiding (betaReduce)+import Language.Syntactic.Constructs.Binding.HigherOrder (CLambda)++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Binding+import Feldspar.Core.Constructs.Literal++data LoopM m a+ where+ While :: (Size (m ()) ~ AnySize) => LoopM m (m Bool :-> m a :-> Full (m ()))+ For :: (Size (m ()) ~ AnySize) => LoopM m (Length :-> (Index -> m a) :-> Full (m ()))++data Loop a+ where+ ForLoop :: Type a => Loop (Length :-> a :-> (Index -> a -> a) :-> Full a)+ WhileLoop :: Type a => Loop (a :-> (a -> Bool) :-> (a -> a) :-> Full a)++instance Monad m => Semantic (LoopM m)+ where+ semantics While = Sem "while" while+ where+ while cond body = do+ c <- cond+ when c (body >> while cond body)+ semantics For = Sem "for" for+ where+ for 0 _ = return ()+ for l body = forM_ [0..l-1] body++instance Semantic Loop+ where+ semantics ForLoop = Sem "forLoop" forLoop+ where+ forLoop 0 initial _ = initial+ forLoop l initial body = foldl (flip body) initial [0..l-1]+ semantics WhileLoop = Sem "whileLoop" whileLoop+ where+ whileLoop initial cond body = go initial+ where+ go st | cond st = go $ body st+ | otherwise = st++instance Monad m => Equality (LoopM m) where equal = equalDefault; exprHash = exprHashDefault+instance Monad m => Render (LoopM m) where renderArgs = renderArgsDefault+instance Monad m => ToTree (LoopM m)+instance Monad m => Eval (LoopM m) where evaluate = evaluateDefault+instance Monad m => EvalBind (LoopM m) where evalBindSym = evalBindSymDefault+instance Sharable (LoopM m)+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance Equality Loop where equal = equalDefault; exprHash = exprHashDefault+instance Render Loop where renderArgs = renderArgsDefault+instance ToTree Loop+instance Eval Loop where evaluate = evaluateDefault+instance EvalBind Loop where evalBindSym = evalBindSymDefault+instance Sharable Loop++instance (AlphaEq dom dom dom env, Monad m) =>+ AlphaEq (LoopM m) (LoopM m) dom env+ where+ alphaEqSym = alphaEqSymDefault++instance AlphaEq dom dom dom env => AlphaEq Loop Loop dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (LoopM m)+ where+ sizeProp While _ = AnySize+ sizeProp For _ = AnySize++instance SizeProp (Loop :|| Type)+ where+ sizeProp (C' ForLoop) (_ :* _ :* WrapFull step :* Nil) = infoSize step+ sizeProp (C' WhileLoop) (_ :* _ :* WrapFull step :* Nil) = infoSize step+++instance ( MonadType m+ , LoopM m :<: dom+ , CLambda Type :<: dom+ , Optimize dom dom+ )+ => Optimize (LoopM m) dom+ where+ optimizeFeat for@For (len :* step :* Nil) = do+ len' <- optimizeM len+ let szI = infoSize (getInfo len')+ ixRange = rangeByRange 0 (szI-1)+ step' <- optimizeFunction optimizeM (mkInfo ixRange) step+ case getInfo step' of+ Info{} -> constructFeat for (len' :* step' :* Nil)++ optimizeFeat a args = optimizeFeatDefault a args++ constructFeatUnOpt While args = constructFeatUnOptDefaultTyp voidTypeRep While args+ constructFeatUnOpt For args = constructFeatUnOptDefaultTyp voidTypeRep For args++instance ( (Literal :|| Type) :<: dom+ , (Loop :|| Type) :<: dom+ , (Variable :|| Type) :<: dom+ , CLambda Type :<: dom+ , OptimizeSuper dom+ )+ => Optimize (Loop :|| Type) dom+ where+ optimizeFeat sym@(C' ForLoop) (len :* initial :* step :* Nil) = do+ len' <- optimizeM len+ init' <- optimizeM initial+ let szI = infoSize (getInfo len')+ ixRange = Range 0 (upperBound szI-1)+ step' <- optimizeFunction+ (optimizeFunction optimizeM (mkInfoTy typeRep))+ -- (optimizeFunctionFix optimizeM (getInfo init'))+ -- TODO The above optimization is unsound, as shown by the following+ -- program:+ --+ -- drawAST $ fold max (value minBound) -:: tVec1 tWordN >-> id+ (mkInfo ixRange)+ step+ constructFeat sym (len' :* init' :* step' :* Nil)++ optimizeFeat sym@(C' WhileLoop) (initial :* cond :* body :* Nil) = do+ init' <- optimizeM initial+ body' <- optimizeFunction optimizeM (mkInfoTy typeRep) body+ -- body' <- optimizeFunctionFix optimizeM info body+ -- TODO See comment above++ let info = getInfo init'+ let info' = info { infoSize = infoSize (getInfo body') }+ cond' <- optimizeFunction optimizeM info' cond+ constructFeat sym (init' :* cond' :* body' :* Nil)++{-+ constructFeatOpt (C' ForLoop) (len :* initial :* step :* Nil)+ | Just 0 <- viewLiteral len = return initial+ | Just 1 <- viewLiteral len = do+ let init' = stripDecor initial+ step' = stripDecor step+ optimizeM $ betaReduce init' $ betaReduce (appSym (c' (Literal 0))) step'+ -- TODO add an optional unroll limit?++ -- ForLoop len init (const id) ==> init+ constructFeatOpt (C' ForLoop) (_ :* initial :* step :* Nil)+ | alphaEq step' (fun `asTypeOf` step') = optimizeM $ stripDecor initial+ where+ step' = stripDecor step+ fun = appSym (Lambda 0) $ appSym (Lambda 1) $ appSym (Variable 1)+-}++ -- TODO ForLoop len init (flip (const f)) ==> step (len - 1) init+ -- This optimization requires that the len > 0++ constructFeatOpt feat args = constructFeatUnOpt feat args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Mutable.hs view
@@ -0,0 +1,167 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Mutable+ ( module Feldspar.Core.Constructs.Mutable+ , module Language.Syntactic.Constructs.Monad+ )+where++import Data.Map+import Data.Typeable+import System.IO.Unsafe++import Language.Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Binding.HigherOrder+import Language.Syntactic.Constructs.Monad++import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Binding++data Mutable a+ where+ Run :: Type a => Mutable (Mut a :-> Full a)++instance Semantic Mutable+ where+ semantics Run = Sem "runMutable" unsafePerformIO++instance Equality Mutable where equal = equalDefault; exprHash = exprHashDefault+instance Render Mutable where renderArgs = renderArgsDefault+instance ToTree Mutable+instance Eval Mutable where evaluate = evaluateDefault+instance EvalBind Mutable where evalBindSym = evalBindSymDefault+instance Sharable Mutable++instance Typed Mutable+ where+ typeDictSym Run = Just Dict++instance AlphaEq dom dom dom env => AlphaEq Mutable Mutable dom env+ where+ alphaEqSym = alphaEqSymDefault++instance Sharable (MONAD Mut)++instance SizeProp (MONAD Mut)+ where+ sizeProp Return (WrapFull a :* Nil) = infoSize a+ sizeProp Bind (_ :* WrapFull f :* Nil) = infoSize f+ sizeProp Then (_ :* WrapFull b :* Nil) = infoSize b+ sizeProp When _ = AnySize++instance SizeProp Mutable+ where+ sizeProp Run (WrapFull a :* Nil) = infoSize a++monadProxy :: P Mut+monadProxy = P++instance ( MONAD Mut :<: dom+ , (Variable :|| Type) :<: dom+ , CLambda Type :<: dom+ , OptimizeSuper dom)+ => Optimize (MONAD Mut) dom+ where+ optimizeFeat bnd@Bind (ma :* f :* Nil) = do+ ma' <- optimizeM ma+ case getInfo ma' of+ Info (MutType ty) sz vs src -> do+ f' <- optimizeFunction optimizeM (Info ty sz vs src) f+ case getInfo f' of+ Info{} -> constructFeat bnd (ma' :* f' :* Nil)++ optimizeFeat a args = optimizeFeatDefault a args++ constructFeatOpt Bind (ma :* (lam :$ (Sym (Decor _ ret) :$ var)) :* Nil)+ | Just (SubConstr2 (Lambda v1)) <- prjLambda lam+ , Just Return <- prjMonad monadProxy ret+ , Just (C' (Variable v2)) <- prjF var+ , v1 == v2+ , Just ma' <- gcast ma+ = return ma'++ constructFeatOpt Bind (ma :* (lam :$ body) :* Nil)+ | Just (SubConstr2 (Lambda v)) <- prjLambda lam+ , v `notMember` vars+ = constructFeat Then (ma :* body :* Nil)+ where+ vars = infoVars $ getInfo body++ -- return x >> mb ==> mb+ constructFeatOpt Then ((Sym (Decor _ ret) :$ _) :* mb :* Nil)+ | Just Return <- prjMonad monadProxy ret+ = return mb++ -- ma >> return () ==> ma+ constructFeatOpt Then (ma :* (Sym (Decor info ret) :$ u) :* Nil)+ | Just Return <- prjMonad monadProxy ret+ , Just TypeEq <- typeEq (infoType $ getInfo ma) (MutType UnitType)+ , Just TypeEq <- typeEq (infoType info) (MutType UnitType)+ , Just () <- viewLiteral u+ = return ma++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt Return args@(a :* Nil)+ | Info {infoType = t} <- getInfo a+ = constructFeatUnOptDefaultTyp (MutType t) Return args++ constructFeatUnOpt Bind args@(_ :* f :* Nil)+ | Info {infoType = FunType _ t} <- getInfo f+ = constructFeatUnOptDefaultTyp t Bind args+ -- TODO The match on `FunType` is total with the current definition of+ -- `TypeRep`, but there's no guarantee this will remain true in the+ -- future. One way around that would be to match `f` against+ -- `Lambda`, but that is also a partial match (at least possibly, in+ -- the future). Another option would be to add a context parameter to+ -- `MONAD` to be able to add the constraint `Type a`.++ constructFeatUnOpt Then args@(_ :* mb :* Nil)+ | Info {infoType = t} <- getInfo mb+ = constructFeatUnOptDefaultTyp t Then args++ constructFeatUnOpt When args =+ constructFeatUnOptDefaultTyp voidTypeRep When args++instance (Mutable :<: dom, OptimizeSuper dom) => Optimize Mutable dom+ where+ constructFeatUnOpt Run args = constructFeatUnOptDefault Run args+
+ src/Feldspar/Core/Constructs/MutableArray.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.MutableArray+where++import Control.Monad+import Data.Array.IO++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data MutableArray a+ where+ NewArr :: Type a => MutableArray (Length :-> a :-> Full (Mut (MArr a)))+ NewArr_ :: Type a => MutableArray (Length :-> Full (Mut (MArr a)))+ GetArr :: Type a => MutableArray (MArr a :-> Index :-> Full (Mut a))+ SetArr :: MutableArray (MArr a :-> Index :-> a :-> Full (Mut ()))+ ArrLength :: MutableArray (MArr a :-> Full (Mut Length))+ -- TODO Should be pure?++instance Semantic MutableArray+ where+ semantics NewArr = Sem "newMArr" (\l -> newArray (0,l-1))+ semantics NewArr_ = Sem "newMArr_" (\l -> newArray_ (0,l-1))+ semantics GetArr = Sem "getMArr" readArray+ semantics SetArr = Sem "setMArr" writeArray+ semantics ArrLength = Sem "arrLength" (getBounds >=> \(l,u) -> return (u-l+1))++instance Equality MutableArray where equal = equalDefault; exprHash = exprHashDefault+instance Render MutableArray where renderArgs = renderArgsDefault+instance ToTree MutableArray+instance Eval MutableArray where evaluate = evaluateDefault+instance EvalBind MutableArray where evalBindSym = evalBindSymDefault+instance Sharable MutableArray+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance AlphaEq dom dom dom env => AlphaEq MutableArray MutableArray dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp MutableArray+ where+ sizeProp NewArr (WrapFull len :* _ :* Nil) = infoSize len :> universal+ sizeProp NewArr_ (WrapFull len :* Nil) = infoSize len :> universal+ sizeProp GetArr _ = universal+ sizeProp SetArr _ = universal+ sizeProp ArrLength (WrapFull arr :* Nil) = len+ where+ len :> _ = infoSize arr++instance (MutableArray :<: dom, Optimize dom dom) => Optimize MutableArray dom+ where+ constructFeatUnOpt NewArr args = constructFeatUnOptDefaultTyp (MutType $ MArrType typeRep) NewArr args+ constructFeatUnOpt NewArr_ args = constructFeatUnOptDefaultTyp (MutType $ MArrType typeRep) NewArr_ args+ constructFeatUnOpt GetArr args = constructFeatUnOptDefaultTyp (MutType typeRep) GetArr args+ constructFeatUnOpt SetArr args = constructFeatUnOptDefaultTyp (MutType typeRep) SetArr args+ constructFeatUnOpt ArrLength args = constructFeatUnOptDefaultTyp (MutType typeRep) ArrLength args+
+ src/Feldspar/Core/Constructs/MutableReference.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.MutableReference+where++import Data.IORef++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data MutableReference a+ where+ NewRef :: Type a => MutableReference (a :-> Full (Mut (IORef a)))+ GetRef :: Type a => MutableReference (IORef a :-> Full (Mut a))+ SetRef :: Type a => MutableReference (IORef a :-> a :-> Full (Mut ()))++instance Semantic MutableReference+ where+ semantics NewRef = Sem "newRef" newIORef+ semantics GetRef = Sem "getRef" readIORef+ semantics SetRef = Sem "setRef" writeIORef++instance Equality MutableReference where equal = equalDefault; exprHash = exprHashDefault+instance Render MutableReference where renderArgs = renderArgsDefault+instance ToTree MutableReference+instance Eval MutableReference where evaluate = evaluateDefault+instance EvalBind MutableReference where evalBindSym = evalBindSymDefault+instance Sharable MutableReference+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance AlphaEq dom dom dom env =>+ AlphaEq MutableReference MutableReference dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp MutableReference+ where+ sizeProp NewRef _ = universal+ sizeProp GetRef _ = universal+ sizeProp SetRef _ = universal++instance (MutableReference :<: dom, Optimize dom dom) =>+ Optimize MutableReference dom+ where+ constructFeatUnOpt NewRef args = constructFeatUnOptDefaultTyp (MutType $ RefType typeRep) NewRef args+ constructFeatUnOpt GetRef args = constructFeatUnOptDefaultTyp (MutType typeRep) GetRef args+ constructFeatUnOpt SetRef args = constructFeatUnOptDefaultTyp (MutType typeRep) SetRef args+
+ src/Feldspar/Core/Constructs/MutableToPure.hs view
@@ -0,0 +1,108 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}+{-# LANGUAGE CPP #-}++module Feldspar.Core.Constructs.MutableToPure+ ( MutableToPure (..)+ ) where++import qualified Control.Exception as C+import Data.Array.IArray+#if __GLASGOW_HASKELL__>=704+import Data.Array.MArray (freeze)+import Data.Array.Unsafe (unsafeFreeze)+#else+import Data.Array.MArray (freeze, unsafeFreeze)+#endif+import System.IO.Unsafe++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data MutableToPure a where+ RunMutableArray :: Type a => MutableToPure (Mut (MArr a) :-> Full [a])+ WithArray :: Type b => MutableToPure (MArr a :-> ([a] -> Mut b) :-> Full (Mut b))++instance Semantic MutableToPure+ where+ semantics RunMutableArray = Sem "runMutableArray" runMutableArrayEval+ semantics WithArray = Sem "withArray" withArrayEval++runMutableArrayEval :: forall a . Mut (MArr a) -> [a]+runMutableArrayEval m = unsafePerformIO $+ do marr <- m+ iarr <- unsafeFreeze marr+ return (elems (iarr :: Array WordN a))++withArrayEval :: forall a b. MArr a -> ([a] -> Mut b) -> Mut b+withArrayEval ma f+ = do a <- f (elems (unsafePerformIO $ freeze ma :: Array WordN a))+ C.evaluate a++instance Equality MutableToPure where equal = equalDefault; exprHash = exprHashDefault+instance Render MutableToPure where renderArgs = renderArgsDefault+instance ToTree MutableToPure+instance Eval MutableToPure where evaluate = evaluateDefault+instance EvalBind MutableToPure where evalBindSym = evalBindSymDefault+instance Sharable MutableToPure++instance Typed MutableToPure+ where+ typeDictSym RunMutableArray = Just Dict+ typeDictSym _ = Nothing+++instance AlphaEq dom dom dom env => AlphaEq MutableToPure MutableToPure dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp MutableToPure+ where+ sizeProp RunMutableArray _ = universal+ sizeProp WithArray _ = universal++instance (MutableToPure :<: dom, Optimize dom dom) => Optimize MutableToPure dom+ where+ constructFeatUnOpt RunMutableArray args = constructFeatUnOptDefaultTyp typeRep RunMutableArray args+ constructFeatUnOpt WithArray args = constructFeatUnOptDefaultTyp (MutType typeRep) WithArray args+
+ src/Feldspar/Core/Constructs/NoInline.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.NoInline where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data NoInline a+ where+ NoInline :: (Type a) => NoInline (a :-> Full a)++instance Semantic NoInline+ where+ semantics NoInline = Sem "NoInline" id++instance Equality NoInline where equal = equalDefault; exprHash = exprHashDefault+instance Render NoInline where renderArgs = renderArgsDefault+instance ToTree NoInline+instance Eval NoInline where evaluate = evaluateDefault+instance EvalBind NoInline where evalBindSym = evalBindSymDefault+instance Sharable NoInline++instance SizeProp (NoInline :|| Type)+ where+ sizeProp (C' s) = sizePropDefault s++instance AlphaEq dom dom dom env => AlphaEq NoInline NoInline dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ( (NoInline :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (NoInline :|| Type) dom+ where+ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Num.hs view
@@ -0,0 +1,202 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Num+ ( NUM (..)+ ) where++++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Literal+++data NUM a+ where+ Abs :: (Type a, Num a, Num (Size a)) => NUM (a :-> Full a)+ Sign :: (Type a, Num a, Num (Size a)) => NUM (a :-> Full a)+ Add :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)+ Sub :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)+ Mul :: (Type a, Num a, Num (Size a)) => NUM (a :-> a :-> Full a)++instance Semantic NUM+ where+ semantics Abs = Sem "abs" abs+ semantics Sign = Sem "signum" signum+ semantics Add = Sem "(+)" (+)+ semantics Sub = Sem "(-)" (-)+ semantics Mul = Sem "(*)" (*)++instance Equality NUM where equal = equalDefault; exprHash = exprHashDefault+instance Render NUM where renderArgs = renderArgsDefault+instance ToTree NUM+instance Eval NUM where evaluate = evaluateDefault+instance EvalBind NUM where evalBindSym = evalBindSymDefault+instance Sharable NUM++instance AlphaEq dom dom dom env => AlphaEq NUM NUM dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (NUM :|| Type)+ where+ sizeProp (C' Abs) (WrapFull a :* Nil) = abs (infoSize a)+ sizeProp (C' Sign) (WrapFull a :* Nil) = signum (infoSize a)+ sizeProp (C' Add) (WrapFull a :* WrapFull b :* Nil) = infoSize a + infoSize b+ sizeProp (C' Sub) (WrapFull a :* WrapFull b :* Nil) = infoSize a - infoSize b+ sizeProp (C' Mul) (WrapFull a :* WrapFull b :* Nil) = infoSize a * infoSize b+++instance ( (NUM :|| Type) :<: dom+ , (Literal :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (NUM :|| Type) dom+ where+ constructFeatOpt (C' Abs) (a :* Nil)+ | RangeSet r <- infoRange (getInfo a)+ , isNatural r+ = return a++ constructFeatOpt (C' Sign) (a :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , 0 `rangeLess` ra+ = return (literalDecor 1)++ constructFeatOpt (C' Sign) (a :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , ra `rangeLess` 0+ = return (literalDecor (-1))++ constructFeatOpt (C' Add) (a :* b :* Nil)+ | Just 0 <- viewLiteral b = return a+ | Just 0 <- viewLiteral a = return b+ | alphaEq a b = constructFeatOpt (c' Mul) (a :* literalDecor 2 :* Nil)++ constructFeatOpt s@(C' Add) (a :* (op :$ b :$ c) :* Nil)+ | Just a' <- viewLiteral a+ , Just (C' Add) <- prjF op+ , Just c' <- viewLiteral c+ = constructFeat s (b :* literalDecor (a'+c') :* Nil)++ constructFeatOpt s@(C' Add) (a :* (op :$ b :$ c) :* Nil)+ | Just a' <- viewLiteral a+ , Just (C' Sub) <- prjF op+ , Just c' <- viewLiteral c+ = constructFeat s (b :* literalDecor (a'-c') :* Nil)++ constructFeatOpt s@(C' Add) ((op :$ a :$ b) :* c :* Nil)+ | Just c' <- viewLiteral c+ , Just (C' Add) <- prjF op+ , Just b' <- viewLiteral b+ = constructFeat s (a :* literalDecor (b'+c') :* Nil)++ constructFeatOpt s@(C' Add) ((op :$ a :$ b) :* c :* Nil)+ | Just c' <- viewLiteral c+ , Just (C' Sub) <- prjF op+ , Just b' <- viewLiteral b+ = constructFeat s (a :* literalDecor (c'-b') :* Nil)++ constructFeatOpt (C' Add) ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)+ | Just (C' Add) <- prjF op1+ , Just (C' Add) <- prjF op2+ , Just b' <- viewLiteral b+ , Just d' <- viewLiteral d+ = do+ ac <- constructFeat (c' Add) (a :* c :* Nil)+ constructFeat (c' Add) (ac :* literalDecor (b'+d') :* Nil)++ constructFeatOpt (C' Add) ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)+ | Just (C' Add) <- prjF op1+ , Just (C' Sub) <- prjF op2+ , alphaEq a c+ , alphaEq b d+ = constructFeat (c' Add) (a :* c :* Nil)++ constructFeatOpt (C' Sub) ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)+ | Just (C' Add) <- prjF op1+ , Just (C' Sub) <- prjF op2+ , alphaEq a c+ , alphaEq b d+ = constructFeat (c' Add) (b :* d :* Nil)++ constructFeatOpt (C' Sub) (a :* b :* Nil)+ | Just 0 <- viewLiteral b = return a+ | alphaEq a b = return $ literalDecor 0++ constructFeatOpt (C' Mul) (a :* b :* Nil)+ | Just 0 <- viewLiteral a = return a+ | Just 1 <- viewLiteral a = return b+ | Just 0 <- viewLiteral b = return b+ | Just 1 <- viewLiteral b = return a++ constructFeatOpt s@(C' Mul) (a :* (op :$ b :$ c) :* Nil)+ | Just a' <- viewLiteral a+ , Just (C' Mul) <- prjF op+ , Just c' <- viewLiteral c+ = constructFeat s (b :* literalDecor (a'*c') :* Nil)++ constructFeatOpt s@(C' Mul) ((op :$ a :$ b) :* c :* Nil)+ | Just c' <- viewLiteral c+ , Just (C' Mul) <- prjF op+ , Just b' <- viewLiteral b+ = constructFeat s (a :* literalDecor (b'*c') :* Nil)++ constructFeatOpt (C' Mul) ((op1 :$ a :$ b) :* (op2 :$ c :$ d) :* Nil)+ | Just (C' Mul) <- prjF op1+ , Just (C' Mul) <- prjF op2+ , Just b' <- viewLiteral b+ , Just d' <- viewLiteral d+ = do+ ac <- constructFeat (c' Mul) (a :* c :* Nil)+ constructFeat (c' Mul) (ac :* literalDecor (b'*d') :* Nil)++ -- Cases to make sure literals end up to the right:+ constructFeatOpt (C' Add) (a :* b :* Nil)+ | Just _ <- viewLiteral a = constructFeatUnOpt (c' Add) (b :* a :* Nil)++ constructFeatOpt (C' Mul) (a :* b :* Nil)+ | Just _ <- viewLiteral a = constructFeatUnOpt (c' Mul) (b :* a :* Nil)++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x
+ src/Feldspar/Core/Constructs/Ord.hs view
@@ -0,0 +1,187 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Implementation of ordering constructs++module Feldspar.Core.Constructs.Ord+ ( ORD (..)+ ) where++++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+++-- | Ordering constructs+data ORD a+ where+ LTH :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)+ GTH :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)+ LTE :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)+ GTE :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full Bool)+ Min :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full a)+ Max :: (Type a, Ord a, Ord (Size a)) => ORD (a :-> a :-> Full a)++instance Semantic ORD+ where+ semantics LTH = Sem "(<)" (<)+ semantics GTH = Sem "(>)" (>)+ semantics LTE = Sem "(<=)" (<=)+ semantics GTE = Sem "(>=)" (>=)+ semantics Min = Sem "min" min+ semantics Max = Sem "max" max++instance Equality ORD where equal = equalDefault; exprHash = exprHashDefault+instance Render ORD where renderArgs = renderArgsDefault+instance ToTree ORD+instance Eval ORD where evaluate = evaluateDefault+instance EvalBind ORD where evalBindSym = evalBindSymDefault+instance Sharable ORD++instance AlphaEq dom dom dom env => AlphaEq ORD ORD dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (ORD :|| Type)+ where+ sizeProp (C' Min) (WrapFull a :* WrapFull b :* Nil) = min (infoSize a) (infoSize b)+ sizeProp (C' Max) (WrapFull a :* WrapFull b :* Nil) = max (infoSize a) (infoSize b)+ sizeProp a@(C' _) args = sizePropDefault a args+++instance ( (ORD :|| Type) :<: dom+ , OptimizeSuper dom+ )+ => Optimize (ORD :|| Type) dom+ where+ constructFeatOpt (C' LTH) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLess` rb+ = return (literalDecor True)++ constructFeatOpt (C' LTH) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLessEq` ra+ = return (literalDecor False)++ constructFeatOpt (C' GTH) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLess` ra+ = return (literalDecor True)++ constructFeatOpt (C' GTH) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLessEq` rb+ = return (literalDecor False)++ constructFeatOpt (C' LTE) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLessEq` rb+ = return (literalDecor True)++ constructFeatOpt (C' LTE) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLess` ra+ = return (literalDecor False)++ constructFeatOpt (C' LTE) (a :* b :* Nil)+ | alphaEq a b+ = return $ literalDecor True++ constructFeatOpt (C' GTE) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLessEq` ra+ = return (literalDecor True)++ constructFeatOpt (C' GTE) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLess` rb+ = return (literalDecor False)++ constructFeatOpt (C' GTE) (a :* b :* Nil)+ | alphaEq a b+ = return $ literalDecor True++ constructFeatOpt (C' Min) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLessEq` rb+ = return a++ constructFeatOpt (C' Min) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLessEq` ra+ = return b++ constructFeatOpt (C' Min) (a :* b :* Nil)+ | alphaEq a b+ = return a++ constructFeatOpt (C' Max) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , ra `rangeLessEq` rb+ = return b++ constructFeatOpt (C' Max) (a :* b :* Nil)+ | RangeSet ra <- infoRange (getInfo a)+ , RangeSet rb <- infoRange (getInfo b)+ , rb `rangeLessEq` ra+ = return a++ constructFeatOpt (C' Max) (a :* b :* Nil)+ | alphaEq a b+ = return a++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Par.hs view
@@ -0,0 +1,188 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Par where++import Language.Syntactic+import Language.Syntactic.Constructs.Monad+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Binding.HigherOrder++import qualified Control.Monad.Par as CMP+import Control.Monad.Par.Scheds.TraceInternal (yield)++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation+import Feldspar.Core.Constructs.Binding++import Data.Map+import Data.Typeable++data ParFeature a+ where+ ParRun :: Type a => ParFeature (Par a :-> Full a)+ ParNew :: Type a => ParFeature (Full (Par (IV a)))+ ParGet :: Type a => ParFeature (IV a :-> Full (Par a))+ ParPut :: Type a => ParFeature (IV a :-> a :-> Full (Par ()))+ ParFork :: ParFeature (Par () :-> Full (Par ()))+ ParYield :: ParFeature (Full (Par ()))++instance Semantic ParFeature+ where+ semantics ParRun = Sem "runPar" CMP.runPar+ semantics ParNew = Sem "new" CMP.new+ semantics ParGet = Sem "get" CMP.get+ semantics ParPut = Sem "put" CMP.put_+ semantics ParFork = Sem "fork" CMP.fork+ semantics ParYield = Sem "yield" yield++instance Equality ParFeature where equal = equalDefault; exprHash = exprHashDefault+instance Render ParFeature where renderArgs = renderArgsDefault+instance ToTree ParFeature+instance Eval ParFeature where evaluate = evaluateDefault+instance EvalBind ParFeature where evalBindSym = evalBindSymDefault+instance Sharable ParFeature+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance AlphaEq dom dom dom env => AlphaEq ParFeature ParFeature dom env+ where+ alphaEqSym = alphaEqSymDefault++instance Sharable (MONAD Par)+ -- Will not be shared anyway, because 'maybeWitnessSat' returns 'Nothing'++instance SizeProp ParFeature+ where+ sizeProp ParRun (WrapFull a :* Nil) = infoSize a+ sizeProp ParNew _ = universal+ sizeProp ParGet _ = universal+ sizeProp ParPut _ = universal+ sizeProp ParFork _ = universal+ sizeProp ParYield _ = universal++instance ( MONAD Par :<: dom+ , ParFeature :<: dom+ , Optimize dom dom+ )+ => Optimize ParFeature dom+ where+ constructFeatUnOpt ParRun args = constructFeatUnOptDefault ParRun args+ constructFeatUnOpt ParNew args = constructFeatUnOptDefaultTyp (ParType $ IVarType typeRep) ParNew args+ constructFeatUnOpt ParGet args = constructFeatUnOptDefaultTyp (ParType typeRep) ParGet args+ constructFeatUnOpt ParPut args = constructFeatUnOptDefaultTyp (ParType typeRep) ParPut args+ constructFeatUnOpt ParFork args = constructFeatUnOptDefaultTyp (ParType typeRep) ParFork args+ constructFeatUnOpt ParYield args = constructFeatUnOptDefaultTyp (ParType typeRep) ParYield args++monadProxy :: P Par+monadProxy = P++instance SizeProp (MONAD Par)+ where+ sizeProp Return (WrapFull a :* Nil) = infoSize a+ sizeProp Bind (_ :* WrapFull f :* Nil) = infoSize f+ sizeProp Then (_ :* WrapFull b :* Nil) = infoSize b+ sizeProp When _ = AnySize++instance ( MONAD Par :<: dom+ , (Variable :|| Type) :<: dom+ , CLambda Type :<: dom+ , OptimizeSuper dom+ )+ => Optimize (MONAD Par) dom+ where+ optimizeFeat bnd@Bind (ma :* f :* Nil) = do+ ma' <- optimizeM ma+ case getInfo ma' of+ Info (ParType ty) sz vs src -> do+ f' <- optimizeFunction optimizeM (Info ty sz vs src) f+ case getInfo f' of+ Info{} -> constructFeat bnd (ma' :* f' :* Nil)++ optimizeFeat a args = optimizeFeatDefault a args++ constructFeatOpt Bind (ma :* (lam :$ (Sym (Decor _ ret) :$ var)) :* Nil)+ | Just (SubConstr2 (Lambda v1)) <- prjLambda lam+ , Just Return <- prjMonad monadProxy ret+ , Just (C' (Variable v2)) <- prjF var+ , v1 == v2+ , Just ma' <- gcast ma+ = return ma'++ constructFeatOpt Bind (ma :* (lam :$ body) :* Nil)+ | Just (SubConstr2 (Lambda v)) <- prjLambda lam+ , v `notMember` vars+ = constructFeat Then (ma :* body :* Nil)+ where+ vars = infoVars $ getInfo body++ -- return x >> mb ==> mb+ constructFeatOpt Then ((Sym (Decor _ ret) :$ _) :* mb :* Nil)+ | Just Return <- prjMonad monadProxy ret+ = return mb++ -- ma >> return () ==> ma+ constructFeatOpt Then (ma :* (Sym (Decor info ret) :$ u) :* Nil)+ | Just Return <- prjMonad monadProxy ret+ , Just TypeEq <- typeEq (infoType $ getInfo ma) (ParType UnitType)+ , Just TypeEq <- typeEq (infoType info) (ParType UnitType)+ , Just () <- viewLiteral u+ = return ma++ constructFeatOpt a args = constructFeatUnOpt a args++ constructFeatUnOpt Return args@(a :* Nil)+ | Info {infoType = t} <- getInfo a+ = constructFeatUnOptDefaultTyp (ParType t) Return args++ constructFeatUnOpt Bind args@(_ :* f :* Nil)+ | Info {infoType = FunType _ t} <- getInfo f+ = constructFeatUnOptDefaultTyp t Bind args+ -- TODO The match on `FunType` is total with the current definition of+ -- `TypeRep`, but there's no guarantee this will remain true in the+ -- future. One way around that would be to match `f` against+ -- `Lambda`, but that is also a partial match (at least possibly, in+ -- the future). Another option would be to add a context parameter to+ -- `MONAD` to be able to add the constraint `Type a`.++ constructFeatUnOpt Then args@(_ :* mb :* Nil)+ | Info {infoType = t} <- getInfo mb+ = constructFeatUnOptDefaultTyp t Then args++ constructFeatUnOpt When args =+ constructFeatUnOptDefaultTyp voidTypeRep When args+
+ src/Feldspar/Core/Constructs/Save.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Save where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data Save a+ where+ Save :: Type a => Save (a :-> Full a)++instance Semantic Save+ where+ semantics Save = Sem "save" id++instance Equality Save where equal = equalDefault; exprHash = exprHashDefault+instance Render Save where renderArgs = renderArgsDefault+instance ToTree Save+instance Eval Save where evaluate = evaluateDefault+instance EvalBind Save where evalBindSym = evalBindSymDefault+instance Sharable Save++instance AlphaEq dom dom dom env => AlphaEq Save Save dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (Save :|| Type)+ where+ sizeProp (C' Save) (WrapFull a :* Nil) = infoSize a++instance ( (Save :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (Save :|| Type) dom+ where+ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/SizeProp.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.SizeProp where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation++data PropSize a+ where+ PropSize :: (Type a, Type b) =>+ (Size a -> Size b) -> PropSize (a :-> b :-> Full b)++instance Semantic PropSize+ where+ semantics (PropSize _) = Sem "propSize" (const id)++instance Equality PropSize where equal = equalDefault; exprHash = exprHashDefault+instance Render PropSize where renderArgs = renderArgsDefault+instance ToTree PropSize+instance Eval PropSize where evaluate = evaluateDefault+instance EvalBind PropSize where evalBindSym = evalBindSymDefault+instance Sharable PropSize++instance SizeProp (PropSize :|| Type)+ where+ sizeProp (C' (PropSize prop)) (WrapFull a :* WrapFull b :* Nil) =+ prop (infoSize a) /\ infoSize b++instance AlphaEq dom dom dom env => AlphaEq PropSize PropSize dom env+ where+ alphaEqSym = alphaEqSymDefault++instance ( (PropSize :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (PropSize :|| Type) dom+ where+ constructFeatOpt (C' (PropSize prop)) (a :* b :* Nil) =+ return $ updateDecor (f (prop (infoSize $ getInfo a))) b+ where+ f :: Lattice (Size b) => Size b -> Info b -> Info b+ f newSize info = info {infoSize = infoSize info /\ newSize}++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/SourceInfo.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.SourceInfo+ ( module Language.Syntactic.Constructs.Identity+ , module Language.Syntactic.Constructs.Decoration+ , SourceInfo1 (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Decoration+import Language.Syntactic.Constructs.Identity++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++-- | Kind @* -> *@ version of 'SourceInfo'+data SourceInfo1 a = SourceInfo1 SourceInfo++{-+instance AlphaEq dom dom dom env =>+ AlphaEq+ (Decor SourceInfo1 Identity)+ (Decor SourceInfo1 Identity)+ dom+ env+ where+ alphaEqSym = alphaEqSymDefault+-}++instance Sharable (Decor SourceInfo1 Identity)+ where+ sharable _ = True++instance SizeProp Identity+ where+ sizeProp Id (WrapFull a :* Nil) = infoSize a++instance SizeProp ((Decor SourceInfo1 Identity) :|| Type)+ where+ sizeProp (C' a) = sizeProp $ decorExpr a++instance ((Decor SourceInfo1 Identity :|| Type) :<: dom, Optimize dom dom) =>+ Optimize ((Decor SourceInfo1 Identity) :|| Type) dom+ where+ optimizeFeat (C' (Decor (SourceInfo1 src) Id)) (a :* Nil) =+ localSource src $ optimizeM a++ constructFeatOpt (C' (Decor (SourceInfo1 _) Id)) (a :* Nil) = return a++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x++
+ src/Feldspar/Core/Constructs/Trace.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Trace+ ( Trace (..)+ ) where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++import Debug.Trace++data Trace a+ where+ Trace :: Type a => Trace (IntN :-> a :-> Full a)+ -- TODO Seems a more suitable definition might be+ --+ -- Trace :: Type a => IntN -> Trace (a :-> Full a)+ --+ -- since the front-end function will always make a literal for the label.++instance Semantic Trace+ where+ semantics Trace = Sem "trace" (\i a -> trace (show i ++ ":" ++ show a) a)++instance Constrained Trace+ where+ type Sat Trace = Type+ exprDict Trace = Dict++instance Equality Trace where equal = equalDefault; exprHash = exprHashDefault+instance Render Trace where renderArgs = renderArgsDefault+instance ToTree Trace+instance Eval Trace where evaluate = evaluateDefault+instance EvalBind Trace where evalBindSym = evalBindSymDefault+instance Sharable Trace++instance AlphaEq dom dom dom env => AlphaEq Trace Trace dom env+ where+ alphaEqSym = alphaEqSymDefault++instance SizeProp (Trace :|| Type)+ where+ sizeProp (C' Trace) (WrapFull _ :* WrapFull a :* Nil) = infoSize a++instance ( (Trace :|| Type) :<: dom+ , OptimizeSuper dom)+ => Optimize (Trace :|| Type) dom+ where+ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Constructs/Tuple.hs view
@@ -0,0 +1,323 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Constructs.Tuple+ ( module Language.Syntactic.Constructs.Tuple+ ) where++import Data.Tuple.Select++import Language.Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Tuple++import Feldspar.Core.Types+import Feldspar.Core.Interpretation++instance Sharable Tuple++instance SizeProp (Tuple :|| Type)+ where+ sizeProp (C' Tup2) (a :* b :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ = (infoSize ia, infoSize ib)+ sizeProp (C' Tup3) (a :* b :* c :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ , WrapFull ic <- c+ = ( infoSize ia+ , infoSize ib+ , infoSize ic+ )+ sizeProp (C' Tup4) (a :* b :* c :* d :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ , WrapFull ic <- c+ , WrapFull id <- d+ = ( infoSize ia+ , infoSize ib+ , infoSize ic+ , infoSize id+ )+ sizeProp (C' Tup5) (a :* b :* c :* d :* e :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ , WrapFull ic <- c+ , WrapFull id <- d+ , WrapFull ie <- e+ = ( infoSize ia+ , infoSize ib+ , infoSize ic+ , infoSize id+ , infoSize ie+ )+ sizeProp (C' Tup6) (a :* b :* c :* d :* e :* g :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ , WrapFull ic <- c+ , WrapFull id <- d+ , WrapFull ie <- e+ , WrapFull ig <- g+ = ( infoSize ia+ , infoSize ib+ , infoSize ic+ , infoSize id+ , infoSize ie+ , infoSize ig+ )+ sizeProp (C' Tup7) (a :* b :* c :* d :* e :* g :* h :* Nil)+ | WrapFull ia <- a+ , WrapFull ib <- b+ , WrapFull ic <- c+ , WrapFull id <- d+ , WrapFull ie <- e+ , WrapFull ig <- g+ , WrapFull ih <- h+ = ( infoSize ia+ , infoSize ib+ , infoSize ic+ , infoSize id+ , infoSize ie+ , infoSize ig+ , infoSize ih+ )++instance Sharable Select+ where+ sharable _ = False++sel1Size :: (Sel1' a ~ b) => TypeRep a -> Size a -> Size b+sel1Size Tup2Type{} = sel1+sel1Size Tup3Type{} = sel1+sel1Size Tup4Type{} = sel1+sel1Size Tup5Type{} = sel1+sel1Size Tup6Type{} = sel1+sel1Size Tup7Type{} = sel1++sel2Size :: (Sel2' a ~ b) => TypeRep a -> (Size a -> Size b)+sel2Size Tup2Type{} = sel2+sel2Size Tup3Type{} = sel2+sel2Size Tup4Type{} = sel2+sel2Size Tup5Type{} = sel2+sel2Size Tup6Type{} = sel2+sel2Size Tup7Type{} = sel2++sel3Size :: (Sel3' a ~ b) => TypeRep a -> (Size a -> Size b)+sel3Size Tup3Type{} = sel3+sel3Size Tup4Type{} = sel3+sel3Size Tup5Type{} = sel3+sel3Size Tup6Type{} = sel3+sel3Size Tup7Type{} = sel3++sel4Size :: (Sel4' a ~ b) => TypeRep a -> (Size a -> Size b)+sel4Size Tup4Type{} = sel4+sel4Size Tup5Type{} = sel4+sel4Size Tup6Type{} = sel4+sel4Size Tup7Type{} = sel4++sel5Size :: (Sel5' a ~ b) => TypeRep a -> (Size a -> Size b)+sel5Size Tup5Type{} = sel5+sel5Size Tup6Type{} = sel5+sel5Size Tup7Type{} = sel5++sel6Size :: (Sel6' a ~ b) => TypeRep a -> (Size a -> Size b)+sel6Size Tup6Type{} = sel6+sel6Size Tup7Type{} = sel6++sel7Size :: (Sel7' a ~ b) => TypeRep a -> (Size a -> Size b)+sel7Size Tup7Type{} = sel7++instance SizeProp (Select :|| Type)+ where+ sizeProp (C' Sel1) (WrapFull ia :* Nil) =+ sel1Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel2) (WrapFull ia :* Nil) =+ sel2Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel3) (WrapFull ia :* Nil) =+ sel3Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel4) (WrapFull ia :* Nil) =+ sel4Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel5) (WrapFull ia :* Nil) =+ sel5Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel6) (WrapFull ia :* Nil) =+ sel6Size (infoType ia) (infoSize ia)+ sizeProp (C' Sel7) (WrapFull ia :* Nil) =+ sel7Size (infoType ia) (infoSize ia)++-- | Compute a witness that a symbol and an expression have the same result type+tupEq :: Type (DenResult a) =>+ sym a -> ASTF (Decor Info dom) b -> Maybe (TypeEq (DenResult a) b)+tupEq _ b = typeEq typeRep (infoType $ getInfo b)++instance+ ( (Tuple :|| Type) :<: dom+ , (Select :|| Type) :<: dom+ , OptimizeSuper dom+ ) =>+ Optimize (Tuple :|| Type) dom+ where+ constructFeatOpt (C' tup@Tup2) (s1 :* s2 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , alphaEq a b+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt (C' tup@Tup3) (s1 :* s2 :* s3 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , (prjF -> Just (C' Sel3)) :$ c <- s3+ , alphaEq a b+ , alphaEq a c+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt (C' tup@Tup4) (s1 :* s2 :* s3 :* s4 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , (prjF -> Just (C' Sel3)) :$ c <- s3+ , (prjF -> Just (C' Sel4)) :$ d <- s4+ , alphaEq a b+ , alphaEq a c+ , alphaEq a d+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt (C' tup@Tup5) (s1 :* s2 :* s3 :* s4 :* s5 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , (prjF -> Just (C' Sel3)) :$ c <- s3+ , (prjF -> Just (C' Sel4)) :$ d <- s4+ , (prjF -> Just (C' Sel5)) :$ e <- s5+ , alphaEq a b+ , alphaEq a c+ , alphaEq a d+ , alphaEq a e+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt (C' tup@Tup6) (s1 :* s2 :* s3 :* s4 :* s5 :* s6 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , (prjF -> Just (C' Sel3)) :$ c <- s3+ , (prjF -> Just (C' Sel4)) :$ d <- s4+ , (prjF -> Just (C' Sel5)) :$ e <- s5+ , (prjF -> Just (C' Sel6)) :$ f <- s6+ , alphaEq a b+ , alphaEq a c+ , alphaEq a d+ , alphaEq a e+ , alphaEq a f+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt (C' tup@Tup7) (s1 :* s2 :* s3 :* s4 :* s5 :* s6 :* s7 :* Nil)+ | (prjF -> Just (C' Sel1)) :$ a <- s1+ , (prjF -> Just (C' Sel2)) :$ b <- s2+ , (prjF -> Just (C' Sel3)) :$ c <- s3+ , (prjF -> Just (C' Sel4)) :$ d <- s4+ , (prjF -> Just (C' Sel5)) :$ e <- s5+ , (prjF -> Just (C' Sel6)) :$ f <- s6+ , (prjF -> Just (C' Sel7)) :$ g <- s7+ , alphaEq a b+ , alphaEq a c+ , alphaEq a d+ , alphaEq a e+ , alphaEq a f+ , alphaEq a g+ , Just TypeEq <- tupEq tup a+ = return a++ constructFeatOpt feat args = constructFeatUnOpt feat args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+++instance+ ( (Select :|| Type) :<: dom+ , (Tuple :|| Type) :<: dom+ , Optimize dom dom+ ) =>+ Optimize (Select :|| Type) dom+ where+ constructFeatOpt (C' Sel1) (t :* Nil)+ | ((prjF -> Just (C' Tup2)) :$ a :$ _) <- t = return a+ | ((prjF -> Just (C' Tup3)) :$ a :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup4)) :$ a :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup5)) :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup6)) :$ a :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ a :$ _ :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a++ constructFeatOpt (C' Sel2) (t :* Nil)+ | ((prjF -> Just (C' Tup2)) :$ _ :$ a) <- t = return a+ | ((prjF -> Just (C' Tup3)) :$ _ :$ a :$ _) <- t = return a+ | ((prjF -> Just (C' Tup4)) :$ _ :$ a :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup5)) :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup6)) :$ _ :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ _ :$ a :$ _ :$ _ :$ _ :$ _ :$ _) <- t = return a++ constructFeatOpt (C' Sel3) (t :* Nil)+ | ((prjF -> Just (C' Tup3)) :$ _ :$ _ :$ a) <- t = return a+ | ((prjF -> Just (C' Tup4)) :$ _ :$ _ :$ a :$ _) <- t = return a+ | ((prjF -> Just (C' Tup5)) :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup6)) :$ _ :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ _ :$ _ :$ a :$ _ :$ _ :$ _ :$ _) <- t = return a++ constructFeatOpt (C' Sel4) (t :* Nil)+ | ((prjF -> Just (C' Tup4)) :$ _ :$ _ :$ _ :$ a) <- t = return a+ | ((prjF -> Just (C' Tup5)) :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a+ | ((prjF -> Just (C' Tup6)) :$ _ :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ _ :$ _ :$ _ :$ a :$ _ :$ _ :$ _) <- t = return a++ constructFeatOpt (C' Sel5) (t :* Nil)+ | ((prjF -> Just (C' Tup5)) :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a+ | ((prjF -> Just (C' Tup6)) :$ _ :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ _ :$ _ :$ _ :$ _ :$ a :$ _ :$ _) <- t = return a++ constructFeatOpt (C' Sel6) (t :* Nil)+ | ((prjF -> Just (C' Tup6)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a+ | ((prjF -> Just (C' Tup7)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ a :$ _) <- t = return a++ constructFeatOpt (C' Sel7) (t :* Nil)+ | ((prjF -> Just (C' Tup7)) :$ _ :$ _ :$ _ :$ _ :$ _ :$ _ :$ a) <- t = return a++ constructFeatOpt feat args = constructFeatUnOpt feat args++ constructFeatUnOpt x@(C' _) = constructFeatUnOptDefault x+
+ src/Feldspar/Core/Frontend.hs view
@@ -0,0 +1,282 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE OverlappingInstances #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend+ ( module Data.Patch+ , Syntactic+ , SyntacticFeld+ , Internal++ , FeldDomainAll+ , Data+ , Syntax++ , module Frontend++ , reifyFeld+ , showExpr+ , printExpr+ , showAST+ , drawAST+ , showDecor+ , drawDecor+ , eval+ , evalTarget+ , desugar+ , sugar+ , resugar++ -- * QuickCheck+ , (===>)+ , (===)++ -- * Type constraints+ , tData+ , tArr1+ , tArr2+ , tM++ -- * Functions+ , ilog2+ , nlz+ ) where++import Prelude as P++import Control.Monad.State+import Test.QuickCheck++import Data.Patch+import Data.Typeable++import Language.Syntactic hiding+ (desugar, sugar, resugar, printExpr, showAST, drawAST)+import qualified Language.Syntactic as Syntactic+import qualified Language.Syntactic.Constructs.Decoration as Syntactic+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Binding.HigherOrder+import Language.Syntactic.Sharing.SimpleCodeMotion++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Interpretation hiding (showDecor, drawDecor)+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Binding (cLambda)+import Feldspar.Core.Frontend.Array as Frontend+import Feldspar.Core.Frontend.Binding as Frontend+import Feldspar.Core.Frontend.Bits as Frontend+import Feldspar.Core.Frontend.Complex as Frontend+import Feldspar.Core.Frontend.Condition as Frontend+import Feldspar.Core.Frontend.ConditionM as Frontend+import Feldspar.Core.Frontend.Conversion as Frontend+import Feldspar.Core.Frontend.Eq as Frontend+import Feldspar.Core.Frontend.Error as Frontend+import Feldspar.Core.Frontend.FFI as Frontend+import Feldspar.Core.Frontend.Floating as Frontend+import Feldspar.Core.Frontend.Fractional as Frontend+import Feldspar.Core.Frontend.Future as Frontend+import Feldspar.Core.Frontend.Integral as Frontend+import Feldspar.Core.Frontend.Literal as Frontend+import Feldspar.Core.Frontend.Logic as Frontend+import Feldspar.Core.Frontend.Loop as Frontend+import Feldspar.Core.Frontend.Mutable as Frontend+import Feldspar.Core.Frontend.MutableArray as Frontend+import Feldspar.Core.Frontend.MutableReference as Frontend+import Feldspar.Core.Frontend.MutableToPure as Frontend+import Feldspar.Core.Frontend.NoInline as Frontend+import Feldspar.Core.Frontend.Num as Frontend+import Feldspar.Core.Frontend.Ord as Frontend+import Feldspar.Core.Frontend.Par as Frontend+import Feldspar.Core.Frontend.Save as Frontend+import Feldspar.Core.Frontend.Select as Frontend+import Feldspar.Core.Frontend.SizeProp as Frontend+import Feldspar.Core.Frontend.SourceInfo as Frontend+import Feldspar.Core.Frontend.Trace as Frontend+import Feldspar.Core.Frontend.Tuple as Frontend+++prjDict :: PrjDict (Decor Info FeldDomain)+prjDict = PrjDict+ (prjVariable prjDictFO . decorExpr)+ (prjLambda prjDictFO . decorExpr)++mkId :: MkInjDict (Decor Info FeldDomain)+mkId a b | simpleMatch (const . sharable) a+ , Just Dict <- typeDict b+ , Just Dict <- typeDict a+ = Just InjDict+ { injVariable = Decor (getInfo a) . injC . c' . Variable+ , injLambda = let info = ((mkInfoTy (FunType typeRep typeRep)) { infoSize = infoSize (getInfo b)})+ in Decor info . injC . cLambda+ , injLet = Decor (getInfo b) $ injC $ c' Let+ }+mkId _ _ = Nothing+++type SyntacticFeld a = (Syntactic a, Domain a ~ FeldDomainAll, Typeable (Internal a))+ -- TODO Typeable needed?++-- | Reification and optimization of a Feldspar program+reifyFeld :: SyntacticFeld a+ => BitWidth n+ -> a+ -> ASTF (Decor Info FeldDomain) (Internal a)+reifyFeld n = flip evalState 0 .+ ( return+ <=< codeMotion prjDict mkId+ . optimize+ . targetSpecialization n+ <=< reifyM+ . Syntactic.desugar+ )+ -- Note that it's important to do 'codeMotion' after 'optimize'. There may be+ -- sub-expressions that appear more than once in the original program, but+ -- where 'optimize' removes all but one occurrence. If 'codeMotion' was run+ -- first, these sub-expressions would be let bound, preventing subsequent+ -- optimizations.++showExpr :: SyntacticFeld a => a -> String+showExpr = render . reifyFeld N32++printExpr :: SyntacticFeld a => a -> IO ()+printExpr = Syntactic.printExpr . reifyFeld N32++showAST :: SyntacticFeld a => a -> String+showAST = Syntactic.showAST . reifyFeld N32++drawAST :: SyntacticFeld a => a -> IO ()+drawAST = Syntactic.drawAST . reifyFeld N32++-- | Draw a syntax tree decorated with type and size information+showDecor :: SyntacticFeld a => a -> String+showDecor = Syntactic.showDecor . reifyFeld N32++-- | Draw a syntax tree decorated with type and size information+drawDecor :: SyntacticFeld a => a -> IO ()+drawDecor = Syntactic.drawDecor . reifyFeld N32++eval :: SyntacticFeld a => a -> Internal a+eval = evalBind . reifyFeld N32++evalTarget+ :: ( SyntacticFeld a+ , BoundedInt (GenericInt U n)+ , BoundedInt (GenericInt S n)+ )+ => BitWidth n -> a -> Internal a+evalTarget n = evalBind . reifyFeld n+ -- TODO This doesn't work yet, because 'targetSpecialization' is not+ -- implemented++desugar :: Syntax a => a -> Data (Internal a)+desugar = Syntactic.resugar++sugar :: Syntax a => Data (Internal a) -> a+sugar = Syntactic.resugar++resugar :: (Syntax a, Syntax b, Internal a ~ Internal b) => a -> b+resugar = Syntactic.resugar++++--------------------------------------------------------------------------------+-- * QuickCheck+--------------------------------------------------------------------------------++instance (Type a, Arbitrary a) => Arbitrary (Data a)+ where+ arbitrary = fmap value arbitrary++instance Testable (Data Bool)+ where+ property = property . eval++(===>) :: Testable prop => Data Bool -> prop -> Property+a ===> b = eval a ==> b+++class Equal a+ where+ (===) :: a -> a -> Property++instance (P.Eq a, Show a) => Equal a+ where+ x === y = printTestCase ("Evaluated property: " ++ show x ++ " === " ++ show y)+ $ property (x P.== y)++instance (Show a, Arbitrary a, Equal b) => Equal (a -> b)+ where+ f === g = property (\x -> f x === g x)+++--------------------------------------------------------------------------------+-- * Type annotations+--------------------------------------------------------------------------------++tData :: Patch a a -> Patch (Data a) (Data a)+tData _ = id++tArr1 :: Patch a a -> Patch (Data [a]) (Data [a])+tArr1 _ = id++tArr2 :: Patch a a -> Patch (Data [[a]]) (Data [[a]])+tArr2 _ = id++tM :: Patch a a -> Patch (M a) (M a)+tM _ = id+++--------------------------------------------------------------------------------+-- * Functions+--------------------------------------------------------------------------------++-- | Integer logarithm in base 2+-- Based on an algorithm in Hacker's Delight+ilog2 :: (Bits a) => Data a -> Data Index+ilog2 x = bitSize x - 1 - nlz x++-- | Count leading zeros+-- Based on an algorithm in Hacker's Delight+nlz :: (Bits a) => Data a -> Data Index+nlz x = bitCount $ complement $ foldl go x $ takeWhile (P.< bitSize' x) $ P.map (2 P.^) [(0::Integer)..]+ where+ go b s = b .|. (b .>>. value s)+
+ src/Feldspar/Core/Frontend/Array.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Array+where++import Data.Patch++import Feldspar.Core.Types+import Feldspar.Core.Collection+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Array+import Feldspar.Core.Frontend.Tuple ()++import Language.Syntactic++parallel :: Type a => Data Length -> (Data Index -> Data a) -> Data [a]+parallel = sugarSymF Parallel+++sequential :: (Type a, Syntax s) =>+ Data Length -> s -> (Data Index -> s -> (Data a,s)) -> Data [a]+sequential = sugarSymF Sequential+++append :: Type a => Data [a] -> Data [a] -> Data [a]+append = sugarSymF Append++getLength :: Type a => Data [a] -> Data Length+getLength = sugarSymF GetLength++-- | Change the length of the vector to the supplied value. If the supplied+-- length is greater than the old length, the new elements will have undefined+-- value.+setLength :: Type a => Data Length -> Data [a] -> Data [a]+setLength = sugarSymF SetLength++getIx :: Type a => Data [a] -> Data Index -> Data a+getIx = sugarSymF GetIx++setIx :: Type a => Data [a] -> Data Index -> Data a -> Data [a]+setIx = sugarSymF SetIx++type instance Elem (Data [a]) = Data a+type instance CollIndex (Data [a]) = Data Index+type instance CollSize (Data [a]) = Data Length++instance Type a => Indexed (Data [a])+ where+ (!) = getIx++instance Type a => Sized (Data [a])+ where+ collSize = getLength+ setCollSize = setLength++instance (Type a, Type b) => CollMap (Data [a]) (Data [b])+ where+ collMap f arr = parallel (getLength arr) (f . getIx arr)++-- | Array patch+(|>) :: (Sized a, CollMap a a) =>+ Patch (CollSize a) (CollSize a) -> Patch (Elem a) (Elem a) -> Patch a a+(sizePatch |> elemPatch) a =+ collMap elemPatch $ setCollSize (sizePatch (collSize a)) a+
+ src/Feldspar/Core/Frontend/Binding.hs view
@@ -0,0 +1,48 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Binding where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs.Binding+import Feldspar.Core.Constructs++-- | Share an expression in the scope of a function+share :: (Syntax a, Syntax b) => a -> (a -> b) -> b+share = sugarSymF Let++-- | Share the intermediate result when composing functions+(.<) :: (Syntax b, Syntax c) => (b -> c) -> (a -> b) -> a -> c+(.<) f g a = share (g a) f++-- | Share an expression in the scope of a function+($<) :: (Syntax a, Syntax b) => (a -> b) -> a -> b+($<) = flip share+
+ src/Feldspar/Core/Frontend/Bits.hs view
@@ -0,0 +1,132 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Bits+where++import Prelude hiding (Integral(..))++import Data.Int+import Data.Word++import Language.Syntactic++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Bits+import Feldspar.Core.Frontend.Integral+import Feldspar.Core.Frontend.Literal++import qualified Data.Bits as B++infixl 5 .<<.,.>>.+infixl 4 ⊕++class (Type a, B.Bits a, Integral a, Bounded a, Size a ~ Range a) => Bits a+ where+ -- Logical operations+ (.&.) :: Data a -> Data a -> Data a+ (.&.) = sugarSymF BAnd+ (.|.) :: Data a -> Data a -> Data a+ (.|.) = sugarSymF BOr+ xor :: Data a -> Data a -> Data a+ xor = sugarSymF BXor+ complement :: Data a -> Data a+ complement = sugarSymF Complement++ -- Bitwise operations+ bit :: Data Index -> Data a+ bit = sugarSymF Bit+ setBit :: Data a -> Data Index -> Data a+ setBit = sugarSymF SetBit+ clearBit :: Data a -> Data Index -> Data a+ clearBit = sugarSymF ClearBit+ complementBit :: Data a -> Data Index -> Data a+ complementBit = sugarSymF ComplementBit+ testBit :: Data a -> Data Index -> Data Bool+ testBit = sugarSymF TestBit++ -- Movement operations+ shiftLU :: Data a -> Data Index -> Data a+ shiftLU = sugarSymF ShiftLU+ shiftRU :: Data a -> Data Index -> Data a+ shiftRU = sugarSymF ShiftRU+ shiftL :: Data a -> Data IntN -> Data a+ shiftL = sugarSymF ShiftL+ shiftR :: Data a -> Data IntN -> Data a+ shiftR = sugarSymF ShiftR+ rotateLU :: Data a -> Data Index -> Data a+ rotateLU = sugarSymF RotateLU+ rotateRU :: Data a -> Data Index -> Data a+ rotateRU = sugarSymF RotateRU+ rotateL :: Data a -> Data IntN -> Data a+ rotateL = sugarSymF RotateL+ rotateR :: Data a -> Data IntN -> Data a+ rotateR = sugarSymF RotateR+ reverseBits :: Data a -> Data a+ reverseBits = sugarSymF ReverseBits++ bitScan :: Data a -> Data Index+ bitScan = sugarSymF BitScan+ bitCount :: Data a -> Data Index+ bitCount = sugarSymF BitCount++ bitSize :: Data a -> Data Index+ bitSize = value . bitSize'++ bitSize' :: Data a -> Index+ bitSize' = const $ fromIntegral $ B.bitSize (undefined :: a)+ isSigned :: Data a -> Data Bool+ isSigned = sugarSymF IsSigned++(⊕) :: (Bits a) => Data a -> Data a -> Data a+(⊕) = xor+(.<<.) :: (Bits a) => Data a -> Data Index -> Data a+(.<<.) = shiftLU+(.>>.) :: (Bits a) => Data a -> Data Index -> Data a+(.>>.) = shiftRU++instance Bits Word8+instance Bits Word16+instance Bits Word32+instance Bits Word64+instance Bits WordN+instance Bits Int8+instance Bits Int16+instance Bits Int32+instance Bits Int64+instance Bits IntN+
+ src/Feldspar/Core/Frontend/Complex.hs view
@@ -0,0 +1,74 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Complex+where++import Data.Complex (Complex)++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Complex+import Feldspar.Core.Frontend.Num++import Language.Syntactic++complex :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)+complex = sugarSymF MkComplex++realPart :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a+realPart = sugarSymF RealPart++imagPart :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a+imagPart = sugarSymF ImagPart++conjugate :: (Numeric a, RealFloat a) => Data (Complex a) -> Data (Complex a)+conjugate = sugarSymF Conjugate++mkPolar :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)+mkPolar = sugarSymF MkPolar++cis :: (Numeric a, RealFloat a) => Data a -> Data (Complex a)+cis = sugarSymF Cis++magnitude :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a+magnitude = sugarSymF Magnitude++phase :: (Numeric a, RealFloat a) => Data (Complex a) -> Data a+phase = sugarSymF Phase++polar :: (Numeric a, RealFloat a) => Data (Complex a) -> (Data a, Data a)+polar c = (magnitude c, phase c)++infixl 6 +.++(+.) :: (Numeric a, RealFloat a) => Data a -> Data a -> Data (Complex a)+(+.) = complex++iunit :: (Numeric a, RealFloat a) => Data (Complex a)+iunit = 0 +. 1+
+ src/Feldspar/Core/Frontend/Condition.hs view
@@ -0,0 +1,43 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Condition where++import Language.Syntactic++import Feldspar.Core.Constructs.Condition+import Feldspar.Core.Constructs++condition :: (Syntax a) => Data Bool -> a -> a -> a+condition c t f = sugarSymF Condition c t f++(?) :: (Syntax a) => Data Bool -> (a, a) -> a+c ? (t, e) = condition c t e++infix 1 ?+
+ src/Feldspar/Core/Frontend/ConditionM.hs view
@@ -0,0 +1,40 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.ConditionM where++import Language.Syntactic++import Feldspar.Core.Constructs.ConditionM+import Feldspar.Core.Constructs++import Feldspar.Core.Frontend.Mutable++ifM :: Syntax a => Data Bool -> M a -> M a -> M a+ifM = sugarSymC ConditionM+
+ src/Feldspar/Core/Frontend/Conversion.hs view
@@ -0,0 +1,72 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Conversion+where++import Prelude hiding (Integral)++import Language.Syntactic++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Conversion+import Feldspar.Core.Frontend.Integral+import Feldspar.Core.Frontend.Num++i2f :: (Integral a) => Data a -> Data Float+i2f = i2n++f2i :: Integral a => Data Float -> Data a+f2i = sugarSymF F2I++i2n :: (Integral a, Numeric b) => Data a -> Data b+i2n = sugarSymF I2N++b2i :: Integral a => Data Bool -> Data a+b2i = sugarSymF B2I++truncate :: Integral a => Data Float -> Data a+truncate = f2i++round :: Integral a => Data Float -> Data a+round = sugarSymF Round++ceiling :: Integral a => Data Float -> Data a+ceiling = sugarSymF Ceiling++floor :: Integral a => Data Float -> Data a+floor = sugarSymF Floor+
+ src/Feldspar/Core/Frontend/Eq.hs view
@@ -0,0 +1,78 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Eq+where++import qualified Prelude as P++import Data.Int+import Data.Word+import Data.Complex++import Language.Syntactic++import Feldspar.Prelude+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Eq++infix 4 ==+infix 4 /=++-- | Redefinition of the standard 'P.Eq' class for Feldspar+class (Type a) => Eq a+ where+ (==) :: Data a -> Data a -> Data Bool+ (==) = sugarSymF Equal+ (/=) :: Data a -> Data a -> Data Bool+ (/=) = sugarSymF NotEqual++instance Eq ()+instance Eq Bool+instance Eq Float+instance Eq Word8+instance Eq Word16+instance Eq Word32+instance Eq Word64+instance Eq WordN+instance Eq Int8+instance Eq Int16+instance Eq Int32+instance Eq Int64+instance Eq IntN++instance (Eq a, Eq b) => Eq (a,b)+instance (Eq a, Eq b, Eq c) => Eq (a,b,c)+instance (Eq a, Eq b, Eq c, Eq d) => Eq (a,b,c,d)+instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a,b,c,d,e)+instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f) => Eq (a,b,c,d,e,f)+instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g) => Eq (a,b,c,d,e,f,g)++instance (Eq a, RealFloat a) => Eq (Complex a)+
+ src/Feldspar/Core/Frontend/Error.hs view
@@ -0,0 +1,50 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Error where++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Error+import Feldspar.Core.Frontend.Literal++undef :: Syntax a => a+undef = sugarSymF Undefined++-- | Assert that the condition holds or fail with message+assertMsg :: Syntax a => String -> Data Bool -> a -> a+assertMsg = sugarSymF . Assert++-- | Assert that the condition holds, the conditions string representation is used as the message+assert :: Syntax a => Data Bool -> a -> a+assert cond = assertMsg (show cond) cond++err :: Syntax a => String -> a+err msg = assertMsg msg false undef+
+ src/Feldspar/Core/Frontend/FFI.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.FFI where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs.FFI++foreignImport :: ( Type (DenResult a)+-- , Signature a+ , SyntacticN c b+ , ApplySym a b dom+ , FFI :<: dom+ )+ => String -> Denotation a -> c+foreignImport name f = sugarSym (ForeignImport name f)+
+ src/Feldspar/Core/Frontend/Floating.hs view
@@ -0,0 +1,85 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Floating where++import qualified Prelude+import Prelude (Float)+import Data.Complex++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Floating+import Feldspar.Core.Frontend.Fractional++-- Make new class, with "Data" in all the types++infixr 8 **++class (Fraction a, Prelude.Floating a) => Floating a where+ pi :: Data a+ pi = sugarSymF Pi+ exp :: Data a -> Data a+ exp = sugarSymF Exp+ sqrt :: Data a -> Data a+ sqrt = sugarSymF Sqrt+ log :: Data a -> Data a+ log = sugarSymF Log+ (**) :: Data a -> Data a -> Data a+ (**) = sugarSymF Pow+ logBase :: Data a -> Data a -> Data a+ logBase = sugarSymF LogBase+ sin :: Data a -> Data a+ sin = sugarSymF Sin+ tan :: Data a -> Data a+ tan = sugarSymF Tan+ cos :: Data a -> Data a+ cos = sugarSymF Cos+ asin :: Data a -> Data a+ asin = sugarSymF Asin+ atan :: Data a -> Data a+ atan = sugarSymF Atan+ acos :: Data a -> Data a+ acos = sugarSymF Acos+ sinh :: Data a -> Data a+ sinh = sugarSymF Sinh+ tanh :: Data a -> Data a+ tanh = sugarSymF Tanh+ cosh :: Data a -> Data a+ cosh = sugarSymF Cosh+ asinh :: Data a -> Data a+ asinh = sugarSymF Asinh+ atanh :: Data a -> Data a+ atanh = sugarSymF Atanh+ acosh :: Data a -> Data a+ acosh = sugarSymF Acosh++instance Floating Float+instance (Fraction a, Prelude.RealFloat a) => Floating (Complex a)+
+ src/Feldspar/Core/Frontend/Fractional.hs view
@@ -0,0 +1,61 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Fractional+where++import Data.Complex++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Fractional++import Feldspar.Core.Frontend.Literal+import Feldspar.Core.Frontend.Num++-- | Fractional types. The relation to the standard 'Fractional' class is+--+-- @instance `Fraction` a => `Fractional` (`Data` a)@+class (Fractional a, Numeric a) => Fraction a+ where+ fromRationalFrac :: Rational -> Data a+ fromRationalFrac = value . fromRational++ divFrac :: Data a -> Data a -> Data a+ divFrac = sugarSymF DivFrac++instance Fraction Float++instance (Fraction a, RealFloat a) => Fraction (Complex a)++instance (Fraction a) => Fractional (Data a)+ where+ fromRational = fromRationalFrac+ (/) = divFrac+
+ src/Feldspar/Core/Frontend/Future.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Future where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Future+import Feldspar.Core.Frontend.Save++newtype Future a = Future { unFuture :: Data (FVal (Internal a)) }++later :: (Syntax a, Syntax b) => (a -> b) -> Future a -> Future b+later f = future . f . await++pval :: (Syntax a, Syntax b) => (a -> b) -> a -> b+pval f x = await $ force $ future (f x)++instance Syntax a => Syntactic (Future a)+ where+ type Domain (Future a) = FeldDomainAll+ type Internal (Future a) = FVal (Internal a)+ desugar = desugar . unFuture+ sugar = Future . sugar++instance Syntax a => Syntax (Future a)++future :: Syntax a => a -> Future a+future = sugarSymF MkFuture++await :: Syntax a => Future a -> a+await = sugarSymF Await+
+ src/Feldspar/Core/Frontend/Integral.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Integral+where++import qualified Prelude as P++import Data.Int+import Data.Word++import Language.Syntactic++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Integral++import Feldspar.Core.Frontend.Condition+import Feldspar.Core.Frontend.Eq+import Feldspar.Core.Frontend.Logic+import Feldspar.Core.Frontend.Num+import Feldspar.Core.Frontend.Ord++class (Ord a, Numeric a, BoundedInt a, P.Integral a, Size a ~ Range a) => Integral a+ where+ quot :: Data a -> Data a -> Data a+ quot = sugarSymF Quot+ rem :: Data a -> Data a -> Data a+ rem = sugarSymF Rem+ div :: Data a -> Data a -> Data a+ div = divSem+ mod :: Data a -> Data a -> Data a+ mod = sugarSymF Mod+ (^) :: Data a -> Data a -> Data a+ (^) = sugarSymF Exp++-- TODO: This is a short-term hack because the compiler doesn't compile+-- the Div construct correctly. So we give the semantics of div in terms of+-- quot directly, and never use the Div construct. In the long term the+-- compiler should be fixed, but it involves writing type corrector plugins+-- and this solution was quicker.+divSem :: (Integral a)+ => Data a -> Data a -> Data a+divSem x y = (x > 0 && y < 0 || x < 0 && y > 0) && rem x y /= 0 ?+ (quot x y P.- 1,quot x y)++instance Integral Word8+instance Integral Word16+instance Integral Word32+instance Integral Word64+instance Integral WordN+instance Integral Int8+instance Integral Int16+instance Integral Int32+instance Integral Int64+instance Integral IntN+
+ src/Feldspar/Core/Frontend/Literal.hs view
@@ -0,0 +1,59 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Literal where++import Language.Syntactic+import Feldspar.Core.Types+import Feldspar.Core.Constructs.Literal+import Feldspar.Core.Constructs+import Feldspar.Core.Interpretation++value :: Syntax a => Internal a -> a+value = sugarSymF . Literal++false :: Data Bool+false = value False++true :: Data Bool+true = value True++instance Syntactic ()+ where+ type Domain () = FeldDomainAll+ type Internal () = ()+ desugar = appSymC . c' . Literal+ sugar _ = ()++instance Syntax ()+
+ src/Feldspar/Core/Frontend/Logic.hs view
@@ -0,0 +1,62 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Logic+where++import Prelude hiding ((&&), (||))+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Logic+import Feldspar.Core.Frontend.Literal+import Feldspar.Core.Frontend.Condition++import Language.Syntactic++infixr 3 &&+infixr 3 &&*+infixr 2 ||+infixr 2 ||*++not :: Data Bool -> Data Bool+not = sugarSymF Not++(&&) :: Data Bool -> Data Bool -> Data Bool+(&&) = sugarSymF And++(||) :: Data Bool -> Data Bool -> Data Bool+(||) = sugarSymF Or+++-- | Lazy conjunction, second argument only evaluated if necessary+(&&*) :: Data Bool -> Data Bool -> Data Bool+a &&* b = a ? (b,false)++-- | Lazy disjunction, second argument only evaluated if necessary+(||*) :: Data Bool -> Data Bool -> Data Bool+a ||* b = a ? (true,b)+
+ src/Feldspar/Core/Frontend/Loop.hs view
@@ -0,0 +1,51 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Loop+where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Loop++import Feldspar.Core.Frontend.Mutable++forLoop :: Syntax a => Data Length -> a -> (Data Index -> a -> a) -> a+forLoop = sugarSymF ForLoop++whileLoop :: Syntax a => a -> (a -> Data Bool) -> (a -> a) -> a+whileLoop = sugarSymF WhileLoop++forM :: (Syntax a) => Data Length -> (Data Index -> M a) -> M ()+forM = sugarSymC For++whileM :: Syntax a => M (Data Bool) -> M a -> M ()+whileM = sugarSymC While+
+ src/Feldspar/Core/Frontend/Mutable.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Mutable+where++import Prelude hiding (not)++import Language.Syntactic+import Language.Syntactic.Frontend.Monad++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Frontend.Logic+import qualified Feldspar.Core.Constructs.Mutable as Feature++newtype M a = M { unM :: Mon FeldSymbols Type Mut a }+ deriving (Functor, Monad)++instance Syntax a => Syntactic (M a)+ where+ type Domain (M a) = FeldDomainAll+ type Internal (M a) = Mut (Internal a)+ desugar = desugar . unM+ sugar = M . sugar++runMutable :: (Syntax a) => M a -> a+runMutable = sugarSymC Feature.Run++when :: Data Bool -> M () -> M ()+when = sugarSymC Feature.When++unless :: Data Bool -> M () -> M ()+unless = when . not+
+ src/Feldspar/Core/Frontend/MutableArray.hs view
@@ -0,0 +1,78 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.MutableArray+where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Loop+import Feldspar.Core.Constructs.MutableArray+import Feldspar.Core.Frontend.Mutable++newArr :: Type a => Data Length -> Data a -> M (Data (MArr a))+newArr = sugarSymC NewArr++newArr_ :: Type a => Data Length -> M (Data (MArr a))+newArr_ = sugarSymC NewArr_++newListArr :: Type a => [Data a] -> M (Data (MArr a))+newListArr _ = error "newListArr: unimplemented" -- TODO++getArr :: Type a => Data (MArr a) -> Data Index -> M (Data a)+getArr = sugarSymC GetArr++setArr :: Type a => Data (MArr a) -> Data Index -> Data a -> M ()+setArr = sugarSymC SetArr++modifyArr :: Type a+ => Data (MArr a) -> Data Index -> (Data a -> Data a) -> M ()+modifyArr arr i f = getArr arr i >>= setArr arr i . f++arrLength :: Type a => Data (MArr a) -> M (Data Length)+arrLength = sugarSymC ArrLength++mapArray :: Type a => (Data a -> Data a) -> Data (MArr a) -> M (Data (MArr a))+mapArray f arr = do+ len <- arrLength arr+ forArr len (flip (modifyArr arr) f)+ return arr++forArr :: Syntax a => Data Length -> (Data Index -> M a) -> M ()+forArr = sugarSymC For++swap :: Syntax a+ => Data (MArr (Internal a)) -> Data Index -> Data Index -> M ()+swap a i1 i2 = do+ tmp1 <- getArr a i1+ tmp2 <- getArr a i2+ setArr a i1 tmp2 :: M ()+ setArr a i2 tmp1 :: M ()+
+ src/Feldspar/Core/Frontend/MutableReference.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.MutableReference+where++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.MutableReference+import Feldspar.Core.Frontend.Mutable++import Data.IORef++newtype Ref a = Ref { unRef :: Data (IORef (Internal a)) }++instance Syntax a => Syntactic (Ref a)+ where+ type Domain (Ref a) = FeldDomainAll+ type Internal (Ref a) = IORef (Internal a)+ desugar = desugar . unRef+ sugar = Ref . sugar++instance Syntax a => Syntax (Ref a)++newRef :: Syntax a => a -> M (Ref a)+newRef = sugarSymC NewRef++getRef :: Syntax a => Ref a -> M a+getRef = sugarSymC GetRef++setRef :: Syntax a => Ref a -> a -> M ()+setRef = sugarSymC SetRef++modifyRef :: Syntax a => Ref a -> (a -> a) -> M ()+modifyRef r f = getRef r >>= setRef r . f+
+ src/Feldspar/Core/Frontend/MutableToPure.hs view
@@ -0,0 +1,58 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.MutableToPure where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.MutableToPure+import Feldspar.Core.Frontend.Array+import Feldspar.Core.Frontend.Loop+import Feldspar.Core.Frontend.Mutable+import Feldspar.Core.Frontend.MutableArray+++withArray :: (Type a, Syntax b) => Data (MArr a) -> (Data [a] -> M b) -> M b+withArray = sugarSymC WithArray++runMutableArray :: Type a => M (Data (MArr a)) -> Data [a]+runMutableArray = sugarSymC RunMutableArray++freezeArray :: Type a => Data (MArr a) -> M (Data [a])+freezeArray marr = withArray marr return++thawArray :: Type a => Data [a] -> M (Data (MArr a))+thawArray arr = do+ marr <- newArr_ (getLength arr)+ forM (getLength arr) (\ix ->+ setArr marr ix (getIx arr ix)+ )+ return marr+
+ src/Feldspar/Core/Frontend/NoInline.hs view
@@ -0,0 +1,38 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.NoInline where++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.NoInline++noInline :: (Syntax a) => a -> a+noInline = sugarSymF NoInline+
+ src/Feldspar/Core/Frontend/Num.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Num where++import Data.Complex+import Data.Int+import Data.Word++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Num+import Feldspar.Core.Frontend.Literal++class (Type a, Num a, Num (Size a)) => Numeric a+ where+ fromIntegerNum :: Integer -> Data a+ fromIntegerNum = value . fromInteger+ absNum :: Data a -> Data a+ absNum = sugarSymF Abs+ signumNum :: Data a -> Data a+ signumNum = sugarSymF Sign+ addNum :: Data a -> Data a -> Data a+ addNum = sugarSymF Add+ subNum :: Data a -> Data a -> Data a+ subNum = sugarSymF Sub+ mulNum :: Data a -> Data a -> Data a+ mulNum = sugarSymF Mul++instance Numeric Word8+instance Numeric Word16+instance Numeric Word32+instance Numeric Word64+instance Numeric WordN+instance Numeric Int8+instance Numeric Int16+instance Numeric Int32+instance Numeric Int64+instance Numeric IntN++instance Numeric Float++instance (Type a, RealFloat a) => Numeric (Complex a)++instance (Numeric a) => Num (Data a)+ where+ fromInteger = fromIntegerNum+ abs = absNum+ signum = signumNum+ (+) = addNum+ (-) = subNum+ (*) = mulNum++
+ src/Feldspar/Core/Frontend/Ord.hs view
@@ -0,0 +1,89 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Frontend.Ord where++import qualified Prelude++import Data.Int+import Data.Word++import Language.Syntactic++import Feldspar.Prelude+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Ord+import Feldspar.Core.Frontend.Eq++infix 4 <+infix 4 >+infix 4 <=+infix 4 >=++-- | Redefinition of the standard 'Prelude.Ord' class for Feldspar+class (Eq a, Prelude.Ord a, Prelude.Ord (Size a)) => Ord a where+ (<) :: Data a -> Data a -> Data Bool+ (<) = sugarSymF LTH+ (>) :: Data a -> Data a -> Data Bool+ (>) = sugarSymF GTH++ (<=) :: Data a -> Data a -> Data Bool+ (<=) = sugarSymF LTE+ (>=) :: Data a -> Data a -> Data Bool+ (>=) = sugarSymF GTE++ min :: Data a -> Data a -> Data a+ min = sugarSymF Min+ max :: Data a -> Data a -> Data a+ max = sugarSymF Max++instance Ord ()+instance Ord Bool+instance Ord Word8+instance Ord Int8+instance Ord Word16+instance Ord Int16+instance Ord Word32+instance Ord Int32+instance Ord Word64+instance Ord Int64+instance Ord WordN+instance Ord IntN+instance Ord Float++-- TODO Should there be more instances?+
+ src/Feldspar/Core/Frontend/Par.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Par where++import Language.Syntactic hiding (P)+import Language.Syntactic.Frontend.Monad (Mon(..))++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Frontend.Literal ()++newtype P a = P { unP :: Mon FeldSymbols Type Par a }+ deriving (Functor, Monad)++instance Syntax a => Syntactic (P a)+ where+ type Domain (P a) = FeldDomainAll+ type Internal (P a) = Par (Internal a)+ desugar = desugar . unP+ sugar = P . sugar++newtype IVar a = IVar { unIVar :: Data (IV (Internal a)) }++instance Syntax a => Syntactic (IVar a)+ where+ type Domain (IVar a) = FeldDomainAll+ type Internal (IVar a) = IV (Internal a)+ desugar = desugar . unIVar+ sugar = IVar . sugar++instance Syntax a => Syntax (IVar a)+
+ src/Feldspar/Core/Frontend/Save.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.+--++-- | Tracing execution of Feldspar expressions++module Feldspar.Core.Frontend.Save where++import Language.Syntactic++import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Save++-- | An identity function that guarantees that the result will be computed as a+-- sub-result of the whole program. This is useful to prevent certain+-- optimizations.+--+-- Exception: Currently constant folding does not respect 'save'.+save :: Syntax a => a -> a+save = sugarSymF Save+ -- TODO Make constant folding respect `save`. This could be done by adding a+ -- field to `Info` saying whether or not each node contains `save`.++ -- TODO It would be nice if `save` could take a `String` argument that would+ -- be used in the back-end to identify the saved value (e.g. used as the+ -- variable name).++-- | Equivalent to 'save'. When applied to a lazy data structure, 'force' (and+-- 'save') has the effect of forcing evaluation of the whole structure.+force :: Syntax a => a -> a+force = save+
+ src/Feldspar/Core/Frontend/Select.hs view
@@ -0,0 +1,41 @@+--+-- Copyright (c) 2009-2011, 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.Core.Frontend.Select where++import qualified Prelude as P++import Feldspar.Core.Frontend.Eq+import Feldspar.Core.Frontend.Condition+import Feldspar.Core.Constructs++-- | Select between the cases based on the value of the scrutinee.+-- TODO: This implementation should be replaces by a proper construct+select :: (Eq a, Syntax b) => Data a -> [(Data a, b)] -> b -> b+select scrutinee cases fallback = P.foldr (\(c,a) b -> c == scrutinee ? (a,b)) fallback cases+
+ src/Feldspar/Core/Frontend/SizeProp.hs view
@@ -0,0 +1,82 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.+--++-- | The functions in this module can be used to help size inference (which, in+-- turn, helps deriving upper bounds of array sizes and helps optimization).++module Feldspar.Core.Frontend.SizeProp where++import Language.Syntactic++import Feldspar.Range+import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.SizeProp+import Feldspar.Core.Frontend.Literal ()++-- | An identity function affecting the abstract size information used during+-- optimization. The application of a 'SizeCap' is a /guarantee/ (by the caller)+-- that the argument is within a certain size (determined by the creator of the+-- 'SizeCap', e.g. 'sizeProp').+--+-- /Warning: If the guarantee is not fulfilled, optimizations become unsound!/+--+-- In general, the size of the resulting value is the intersection of the cap+-- size and the size obtained by ordinary size inference. That is, a 'SizeCap'+-- can only make the size more precise, not less precise.+type SizeCap a = Data a -> Data a++-- | @sizeProp prop a b@: A guarantee that @b@ is within the size @(prop sa)@,+-- where @sa@ is the size of @a@.+sizeProp :: (Syntax a, Type b) =>+ (Size (Internal a) -> Size b) -> a -> SizeCap b+sizeProp = sugarSymF . PropSize++-- | A guarantee that the argument is within the given size+cap :: Type a => Size a -> SizeCap a+cap sz = sizeProp (const sz) (Data $ desugar ())++-- | @notAbove a b@: A guarantee that @b <= a@ holds+notAbove :: (Type a, Bounded a, Size a ~ Range a) => Data a -> SizeCap a+notAbove = sizeProp (Range minBound . upperBound)++-- | @notBelow a b@: A guarantee that @b >= a@ holds+notBelow :: (Type a, Bounded a, Size a ~ Range a) => Data a -> SizeCap a+notBelow = sizeProp (flip Range maxBound . lowerBound)++-- | @between l u a@: A guarantee that @l <= a <= u@ holds+between :: (Type a, Bounded a, Size a ~ Range a) =>+ Data a -> Data a -> SizeCap a+between l u = notBelow l . notAbove u+
+ src/Feldspar/Core/Frontend/SourceInfo.hs view
@@ -0,0 +1,51 @@+--+-- Copyright (c) 2009-2011, 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 OverlappingInstances #-}++-- | Source-code annotations++module Feldspar.Core.Frontend.SourceInfo where+++import QuickAnnotate++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs.SourceInfo+import Feldspar.Core.Constructs++-- | Annotate an expression with information about its source code+sourceData :: Type a => SourceInfo1 a -> Data a -> Data a+sourceData info = sugarSymF (Decor info Id)++instance Type a => Annotatable (Data a)+ where+ annotate = sourceData . SourceInfo1+
+ src/Feldspar/Core/Frontend/Trace.hs view
@@ -0,0 +1,45 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | Tracing execution of Feldspar expressions++module Feldspar.Core.Frontend.Trace where++import Language.Syntactic++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Trace+import Feldspar.Core.Frontend.Num++-- | Tracing execution of an expression. Semantically, this is the identity+-- function, but a back end may treat this function specially, for example write+-- its arguments to a log.+trace :: Numeric a => Int -> Data a -> Data a+trace label = sugarSymF Trace (fromIntegral label :: Data IntN)+
+ src/Feldspar/Core/Frontend/Tuple.hs view
@@ -0,0 +1,152 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Core.Frontend.Tuple where++import QuickAnnotate++import Language.Syntactic+import Language.Syntactic.Frontend.TupleConstrained++import Feldspar.Core.Types+import Feldspar.Core.Constructs+import Feldspar.Core.Constructs.Tuple ()++instance (Syntax a, Syntax b) => Syntax (a,b)+instance (Syntax a, Syntax b, Syntax c) => Syntax (a,b,c)+instance (Syntax a, Syntax b, Syntax c, Syntax d) => Syntax (a,b,c,d)+instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e) => Syntax (a,b,c,d,e)+instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e, Syntax f) => Syntax (a,b,c,d,e,f)+instance (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e, Syntax f, Syntax g) => Syntax (a,b,c,d,e,f,g)++++instance+ ( Annotatable a+ , Annotatable b+ ) =>+ Annotatable (a,b)+ where+ annotate info (a,b) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ )++instance+ ( Annotatable a+ , Annotatable b+ , Annotatable c+ ) =>+ Annotatable (a,b,c)+ where+ annotate info (a,b,c) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ , annotate (info ++ " (tuple element 3)") c+ )++instance+ ( Annotatable a+ , Annotatable b+ , Annotatable c+ , Annotatable d+ ) =>+ Annotatable (a,b,c,d)+ where+ annotate info (a,b,c,d) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ , annotate (info ++ " (tuple element 3)") c+ , annotate (info ++ " (tuple element 4)") d+ )++instance+ ( Annotatable a+ , Annotatable b+ , Annotatable c+ , Annotatable d+ , Annotatable e+ ) =>+ Annotatable (a,b,c,d,e)+ where+ annotate info (a,b,c,d,e) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ , annotate (info ++ " (tuple element 3)") c+ , annotate (info ++ " (tuple element 4)") d+ , annotate (info ++ " (tuple element 5)") e+ )++instance+ ( Annotatable a+ , Annotatable b+ , Annotatable c+ , Annotatable d+ , Annotatable e+ , Annotatable f+ ) =>+ Annotatable (a,b,c,d,e,f)+ where+ annotate info (a,b,c,d,e,f) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ , annotate (info ++ " (tuple element 3)") c+ , annotate (info ++ " (tuple element 4)") d+ , annotate (info ++ " (tuple element 5)") e+ , annotate (info ++ " (tuple element 6)") f+ )++instance+ ( Annotatable a+ , Annotatable b+ , Annotatable c+ , Annotatable d+ , Annotatable e+ , Annotatable f+ , Annotatable g+ ) =>+ Annotatable (a,b,c,d,e,f,g)+ where+ annotate info (a,b,c,d,e,f,g) =+ ( annotate (info ++ " (tuple element 1)") a+ , annotate (info ++ " (tuple element 2)") b+ , annotate (info ++ " (tuple element 3)") c+ , annotate (info ++ " (tuple element 4)") d+ , annotate (info ++ " (tuple element 5)") e+ , annotate (info ++ " (tuple element 6)") f+ , annotate (info ++ " (tuple element 7)") g+ )+
+ src/Feldspar/Core/Interpretation.hs view
@@ -0,0 +1,489 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ConstraintKinds #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Defines different interpretations of Feldspar programs++module Feldspar.Core.Interpretation+ ( module Language.Syntactic.Constructs.Decoration+ , module Feldspar.Core.Interpretation.Typed++ , targetSpecialization+ , Sharable (..)+ , SizeProp (..)+ , sizePropDefault+ , resultType+ , SourceInfo+ , Info (..)+ , mkInfo+ , mkInfoTy+ , infoRange+ , LatticeSize1 (..)+ , viewLiteral+ , literalDecor+ , constFold+ , SomeInfo (..)+ , SomeType (..)+ , Env (..)+ , localVar+ , localSource+ , Opt+ , Optimize (..)+ , OptimizeSuper+ , constructFeat+ , optimizeM+ , optimize+ , constructFeatUnOptDefaultTyp+ , constructFeatUnOptDefault+ , optimizeFeatDefault+ , prjF+ , c'+ ) where++++import Control.Monad.Reader+import Data.Map as Map+import Data.Typeable (Typeable)++import Language.Syntactic+import Language.Syntactic.Constructs.Decoration+import Language.Syntactic.Constructs.Literal+import Language.Syntactic.Constructs.Binding+import Language.Syntactic.Constructs.Binding.HigherOrder++import Feldspar.Lattice+import Feldspar.Core.Types+import Feldspar.Core.Interpretation.Typed+++--------------------------------------------------------------------------------+-- * Target specialization+--------------------------------------------------------------------------------++-- | Specialize the program for a target platform with the given native bit+-- width+targetSpecialization :: BitWidth n -> ASTF dom a -> ASTF dom a+-- TODO targetSpecialization :: BitWidth n -> ASTF dom a -> ASTF dom (TargetType n a)+targetSpecialization _ = id++++--------------------------------------------------------------------------------+-- * Code motion+--------------------------------------------------------------------------------++-- | Indication whether a symbol is sharable or not+class Sharable dom+ where+ sharable :: dom a -> Bool+ sharable _ = True++instance (Sharable sub1, Sharable sub2) => Sharable (sub1 :+: sub2)+ where+ sharable (InjL a) = sharable a+ sharable (InjR a) = sharable a++instance Sharable sym => Sharable (sym :|| pred)+ where+ sharable (C' s) = sharable s++instance Sharable sym => Sharable (SubConstr2 c sym p1 p2)+ where+ sharable (SubConstr2 s) = sharable s++instance Sharable dom => Sharable (Decor Info dom)+ where+ sharable = sharable . decorExpr++instance Sharable Empty++++--------------------------------------------------------------------------------+-- * Size propagation+--------------------------------------------------------------------------------++-- | Forwards size propagation+class SizeProp feature+ where+ -- | Size propagation for a symbol given a list of argument sizes+ sizeProp :: feature a -> Args (WrapFull Info) a -> Size (DenResult a)++-- | Convenient default implementation of 'sizeProp'+sizePropDefault :: (Type (DenResult a))+ => feature a -> Args (WrapFull Info) a -> Size (DenResult a)+sizePropDefault _ _ = universal++--------------------------------------------------------------------------------+-- * Optimization and type/size inference+--------------------------------------------------------------------------------++-- | Compute a type representation of a symbol's result type+resultType :: Type (DenResult a) => c a -> TypeRep (DenResult a)+resultType _ = typeRep++data SomeType+ where+ SomeType :: TypeRep a -> SomeType++type VarInfo = Map VarId SomeType++-- | Information about the source code of an expression+type SourceInfo = String++-- | Type and size information of a Feldspar program+data Info a+ where+ Info+ :: Show (Size a)+ => { infoType :: TypeRep a+ , infoSize :: Size a+ , infoVars :: VarInfo+ , infoSource :: SourceInfo+ }+ -> Info a++instance Render Info+ where+ render i@(Info {}) = show (infoType i) ++ szStr ++ srcStr+ where+ szStr = case show (infoSize i) of+ "()" -> "" -- TODO AnySize+ str -> " | " ++ str++ srcStr = case infoSource i of+ "" -> ""+ src -> " | " ++ src++instance Eq (Size a) => Eq (Info a)+ where+ ia == ib = infoSize ia == infoSize ib+ -- TODO++mkInfo :: Type a => Size a -> Info a+mkInfo sz = Info typeRep sz Map.empty ""++mkInfoTy :: (Show (Size a), Lattice (Size a)) => TypeRep a -> Info a+mkInfoTy t = Info t universal Map.empty ""++infoRange :: Type a => Info a -> RangeSet a+infoRange = sizeToRange . infoSize++-- | This class is used to allow constructs to be abstract in the monad. Its+-- purpose is similar to that of 'MonadType'.+class LatticeSize1 m+ where+ mergeSize :: Lattice (Size a) =>+ Info (m a) -> Size (m a) -> Size (m a) -> Size (m a)+ -- TODO Is this class needed? See comment to `MonadType`.++instance LatticeSize1 Mut+ where+ mergeSize _ = (\/)++-- | 'Info' with hidden result type+data SomeInfo+ where+ SomeInfo :: Typeable a => Info a -> SomeInfo++data Env = Env+ { varEnv :: [(VarId, SomeInfo)]+ , sourceEnv :: SourceInfo+ }++-- | Initial environment+initEnv :: Env+initEnv = Env [] ""++-- | Insert a variable into the environment+localVar :: Typeable b => VarId -> Info b -> Opt a -> Opt a+localVar v info = local $ \env -> env {varEnv = (v, SomeInfo info):varEnv env}++-- | Change the 'SourceInfo' environment+localSource :: SourceInfo -> Opt a -> Opt a+localSource src = local $ \env -> env {sourceEnv = src}++-- | It the expression is a literal, its value is returned, otherwise 'Nothing'+viewLiteral :: forall info dom a. ((Literal :|| Type) :<: dom)+ => ASTF (Decor info (dom :|| Typeable)) a -> Maybe a+viewLiteral (prjF -> Just (C' (Literal a))) = Just a+viewLiteral _ = Nothing++prjF :: Project (sub :|| Type) sup => sup sig -> Maybe ((sub :|| Type) sig)+prjF = prj++-- | Construct a 'Literal' decorated with 'Info'+literalDecorSrc :: (Type a, (Literal :|| Type) :<: dom) =>+ SourceInfo -> a -> ASTF (Decor Info (dom :|| Typeable)) a+literalDecorSrc src a = Sym $ Decor+ ((mkInfo (sizeOf a)) {infoSource = src})+ (C' $ inj $ c' $ Literal a)++c' :: (Type (DenResult sig)) => feature sig -> (feature :|| Type) sig+c' = C'++-- | Construct a 'Literal' decorated with 'Info'+literalDecor :: (Type a, (Literal :|| Type) :<: dom) =>+ a -> ASTF (Decor Info (dom :|| Typeable)) a+literalDecor = literalDecorSrc ""+ -- Note: This function could get the 'SourceInfo' from the environment and+ -- insert it in the 'infoSource' field. But then it needs to be monadic which+ -- makes optimizations uglier.++-- | Replaces an expression with a literal if the type permits, otherwise+-- returns the expression unchanged.+constFold :: (Typed dom, (Literal :|| Type) :<: dom) =>+ SourceInfo -> ASTF (Decor Info (dom :|| Typeable)) a -> a -> ASTF (Decor Info (dom :|| Typeable)) a+constFold src expr a+ | Just Dict <- typeDict expr+ = literalDecorSrc src a+constFold _ expr _ = expr++-- | Environment for optimization+type Opt = Reader Env++-- | Basic optimization of a feature+--+-- This optimization is similar to 'Synt.Optimize', but it also performs size+-- inference. Size inference has to be done simultaneously with other+-- optimizations in order to avoid iterating the phases. (Size information may+-- help optimization and optimization may help size inference.)+class Optimize feature dom+ where+ -- | Top-down and bottom-up optimization of a feature+ optimizeFeat+ :: ( Typeable (DenResult a)+ , OptimizeSuper dom+ )+ => feature a+ -> Args (AST (dom :|| Typeable)) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+ optimizeFeat = optimizeFeatDefault++ -- | Optimized construction of an expression from a symbol and its optimized+ -- arguments+ --+ -- Note: This function should normally not be called directly. Instead, use+ -- 'constructFeat' which has more accurate propagation of 'Info'.+ constructFeatOpt+ :: ( Typeable (DenResult a))+ => feature a+ -> Args (AST (Decor Info (dom :|| Typeable))) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+ constructFeatOpt = constructFeatUnOpt++ -- | Unoptimized construction of an expression from a symbol and its+ -- optimized arguments+ constructFeatUnOpt+ :: ( Typeable (DenResult a))+ => feature a+ -> Args (AST (Decor Info (dom :|| Typeable))) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+++instance Optimize Empty dom+ where+ constructFeatUnOpt = error "Not implemented: constructFeatUnOpt for Empty"++-- These classes used to be super-classes of `Optimize`, but after switching to+-- GHC 7.4, that lead to looping dictionaries (at run time). The problem arises+-- when you make instances like+--+-- instance Optimize dom dom => Optimize MyConstruct dom+--+-- Since the second parameter does not change, this seems to create a loop+-- whenever you want to access super-class methods through a+-- `Optimize MyConstruct dom` constraint.+--+-- This may or may not be related to the following (unconfirmed) bug:+--+-- http://hackage.haskell.org/trac/ghc/ticket/5913+--+-- To revert the class hierarchy:+--+-- * Make `OptimizeSuper` (expanded) a super-class of `Optimize`+-- * Make `WitnessCons feature` a super-class of `Optimize`+-- * Replace the context of `optimizeFeat` with `Optimize dom dom`+-- * Replace all references to `OptimizeSuper dom` with `Optimize dom dom`+-- * Remove `OptimizeSuper`+class+ ( AlphaEq dom dom (dom :|| Typeable) [(VarId, VarId)]+ , AlphaEq dom dom (Decor Info (dom :|| Typeable)) [(VarId, VarId)]+ , EvalBind dom+ , (Literal :|| Type) :<: dom+ , Typed dom+ , Constrained dom+ , Optimize dom dom+ ) =>+ OptimizeSuper dom++instance+ ( AlphaEq dom dom (dom :|| Typeable) [(VarId, VarId)]+ , AlphaEq dom dom (Decor Info (dom :|| Typeable)) [(VarId, VarId)]+ , EvalBind dom+ , (Literal :|| Type) :<: dom+ , Typed dom+ , Constrained dom+ , Optimize dom dom+ ) =>+ OptimizeSuper dom++++-- TODO Optimization should throw an error when the size of a node is+-- over-constrained. It can only happen if there's a bug in the general+-- size inference, or if the user has stated invalid size constraints. In+-- both cases it may lead to incorrect optimizations, so throwing an error+-- seems preferable.++-- | Optimized construction of an expression from a symbol and its optimized+-- arguments+constructFeat :: ( Typeable (DenResult a)+ , Optimize feature dom)+ => feature a+ -> Args (AST (Decor Info (dom :|| Typeable))) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+constructFeat a args = do+ aUnOpt <- constructFeatUnOpt a args+ aOpt <- constructFeatOpt a args+ return $ updateDecor+ (\info -> info {infoSize = infoSize (getInfo aUnOpt)})+ aOpt+ -- This function uses `constructFeatOpt` for optimization and+ -- `constructFeatUnOpt` for size propagation. This is because+ -- `constructFeatOpt` may produce less accurate size information than+ -- `constructFeatUnOpt`.++ -- TODO It might be better to use `sizeProp` instead of `constructFeatUnOpt`+ -- (but this changes class dependencies a bit). Is there any other use of+ -- `constructFeatUnOpt`?++instance+ ( Optimize sub1 dom+ , Optimize sub2 dom+ ) =>+ Optimize (sub1 :+: sub2) dom+ where+ optimizeFeat (InjL a) = optimizeFeat a+ optimizeFeat (InjR a) = optimizeFeat a++ constructFeatOpt (InjL a) = constructFeatOpt a+ constructFeatOpt (InjR a) = constructFeatOpt a++ constructFeatUnOpt (InjL a) = constructFeatUnOpt a+ constructFeatUnOpt (InjR a) = constructFeatUnOpt a++-- | Optimization of an expression+--+-- In addition to running 'optimizeFeat', this function performs constant+-- folding on all closed expressions, provided that the type permits making a+-- literal.+optimizeM :: (OptimizeSuper dom)+ => ASTF (dom :|| Typeable) a -> Opt (ASTF (Decor Info (dom :|| Typeable)) a)+optimizeM a+ | Dict <- exprDict a+ = do+ aOpt <- matchTrans (\(C' x) -> optimizeFeat x) a+ let vars = infoVars $ getInfo aOpt+ value = evalBind aOpt+ src = infoSource $ getInfo aOpt+ -- return aOpt+ if Map.null vars+ then return $ constFold src aOpt value+ else return aOpt+ -- TODO singleton range --> literal+ -- literal --> singleton range++-- | Optimization of an expression. This function runs 'optimizeM' and extracts+-- the result.+optimize :: ( Typeable a+ , OptimizeSuper dom+ )+ => ASTF (dom :|| Typeable) a -> ASTF (Decor Info (dom :|| Typeable)) a+optimize = flip runReader initEnv . optimizeM++-- | Convenient default implementation of 'constructFeatUnOpt'. Uses 'sizeProp'+-- to propagate size.+constructFeatUnOptDefaultTyp+ :: ( feature :<: dom+ , SizeProp feature+ , Typeable (DenResult a)+ , Show (Size (DenResult a))+ )+ => TypeRep (DenResult a)+ -> feature a+ -> Args (AST (Decor Info (dom :|| Typeable))) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+constructFeatUnOptDefaultTyp typ feat args+ = do+ src <- asks sourceEnv+ let sz = sizeProp feat $ mapArgs (WrapFull . getInfo) args+ vars = Map.unions $ listArgs (infoVars . getInfo) args+ return $ appArgs (Sym $ Decor (Info typ sz vars src) $ C' $ inj feat) args++-- | Like 'constructFeatUnOptDefaultTyp' but without an explicit 'TypeRep'+constructFeatUnOptDefault+ :: ( feature :<: dom+ , SizeProp feature+ , Type (DenResult a)+ )+ => feature a+ -> Args (AST (Decor Info (dom :|| Typeable))) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+constructFeatUnOptDefault feat args+ = do+ src <- asks sourceEnv+ let sz = sizeProp feat $ mapArgs (WrapFull . getInfo) args+ vars = Map.unions $ listArgs (infoVars . getInfo) args+ return $ appArgs (Sym $ Decor (Info typeRep sz vars src) $ C' $ inj feat) args++-- | Convenient default implementation of 'optimizeFeat'+optimizeFeatDefault+ :: ( Optimize feature dom+ , Typeable (DenResult a)+ , OptimizeSuper dom+ )+ => feature a+ -> Args (AST (dom :|| Typeable)) a+ -> Opt (ASTF (Decor Info (dom :|| Typeable)) (DenResult a))+optimizeFeatDefault feat args+ = constructFeat feat =<< mapArgsM optimizeM args+
+ src/Feldspar/Core/Interpretation/Typed.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverlappingInstances #-}++-- | Witness 'Type' constraints++module Feldspar.Core.Interpretation.Typed+ ( Typed(..)+ , typeDict+ )+where++import Language.Syntactic+import Language.Syntactic.Constructs.Binding.HigherOrder+import Language.Syntactic.Constructs.Decoration++import Feldspar.Core.Types (Type)++-- | Class representing a possible dictionary to witness a 'Type'+-- constraint.+class Typed dom+ where+ typeDictSym :: dom a -> Maybe (Dict (Type (DenResult a)))+ typeDictSym _ = Nothing++instance Typed (sub :|| Type)+ where typeDictSym (C' _) = Just Dict++instance Typed sub => Typed (sub :|| pred)+ where typeDictSym (C' s) = typeDictSym s++instance Typed sub => Typed (sub :| pred)+ where typeDictSym (C s) = typeDictSym s++instance Typed (SubConstr2 c sub Type Top)+ where typeDictSym (SubConstr2 s) = Nothing++instance (Typed sub, Typed sup) => Typed (sub :+: sup)+ where typeDictSym (InjL s) = typeDictSym s+ typeDictSym (InjR s) = typeDictSym s++instance (Typed sub) => Typed (Decor info sub)+ where typeDictSym (Decor _ s) = typeDictSym s++instance Typed Empty+instance Typed dom++-- | Extract a possible 'Type' constraint witness from an 'AST'+typeDict :: Typed dom => ASTF dom a -> Maybe (Dict (Type a))+typeDict = simpleMatch (const . typeDictSym)+
+ src/Feldspar/Core/Types.hs view
@@ -0,0 +1,863 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++--+-- Copyright (c) 2009-2011, 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.Core.Types where++++import Data.Array.IO+import Data.Bits+import Data.Complex+import Data.Int+import Data.IORef+import Data.List+import Data.Typeable (Typeable, Typeable1)+import Data.Word+import Test.QuickCheck+import qualified Control.Monad.Par as MonadPar++import Data.Patch++import Data.Proxy++import Language.Syntactic++import Feldspar.Lattice+import Feldspar.Range++++--------------------------------------------------------------------------------+-- * Heterogenous lists+--------------------------------------------------------------------------------++-- | Heterogeneous list+data a :> b = a :> b+ deriving (Eq, Ord, Show)++infixr 5 :>++instance (Lattice a, Lattice b) => Lattice (a :> b)+ where+ empty = empty :> empty+ universal = universal :> universal+ (a1:>a2) \/ (b1:>b2) = (a1 \/ b1) :> (a2 \/ b2)+ (a1:>a2) /\ (b1:>b2) = (a1 /\ b1) :> (a2 /\ b2)++++--------------------------------------------------------------------------------+-- * Integers+--------------------------------------------------------------------------------++-- | Target-dependent unsigned integers+newtype WordN = WordN Word32+ deriving+ ( Eq, Ord, Num, Enum, Ix, Real, Integral, Bits, Bounded, Typeable+ , Arbitrary )++-- | Target-dependent signed integers+newtype IntN = IntN Int32+ deriving+ ( Eq, Ord, Num, Enum, Ix, Real, Integral, Bits, Bounded, Typeable+ , Arbitrary )++instance Show WordN+ where+ show (WordN a) = show a++instance Show IntN+ where+ show (IntN a) = show a++-- | Type representation of 8 bits+data N8++-- | Type representation of 16 bits+data N16++-- | Type representation of 32 bits+data N32++-- | Type representation of 64 bits+data N64++-- | Type representation of the native number of bits on the target+data NNative++-- | Witness for 'N8', 'N16', 'N32', 'N64' or 'NNative'+data BitWidth n+ where+ N8 :: BitWidth N8+ N16 :: BitWidth N16+ N32 :: BitWidth N32+ N64 :: BitWidth N64+ NNative :: BitWidth NNative++bitWidth :: BitWidth n -> String+bitWidth N8 = "8"+bitWidth N16 = "16"+bitWidth N32 = "32"+bitWidth N64 = "64"+bitWidth NNative = "N"++-- | Type representation of \"unsigned\"+data U++-- | Type representation of \"signed\"+data S++-- | Witness for 'U' or 'S'+data Signedness s+ where+ U :: Signedness U+ S :: Signedness S++signedness :: Signedness s -> String+signedness U = "Word"+signedness S = "Int"++-- | A generalization of unsigned and signed integers. The first parameter+-- represents the signedness and the sectond parameter the number of bits.+type family GenericInt s n+type instance GenericInt U N8 = Word8+type instance GenericInt S N8 = Int8+type instance GenericInt U N16 = Word16+type instance GenericInt S N16 = Int16+type instance GenericInt U N32 = Word32+type instance GenericInt S N32 = Int32+type instance GenericInt U N64 = Word64+type instance GenericInt S N64 = Int64+type instance GenericInt U NNative = WordN+type instance GenericInt S NNative = IntN++type family WidthOf a+type instance WidthOf Word8 = N8+type instance WidthOf Int8 = N8+type instance WidthOf Word16 = N16+type instance WidthOf Int16 = N16+type instance WidthOf Word32 = N32+type instance WidthOf Int32 = N32+type instance WidthOf Word64 = N64+type instance WidthOf Int64 = N64+type instance WidthOf WordN = NNative+type instance WidthOf IntN = NNative++type family SignOf a+type instance SignOf Word8 = U+type instance SignOf Int8 = S+type instance SignOf Word16 = U+type instance SignOf Int16 = S+type instance SignOf Word32 = U+type instance SignOf Int32 = S+type instance SignOf Word64 = U+type instance SignOf Int64 = S+type instance SignOf WordN = U+type instance SignOf IntN = S++fromWordN :: BitWidth n -> WordN -> GenericInt U n+fromWordN N8 = fromInteger . toInteger+fromWordN N16 = fromInteger . toInteger+fromWordN N32 = fromInteger . toInteger+fromWordN N64 = fromInteger . toInteger+fromWordN NNative = id+ -- TODO Check that the number fits++fromIntN :: BitWidth n -> IntN -> GenericInt S n+fromIntN N8 = fromInteger . toInteger+fromIntN N16 = fromInteger . toInteger+fromIntN N32 = fromInteger . toInteger+fromIntN N64 = fromInteger . toInteger+fromIntN NNative = id+ -- TODO Check that the number fits++genericLen :: BitWidth n -> [a] -> GenericInt U n+genericLen N8 = genericLength+genericLen N16 = genericLength+genericLen N32 = genericLength+genericLen N64 = genericLength+genericLen NNative = genericLength++type Length = WordN+type Index = WordN++++--------------------------------------------------------------------------------+-- * Arrays+--------------------------------------------------------------------------------++-- | Array whose length is represented by an @n@-bit word+data TargetArr n a = TargetArr (GenericInt U n) [a]+++--------------------------------------------------------------------------------+-- * Monadic Types+--------------------------------------------------------------------------------++-- | This class is used to allow constructs to be abstract in the monad+class MonadType m+ where+ voidTypeRep :: TypeRep (m ())+ -- TODO Since the `Mut` monad is already abstract, this class is probably only+ -- needed if we want to be able to use monadic constructs with different+ -- monad types.++++--------------------------------------------------------------------------------+-- * Mutable data+--------------------------------------------------------------------------------++-- TODO Make newtypes?++-- | Monad for manipulation of mutable data+type Mut = IO++-- | Mutable references+instance Show (IORef a)+ where+ show _ = "IORef"++-- | Mutable arrays+type MArr a = IOArray Index a++instance Show (MArr a)+ where+ show _ = "MArr"++instance MonadType Mut+ where+ voidTypeRep = MutType UnitType+++--------------------------------------------------------------------------------+-- * Par Monad+--------------------------------------------------------------------------------++-- | Monad for parallel constructs+type Par = MonadPar.Par++deriving instance Typeable1 Par++-- | Immutable references+type IV = MonadPar.IVar++deriving instance Typeable1 IV++instance Show (IV a)+ where+ show _ = "IVar"++instance Eq (IV a)+ where+ _ == _ = False++instance MonadType Par+ where+ voidTypeRep = ParType UnitType++--------------------------------------------------------------------------------+-- * Future values+--------------------------------------------------------------------------------++newtype FVal a = FVal {unFVal :: a}++deriving instance Typeable1 FVal++instance Show (FVal a)+ where+ show _ = "future"++instance Eq a => Eq (FVal a)+ where+ (FVal a) == (FVal b) = a == b+++--------------------------------------------------------------------------------+-- * Type representation+--------------------------------------------------------------------------------++-- | Representation of supported types+data TypeRep a+ where+ UnitType :: TypeRep ()+ BoolType :: TypeRep Bool+ IntType :: ( BoundedInt (GenericInt s n)+ , Size (GenericInt s n) ~ Range (GenericInt s n)+ ) =>+ Signedness s -> BitWidth n -> TypeRep (GenericInt s n)+ FloatType :: TypeRep Float+ ComplexType :: RealFloat a => TypeRep a -> TypeRep (Complex a)+ ArrayType :: TypeRep a -> TypeRep [a]+ TargetArrType :: BitWidth n -> TypeRep a -> TypeRep (TargetArr n a)+ Tup2Type :: TypeRep a -> TypeRep b -> TypeRep (a,b)+ Tup3Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep (a,b,c)+ Tup4Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep (a,b,c,d)+ Tup5Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep (a,b,c,d,e)+ Tup6Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep f -> TypeRep (a,b,c,d,e,f)+ Tup7Type :: TypeRep a -> TypeRep b -> TypeRep c -> TypeRep d -> TypeRep e -> TypeRep f -> TypeRep g -> TypeRep (a,b,c,d,e,f,g)+ FunType :: TypeRep a -> TypeRep b -> TypeRep (a -> b)+ MutType :: TypeRep a -> TypeRep (Mut a)+ RefType :: TypeRep a -> TypeRep (IORef a)+ MArrType :: TypeRep a -> TypeRep (MArr a)+ ParType :: TypeRep a -> TypeRep (Par a)+ IVarType :: TypeRep a -> TypeRep (IV a)+ FValType :: TypeRep a -> TypeRep (FVal a)+ -- TODO `MArrType` Should have a target-specialized version. Or perhaps+ -- use a single type with a flag to distinguish between immutable and+ -- mutable arrays.++instance Show (TypeRep a)+ where+ show UnitType = "()"+ show BoolType = "Bool"+ show (IntType s n) = signedness s ++ bitWidth n+ show FloatType = "Float"+ show (ComplexType t) = "(Complex " ++ show t ++ ")"+ show (ArrayType t) = "[" ++ show t ++ "]"+ show (TargetArrType _ t) = "[" ++ show t ++ "]"+ show (Tup2Type ta tb) = showTup [show ta, show tb]+ show (Tup3Type ta tb tc) = showTup [show ta, show tb, show tc]+ show (Tup4Type ta tb tc td) = showTup [show ta, show tb, show tc, show td]+ show (Tup5Type ta tb tc td te) = showTup [show ta, show tb, show tc, show td, show te]+ show (Tup6Type ta tb tc td te tf) = showTup [show ta, show tb, show tc, show td, show te, show tf]+ show (Tup7Type ta tb tc td te tf tg) = showTup [show ta, show tb, show tc, show td, show te, show tf, show tg]+ show (FunType ta tb) = show ta ++ " -> " ++ show tb+ show (MutType ta) = unwords ["Mut", show ta]+ show (RefType ta) = unwords ["Ref", show ta]+ show (MArrType ta) = unwords ["MArr", show ta]+ show (ParType ta) = unwords ["Par", show ta]+ show (IVarType ta) = unwords ["IVar", show ta]+ show (FValType ta) = unwords ["FVal", show ta]++argType :: TypeRep (a -> b) -> TypeRep a+argType (FunType ta _) = ta++resType :: TypeRep (a -> b) -> TypeRep b+resType (FunType _ tb) = tb++-- | Type equality witness+data TypeEq a b+ where+ TypeEq :: TypeEq a a++defaultSize :: TypeRep a -> Size a+defaultSize UnitType = universal+defaultSize BoolType = universal+defaultSize (IntType _ _) = universal+defaultSize FloatType = universal+defaultSize (ComplexType _) = universal+defaultSize (ArrayType t) = universal :> defaultSize t+--defaultSize (TargetArrType n t) = universal :> defaultSize t -- TODO+defaultSize (Tup2Type ta tb) = ( defaultSize ta+ , defaultSize tb+ )+defaultSize (Tup3Type ta tb tc) = ( defaultSize ta+ , defaultSize tb+ , defaultSize tc+ )+defaultSize (Tup4Type ta tb tc td) = ( defaultSize ta+ , defaultSize tb+ , defaultSize tc+ , defaultSize td+ )+defaultSize (Tup5Type ta tb tc td te) = ( defaultSize ta+ , defaultSize tb+ , defaultSize tc+ , defaultSize td+ , defaultSize te+ )+defaultSize (Tup6Type ta tb tc td te tf) = ( defaultSize ta+ , defaultSize tb+ , defaultSize tc+ , defaultSize td+ , defaultSize te+ , defaultSize tf+ )+defaultSize (Tup7Type ta tb tc td te tf tg) = ( defaultSize ta+ , defaultSize tb+ , defaultSize tc+ , defaultSize td+ , defaultSize te+ , defaultSize tf+ , defaultSize tg+ )+defaultSize (FunType _ tb) = defaultSize tb+defaultSize (MutType ta) = defaultSize ta+defaultSize (RefType ta) = defaultSize ta+defaultSize (MArrType ta) = universal :> defaultSize ta+defaultSize (ParType ta) = defaultSize ta+defaultSize (IVarType ta) = defaultSize ta+defaultSize (FValType ta) = defaultSize ta++-- | Type equality on 'Signedness'+signEq :: Signedness s1 -> Signedness s2 -> Maybe (TypeEq s1 s2)+signEq U U = Just TypeEq+signEq S S = Just TypeEq+signEq _ _ = Nothing++-- | Type equality on 'BitWidth'+widthEq :: BitWidth n1 -> BitWidth n2 -> Maybe (TypeEq n1 n2)+widthEq N8 N8 = Just TypeEq+widthEq N16 N16 = Just TypeEq+widthEq N32 N32 = Just TypeEq+widthEq N64 N64 = Just TypeEq+widthEq NNative NNative = Just TypeEq+widthEq _ _ = Nothing++-- | Type equality on 'TypeRep'+typeEq :: TypeRep a -> TypeRep b -> Maybe (TypeEq a b)+typeEq UnitType UnitType = Just TypeEq+typeEq BoolType BoolType = Just TypeEq+typeEq (IntType s1 n1) (IntType s2 n2) = do+ TypeEq <- signEq s1 s2+ TypeEq <- widthEq n1 n2+ return TypeEq+typeEq FloatType FloatType = Just TypeEq+typeEq (ComplexType t1) (ComplexType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (ArrayType t1) (ArrayType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (TargetArrType n1 t1) (TargetArrType n2 t2) = do+ TypeEq <- widthEq n1 n2+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (Tup2Type a1 b1) (Tup2Type a2 b2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ return TypeEq+typeEq (Tup3Type a1 b1 c1) (Tup3Type a2 b2 c2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ TypeEq <- typeEq c1 c2+ return TypeEq+typeEq (Tup4Type a1 b1 c1 d1) (Tup4Type a2 b2 c2 d2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ TypeEq <- typeEq c1 c2+ TypeEq <- typeEq d1 d2+ return TypeEq+typeEq (Tup5Type a1 b1 c1 d1 e1) (Tup5Type a2 b2 c2 d2 e2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ TypeEq <- typeEq c1 c2+ TypeEq <- typeEq d1 d2+ TypeEq <- typeEq e1 e2+ return TypeEq+typeEq (Tup6Type a1 b1 c1 d1 e1 f1) (Tup6Type a2 b2 c2 d2 e2 f2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ TypeEq <- typeEq c1 c2+ TypeEq <- typeEq d1 d2+ TypeEq <- typeEq e1 e2+ TypeEq <- typeEq f1 f2+ return TypeEq+typeEq (Tup7Type a1 b1 c1 d1 e1 f1 g1) (Tup7Type a2 b2 c2 d2 e2 f2 g2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ TypeEq <- typeEq c1 c2+ TypeEq <- typeEq d1 d2+ TypeEq <- typeEq e1 e2+ TypeEq <- typeEq f1 f2+ TypeEq <- typeEq g1 g2+ return TypeEq+typeEq (FunType a1 b1) (FunType a2 b2) = do+ TypeEq <- typeEq a1 a2+ TypeEq <- typeEq b1 b2+ return TypeEq+typeEq (MutType t1) (MutType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (RefType t1) (RefType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (MArrType a1) (MArrType a2) = do+ TypeEq <- typeEq a1 a2+ return TypeEq+typeEq (ParType t1) (ParType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (IVarType t1) (IVarType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq+typeEq (FValType t1) (FValType t2) = do+ TypeEq <- typeEq t1 t2+ return TypeEq++typeEq _ _ = Nothing++showTup :: [String] -> String+showTup as = "(" ++ intercalate "," as ++ ")"++type family TargetType n a+type instance TargetType n () = ()+type instance TargetType n Bool = Bool+type instance TargetType n Word8 = Word8+type instance TargetType n Int8 = Int8+type instance TargetType n Word16 = Word16+type instance TargetType n Int16 = Int16+type instance TargetType n Word32 = Word32+type instance TargetType n Int32 = Int32+type instance TargetType n Word64 = Word64+type instance TargetType n Int64 = Int64+type instance TargetType n WordN = GenericInt U n+type instance TargetType n IntN = GenericInt S n+type instance TargetType n Float = Float+type instance TargetType n (Complex a) = Complex (TargetType n a)+type instance TargetType n [a] = TargetArr n (TargetType n a)+type instance TargetType n (a,b) = (TargetType n a, TargetType n b)+type instance TargetType n (a,b,c) = (TargetType n a, TargetType n b, TargetType n c)+type instance TargetType n (a,b,c,d) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d)+type instance TargetType n (a,b,c,d,e) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e)+type instance TargetType n (a,b,c,d,e,f) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e, TargetType n f)+type instance TargetType n (a,b,c,d,e,f,g) = (TargetType n a, TargetType n b, TargetType n c, TargetType n d, TargetType n e, TargetType n f, TargetType n g)+type instance TargetType n (IORef a) = IORef (TargetType n a)+type instance TargetType n (MArr a) = MArr (TargetType n a)+type instance TargetType n (IV a) = IV (TargetType n a)+type instance TargetType n (FVal a) = FVal (TargetType n a)++-- | The set of supported types+class (Eq a, Show a, Typeable a, Show (Size a), Lattice (Size a)) => Type a+ where+ -- | Gives the type representation a value.+ typeRep :: TypeRep a+ sizeOf :: a -> Size a+ toTarget :: BitWidth n -> a -> TargetType n a+ -- TODO Typeable needed?++instance Type () where typeRep = UnitType; sizeOf _ = AnySize; toTarget _ = id+instance Type Bool where typeRep = BoolType; sizeOf _ = AnySize; toTarget _ = id+instance Type Word8 where typeRep = IntType U N8; sizeOf = singletonRange; toTarget _ = id+instance Type Int8 where typeRep = IntType S N8; sizeOf = singletonRange; toTarget _ = id+instance Type Word16 where typeRep = IntType U N16; sizeOf = singletonRange; toTarget _ = id+instance Type Int16 where typeRep = IntType S N16; sizeOf = singletonRange; toTarget _ = id+instance Type Word32 where typeRep = IntType U N32; sizeOf = singletonRange; toTarget _ = id+instance Type Int32 where typeRep = IntType S N32; sizeOf = singletonRange; toTarget _ = id+instance Type Word64 where typeRep = IntType U N64; sizeOf = singletonRange; toTarget _ = id+instance Type Int64 where typeRep = IntType S N64; sizeOf = singletonRange; toTarget _ = id+instance Type WordN where typeRep = IntType U NNative; sizeOf = singletonRange; toTarget = fromWordN+instance Type IntN where typeRep = IntType S NNative; sizeOf = singletonRange; toTarget = fromIntN+instance Type Float where typeRep = FloatType; sizeOf _ = AnySize; toTarget _ = id++instance (Type a, RealFloat a) => Type (Complex a)+ where+ typeRep = ComplexType typeRep+ sizeOf _ = AnySize+ toTarget _ (_ :+ _) = error "TODO" -- toTarget n r :+ toTarget n i++instance Type a => Type [a]+ where+ typeRep = ArrayType typeRep+ sizeOf as = singletonRange (genericLength as) :> unions (map sizeOf as)+ toTarget n as = TargetArr (genericLen n as) $ map (toTarget n) as++instance (Type a, Type b) => Type (a,b)+ where+ typeRep = Tup2Type typeRep typeRep++ sizeOf (a,b) =+ ( sizeOf a+ , sizeOf b+ )++ toTarget n (a,b) =+ ( toTarget n a+ , toTarget n b+ )++instance (Type a, Type b, Type c) => Type (a,b,c)+ where+ typeRep = Tup3Type typeRep typeRep typeRep++ sizeOf (a,b,c) =+ ( sizeOf a+ , sizeOf b+ , sizeOf c+ )++ toTarget n (a,b,c) =+ ( toTarget n a+ , toTarget n b+ , toTarget n c+ )++instance (Type a, Type b, Type c, Type d) => Type (a,b,c,d)+ where+ typeRep = Tup4Type typeRep typeRep typeRep typeRep++ sizeOf (a,b,c,d) =+ ( sizeOf a+ , sizeOf b+ , sizeOf c+ , sizeOf d+ )++ toTarget n (a,b,c,d) =+ ( toTarget n a+ , toTarget n b+ , toTarget n c+ , toTarget n d+ )++instance (Type a, Type b, Type c, Type d, Type e) => Type (a,b,c,d,e)+ where+ typeRep = Tup5Type typeRep typeRep typeRep typeRep typeRep++ sizeOf (a,b,c,d,e) =+ ( sizeOf a+ , sizeOf b+ , sizeOf c+ , sizeOf d+ , sizeOf e+ )++ toTarget n (a,b,c,d,e) =+ ( toTarget n a+ , toTarget n b+ , toTarget n c+ , toTarget n d+ , toTarget n e+ )++instance (Type a, Type b, Type c, Type d, Type e, Type f) => Type (a,b,c,d,e,f)+ where+ typeRep = Tup6Type typeRep typeRep typeRep typeRep typeRep typeRep++ sizeOf (a,b,c,d,e,f) =+ ( sizeOf a+ , sizeOf b+ , sizeOf c+ , sizeOf d+ , sizeOf e+ , sizeOf f+ )++ toTarget n (a,b,c,d,e,f) =+ ( toTarget n a+ , toTarget n b+ , toTarget n c+ , toTarget n d+ , toTarget n e+ , toTarget n f+ )++instance (Type a, Type b, Type c, Type d, Type e, Type f, Type g) => Type (a,b,c,d,e,f,g)+ where+ typeRep = Tup7Type typeRep typeRep typeRep typeRep typeRep typeRep typeRep++ sizeOf (a,b,c,d,e,f,g) =+ ( sizeOf a+ , sizeOf b+ , sizeOf c+ , sizeOf d+ , sizeOf e+ , sizeOf f+ , sizeOf g+ )++ toTarget n (a,b,c,d,e,f,g) =+ ( toTarget n a+ , toTarget n b+ , toTarget n c+ , toTarget n d+ , toTarget n e+ , toTarget n f+ , toTarget n g+ )++instance (Type a, Show (IORef a)) => Type (IORef a)+ where+ typeRep = RefType typeRep++ sizeOf _ = universal++ toTarget = error "toTarget: IORef" -- TODO Requires IO++instance Type a => Type (MArr a)+ where+ typeRep = MArrType typeRep++ sizeOf _ = universal++ toTarget = error "toTarget: MArr" -- TODO Requires IO++instance Type a => Type (IV a)+ where+ typeRep = IVarType typeRep++ sizeOf _ = universal++ toTarget = error "toTarget: IVar" -- TODO Requires IO++instance Type a => Type (FVal a)+ where+ typeRep = FValType typeRep++ sizeOf _ = universal++ toTarget = error "toTarget: FVal" -- TODO++++typeRepByProxy :: Type a => Proxy a -> TypeRep a+typeRepByProxy _ = typeRep++++--------------------------------------------------------------------------------+-- * Sized types+--------------------------------------------------------------------------------++data AnySize = AnySize+ deriving (Eq, Show, Ord)++anySizeFun :: AnySize -> AnySize+anySizeFun AnySize = AnySize++anySizeFun2 :: AnySize -> AnySize -> AnySize+anySizeFun2 AnySize AnySize = AnySize++instance Num AnySize+ where+ fromInteger _ = AnySize+ abs = anySizeFun+ signum = anySizeFun+ (+) = anySizeFun2+ (-) = anySizeFun2+ (*) = anySizeFun2++instance Lattice AnySize+ where+ empty = AnySize+ universal = AnySize+ (\/) = anySizeFun2+ (/\) = anySizeFun2++type family Size a++type instance Size () = AnySize+type instance Size Bool = AnySize+type instance Size Word8 = Range Word8+type instance Size Int8 = Range Int8+type instance Size Word16 = Range Word16+type instance Size Int16 = Range Int16+type instance Size Word32 = Range Word32+type instance Size Int32 = Range Int32+type instance Size Word64 = Range Word64+type instance Size Int64 = Range Int64+type instance Size WordN = Range WordN+type instance Size IntN = Range IntN+type instance Size Float = AnySize+type instance Size (Complex a) = AnySize+type instance Size [a] = Range Length :> Size a+type instance Size (TargetArr n a) = Range (GenericInt U n) :> Size a+type instance Size (a,b) = (Size a, Size b)+type instance Size (a,b,c) = (Size a, Size b, Size c)+type instance Size (a,b,c,d) = (Size a, Size b, Size c, Size d)+type instance Size (a,b,c,d,e) = (Size a, Size b, Size c, Size d, Size e)+type instance Size (a,b,c,d,e,f) = (Size a, Size b, Size c, Size d, Size e, Size f)+type instance Size (a,b,c,d,e,f,g) = (Size a, Size b, Size c, Size d, Size e, Size f, Size g)+type instance Size (a -> b) = Size b+type instance Size (Mut a) = Size a+type instance Size (IORef a) = Size a+type instance Size (MArr a) = Range Length :> Size a+type instance Size (Par a) = Size a+type instance Size (IV a) = Size a+type instance Size (FVal a) = Size a++-- Note: The instance+--+-- Size (a -> b) = Size b+--+-- might seem strange. In general, the size of a function result depends on the+-- size of the argument, so it might be more natural to have+--+-- Size (a -> b) = Size a -> Size b+--+-- However, this doesn't really work with the `optimize` function, since+-- optimization is done simultaneously with size inference, and the two+-- influence each other. The result of optimization is an optimized expression+-- decorated with a size. If the expression is of function type, the size of the+-- argument has to be provided before optimizing the function body. Yet, the+-- result will be decorated by a value of type `Size a -> Size b`, which+-- suggests that we do not yet know the size of the argument.+--+-- So instead, we represent the size of a function as the size of its result,+-- which means that the size of a function is only valid in a given context.++++-- | A generalization of 'Range' that serves two purposes: (1) Adding an extra+-- 'Universal' constructor to support unbounded types ('Range' can only+-- represent bounded ranges), and (2) pack a 'BoundedInt' constraint with the+-- 'RangeSet' constructor. This is what allows 'sizeToRange' to be defined as a+-- total function with 'Type' as the only constraint.+data RangeSet a+ where+ RangeSet :: BoundedInt a => Range a -> RangeSet a+ Universal :: RangeSet a++-- | Cast a 'Size' to a 'RangeSet'+sizeToRange :: forall a . Type a => Size a -> RangeSet a+sizeToRange sz = case typeRep :: TypeRep a of+ IntType _ _ -> RangeSet sz+ _ -> Universal+++tIntN :: Patch IntN IntN+tIntN = id++tWordN :: Patch WordN WordN+tWordN = id++tIndex :: Patch Index Index+tIndex = id++tLength :: Patch Length Length+tLength = id++tArr :: Patch a a -> Patch [a] [a]+tArr _ = id+
+ src/Feldspar/FixedPoint.hs view
@@ -0,0 +1,240 @@+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}+module Feldspar.FixedPoint+ ( Fix(..), Fixable(..)+ , freezeFix, freezeFix', unfreezeFix, unfreezeFix'+ , (?!), fixFold+ )+where++import qualified Prelude+import Feldspar hiding (sugar,desugar)+import Feldspar.Vector++import Language.Syntactic hiding (fold)++-- | Abstract real number type with exponent and mantissa+data Fix a =+ Fix+ { exponent :: Data IntN+ , mantissa :: Data a+ }+ deriving (Prelude.Eq,Prelude.Show)++instance+ ( Integral a+ , Bits a+ , Prelude.Real a+ ) => Num (Fix a)+ where+ fromInteger n = Fix 0 (Prelude.fromInteger n)+ (+) = fixAddition+ (*) = fixMultiplication+ negate = fixNegate+ abs = fixAbsolute+ signum = fixSignum++instance+ ( Integral a+ , Bits a+ , Prelude.Real a+ ) => Fractional (Fix a)+ where+ (/) = fixDiv'+ recip = fixRecip'+ fromRational = fixfromRational++fixAddition :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a -> Fix a+fixAddition f1@(Fix e1 _) f2@(Fix e2 _) = Fix e m+ where+ e = max e1 e2+ m = mantissa (fix e f1) + mantissa (fix e f2)++fixMultiplication :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a -> Fix a+fixMultiplication (Fix e1 m1) (Fix e2 m2) = Fix e m+ where+ e = e1 + e2+ m = m1 * m2++fixNegate :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a+fixNegate (Fix e1 m1) = Fix e1 m+ where+ m = negate m1++fixAbsolute :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a+fixAbsolute (Fix e1 m1) = Fix e1 m+ where+ m = abs m1++fixSignum :: (Integral a, Bits a, Prelude.Real a) => Fix a -> Fix a+fixSignum (Fix _ m1) = Fix 0 m+ where+ m = signum m1++fixDiv' :: (Integral a, Bits a, Prelude.Real a)+ => Fix a -> Fix a -> Fix a+fixDiv' (Fix e1 m1) (Fix e2 m2) = Fix e m+ where+ e = e1 - e2+ m = div m1 m2++fixRecip' :: forall a . (Integral a, Bits a, Prelude.Real a)+ => Fix a -> Fix a+fixRecip' (Fix e m) = Fix (e + value (wordLength (T :: T a) - 1)) (div sh m)+ where+ sh :: Data a+ sh = (1::Data a) .<<. value (fromInteger $ toInteger $ wordLength (T :: T a) - 1)++fixfromRational :: forall a . (Integral a) =>+ Prelude.Rational -> Fix a+fixfromRational inp = Fix e m+ where+ inpAsFloat :: Float+ inpAsFloat = fromRational inp+ intPart :: Float+ intPart = fromRational $ toRational $ Prelude.floor inpAsFloat+ intPartWidth :: IntN+ intPartWidth = Prelude.ceiling $ Prelude.logBase 2 intPart+ fracPartWith :: IntN+ fracPartWith = wordLength (T :: T a) - intPartWidth - 2+ m = value $ Prelude.floor $ inpAsFloat * 2.0 Prelude.** fromRational (toRational fracPartWith)+ e = negate $ value fracPartWith++instance (Type a) => Syntactic (Fix a) where+ type Domain (Fix a) = FeldDomainAll+ type Internal (Fix a) = (IntN, a)+ desugar = desugar . freezeFix+ sugar = unfreezeFix . sugar++instance (Type a) => Syntax (Fix a)++-- | Converts an abstract real number to a pair of exponent and mantissa+freezeFix :: (Type a) => Fix a -> (Data IntN,Data a)+freezeFix (Fix e m) = (e,m)++-- | Converts an abstract real number to fixed point integer with given exponent+freezeFix' :: (Bits a) => IntN -> Fix a -> Data a+freezeFix' e f = mantissa $ fix (value e) f++-- | Converts a pair of exponent and mantissa to an abstract real number+unfreezeFix :: (Type a) => (Data IntN, Data a) -> Fix a+unfreezeFix = uncurry Fix++-- | Converts a fixed point integer with given exponent to an abstract real number+unfreezeFix' :: IntN -> Data a -> Fix a+unfreezeFix' e = Fix (value e)++-- This function cannot be implemented now as we don't have access to range+-- information while building the tree anymore.+{-+significantBits :: forall a . (Type a, Num a, Ord a, Size a ~ Range a, Prelude.Real a) => Data a -> IntN+significantBits x = IntN $ fromInteger $ toInteger $ (Prelude.floor mf)+1+ where+ r :: Range a+ r = dataSize x+ m :: a+ m = Prelude.max (Prelude.abs $ lowerBound r) (Prelude.abs $ upperBound r)+ mf :: Float+ mf = logBase 2 $ fromRational $ toRational m+-}+{-+setSignificantBits :: forall a . (Type a, Num a, Ord a, Size a ~ Range a, Prelude.Real a) => a -> Data a -> Data a+setSignificantBits sb x = resizeData r x+ where+ r :: Range a+ r = Range 0 sb+-}+wordLength :: forall a . (Integral a, Prelude.Real a) => T a -> IntN+wordLength _ = Prelude.ceiling ( Prelude.logBase 2 $ fromRational $ toRational (maxBound :: a)) + 1++-- | Operations to get and set exponent+class (Splittable t) => Fixable t where+ fix :: Data IntN -> t -> t+ getExp :: t -> Data IntN++instance (Bits a) => Fixable (Fix a) where+ fix e' (Fix e m) = Fix e' $ e' > e ? (m .>>. i2n (e' - e), m .<<. i2n (e - e'))+ getExp = Feldspar.FixedPoint.exponent++instance Fixable (Data Float) where+ fix = const id+ getExp = const $ fromInteger $ toInteger $ Feldspar.exponent (0.0 :: Float)++data T a = T++-- | Operations to split data into dynamic and static parts+class (Syntax (Dynamic t)) => Splittable t where+ type Static t+ type Dynamic t+ store :: t -> (Static t, Dynamic t)+ retrieve :: (Static t, Dynamic t) -> t+ patch :: Static t -> t -> t+ common :: t -> t -> Static t++instance (Type a) => Splittable (Data a) where+ type Static (Data a) = ()+ type Dynamic (Data a) = Data a+ store x = ((),x)+ retrieve = snd+ patch = const id+ common _ _ = ()++instance (Bits a) => Splittable (Fix a) where+ type Static (Fix a) = Data IntN+ type Dynamic (Fix a) = Data a+ store f = (Feldspar.FixedPoint.exponent f, mantissa f)+ retrieve = uncurry Fix+ patch = fix+ common f g = max (Feldspar.FixedPoint.exponent f) (Feldspar.FixedPoint.exponent g)++-- | A version of vector fold for fixed point algorithms+fixFold :: forall a b . (Splittable a) => (a -> b -> a) -> a -> Vector b -> a+fixFold fun ini vec = retrieve (static, fold fun' ini' vec)+ where+ static = fst $ store ini+ ini' = snd $ store ini+ fun' st el = snd $ store $ patch static $ retrieve (static,st) `fun` el++-- | A version of branching for fixed point algorithms+infix 1 ?!+(?!) :: forall a . (Syntax a, Splittable a) => Data Bool -> (a,a) -> a+cond ?! (x,y) = retrieve (comm, cond ? (x',y'))+ where+ comm = common x y+ x' = snd $ store $ patch comm x+ y' = snd $ store $ patch comm y
+ src/Feldspar/Future.hs view
@@ -0,0 +1,41 @@+--+-- Copyright (c) 2009-2011, 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.Future where++import Feldspar+import Feldspar.Vector as V++withFuture :: (Syntax a, Syntax b)+ => a -> (Future a -> b) -> b+withFuture = share . future++withFutures :: (Syntax a, Syntax b)+ => Vector a -> (Vector (Future a) -> b) -> b+withFutures coll = share $ indexed (V.length coll) $ \i -> future $ coll!i+
+ src/Feldspar/Lattice.hs view
@@ -0,0 +1,198 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | General operations on sets++module Feldspar.Lattice where++++import Data.Lens.Common++++-- | Lattice types+class Eq a => Lattice a+ where+ empty :: a+ universal :: a+ -- | Union+ (\/) :: a -> a -> a+ -- | Intersection+ (/\) :: a -> a -> a++instance Lattice ()+ where+ empty = ()+ universal = ()+ () \/ () = ()+ () /\ () = ()++-- | Lattice product+instance (Lattice a, Lattice b) => Lattice (a,b)+ where+ empty = (empty,empty)+ universal = (universal,universal)+ (a1,a2) \/ (b1,b2) = (a1 \/ b1, a2 \/ b2)+ (a1,a2) /\ (b1,b2) = (a1 /\ b1, a2 /\ b2)++-- | Three-way product+instance (Lattice a, Lattice b, Lattice c) => Lattice (a,b,c)+ where+ empty = (empty,empty,empty)+ universal = (universal,universal,universal)+ (a1,a2,a3) \/ (b1,b2,b3) = (a1 \/ b1, a2 \/ b2, a3 \/ b3)+ (a1,a2,a3) /\ (b1,b2,b3) = (a1 /\ b1, a2 /\ b2, a3 /\ b3)++-- | Four-way product+instance (Lattice a, Lattice b, Lattice c, Lattice d) => Lattice (a,b,c,d)+ where+ empty = (empty,empty,empty,empty)+ universal = (universal,universal,universal,universal)+ (a1,a2,a3,a4) \/ (b1,b2,b3,b4) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4)+ (a1,a2,a3,a4) /\ (b1,b2,b3,b4) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4)++-- | Five-way product+instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e) => Lattice (a,b,c,d,e)+ where+ empty = (empty,empty,empty,empty,empty)+ universal = (universal,universal,universal,universal,universal)+ (a1,a2,a3,a4,a5) \/ (b1,b2,b3,b4,b5) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5)+ (a1,a2,a3,a4,a5) /\ (b1,b2,b3,b4,b5) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5)++-- | Six-way product+instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e, Lattice f) => Lattice (a,b,c,d,e,f)+ where+ empty = (empty,empty,empty,empty,empty,empty)+ universal = (universal,universal,universal,universal,universal,universal)+ (a1,a2,a3,a4,a5,a6) \/ (b1,b2,b3,b4,b5,b6) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5, a6 \/ b6)+ (a1,a2,a3,a4,a5,a6) /\ (b1,b2,b3,b4,b5,b6) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5, a6 /\ b6)++-- | Seven-way product+instance (Lattice a, Lattice b, Lattice c, Lattice d, Lattice e, Lattice f, Lattice g) => Lattice (a,b,c,d,e,f,g)+ where+ empty = (empty,empty,empty,empty,empty,empty,empty)+ universal = (universal,universal,universal,universal,universal,universal,universal)+ (a1,a2,a3,a4,a5,a6,a7) \/ (b1,b2,b3,b4,b5,b6,b7) = (a1 \/ b1, a2 \/ b2, a3 \/ b3, a4 \/ b4, a5 \/ b5, a6 \/ b6, a7 \/ b7)+ (a1,a2,a3,a4,a5,a6,a7) /\ (b1,b2,b3,b4,b5,b6,b7) = (a1 /\ b1, a2 /\ b2, a3 /\ b3, a4 /\ b4, a5 /\ b5, a6 /\ b6, a7 /\ b7)++-- | Accumulated union+unions :: Lattice a => [a] -> a+unions = foldr (\/) empty++-- | Accumulated intersection+intersections :: Lattice a => [a] -> a+intersections = foldr (/\) universal++++-- * Computing fixed points++-- | Generalization of 'fixedPoint' to functions whose argument and result+-- contain (i.e has a lens to) a common lattice+lensedFixedPoint :: Lattice lat =>+ Lens a lat -> Lens b lat -> (a -> b) -> (a -> b)+lensedFixedPoint aLens bLens f a+ | aLat == bLat = (bLens ^= aLat) b+ | otherwise = lensedFixedPoint aLens bLens f a'+ where+ aLat = a ^! aLens+ b = f a+ bLat = (b ^! bLens) \/ aLat+ a' = (aLens ^= bLat) a++-- | Generalization of 'indexedFixedPoint' to functions whose argument and+-- result contain (i.e has a lens to) a common lattice+lensedIndexedFixedPoint :: Lattice lat =>+ Lens a lat -> Lens b lat -> (Int -> a -> b) -> (a -> (b,Int))+lensedIndexedFixedPoint aLens bLens f = go 0+ where+ go i a+ | aLat == bLat = ((bLens ^= aLat) b, i)+ | otherwise = go (i+1) a'+ where+ aLat = a ^! aLens+ b = f i a+ bLat = (b ^! bLens) \/ aLat+ a' = (aLens ^= bLat) a++-- | Take the fixed point of a function. The second argument is an initial+-- element. A sensible default for the initial element is 'empty'.+--+-- The function is not required to be monotonic. It is made monotonic internally+-- by always taking the union of the result and the previous value.+fixedPoint :: Lattice a => (a -> a) -> a -> a+fixedPoint = lensedFixedPoint (iso id id) (iso id id)++-- | Much like 'fixedPoint' but keeps track of the number of iterations+-- in the fixed point iteration. Useful for defining widening operators.+indexedFixedPoint :: Lattice a => (Int -> a -> a) -> a -> (a,Int)+indexedFixedPoint = lensedIndexedFixedPoint (iso id id) (iso id id)++-- | The type of widening operators. A widening operator modifies a+-- function that is subject to fixed point analysis. A widening+-- operator introduces approximations in order to guarantee (fast)+-- termination of the fixed point analysis.+type Widening a = (Int -> a -> a) -> (Int -> a -> a)++-- | A widening operator which defaults to 'universal' when the number of+-- iterations goes over the specified value.+cutOffAt :: Lattice a => Int -> Widening a+cutOffAt n f i a | i >= n = universal+ | otherwise = f i a++-- | A bounded version of 'lensedFixedPoint'. It will always do at least one+-- iteration regardless of the provided bound (in order to return something of+-- the right type).+boundedLensedFixedPoint :: Lattice lat =>+ Int -> Lens a lat -> Lens b lat -> (a -> b) -> (a -> (b,Int))+boundedLensedFixedPoint n aLens bLens f = go 0+ where+ go i a+ | aLat == bLat = ((bLens ^= aLat) b, i)+ | i >= n-1 = ((bLens ^= universal) b, i)+ | otherwise = go (i+1) a'+ where+ aLat = a ^! aLens+ b = f a+ bLat = (b ^! bLens) \/ aLat+ a' = (aLens ^= bLat) a+ -- Note: This function achieves a similar effect to+ -- `indexedFixedPoint (cutOffAt n ...)`. The difference is that it works for+ -- lensed fixed points. It would be possible to define a version of `cutOffAt`+ -- that works for lensed fixed points, but such an operator would be less+ -- efficient since it would have to apply the argument function in the base+ -- case as well as the recursive case (in order to return something of the+ -- right type). This means that there would always be one extra unnecessary+ -- iteration. In particular, it would not be possible to get a meaningful+ -- result from performing a single iteration. To only perform a single+ -- iteration, the cut-off function would have to "fail" immediately, which+ -- means that the whole fixed point iteration would also "fail". (A+ -- single-iteration fixed point is an important special case as it avoids+ -- exponential blowup when performing several nested iterations.)+
+ src/Feldspar/Matrix.hs view
@@ -0,0 +1,222 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++-- | Operations on matrices (doubly-nested parallel vectors). All operations in+-- this module assume rectangular matrices.++module Feldspar.Matrix where++import qualified Prelude as P+import qualified Data.TypeLevel as TL++import Feldspar.Prelude+import Feldspar.Core+import Feldspar.Wrap+import Feldspar.Vector.Internal++++type Matrix a = Vector2 a++tMat :: Patch a a -> Patch (Matrix a) (Matrix a)+tMat = tVec2++++-- | Converts a matrix to a core array.+freezeMatrix :: Type a => Matrix a -> Data [[a]]+freezeMatrix = freezeVector . map freezeVector++-- | Converts a core array to a matrix.+thawMatrix :: Type a => Data [[a]] -> Matrix a+thawMatrix = map thawVector . thawVector++-- | Converts a core array to a matrix. The first length argument is the number+-- of rows (outer vector), and the second argument is the number of columns+-- (inner vector).+thawMatrix' :: Type a => Length -> Length -> Data [[a]] -> Matrix a+thawMatrix' y x = map (thawVector' x) . thawVector' y++-- | Constructs a matrix. The elements are stored in a core array.+matrix :: Type a => [[a]] -> Matrix a+matrix = value++-- | Constructing a matrix from an index function.+--+-- @indexedMat m n ixf@:+--+-- * @m@ is the number of rows.+--+-- * @n@ is the number of columns.+--+-- * @ifx@ is a function mapping indexes to elements (first argument is row+-- index; second argument is column index).+indexedMat+ :: Data Length+ -> Data Length+ -> (Data Index -> Data Index -> Data a)+ -> Matrix a+indexedMat m n idx = indexed m $ \k -> indexed n $ \l -> idx k l++-- | Transpose of a matrix. Assumes that the number of rows is > 0.+transpose :: Type a => Matrix a -> Matrix a+transpose a = indexedMat (length $ head a) (length a) $ \y x -> a ! x ! y+ -- TODO This assumes that (head a) can be used even if a is empty.++-- | Concatenates the rows of a matrix.+flatten :: Type a => Matrix a -> Vector (Data a)+flatten matr = Indexed (m*n) ixf Empty+ where+ m = length matr+ n = (m==0) ? (0, length (head matr))++ ixf i = matr ! y ! x+ where+ y = i `div` n+ x = i `mod` n+ -- TODO Should use linear indexing++-- | The diagonal vector of a square matrix. It happens to work if the number of+-- rows is less than the number of columns, but not the other way around (this+-- would require some overhead).+diagonal :: Type a => Matrix a -> Vector (Data a)+diagonal m = zipWith (!) m (0 ... (length m - 1))++distributeL :: (a -> b -> c) -> a -> Vector b -> Vector c+distributeL f = map . f++distributeR :: (a -> b -> c) -> Vector a -> b -> Vector c+distributeR = flip . distributeL . flip++++class Mul a b+ where+ type Prod a b++ -- | General multiplication operator+ (***) :: a -> b -> Prod a b++instance Numeric a => Mul (Data a) (Data a)+ where+ type Prod (Data a) (Data a) = Data a+ (***) = (*)++instance Numeric a => Mul (Data a) (Vector1 a)+ where+ type Prod (Data a) (Vector1 a) = Vector1 a+ (***) = distributeL (***)++instance Numeric a => Mul (Vector1 a) (Data a)+ where+ type Prod (Vector1 a) (Data a) = Vector1 a+ (***) = distributeR (***)++instance Numeric a => Mul (Data a) (Matrix a)+ where+ type Prod (Data a) (Matrix a) = Matrix a+ (***) = distributeL (***)++instance Numeric a => Mul (Matrix a) (Data a)+ where+ type Prod (Matrix a) (Data a) = Matrix a+ (***) = distributeR (***)++instance Numeric a => Mul (Vector1 a) (Vector1 a)+ where+ type Prod (Vector1 a) (Vector1 a) = Data a+ (***) = scalarProd++instance Numeric a => Mul (Vector1 a) (Matrix a)+ where+ type Prod (Vector1 a) (Matrix a) = (Vector1 a)+ vec *** mat = distributeL (***) vec (transpose mat)++instance Numeric a => Mul (Matrix a) (Vector1 a)+ where+ type Prod (Matrix a) (Vector1 a) = (Vector1 a)+ (***) = distributeR (***)++instance Numeric a => Mul (Matrix a) (Matrix a)+ where+ type Prod (Matrix a) (Matrix a) = (Matrix a)+ (***) = distributeR (***)++++-- | Matrix multiplication+mulMat :: Numeric a => Matrix a -> Matrix a -> Matrix a+mulMat = (***)++++class Syntax a => ElemWise a+ where+ type Scalar a++ -- | Operator for general element-wise multiplication+ elemWise :: (Scalar a -> Scalar a -> Scalar a) -> a -> a -> a++instance Type a => ElemWise (Data a)+ where+ type Scalar (Data a) = Data a+ elemWise = id++instance (ElemWise a, Syntax (Vector a)) => ElemWise (Vector a)+ where+ type Scalar (Vector a) = Scalar a+ elemWise = zipWith . elemWise++(.+) :: (ElemWise a, Num (Scalar a)) => a -> a -> a+(.+) = elemWise (+)++(.-) :: (ElemWise a, Num (Scalar a)) => a -> a -> a+(.-) = elemWise (-)++(.*) :: (ElemWise a, Num (Scalar a)) => a -> a -> a+(.*) = elemWise (*)++-- * Wrapping for matrices++instance (Type a) => Wrap (Matrix a) (Data [[a]]) where+ wrap = freezeMatrix++instance (Wrap t u, Type a, TL.Nat row, TL.Nat col) => Wrap (Matrix a -> t) (Data' (row,col) [[a]] -> u) where+ wrap f = \(Data' d) -> wrap $ f $ thawMatrix' row' col' d where+ row' = fromInteger $ toInteger $ TL.toInt (undefined :: row)+ col' = fromInteger $ toInteger $ TL.toInt (undefined :: col)+
+ src/Feldspar/Option.hs view
@@ -0,0 +1,121 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Option where++++import qualified Prelude+import Control.Monad++import Language.Syntactic++import Feldspar hiding (sugar,desugar,resugar)++++data Option a = Option { isSome :: Data Bool, fromSome :: a }++instance Syntax a => Syntactic (Option a)+ where+ type Domain (Option a) = FeldDomainAll+ type Internal (Option a) = (Bool, Internal a)+ desugar = desugar . desugarOption . fmap resugar+ sugar = fmap resugar . sugarOption . sugar++instance Syntax a => Syntax (Option a)++instance Functor Option+ where+ fmap f opt = opt {fromSome = f (fromSome opt)}++instance Monad Option+ where+ return = some+ a >>= f = b { isSome = isSome a ? (isSome b, false) }+ where+ b = f (fromSome a)++++-- | One-layer desugaring of 'Option'+desugarOption :: Type a => Option (Data a) -> Data (Bool,a)+desugarOption a = resugar (isSome a, fromSome a)++-- | One-layer sugaring of 'Option'+sugarOption :: Type a => Data (Bool,a) -> Option (Data a)+sugarOption (resugar -> (valid,a)) = Option valid a++some :: a -> Option a+some = Option true++none :: Syntax a => Option a+none = Option false (err "fromSome: none")++option :: Syntax b => b -> (a -> b) -> Option a -> b+option noneCase someCase opt = isSome opt ?+ ( someCase (fromSome opt)+ , noneCase+ )++oplus :: Syntax a => Option a -> Option a -> Option a+oplus a b = isSome a ? (a,b)++++--------------------------------------------------------------------------------+-- * Conditional choice operator+--------------------------------------------------------------------------------++-- http://zenzike.com/posts/2011-08-01-the-conditional-choice-operator++-- | Conditional choice operator. Can be used together with '<?' to write+-- guarded choices as follows:+--+-- > prog :: Data Index -> Data Index+-- > prog a+-- > = a+1 <? a==0+-- > ?> a+2 <? a==1+-- > ?> a+3 <? a==2+-- > ?> a+4 <? a==3+-- > ?> a+5+(?>) :: Data Bool -> a -> Option a+cond ?> a = Option (not cond) a++(<?) :: Syntax a => a -> Option a -> a+a <? b = option a id b++infixr 0 <?+infixr 0 ?>+
+ src/Feldspar/Par.hs view
@@ -0,0 +1,92 @@+--+-- Copyright (c) 2009-2011, 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.Par+ ( P+ , IVar+ , runPar+ , new+ , get+ , put+ , fork+ , yield+ , spawn+ , pval+ , parMap+ , parMapM+ , divConq+ )+where++import Language.Syntactic (sugarSymC)++import Feldspar.Core.Constructs (Syntax())+import Feldspar.Core.Constructs.Par+import Feldspar.Core.Frontend.Par++runPar :: Syntax a => P a -> a+runPar = sugarSymC ParRun++new :: Syntax a => P (IVar a)+new = sugarSymC ParNew++get :: Syntax a => IVar a -> P a+get = sugarSymC ParGet++put :: Syntax a => IVar a -> a -> P ()+put = sugarSymC ParPut++fork :: P () -> P ()+fork = sugarSymC ParFork++yield :: P ()+yield = sugarSymC ParYield++spawn :: Syntax a => P a -> P (IVar a)+spawn p = do+ r <- new+ fork (p >>= put r)+ return r++pval :: Syntax a => a -> P (IVar a)+pval a = spawn (return a)++parMap :: Syntax b => (a -> b) -> [a] -> P [b]+parMap f xs = mapM (pval . f) xs >>= mapM get++parMapM :: Syntax b => (a -> P b) -> [a] -> P [b]+parMapM f xs = mapM (spawn . f) xs >>= mapM get++divConq :: Syntax b => (a -> Bool) -> (a -> [a]) -> ([b] -> b) -> (a -> b) -> a -> P b+divConq indiv split join f = go+ where+ go prob | indiv prob = return (f prob)+ | otherwise = do+ sols <- parMapM go (split prob)+ return (join sols)+
+ src/Feldspar/Prelude.hs view
@@ -0,0 +1,77 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | Reexports a minimal subset of the "Prelude" to open up for reusing+-- "Prelude" identifiers in Feldspar++module Feldspar.Prelude+ ( module Prelude+ ) where++++import Prelude+ ( Bool (..)+ , Double+ , Float+ , Int+ , IO+ , Integer+ , Maybe (..)+ , String++ , Bounded (..)+ , Fractional (..)+ , Functor (..)+ , Monad (..)+ , Num (..)+ , Read (..)+ , RealFloat (..)+ , Show (..)++ , (.)+ , ($)+ , asTypeOf+ , const+ , curry+ , flip+ , fst+ , id+ , otherwise+ , print+ , putStr+ , putStrLn+ , readFile+ , snd+ , toInteger+ , toRational+ , uncurry+ , undefined+ , writeFile+ )+
+ src/Feldspar/Range.hs view
@@ -0,0 +1,686 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE UndecidableInstances #-}++--+-- Copyright (c) 2009-2011, 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.+--++-- | Bounded integer ranges++module Feldspar.Range where++-- TODO This module should be broken up into smaller pieces. Since most+-- functions seem to be useful not only for Feldspar, it would probably be good+-- to make a separate package. In any case, the modules should go under+-- `Data.Range`. If there are functions that are very Feldspar specific, these+-- should go into `Feldspar.Core.Constructs.*` (or whereever suitable).++import Data.Bits+import Feldspar.Lattice++--------------------------------------------------------------------------------+-- * Definition+--------------------------------------------------------------------------------++-- | A bounded range of values of type @a@+data Range a = Range+ { lowerBound :: a+ , upperBound :: a+ }+ deriving (Eq, Show)++-- | Convenience alias for bounded integers+class (Ord a, Num a, Bounded a, Integral a, Bits a) => BoundedInt a+instance (Ord a, Num a, Bounded a, Integral a, Bits a) => BoundedInt a++-- | A convenience function for defining range propagation.+-- @handleSign propU propS@ chooses @propU@ for unsigned types and+-- @propS@ for signed types.+handleSign :: forall a b . BoundedInt a =>+ (Range a -> b) -> (Range a -> b) -> (Range a -> b)+handleSign u s+ | isSigned (undefined::a) = s+ | otherwise = u++-- | Shows a bound.+showBound :: (Show a, BoundedInt a) => a -> String+showBound a+ | a `elem` [maxBound,minBound] = "*"+ | otherwise = show a++-- | A textual representation of ranges.+showRange :: (Show a, BoundedInt a) => Range a -> String+showRange r@(Range l u)+ | isEmpty r = "[]"+ | isSingleton r = show u+ | otherwise = "[" ++ showBound l ++ "," ++ showBound u ++ "]"++-- | Requires a monotonic function+mapMonotonic :: (a -> b) -> Range a -> Range b+mapMonotonic f (Range l u) = Range (f l) (f u)++-- | Requires a monotonic function+mapMonotonic2 :: (a -> b -> c) -> Range a -> Range b -> Range c+mapMonotonic2 f (Range l1 u1) (Range l2 u2) = Range (f l1 l2) (f u1 u2)++++--------------------------------------------------------------------------------+-- * Lattice operations+--------------------------------------------------------------------------------++instance BoundedInt a => Lattice (Range a)+ where+ empty = emptyRange+ universal = fullRange+ (\/) = rangeUnion+ (/\) = rangeIntersection++-- | The range containing no elements+emptyRange :: BoundedInt a => Range a+emptyRange = Range maxBound minBound++-- | The range containing all elements of a type+fullRange :: BoundedInt a => Range a+fullRange = Range minBound maxBound++-- | Construct a range+range :: Ord a => a -> a -> Range a+range x y | y < x = Range y x+ | otherwise = Range x y++-- | The range containing one element+singletonRange :: a -> Range a+singletonRange a = Range a a++-- | The range from @0@ to the maximum element+naturalRange :: BoundedInt a => Range a+naturalRange = Range 0 maxBound++-- | The range from the smallest negative element to @-1@.+-- Undefined for unsigned types+negativeRange :: forall a . BoundedInt a => Range a+negativeRange+ | isSigned (undefined::a) = Range minBound (-1)+ | otherwise = emptyRange++-- | The size of a range. Beware that the size may not always be representable+-- for signed types. For instance+-- @rangeSize (range minBound maxBound) :: Int@ gives a nonsense answer.+rangeSize :: BoundedInt a => Range a -> a+rangeSize (Range l u) = u-l+1++-- | Checks if the range is empty+isEmpty :: BoundedInt a => Range a -> Bool+isEmpty (Range l u) = u < l++-- | Checks if the range contains all values of the type+isFull :: BoundedInt a => Range a -> Bool+isFull = (==fullRange)++-- | Checks is the range contains exactly one element+isSingleton :: BoundedInt a => Range a -> Bool+isSingleton (Range l u) = l==u++-- | @r1 \`isSubRangeOf\` r2@ checks is all the elements in @r1@ are included+-- in @r2@+isSubRangeOf :: BoundedInt a => Range a -> Range a -> Bool+isSubRangeOf r1@(Range l1 u1) r2@(Range l2 u2)+ | isEmpty r1 = True+ | isEmpty r2 = False+ | otherwise = (l1>=l2) && (u1<=u2)++-- | Checks whether a range is a sub-range of the natural numbers.+isNatural :: BoundedInt a => Range a -> Bool+isNatural = (`isSubRangeOf` naturalRange)++-- | Checks whether a range is a sub-range of the negative numbers.+isNegative :: BoundedInt a => Range a -> Bool+isNegative = (`isSubRangeOf` negativeRange)++-- | @a \`inRange\` r@ checks is @a@ is an element of the range @r@.+inRange :: BoundedInt a => a -> Range a -> Bool+inRange a r = singletonRange a `isSubRangeOf` r++-- | A convenience function for defining range propagation. If the input+-- range is empty then the result is also empty.+rangeOp :: BoundedInt a => (Range a -> Range a) -> (Range a -> Range a)+rangeOp f r = if isEmpty r then r else f r++-- | See 'rangeOp'.+rangeOp2 :: BoundedInt a =>+ (Range a -> Range a -> Range a) -> (Range a -> Range a -> Range a)+rangeOp2 f r1 r2+ | isEmpty r1 = r1+ | isEmpty r2 = r2+ | otherwise = f r1 r2++-- | Union on ranges.+rangeUnion :: BoundedInt a => Range a -> Range a -> Range a+r1 `rangeUnion` r2+ | isEmpty r1 = r2+ | isEmpty r2 = r1+ | otherwise = union r1 r2+ where+ union (Range l1 u1) (Range l2 u2) = Range (min l1 l2) (max u1 u2)++-- | Intersection on ranges.+rangeIntersection :: BoundedInt a => Range a -> Range a -> Range a+rangeIntersection = rangeOp2 intersection+ where+ intersection (Range l1 u1) (Range l2 u2) = Range (max l1 l2) (min u1 u2)++-- | @disjoint r1 r2@ returns true when @r1@ and @r2@ have no elements in+-- common.+disjoint :: BoundedInt a => Range a -> Range a -> Bool+disjoint r1 r2 = isEmpty (r1 /\ r2)++-- | @rangeGap r1 r2@ returns a range of all the elements between @r1@ and+-- @r2@ including the boundary elements. If @r1@ and @r2@ have elements in+-- common the result is an empty range.+rangeGap :: BoundedInt a => Range a -> Range a -> Range a+rangeGap = rangeOp2 gap+ where+ gap (Range l1 u1) (Range l2 u2)+ | u1 < l2 = range u1 l2+ | u2 < l1 = range u2 l1+ gap _ _ = emptyRange+ -- If the result is non-empty, it will include the boundary elements from the+ -- two ranges.++-- | @r1 \`rangeLess\` r2:@+--+-- Checks if all elements of @r1@ are less than all elements of @r2@.+rangeLess :: BoundedInt a => Range a -> Range a -> Bool+rangeLess r1 r2+ | isEmpty r1 || isEmpty r2 = True+rangeLess (Range _ u1) (Range l2 _) = u1 < l2++-- | @r1 \`rangeLessEq\` r2:@+--+-- Checks if all elements of @r1@ are less than or equal to all elements of+-- @r2@.+rangeLessEq :: BoundedInt a => Range a -> Range a -> Bool+rangeLessEq (Range _ u1) (Range l2 _) = u1 <= l2++++--------------------------------------------------------------------------------+-- * Propagation+--------------------------------------------------------------------------------++-- | @rangeByRange ra rb@: Computes the range of the following set+--+-- > {x | a <- ra, b <- rb, x <- Range a b}+rangeByRange :: BoundedInt a => Range a -> Range a -> Range a+rangeByRange r1 r2+ | isEmpty r1 = emptyRange+ | isEmpty r2 = emptyRange+ | otherwise = Range (lowerBound r1) (upperBound r2)++-- | Implements 'fromInteger' as a 'singletonRange', and implements correct+-- range propagation for arithmetic operations.+instance BoundedInt a => Num (Range a)+ where+ fromInteger = singletonRange . fromInteger+ abs = rangeAbs+ signum = rangeSignum+ negate = rangeNeg+ (+) = rangeAdd+ (*) = rangeMul+ (-) = rangeSub++-- | Propagates range information through @abs@.+rangeAbs :: BoundedInt a => Range a -> Range a+rangeAbs = rangeOp $ \r -> case r of+ Range l u+ | isNatural r -> r+ | r == singletonRange minBound -> r+ | minBound `inRange` r -> range minBound maxBound+ | isNegative r -> range (abs u) (abs l)+ | otherwise -> range 0 (abs l `max` abs u)++-- | Propagates range information through 'signum'.+rangeSignum :: BoundedInt a => Range a -> Range a+rangeSignum = handleSign rangeSignumUnsigned rangeSignumSigned++-- | Signed case for 'rangeSignum'.+rangeSignumSigned :: BoundedInt a => Range a -> Range a+rangeSignumSigned = rangeOp sign+ where+ sign r+ | range (-1) 1 `isSubRangeOf` r = range (-1) 1+ | range (-1) 0 `isSubRangeOf` r = range (-1) 0+ | range 0 1 `isSubRangeOf` r = range 0 1+ | inRange 0 r = 0+ | isNatural r = 1+ | isNegative r = -1++-- | Unsigned case for 'rangeSignum'.+rangeSignumUnsigned :: BoundedInt a => Range a -> Range a+rangeSignumUnsigned = rangeOp sign+ where+ sign r+ | r == singletonRange 0 = r+ | not (0 `inRange` r) = singletonRange 1+ | otherwise = range 0 1++-- | Propagates range information through negation.+rangeNeg :: BoundedInt a => Range a -> Range a+rangeNeg = handleSign rangeNegUnsigned rangeNegSigned++-- | Unsigned case for 'rangeNeg'.+rangeNegUnsigned :: BoundedInt a => Range a -> Range a+rangeNegUnsigned (Range l u)+ | l == 0 && u /= 0 = fullRange+ | otherwise = range (-u) (-l)+-- Code from Hacker's Delight++-- | Signed case for 'rangeNeg'.+rangeNegSigned :: BoundedInt a => Range a -> Range a+rangeNegSigned (Range l u)+ | l == minBound && u == minBound = singletonRange minBound+ | l == minBound = fullRange+ | otherwise = range (-u) (-l)+-- Code from Hacker's Delight++-- | Propagates range information through addition.+rangeAdd :: BoundedInt a => Range a -> Range a -> Range a+rangeAdd = handleSign rangeAddUnsigned rangeAddSigned++-- | Unsigned case for 'rangeAdd'.+rangeAddUnsigned :: BoundedInt a => Range a -> Range a -> Range a+rangeAddUnsigned (Range l1 u1) (Range l2 u2)+ | s >= l1 && t < u1 = fullRange+ | otherwise = range s t+ where+ s = l1 + l2+ t = u1 + u2+-- Code from Hacker's Delight++-- | Signed case for 'rangeAdd'.+rangeAddSigned :: BoundedInt a => Range a -> Range a -> Range a+rangeAddSigned (Range a b) (Range c d)+ | (u .|. v) < 0 = fullRange+ | otherwise = range s t+ where+ s = a + c+ t = b + d+ u = a .&. c .&. complement s .&. complement (b .&. d .&. complement t)+ v = ((a `xor` c) .|. complement (a `xor` s)) .&. (complement b .&. complement d .&. t)++-- | Propagates range information through subtraction.+rangeSub :: BoundedInt a => Range a -> Range a -> Range a+rangeSub = handleSign rangeSubUnsigned rangeSubSigned++-- | Unsigned case for 'rangeSub'.+rangeSubUnsigned :: BoundedInt a => Range a -> Range a -> Range a+rangeSubUnsigned (Range l1 u1) (Range l2 u2)+ | s > l1 && t <= u1 = fullRange+ | otherwise = range s t+ where+ s = l1 - u2+ t = u1 - l2+ -- Note: This is more accurate than the default definition using 'negate',+ -- because 'negate' always overflows for unsigned numbers.+ -- Code from Hacker's Delight++rangeSubSigned :: BoundedInt a => Range a -> Range a -> Range a+rangeSubSigned (Range a b) (Range c d)+ | (u .|. v) < 0 = fullRange+ | otherwise = range s t+ where+ s = a - d+ t = b - c+ u = a .&. complement d .&. complement s .&.+ complement (b .&. complement c .&. complement t)+ v = (xor a (complement d) .|. complement (xor a s)) .&.+ (complement b .&. c .&. t)+-- Code from Hacker's Delight++-- | Saturating unsigned subtraction+subSat :: BoundedInt a => a -> a -> a+subSat a b = a - min a b++-- | Range propagation for 'subSat'+rangeSubSat :: BoundedInt a => Range a -> Range a -> Range a+rangeSubSat r1 r2 = range+ (subSat (lowerBound r1) (upperBound r2))+ (subSat (upperBound r1) (lowerBound r2))++-- | Propagates range information through multiplication+rangeMul :: BoundedInt a => Range a -> Range a -> Range a+rangeMul = handleSign rangeMulUnsigned rangeMulSigned++-- | Signed case for 'rangeMul'.+rangeMulSigned :: forall a . BoundedInt a => Range a -> Range a -> Range a+rangeMulSigned r1 r2+ | r1 == singletonRange 0 || r2 == singletonRange 0 = singletonRange 0+ -- The following case is important because the 'maxAbs' function doesn't+ -- work for 'minBound' on signed numbers.+ | lowerBound r1 == minBound || lowerBound r2 == minBound+ = range minBound maxBound+ | bits (maxAbs r1) + bits (maxAbs r2) <= bitSize (undefined :: a) - 1+ = range (minimum [b1,b2,b3,b4]) (maximum [b1,b2,b3,b4])+ | otherwise = range minBound maxBound+ where maxAbs (Range l u) = max (abs l) (abs u)+ b1 = lowerBound r1 * lowerBound r2+ b2 = lowerBound r1 * upperBound r2+ b3 = upperBound r1 * lowerBound r2+ b4 = upperBound r1 * upperBound r2++-- | Unsigned case for 'rangeMul'.+rangeMulUnsigned :: forall a . BoundedInt a => Range a -> Range a -> Range a+rangeMulUnsigned r1 r2+ | bits (upperBound r1) + bits (upperBound r2)+ <= bitSize (undefined :: a)+ = mapMonotonic2 (*) r1 r2+ | otherwise = universal++-- | Returns the position of the highest bit set to 1. Counting starts at 1.+-- Beware! It doesn't terminate for negative numbers.+bits :: (Num b, Bits b) => b -> Int+bits b = loop b 0+ where loop 0 c = c+ loop n c = loop (n `shiftR` 1) (c+1)++-- | Propagates range information through exponentiation.+rangeExp :: BoundedInt a => Range a -> Range a -> Range a+rangeExp = handleSign rangeExpUnsigned rangeExpSigned++-- | Unsigned case for 'rangeExp'.+rangeExpUnsigned :: BoundedInt a => Range a -> Range a -> Range a+rangeExpUnsigned m@(Range l1 u1) e@(Range l2 u2)+ | toInteger (bits u1) * toInteger u2 > toInteger (bitSize l1) + 1 = universal+ | toInteger u1 ^ toInteger u2 > toInteger (maxBound `asTypeOf` l1) = universal+ | 0 `inRange` m && 0 `inRange` e = range 0 (max b1 b2)+ | otherwise = range b1 b2+ where b1 = l1 ^ l2+ b2 = u1 ^ u2++-- | Sigend case for 'rangeExp'+rangeExpSigned :: BoundedInt a => Range a -> Range a -> Range a+rangeExpSigned m _ | m == singletonRange (-1) = range (-1) 1+rangeExpSigned _ _ = universal++-- | Propagates range information through '.|.'.+rangeOr :: forall a . BoundedInt a => Range a -> Range a -> Range a+rangeOr = handleSign rangeOrUnsignedAccurate (\_ _ -> universal)++-- | Cheap and inaccurate range propagation for '.|.' on unsigned numbers.+rangeOrUnsignedCheap :: BoundedInt a => Range a -> Range a -> Range a+rangeOrUnsignedCheap (Range l1 u1) (Range l2 u2) =+ range (max l1 l2) (maxPlus u1 u2)+-- Code from Hacker's Delight.++-- | @a \`maxPlus\` b@ adds @a@ and @b@ but if the addition overflows then+-- 'maxBound' is returned.+maxPlus :: BoundedInt a => a -> a -> a+maxPlus b d = if s < b then maxBound+ else s+ where s = b + d++-- | Accurate lower bound for '.|.' on unsigned numbers.+minOrUnsigned :: BoundedInt a => a -> a -> a -> a -> a+minOrUnsigned a b c d = loop (bit (bitSize a - 1))+ where loop 0 = a .|. c+ loop m+ | complement a .&. c .&. m > 0 =+ let temp = (a .|. m) .&. negate m+ in if temp <= b+ then temp .|. c+ else loop (shiftR m 1)+ | a .&. complement c .&. m > 0 =+ let temp = (c .|. m) .&. negate m+ in if temp <= d+ then a .|. temp+ else loop (shiftR m 1)+ | otherwise = loop (shiftR m 1)+-- Code from Hacker's Delight.++-- | Accurate upper bound for '.|.' on unsigned numbers.+maxOrUnsigned :: BoundedInt a => a -> a -> a -> a -> a+maxOrUnsigned a b c d = loop (bit (bitSize a - 1))+ where loop 0 = b .|. d+ loop m+ | b .&. d .&. m > 0 =+ let temp = (b - m) .|. (m - 1)+ in if temp >= a+ then temp .|. d+ else let tmp = (d - m) .|. (m - 1)+ in if tmp >= c+ then b .|. tmp+ else loop (shiftR m 1)+ | otherwise = loop (shiftR m 1)+-- Code from Hacker's Delight.++-- | Accurate range propagation through '.|.' for unsigned types.+rangeOrUnsignedAccurate :: BoundedInt a => Range a -> Range a -> Range a+rangeOrUnsignedAccurate (Range l1 u1) (Range l2 u2) =+ range (minOrUnsigned l1 u1 l2 u2) (maxOrUnsigned l1 u1 l2 u2)+-- Code from Hacker's Delight.++-- | Propagating range information through '.&.'.+rangeAnd :: forall a . BoundedInt a => Range a -> Range a -> Range a+rangeAnd = handleSign rangeAndUnsignedCheap (\_ _ -> universal)++-- | Cheap and inaccurate range propagation for '.&.' on unsigned numbers.+rangeAndUnsignedCheap :: BoundedInt a => Range a -> Range a -> Range a+rangeAndUnsignedCheap (Range _ u1) (Range _ u2) = range 0 (min u1 u2)+-- Code from Hacker's Delight.++-- | Propagating range information through 'xor'.+rangeXor :: forall a . BoundedInt a => Range a -> Range a -> Range a+rangeXor = handleSign rangeXorUnsigned (\_ _ -> universal)++-- | Unsigned case for 'rangeXor'.+rangeXorUnsigned :: BoundedInt a => Range a -> Range a -> Range a+rangeXorUnsigned (Range _ u1) (Range _ u2) = range 0 (maxPlus u1 u2)+-- Code from Hacker's Delight.++-- | Propagating range information through 'shiftLU'.+rangeShiftLU :: (BoundedInt a, BoundedInt b) => Range a -> Range b -> Range a+rangeShiftLU = handleSign rangeShiftLUUnsigned (\_ _ -> universal)+-- TODO: improve accuracy++-- | Unsigned case for 'rangeShiftLU'.+rangeShiftLUUnsigned :: (Bounded a, Bits a, Integral a, Integral b)+ => Range a -> Range b -> Range a+rangeShiftLUUnsigned (Range _ u1) (Range _ u2)+ | toInteger (bits u1) + fromIntegral u2 > toInteger (bitSize u1) = universal+rangeShiftLUUnsigned (Range l1 u1) (Range l2 u2)+ = range (shiftL l1 (fromIntegral l2)) (shiftL u1 (fromIntegral u2))++-- | Propagating range information through 'shiftRU'.+rangeShiftRU :: (BoundedInt a, BoundedInt b) => Range a -> Range b -> Range a+rangeShiftRU = handleSign rangeShiftRUUnsigned (\_ _ -> universal)+-- TODO: improve accuracy++-- | Unsigned case for 'rangeShiftRU'.+rangeShiftRUUnsigned :: (Num a, Bits a, Ord a, Bounded b, Integral b, Bits b)+ => Range a -> Range b -> Range a+rangeShiftRUUnsigned (Range l1 u1) (Range l2 u2)+ = range (correctShiftRU l1 u2) (correctShiftRU u1 l2)++-- | This is a replacement fror Haskell's shiftR. If we carelessly use+-- Haskell's variant then we will get left shifts for very large shift values.+correctShiftRU :: (Num a, Bits a, BoundedInt b) => a -> b -> a+correctShiftRU _ i | i > fromIntegral (maxBound :: Int) = 0+correctShiftRU a i = shiftR a (fromIntegral i)++-- | Propagating range information through 'complement'+rangeComplement :: (Bits a, BoundedInt a) => Range a -> Range a+rangeComplement (Range l u) = range (complement l) (complement u)++-- | Propagates range information through 'max'.+rangeMax :: BoundedInt a => Range a -> Range a -> Range a+rangeMax r1 r2+ | isEmpty r1 = r2+ | isEmpty r2 = r1+ | r1 `rangeLess` r2 = r2+ | r2 `rangeLess` r1 = r1+ | otherwise = mapMonotonic2 max r1 r2++-- | Analogous to 'rangeMax'+rangeMin :: BoundedInt a => Range a -> Range a -> Range a+rangeMin r1 r2+ | isEmpty r1 = r2+ | isEmpty r2 = r1+ | r1 `rangeLess` r2 = r1+ | r2 `rangeLess` r1 = r2+ | otherwise = mapMonotonic2 min r1 r2++instance BoundedInt a => Ord (Range a)+ where+ compare = error "compare: I don't make sense for (Range a)"+ min = rangeMin+ max = rangeMax++-- | Propagates range information through 'mod'.+-- Note that we assume Haskell semantics for 'mod'.+rangeMod :: BoundedInt a => Range a -> Range a -> Range a+rangeMod d r+ | isSigned (lowerBound d) &&+ minBound `inRange` d && (-1) `inRange` r = fullRange+ | d `rangeLess` r && isNatural r && isNatural d = d+ | isNatural r = range 0 (pred (upperBound r))+ | r `rangeLess` d && isNeg r && isNeg d = d+ | isNeg r = range (succ (lowerBound r)) 0+ where+ isNeg = (`isSubRangeOf` negs)+ negs = negativeRange \/ 0+rangeMod _ (Range l u) = Range (succ l) (pred u)++-- | Propagates range information through 'rem'.+-- Note that we assume Haskell semantics for 'rem'.+rangeRem :: BoundedInt a => Range a -> Range a -> Range a+rangeRem d r+ | isSigned (lowerBound d) &&+ minBound `inRange` d && (-1) `inRange` r = fullRange+ | d `rangeLessAbs` r && isNatural d = d+ | isNatural d = range 0 (pred (upperBound (abs r)))+ | d `absRangeLessAbs` r && isNeg d = d+ | isNeg d = range (negate (upperBound (abs r))) 0+ where+ isNeg = (`isSubRangeOf` negs)+ negs = negativeRange \/ 0+rangeRem _ (Range l u)+ | abs l >= abs u || l == minBound = range (succ $ negate $ abs l) (predAbs l)+ | otherwise = range (succ $ negate $ abs u) (predAbs u)++predAbs :: (Bounded a, Eq a, Num a, Enum a) => a -> a+predAbs l | l == minBound = abs (succ l)+ | otherwise = pred (abs l)++-- | Propagates range information through 'div'+rangeDiv :: BoundedInt a => Range a -> Range a -> Range a+rangeDiv = handleSign rangeDivU (\_ _ -> universal)++-- | Unsigned case for 'rangeDiv'+rangeDivU :: BoundedInt a => Range a -> Range a -> Range a+rangeDivU (Range _ _ ) (Range l2 u2) | l2 == 0 || u2 == 0 = universal+rangeDivU (Range l1 u1) (Range l2 u2) = Range (l1 `quot` u2) (u1 `quot`l2)++-- | Propagates range information through 'quot'.+rangeQuot :: BoundedInt a => Range a -> Range a -> Range a+rangeQuot = handleSign rangeQuotU (\_ _ -> universal)++-- | Unsigned case for 'rangeQuot'.+rangeQuotU :: BoundedInt a => Range a -> Range a -> Range a+rangeQuotU (Range _ _ ) (Range l2 u2) | l2 == 0 || u2 == 0 = universal+rangeQuotU (Range l1 u1) (Range l2 u2) = Range (l1 `quot` u2) (u1 `quot` l2)++-- | Writing @d \`rangeLess\` abs r@ doesn't mean what you think it does because+-- 'r' may contain minBound which doesn't have a positive representation.+-- Instead, this function should be used.+rangeLessAbs :: (Bounded a, Integral a, Bits a)+ => Range a -> Range a -> Bool+rangeLessAbs d r+ | r == singletonRange minBound+ = lowerBound d /= minBound+ | lowerBound r == minBound+ = d `rangeLess` abs (range (succ (lowerBound r)) (upperBound r))+ | otherwise = d `rangeLess` abs r++-- | Similar to 'rangeLessAbs' but replaces the expression+-- @abs d \`rangeLess\` abs r@ instead.+absRangeLessAbs :: (Bounded a, Integral a, Bits a)+ => Range a -> Range a -> Bool+absRangeLessAbs d r+ | lowerBound d == minBound = False+ | otherwise = abs d `rangeLessAbs` r+++--------------------------------------------------------------------------------+-- * Products of ranges+--------------------------------------------------------------------------------++{- These functions are used to compute the ranges of DefaultInt and+ DefaultWord. The size information of these two types is the union of the+ sizes for all possible IntX/WordX that we support as defaults -}++liftR :: (BoundedInt b, BoundedInt c, BoundedInt d) =>+ (forall a. (BoundedInt a) => Range a) -> (Range b,Range c,Range d)+liftR r = (r,r,r)++binopR :: (BoundedInt a, BoundedInt b, BoundedInt c) =>+ (forall d. BoundedInt d => Range d -> Range d -> Range d) ->+ (Range a, Range b, Range c) ->+ (Range a, Range b, Range c) ->+ (Range a, Range b, Range c)+binopR bop (a1,b1,c1) (a2,b2,c2)+ = (bop a1 a2, bop b1 b2, bop c1 c2)+++mapR :: (BoundedInt a, BoundedInt b, BoundedInt c) =>+ (forall d . BoundedInt d => Range d -> Range d) ->+ (Range a, Range b, Range c) ->+ (Range a, Range b, Range c)+mapR f (a,b,c) = (f a, f b, f c)++approx :: (BoundedInt a, BoundedInt b, BoundedInt c, BoundedInt d)+ => (Range a, Range b, Range c) -> Range d+approx (r1,r2,r3) | isFull r1 || isFull r2 || isFull r3+ = fullRange+approx (r1,r2,r3) = mapMonotonic fromIntegral r1 \/+ mapMonotonic fromIntegral r2 \/+ mapMonotonic fromIntegral r3++instance (BoundedInt a, BoundedInt b, BoundedInt c) =>+ Num (Range a,Range b,Range c) where+ (+) = binopR (+)+ (-) = binopR (-)+ (*) = binopR (*)+ signum = mapR rangeSignum+ fromInteger i = liftR (fromInteger i)+ abs = mapR abs+ negate = mapR negate++
+ src/Feldspar/Repa.hs view
@@ -0,0 +1,513 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}+module Feldspar.Repa where++import qualified Prelude as P++import Language.Syntactic.Sugar+import Feldspar hiding (desugar,sugar,resugar)++import QuickAnnotate++-- | * Shapes++infixl 3 :.+data Z = Z+data tail :. head = tail :. head++type DIM0 = Z+type DIM1 = DIM0 :. Data Length+type DIM2 = DIM1 :. Data Length+type DIM3 = DIM2 :. Data Length++class Shape sh where+ -- | Get the number of dimensions in a shape+ dim :: sh -> Int+ -- | The shape of an array of size zero, with a particular dimension+ zeroDim :: sh+ -- | The shape of an array with size one, with a particular dimension+ unitDim :: sh+ -- | Get the total number of elements in an array with this shape.+ size :: sh -> Data Length+ -- | Index into flat, linear, row-major representation+ toIndex :: sh -> sh -> Data Index+ -- | Inverse of `toIndex`.+ fromIndex :: sh -> Data Index -> sh+ -- | The intersection of two dimensions.+ intersectDim :: sh -> sh -> sh+ -- | Check whether an index is within a given shape.+ -- @inRange l u i@ checks that 'i' fits between 'l' and 'u'.+ inRange :: sh -> sh -> sh -> Data Bool+ -- | Turn a shape into a list. Used in the 'Syntactic' instance.+ toList :: sh -> [Data Length]+ -- | Reconstruct a shape. Used in the 'Syntactic' instance.+ toShape :: Int -> Data [Length] -> sh++instance Shape Z where+ dim Z = 0+ zeroDim = Z+ unitDim = Z+ size Z = 1+ toIndex _ _ = 0+ fromIndex _ _ = Z+ intersectDim _ _ = Z+ inRange Z Z Z = true+ toList _ = []+ toShape _ _ = Z++instance Shape sh => Shape (sh :. Data Length) where+ dim (sh :. _) = dim sh + 1+ zeroDim = zeroDim :. 0+ unitDim = unitDim :. 1+ size (sh :. i) = size sh * i+ toIndex (sh1 :. sh2) (sh1' :. sh2') = toIndex sh1 sh1' * sh2 + sh2'+ fromIndex (ds :. d) ix+ = fromIndex ds (ix `quot` d) :. (ix `rem` d)+ intersectDim (sh1 :. n1) (sh2 :. n2)+ = (intersectDim sh1 sh2 :. (min n1 n2))+ inRange (shL :. l) (shU :. u) (sh :. i)+ = l <= i && i < u && inRange shL shU sh+ toList (sh :. i) = i : toList sh+ toShape i arr+ = toShape (i+1) arr :. (arr ! (P.fromIntegral i))++-- | * Slices++data All = All+data Any sh = Any++type family FullShape ss+type instance FullShape Z = Z+type instance FullShape (Any sh) = sh+type instance FullShape (sl :. Data Length) = FullShape sl :. Data Length+type instance FullShape (sl :. All) = FullShape sl :. Data Length++type family SliceShape ss+type instance SliceShape Z = Z+type instance SliceShape (Any sh) = sh+type instance SliceShape (sl :. Data Length) = SliceShape sl+type instance SliceShape (sl :. All) = SliceShape sl :. Data Length++class Slice ss where+ sliceOfFull :: ss -> FullShape ss -> SliceShape ss+ fullOfSlice :: ss -> SliceShape ss -> FullShape ss++instance Slice Z where+ sliceOfFull Z Z = Z+ fullOfSlice Z Z = Z++instance Slice (Any sh) where+ sliceOfFull Any sh = sh+ fullOfSlice Any sh = sh++instance Slice sl => Slice (sl :. Data Length) where+ sliceOfFull (fsl :. _) (ssl :. _) = sliceOfFull fsl ssl+ fullOfSlice (fsl :. n) ssl = fullOfSlice fsl ssl :. n++instance Slice sl => Slice (sl :. All) where+ sliceOfFull (fsl :. All) (ssl :. s)+ = sliceOfFull fsl ssl :. s+ fullOfSlice (fsl :. All) (ssl :. s)+ = fullOfSlice fsl ssl :. s++++-- | * Vectors++data Vector sh a = Vector sh (sh -> a)+type DVector sh a = Vector sh (Data a)++instance (Shape sh, Syntax a) => Syntactic (Vector sh a)+ where+ type Domain (Vector sh a) = FeldDomainAll+ type Internal (Vector sh a) = ([Length],[Internal a])+ desugar = desugar . freezeVector . map resugar+ sugar = map resugar . thawVector . sugar++instance (Shape sh, Syntax a) => Syntax (Vector sh a)++type instance Elem (Vector sh a) = a+type instance CollIndex (Vector sh a) = sh+type instance CollSize (Vector sh a) = sh++instance Syntax a => Indexed (Vector sh a)+ where+ (Vector _ ixf) ! i = ixf i++instance (Syntax a, Shape sh) => Sized (Vector sh a)+ where+ collSize = extent+ setCollSize = newExtent++instance CollMap (Vector sh a) (Vector sh a)+ where+ collMap = map++-- | * Fuctions++-- | Store a vector in an array.+fromVector :: (Shape sh, Type a) => DVector sh a -> Data [a]+fromVector vec = parallel (size ext) (\ix -> vec !: fromIndex ext ix)+ where ext = extent vec++-- | Restore a vector from an array+toVector :: (Shape sh, Type a) => sh -> Data [a] -> DVector sh a+toVector sh arr = Vector sh (\ix -> arr ! toIndex ix sh)++freezeVector :: (Shape sh, Type a) => DVector sh a -> (Data [Length], Data [a])+freezeVector v = (shapeArr, fromVector v)+ where shapeArr = fromList (toList $ extent v)++fromList :: Type a => [Data a] -> Data [a]+fromList ls = loop 1 (parallel (value len) (const (P.head ls)))+ where loop i arr+ | i P.< len = loop (i+1) (setIx arr (value i) (ls P.!! (P.fromIntegral i)))+ | otherwise = arr+ len = P.fromIntegral $ P.length ls++thawVector :: (Shape sh, Type a) => (Data [Length], Data [a]) -> DVector sh a+thawVector (l,arr) = toVector (toShape 0 l) arr++-- | Store a vector in memory. Use this function instead of 'force' if+-- possible as it is both much more safe and faster.+memorize :: (Shape sh, Type a) => DVector sh a -> DVector sh a+memorize vec = toVector (extent vec) (fromVector vec)++-- | The shape and size of the vector+extent :: Vector sh a -> sh+extent (Vector sh _) = sh++-- | Change the extent of the vector to the supplied value. If the supplied+-- extent will contain more elements than the old extent, the new elements+-- will have undefined value.+newExtent :: sh -> Vector sh a -> Vector sh a+newExtent sh (Vector _ ixf) = Vector sh ixf++-- | Change shape and transform elements of a vector. This function is the+-- most general way of manipulating a vector.+traverse :: (Shape sh, Shape sh') =>+ Vector sh a -> (sh -> sh') -> ((sh -> a) -> sh' -> a')+ -> Vector sh' a'+traverse (Vector sh ixf) shf elemf+ = Vector (shf sh) (elemf ixf)++-- | Duplicates part of a vector along a new dimension.+replicate :: (Slice sl, Shape (FullShape sl)+ ,Shape (SliceShape sl))+ => sl -> Vector (SliceShape sl) a+ -> Vector (FullShape sl) a+replicate sl vec+ = backpermute (fullOfSlice sl (extent vec))+ (sliceOfFull sl) vec++-- | Extracts a slice from a vector.+slice :: (Slice sl+ ,Shape (FullShape sl)+ ,Shape (SliceShape sl))+ => Vector (FullShape sl) a+ -> sl -> Vector (SliceShape sl) a+slice vec sl+ = backpermute (sliceOfFull sl (extent vec))+ (fullOfSlice sl) vec++-- | Change the shape of a vector. This function is potentially unsafe, the+-- new shape need to have fewer or equal number of elements compared to+-- the old shape.+reshape :: (Shape sh, Shape sh') => sh -> Vector sh' a -> Vector sh a+reshape sh' (Vector sh ixf)+ = Vector sh' (ixf . fromIndex sh . toIndex sh')++-- | A scalar (zero dimensional) vector+unit :: a -> Vector Z a+unit a = Vector Z (const a)++-- | Index into a vector+(!:) :: (Shape sh) => Vector sh a -> sh -> a+(Vector _ ixf) !: ix = ixf ix++-- | Extract the diagonal of a two dimensional vector+diagonal :: Vector DIM2 a -> Vector DIM1 a+diagonal vec = backpermute (Z :. width) (\ (_ :. x) -> Z :. x :. x) vec+ where Z :. _ :. width = extent vec++-- | Change the shape of a vector.+backpermute :: (Shape sh, Shape sh') =>+ sh' -> (sh' -> sh) -> Vector sh a -> Vector sh' a+backpermute sh perm vec = traverse vec (const sh) (. perm)++-- | Map a function on all the elements of a vector+map :: (a -> b) -> Vector sh a -> Vector sh b+map f (Vector sh ixf) = Vector sh (f . ixf)++-- | Combines the elements of two vectors. The size of the resulting vector+-- will be the intersection of the two argument vectors.+zip :: (Shape sh) => Vector sh a -> Vector sh b -> Vector sh (a,b)+zip = zipWith (\a b -> (a,b))++-- | Combines the elements of two vectors pointwise using a function.+-- The size of the resulting vector will be the intersection of the+-- two argument vectors.+zipWith :: (Shape sh) =>+ (a -> b -> c) -> Vector sh a -> Vector sh b -> Vector sh c+zipWith f arr1 arr2 = Vector (intersectDim (extent arr1) (extent arr2))+ (\ix -> f (arr1 !: ix) (arr2 !: ix))++-- | Reduce a vector along its last dimension+fold :: (Shape sh, Syntax a) =>+ (a -> a -> a)+ -> a+ -> Vector (sh :. Data Length) a+ -> Vector sh a+fold f x vec = Vector sh ixf+ where sh :. n = extent vec+ ixf i = forLoop n x (\ix s -> f s (vec !: (i :. ix)))++-- Here's another version of fold which has a little bit more freedom+-- when it comes to choosing the initial element when folding++-- | A generalization of 'fold' which allows for different initial+-- values when starting to fold.+fold' :: (Shape sh, Syntax a) =>+ (a -> a -> a)+ -> Vector sh a+ -> Vector (sh :. Data Length) a+ -> Vector sh a+fold' f x vec = Vector sh ixf+ where sh :. n = extent vec+ ixf i = forLoop n (x!:i) (\ix s -> f s (vec !: (i :. ix)))++-- | Summing a vector along its last dimension+sum :: (Shape sh, Type a, Numeric a) =>+ DVector (sh :. Data Length) a -> DVector sh a+sum = fold (+) 0++-- | Enumerating a vector+(...) :: Data Index -> Data Index -> DVector DIM1 Index+from ... to = Vector (Z :. (to - from + 1)) (\(Z :. ix) -> ix + from)++-- This one should generalize to arbitrary shapes++++-- Laplace++stencil :: DVector DIM2 Float -> DVector DIM2 Float+stencil vec+ = traverse vec id update+ where+ _ :. height :. width = extent vec++ update get d@(sh :. i :. j)+ = isBoundary i j ?+ (get d+ , (get (sh :. (i-1) :. j)+ + get (sh :. i :. (j-1))+ + get (sh :. (i+1) :. j)+ + get (sh :. i :. (j+1))) / 4)++ isBoundary i j+ = (i == 0) || (i >= width - 1)+ || (j == 0) || (j >= height - 1)++laplace :: Data Length -> DVector DIM2 Float -> DVector DIM2 Float+laplace steps vec = toVector (extent vec) $+ forLoop steps (fromVector vec) $+ const $ fromVector . stencil . toVector (extent vec)+++-- Matrix Multiplication++transpose2D :: Vector DIM2 e -> Vector DIM2 e+transpose2D vec+ = backpermute new_extent swp vec+ where swp (Z :. i :. j) = Z :. j :. i+ new_extent = swp (extent vec)++-- | Matrix multiplication+mmMult :: (Type e, Numeric e) =>+ DVector DIM2 e -> DVector DIM2 e+ -> DVector DIM2 e+mmMult vA vB+ = sum (zipWith (*) vaRepl vbRepl)+ where+ vaRepl = replicate (Z :. All :. colsB :. All) vA+ vbRepl = replicate (Z :. rowsA :. All :. All) vB+ (Z :. _ :. rowsA) = extent vA+ (Z :. colsB :. _ ) = extent vB++-- One dimensional vectors, meant to help transitioning from+-- the old vector library++mapDIM1 :: (Data Index -> Data Index) -> DIM1 -> DIM1+mapDIM1 ixmap (Z :. i) = (Z :. ixmap i)++indexed :: Data Length -> (Data Index -> a) -> Vector DIM1 a+indexed l idxFun = Vector (Z :. l) (\ (Z :. i) -> idxFun i)++length :: Vector DIM1 a -> Data Length+length (Vector (Z :. l) _) = l++--------------------------------------------------------------------------------+-- * Operations on one dimensional vectors+--------------------------------------------------------------------------------++-- | Change the length of the vector to the supplied value. If the supplied+-- length is greater than the old length, the new elements will have undefined+-- value. The resulting vector has only one segment.+newLen :: Syntax a => Data Length -> Vector DIM1 a -> Vector DIM1 a+newLen l (Vector (Z :. _) ixf) = Vector (Z :. l) ixf++(++) :: Syntax a => Vector DIM1 a -> Vector DIM1 a -> Vector DIM1 a+Vector (Z :. l1) ixf1 ++ Vector (Z :. l2) ixf2+ = Vector (Z :. l1 + l2) (\ (Z :. i) -> i < l1 ? (ixf1 (Z :. i)+ ,ixf2 (Z :. (i + l1))))++infixr 5 ++++take :: Data Length -> Vector DIM1 a -> Vector DIM1 a+take n (Vector (Z :. l) ixf) = Vector (Z :. (min n l)) ixf++drop :: Data Length -> Vector DIM1 a -> Vector DIM1 a+drop n (Vector (Z :. l) ixf) = Vector (Z :. (l - min l n)) (ixf . mapDIM1 (+ n))++splitAt :: Data Index -> Vector DIM1 a -> (Vector DIM1 a, Vector DIM1 a)+splitAt n vec = (take n vec, drop n vec)++head :: Syntax a => Vector DIM1 a -> a+head = (! (Z :. 0))++last :: Syntax a => Vector DIM1 a -> a+last vec = vec ! (Z :. (length vec - 1))++tail :: Vector DIM1 a -> Vector DIM1 a+tail = drop 1++init :: Vector DIM1 a -> Vector DIM1 a+init vec = take (length vec - 1) vec++tails :: Vector DIM1 a -> Vector DIM1 (Vector DIM1 a)+tails vec = indexed (length vec + 1) (\n -> drop n vec)++inits :: Vector DIM1 a -> Vector DIM1 (Vector DIM1 a)+inits vec = indexed (length vec + 1) (\n -> take n vec)++inits1 :: Vector DIM1 a -> Vector DIM1 (Vector DIM1 a)+inits1 = tail . inits++-- | Permute a vector+permute :: (Data Length -> Data Index -> Data Index) -> (Vector DIM1 a -> Vector DIM1 a)+permute perm (Vector s@(Z :. l) ixf) = Vector s (ixf . mapDIM1 (perm l))++reverse :: Syntax a => Vector DIM1 a -> Vector DIM1 a+reverse = permute $ \l i -> l-1-i++rotateVecL :: Syntax a => Data Index -> Vector DIM1 a -> Vector DIM1 a+rotateVecL ix = permute $ \l i -> (i + ix) `rem` l++rotateVecR :: Syntax a => Data Index -> Vector DIM1 a -> Vector DIM1 a+rotateVecR ix = reverse . rotateVecL ix . reverse++replicate1 :: Data Length -> a -> Vector DIM1 a+replicate1 n a = Vector (Z :. n) (const a)++-- | @enumFromTo m n@: Enumerate the indexes from @m@ to @n@+--+-- In order to enumerate a different type, use 'i2n', e.g:+--+-- > map i2n (10...20) :: Vector1 Word8+enumFromTo :: Data Index -> Data Index -> Vector DIM1 (Data Index)+enumFromTo 1 n = indexed n (+1)+enumFromTo m n = indexed l (+m)+ where+ l = (n<m) ? (0, n-m+1)+ -- TODO The first case avoids the comparison when `m` is 1. However, it+ -- cover the case when `m` is a complicated expression that is later+ -- optimized to the literal 1. The same holds for other such+ -- optimizations in this module.+ --+ -- Perhaps we need a language construct that lets the user supply a+ -- custom optimization rule (similar to `sizeProp`)? `sizeProp` could+ -- probably be expressed in terms of this more general construct.++-- | @enumFrom m@: Enumerate the indexes from @m@ to 'maxBound'+enumFrom :: Data Index -> Vector DIM1 (Data Index)+enumFrom = flip enumFromTo (value maxBound)++unzip :: Vector DIM1 (a,b) -> (Vector DIM1 a, Vector DIM1 b)+unzip (Vector l ixf) = (Vector l (fst.ixf), Vector l (snd.ixf))++-- | Corresponds to the standard 'foldl'.+foldl :: (Syntax a) => (a -> b -> a) -> a -> Vector DIM1 b -> a+foldl f x (Vector (Z :. l) ixf) = forLoop l x $ \ix s -> f s (ixf (Z :. ix))++-- | Corresponds to the standard 'foldl1'.+fold1 :: Syntax a => (a -> a -> a) -> Vector DIM1 a -> a+fold1 f a = foldl f (head a) (tail a)++sum1 :: (Syntax a, Num a) => Vector DIM1 a -> a+sum1 = foldl (+) 0++maximum :: Ord a => Vector DIM1 (Data a) -> Data a+maximum = fold1 max++minimum :: Ord a => Vector DIM1 (Data a) -> Data a+minimum = fold1 min++-- | Scalar product of two vectors+scalarProd :: (Syntax a, Num a) => Vector DIM1 a -> Vector DIM1 a -> a+scalarProd a b = sum1 (zipWith (*) a b)++++--------------------------------------------------------------------------------+-- Misc.+--------------------------------------------------------------------------------++tVec :: Patch a a -> Patch (Vector DIM1 a) (Vector DIM1 a)+tVec _ = id++tVec1 :: Patch a a -> Patch (Vector DIM1 (Data a)) (Vector DIM1 (Data a))+tVec1 _ = id++tVec2 :: Patch a a -> Patch (Vector DIM2 (Data a)) (Vector DIM2 (Data a))+tVec2 _ = id++instance Annotatable a => Annotatable (Vector s a)+ where+ annotate info (Vector len ixf) = Vector+ (annotate (info P.++ " (vector length)") len)+ (annotate (info P.++ " (vector element)") . ixf)+
+ src/Feldspar/Stream.hs view
@@ -0,0 +1,480 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}++--+-- Copyright (c) 2009-2011, 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.Stream+ (Stream+ ,head+ ,tail+ ,map,mapNth+ ,maps+ ,intersperse+ ,interleave+ ,downsample+ ,duplicate+ ,scan, scan1+ ,mapAccum+ ,iterate+ ,repeat+ ,unfold+ ,drop+ ,zip,zipWith+ ,unzip+ ,take+ ,splitAt+ ,cycle+ ,streamAsVector, streamAsVectorSize+ ,recurrenceO, recurrenceI, recurrenceIO, recurrenceIIO+ ,slidingAvg+ ,iir,fir+ )+ where++import qualified Prelude as P++import Feldspar+import Feldspar.Vector.Internal+ (Vector, Vector1+ ,freezeVector,indexed+ ,sum,length,replicate,scalarProd)++-- | Infinite streams.+data Stream a where+ Stream :: Syntax state => (state -> M a) -> M state -> Stream a++type instance Elem (Stream a) = a+type instance CollIndex (Stream a) = Data Index++-- | Take the first element of a stream+head :: Syntax a => Stream a -> a+head (Stream next init) = runMutable (init >>= next)++-- | Drop the first element of a stream+tail :: Syntax a => Stream a -> Stream a+tail (Stream next init) = Stream next (init >>= \st -> next st >> return st)++-- | 'map f str' transforms every element of the stream 'str' using the+-- function 'f'+map :: (Syntax a, Syntax b) =>+ (a -> b) -> Stream a -> Stream b+map f (Stream next init) = Stream newNext init+ where newNext st = do a <- next st+ return (f a)++-- | 'mapNth f n k str' transforms every 'n'th element with offset 'k'+-- of the stream 'str' using the function 'f'+mapNth :: (Syntax a) =>+ (a -> a) -> Data Index -> Data Index -> Stream a -> Stream a+mapNth f n k (Stream next init) = Stream newNext newInit+ where+ newInit = do st <- init+ r <- newRef (0 :: Data WordN)+ return (st,r)+ newNext (st,r) = do a <- next st+ i <- getRef r+ setRef r ((i+1) `mod` n)+ return (i==k?(f a,a))++-- | 'maps fs str' uses one of the functions from 'fs' successively to modify+-- the elements of 'str'+maps :: (Syntax a) =>+ [a -> a] -> Stream a -> Stream a+maps fs (Stream next initial) = Stream newNext newInit+ where+ newInit = do+ r <- newRef (0 :: Data Index)+ st <- initial+ return (r,st)++ newNext (r,st) = do+ a <- next st+ i <- getRef r+ setRef r ((i+1) `mod` P.fromIntegral (P.length fs))+ return $+ (P.foldr (\ (k,f) x ->+ i==(P.fromIntegral k)?(f a,x)))+ a (P.zip [1..] fs)++-- | 'intersperse a str' inserts an 'a' between each element of the stream+-- 'str'.+intersperse :: Syntax a => a -> Stream a -> Stream a+intersperse a s = interleave s (repeat a)++-- | Create a new stream by alternating between the elements from+-- the two input streams+interleave :: Syntax a => Stream a -> Stream a -> Stream a+interleave (Stream next1 init1) (Stream next2 init2)+ = Stream next init+ where+ init = do st1 <- init1+ st2 <- init2+ r <- newRef true+ return (r,st1,st2)+ next (r,st1,st2) = do b <- getRef r+ setRef r (not b)+ ifM b (next1 st1) (next2 st2)++-- | 'downsample n str' takes every 'n'th element of the input stream+downsample :: Syntax a => Data Index -> Stream a -> Stream a+downsample n (Stream next init) = Stream newNext init+ where newNext st = do forM (n-1) (\_ -> next st)+ next st++-- | 'duplicate n str' stretches the stream by duplicating the elements 'n' times+duplicate :: Syntax a => Data Index -> Stream a -> Stream a+duplicate n (Stream next init) = Stream newNext newInit+ where+ newInit = do st <- init+ a <- next st+ r1 <- newRef a+ r2 <- newRef (1 :: Data Index)+ return (st,r1,r2)+ newNext (st,r1,r2) = do i <- getRef r2+ setRef r2 ((i+1)`mod`n)+ ifM (i==0)+ (do a <- next st+ setRef r1 a+ return a)+ (getRef r1)++-- | 'scan f a str' produces a stream by successively applying 'f' to+-- each element of the input stream 'str' and the previous element of+-- the output stream.+scan :: Syntax a => (a -> b -> a) -> a -> Stream b -> Stream a+scan f a (Stream next init) = Stream newNext newInit+ where+ newInit = do st <- init+ r <- newRef a+ return (st,r)+ newNext (st,r) = do x <- next st+ acc <- getRef r+ setRef r (f acc x)+ return acc+++-- | A scan but without an initial element.+scan1 :: Syntax a => (a -> a -> a) -> Stream a -> Stream a+scan1 f (Stream next init)+ = Stream newNext newInit+ where+ newInit = do+ st <- init+ a <- next st+ r <- newRef a+ return (st,r)+ newNext (st,r) = do+ a <- getRef r+ b <- next st+ let c = f a b+ setRef r c+ return c++-- | Maps a function over a stream using an accumulator.+mapAccum :: (Syntax acc, Syntax b) =>+ (acc -> a -> (acc,b)) -> acc -> Stream a -> Stream b+mapAccum f acc (Stream next init)+ = Stream newNext newInit+ where+ newInit = do+ st <- init+ r <- newRef acc+ return (st,r)+ newNext (st,r) = do+ x <- getRef r+ a <- next st+ let (acc',b) = f x a+ setRef r acc'+ return b++-- | Iteratively applies a function to a starting element. All the successive+-- results are used to create a stream.+--+-- @iterate f a == [a, f a, f (f a), f (f (f a)) ...]@+iterate :: Syntax a => (a -> a) -> a -> Stream a+iterate f a = Stream next init+ where+ init = newRef a+ next r = do x <- getRef r+ setRef r (f x)+ return x++-- | Repeat an element indefinitely.+--+-- @repeat a = [a, a, a, ...]@+repeat :: Syntax a => a -> Stream a+repeat a = Stream return (return a)++-- | @unfold f acc@ creates a new stream by successively applying 'f' to+-- to the accumulator 'acc'.+unfold :: (Syntax a, Syntax c) => (c -> (a,c)) -> c -> Stream a+unfold next init = Stream newNext newInit+ where+ newInit = newRef init+ newNext r = do c <- getRef r+ let (a,c') = next c+ setRef r c'+ return a++-- | Drop a number of elements from the front of a stream+drop :: Syntax a => Data Length -> Stream a -> Stream a+drop i (Stream next init) = Stream next newInit+ where newInit = do st <- init+ forM i (\_ -> next st)+ return st++-- | Pairs together two streams into one.+zip :: Stream a -> Stream b -> Stream (a,b)+zip = zipWith (,)++-- | Pairs together two streams using a function to combine the+-- corresponding elements.+zipWith :: (a -> b -> c) -> Stream a -> Stream b -> Stream c+zipWith f (Stream next1 init1) (Stream next2 init2) = Stream next init+ where+ init = do st1 <- init1+ st2 <- init2+ return (st1,st2)+ next (st1,st2) = do a <- next1 st1+ b <- next2 st2+ return (f a b)++-- | Given a stream of pairs, split it into two stream.+unzip :: (Syntax a, Syntax b) => Stream (a,b) -> (Stream a, Stream b)+unzip stream = (map fst stream, map snd stream)++instance Syntax a => Indexed (Stream a) where+ (Stream next init) ! n = runMutable $ do+ st <- init+ forM (n-1) (\_ -> next st)+ next st++-- | 'take n str' allocates 'n' elements from the stream 'str' into a+-- core array.+take :: (Syntax a) => Data Length -> Stream a -> Data [Internal a]+take n (Stream next init)+ = runMutableArray $ do+ marr <- newArr_ n+ st <- init+ forM n $ \ix -> do+ a <- next st+ setArr marr ix (desugar a)+ return marr++-- | 'splitAt n str' allocates 'n' elements from the stream 'str' into a+-- core array and returns the rest of the stream continuing from+-- element 'n+1'.+splitAt :: (Syntax a) =>+ Data Length -> Stream a -> (Data [Internal a], Stream a)+splitAt n stream = (take n stream,drop n stream)++-- | Loops through a vector indefinitely to produce a stream.+cycle :: Syntax a => Vector a -> Stream a+cycle vec = Stream next init+ where+ init = newRef (0 :: Data Index)+ next r = do i <- getRef r+ setRef r ((i + 1) `rem` length vec)+ return (vec ! i)++unsafeVectorToStream :: Syntax a => Vector a -> Stream a+unsafeVectorToStream vec = Stream next init+ where+ init = newRef (0 :: Data Index)+ next r = do i <- getRef r+ setRef r (i + 1)+ return (vec ! i)++-- | A convenience function for translating an algorithm on streams to an algorithm on vectors.+-- The result vector will have the same length as the input vector.+-- It is important that the stream function doesn't drop any elements of+-- the input stream.+--+-- This function allocates memory for the output vector.+streamAsVector :: (Syntax a, Syntax b) =>+ (Stream a -> Stream b)+ -> (Vector a -> Vector b)+streamAsVector f v = sugar $ take (length v) $ f $ unsafeVectorToStream v++-- | Similar to 'streamAsVector' except the size of the output array is computed by the second argument+-- which is given the size of the input vector as a result.+streamAsVectorSize :: (Syntax a, Syntax b) =>+ (Stream a -> Stream b) -> (Data Length -> Data Length)+ -> (Vector a -> Vector b)+streamAsVectorSize f s v = sugar $ take (s $ length v) $ f $ cycle v++-- | A combinator for descibing recurrence equations, or feedback loops.+-- The recurrence equation may refer to previous outputs of the stream,+-- but only as many as the length of the input stream+-- It uses memory proportional to the input vector.+--+-- For exaple one can define the fibonacci sequence as follows:+--+-- > fib = recurrenceO (vector [0,1]) (\fib -> fib!0 + fib!1)+--+-- The expressions @fib!0@ and @fib!1@ refer to previous elements in the+-- stream defined one step back and two steps back respectively.+recurrenceO :: Type a =>+ Vector1 a ->+ (Vector1 a -> Data a) ->+ Stream (Data a)+recurrenceO initV mkExpr = Stream next init+ where+ len = length initV+ init = do+ buf <- thawArray (freezeVector initV)+ r <- newRef (0 :: Data Index)+ return (buf,r)++ next (buf,r) = do+ ix <- getRef r+ setRef r (ix + 1)+ a <- withArray buf+ (\ibuf -> return $ mkExpr+ (indexed len (\i -> getIx ibuf ((i + ix) `rem` len))))+ result <- getArr buf (ix `rem` len)+ setArr buf (ix `rem` len) a+ return result++-- | A recurrence combinator with input. The function 'recurrenceI' is+-- similar to 'recurrenceO'. The difference is that that it has an input+-- stream, and that the recurrence equation may only refer to previous+-- inputs, it may not refer to previous outputs.+--+-- The sliding average of a stream can easily be implemented using+-- 'recurrenceI'.+--+-- > slidingAvg :: Data WordN -> Stream (Data WordN) -> Stream (Data WordN)+-- > slidingAvg n str = recurrenceI (replicate n 0) str+-- > (\input -> sum input `quot` n)+recurrenceI :: (Type a, Type b) =>+ Vector1 a -> Stream (Data a) ->+ (Vector1 a -> Data b) ->+ Stream (Data b)+recurrenceI ii stream mkExpr+ = recurrenceIO ii stream (value []) (\i _ -> mkExpr i)++-- | 'recurrenceIO' is a combination of 'recurrenceO' and 'recurrenceI'. It+-- has an input stream and the recurrence equation may refer both to+-- previous inputs and outputs.+--+-- 'recurrenceIO' is used when defining the 'iir' filter.+recurrenceIO :: (Type a, Type b) =>+ Vector1 a -> Stream (Data a) -> Vector1 b ->+ (Vector1 a -> Vector1 b -> Data b) ->+ Stream (Data b)+recurrenceIO ii (Stream nxt int) io mkExpr+ = Stream next init+ where+ lenI = length ii+ lenO = length io+ init = do+ ibuf <- thawArray (freezeVector ii)+ obuf <- thawArray (freezeVector io)+ st <- int+ r <- newRef (0 :: Data Index)+ return (ibuf,obuf,st,r)+ next (ibuf,obuf,st,r) = do+ ix <- getRef r+ setRef r (ix + 1)+ a <- nxt st+ when (lenI /= 0) $ setArr ibuf (ix `rem` lenI) a+ b <- withArray ibuf (\ib ->+ withArray obuf (\ob ->+ return $ mkExpr+ (indexed lenI (\i -> getIx ib ((i + ix) `rem` lenI)))+ (indexed lenO (\i -> getIx ob ((i + ix - 1) `rem` lenO)))+ ))+ ifM (lenO /= 0)+ (do o <- getArr obuf (ix `rem` lenO)+ setArr obuf (ix `rem` lenO) b+ return o)+ (return b)++-- | Similar to 'recurrenceIO' but takes two input streams.+recurrenceIIO :: (Type a, Type b, Type c) =>+ Vector1 a -> Stream (Data a) -> Vector1 b -> Stream (Data b) ->+ Vector1 c ->+ (Vector1 a -> Vector1 b -> Vector1 c -> Data c) ->+ Stream (Data c)+recurrenceIIO i1 (Stream next1 init1) i2 (Stream next2 init2) io mkExpr+ = Stream next init+ where+ len1 = length i1+ len2 = length i2+ lenO = length io+ init = do+ ibuf1 <- thawArray (freezeVector i1)+ st1 <- init1+ ibuf2 <- thawArray (freezeVector i2)+ st2 <- init2+ obuf <- thawArray (freezeVector io)+ c <- newRef (0 :: Data Index)+ return (ibuf1,st1,ibuf2,st2,obuf,c)+ next (ibuf1,st1,ibuf2,st2,obuf,c) = do+ ix <- getRef c+ setRef c (ix + 1)+ a <- next1 st1+ b <- next2 st2+ when (len1 /= 0) $ setArr ibuf1 (ix `rem` len1) a+ when (len2 /= 0) $ setArr ibuf2 (ix `rem` len2) b+ out <- withArray ibuf1 (\ib1 ->+ withArray ibuf2 (\ib2 ->+ withArray obuf (\ob ->+ return $ mkExpr (indexed len1 (\i -> getIx ib1 ((i + ix) `rem` len1)))+ (indexed len2 (\i -> getIx ib2 ((i + ix) `rem` len2)))+ (indexed lenO (\i -> getIx ob ((i + ix) `rem` lenO)))+ )))+ ifM (lenO /= 0)+ (do o <- getArr obuf (ix `rem` lenO)+ setArr obuf (ix `rem` lenO) out+ return o)+ (return out)++slidingAvg :: Data WordN -> Stream (Data WordN) -> Stream (Data WordN)+slidingAvg n str = recurrenceI (replicate n 0) str+ (\input -> sum input `quot` n)++-- | A fir filter on streams+fir :: Vector1 Float ->+ Stream (Data Float) -> Stream (Data Float)+fir b inp =+ recurrenceI (replicate (length b) 0) inp+ (scalarProd b)++-- | An iir filter on streams+iir :: Data Float -> Vector1 Float -> Vector1 Float ->+ Stream (Data Float) -> Stream (Data Float)+iir a0 a b inp =+ recurrenceIO (replicate (length b) 0) inp+ (replicate (length a) 0)+ (\i o -> 1 / a0 * ( scalarProd b i+ - scalarProd a o)+ )+
+ src/Feldspar/Vector.hs view
@@ -0,0 +1,65 @@+--+-- Copyright (c) 2009-2011, 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.+--++-- | A module for /virtual vectors/. Many of the functions defined here are+-- imitations of Haskell's list operations, and to a first approximation they+-- behave accordingly.+--+-- A virtual vector is normally guaranteed not to be present in the generated+-- code. The only exceptions are:+--+-- * when it is explicitly forced using the functions 'force' or 'desugar'+--+-- * when it is the input or output of a program+--+-- * when it is accessed by a function outside the "Feldspar.Vector" API, for+-- example, 'condition' or 'forLoop'+--+-- Note also that most operations only introduce a small constant overhead on+-- the vector. The exceptions are+--+-- * 'fold'+--+-- * 'fold1'+--+-- * Functions that introduce storage (see above)+--+-- * \"Folding\" functions: 'sum', 'maximum', etc.+--+-- These functions introduce overhead that is linear in the length of the+-- vector.++module Feldspar.Vector+ ( module Feldspar.Vector.Internal+ ) where++++import Feldspar() -- For Haddock+import Feldspar.Vector.Internal hiding (freezeVector)+
+ src/Feldspar/Vector/Internal.hs view
@@ -0,0 +1,408 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 #-}++module Feldspar.Vector.Internal where++++import qualified Prelude+import Control.Applicative+import qualified Data.TypeLevel as TL+import Test.QuickCheck++import QuickAnnotate++import Language.Syntactic hiding (fold)++import Feldspar.Range (rangeSubSat)+import Feldspar hiding (sugar,desugar,resugar)+import Feldspar.Wrap++import Data.Tuple.Curry+import Data.Tuple.Select+++--------------------------------------------------------------------------------+-- * Types+--------------------------------------------------------------------------------++-- | Symbolic vector+data Vector a+ = Empty+ | Indexed+ { segmentLength :: Data Length+ , segmentIndex :: Data Index -> a+ , continuation :: Vector a+ }++type instance Elem (Vector a) = a+type instance CollIndex (Vector a) = Data Index+type instance CollSize (Vector a) = Data Length++-- | Non-nested vector+type Vector1 a = Vector (Data a)++-- | Two-level nested vector+type Vector2 a = Vector (Vector (Data a))++instance Syntax a => Syntactic (Vector a)+ where+ type Domain (Vector a) = FeldDomainAll+ type Internal (Vector a) = [Internal a]+ desugar = desugar . freezeVector . map resugar+ sugar = map resugar . thawVector . sugar++instance Syntax a => Syntax (Vector a)++instance (Syntax a, Show (Internal a)) => Show (Vector a)+ where+ show = show . eval++++--------------------------------------------------------------------------------+-- * Construction/conversion+--------------------------------------------------------------------------------++indexed :: Data Length -> (Data Index -> a) -> Vector a+indexed 0 _ = Empty+indexed l idxFun = Indexed l idxFun Empty++-- | Breaks up a segmented vector into a list of single-segment vectors.+segments :: Vector a -> [Vector a]+segments Empty = []+segments (Indexed l ixf cont) = Indexed l ixf Empty : segments cont+ -- Note: Important to use `Indexed` instead of `indexed` since we need to+ -- guarantee that each vector has a single segment.++length :: Vector a -> Data Length+length Empty = 0+length vec = Prelude.sum $ Prelude.map segmentLength $ segments vec++-- | Converts a segmented vector to a vector with a single segment.+mergeSegments :: Syntax a => Vector a -> Vector a+mergeSegments Empty = Empty+mergeSegments vec = Indexed (length vec) (ixFun (segments vec)) Empty+ -- Note: Important to use `Indexed` instead of `indexed` since we need to+ -- guarantee that the result has a single segment.+ where+ ixFun [] = const $ err "indexing in empty vector"+ ixFun (Empty : vs) = ixFun vs+ ixFun (Indexed l ixf _ : vs) = case vs of+ [] -> ixf+ _ -> \i -> (i<l) ? (ixf i, ixFun vs (i-l))++-- | Converts a non-nested vector to a core vector.+freezeVector :: Type a => Vector (Data a) -> Data [a]+freezeVector Empty = value []+freezeVector (Indexed l ixf cont) = parallel l ixf `append` freezeVector cont++-- | Converts a non-nested core array to a vector.+thawVector :: Type a => Data [a] -> Vector (Data a)+thawVector arr = indexed (getLength arr) (getIx arr)++thawVector' :: Type a => Length -> Data [a] -> Vector (Data a)+thawVector' len arr = thawVector $ setLength (value len) arr++++--------------------------------------------------------------------------------+-- * Operations+--------------------------------------------------------------------------------++instance Syntax a => Indexed (Vector a)+ where+ (!) = segmentIndex . mergeSegments++instance Syntax a => Sized (Vector a)+ where+ collSize = length+ setCollSize = newLen++instance CollMap (Vector a) (Vector b)+ where+ collMap = map++-- | Change the length of the vector to the supplied value. If the supplied+-- length is greater than the old length, the new elements will have undefined+-- value. The resulting vector has only one segment.+newLen :: Syntax a => Data Length -> Vector a -> Vector a+newLen l vec = (mergeSegments vec) {segmentLength = l}++(++) :: Vector a -> Vector a -> Vector a+Empty ++ v = v+v ++ Empty = v+Indexed l ixf cont ++ v = Indexed l ixf (cont ++ v)++infixr 5 ++++take :: Data Length -> Vector a -> Vector a+take _ Empty = Empty+take n (Indexed l ixf cont) = indexed nHead ixf ++ take nCont cont+ where+ nHead = min l n+ nCont = sizeProp (uncurry rangeSubSat) (n,l) $ n - min l n++drop :: Data Length -> Vector a -> Vector a+drop _ Empty = Empty+drop n (Indexed l ixf cont) = indexed nHead (ixf . (+n)) ++ drop nCont cont+ where+ nHead = sizeProp (uncurry rangeSubSat) (l,n) $ l - min l n+ nCont = sizeProp (uncurry rangeSubSat) (n,l) $ n - min l n++splitAt :: Data Index -> Vector a -> (Vector a, Vector a)+splitAt n vec = (take n vec, drop n vec)++head :: Syntax a => Vector a -> a+head = (!0)++last :: Syntax a => Vector a -> a+last vec = vec ! (length vec - 1)++tail :: Vector a -> Vector a+tail = drop 1++init :: Vector a -> Vector a+init vec = take (length vec - 1) vec++tails :: Vector a -> Vector (Vector a)+tails vec = indexed (length vec + 1) (`drop` vec)++inits :: Vector a -> Vector (Vector a)+inits vec = indexed (length vec + 1) (`take` vec)++inits1 :: Vector a -> Vector (Vector a)+inits1 = tail . inits++-- | Permute a single-segment vector+permute' :: (Data Length -> Data Index -> Data Index) -> (Vector a -> Vector a)+permute' _ Empty = Empty+permute' perm (Indexed l ixf Empty) = indexed l (ixf . perm l)++-- | Permute a vector+permute :: Syntax a =>+ (Data Length -> Data Index -> Data Index) -> (Vector a -> Vector a)+permute perm = permute' perm . mergeSegments++reverse :: Syntax a => Vector a -> Vector a+reverse = permute $ \l i -> l-1-i+ -- TODO Can be optimized (reversing each segment separately, and then+ -- reversing the segment order)++rotateVecL :: Syntax a => Data Index -> Vector a -> Vector a+rotateVecL ix = permute $ \l i -> (i + ix) `rem` l++rotateVecR :: Syntax a => Data Index -> Vector a -> Vector a+rotateVecR ix = reverse . rotateVecL ix . reverse++replicate :: Data Length -> a -> Vector a+replicate n a = Indexed n (const a) Empty++-- | @enumFromTo m n@: Enumerate the integers from @m@ to @n@+--+enumFromTo :: forall a. (Integral a)+ => Data a -> Data a -> Vector (Data a)+enumFromTo 1 n+ | IntType U _ <- typeRep :: TypeRep a+ = indexed (i2n n) ((+1) . i2n)+enumFromTo m n = indexed (i2n l) ((+m) . i2n)+ where+ l = (n<m) ? (0, n-m+1)+ -- TODO The first case avoids the comparison when `m` is 1. However, it+ -- cover the case when `m` is a complicated expression that is later+ -- optimized to the literal 1. The same holds for other such+ -- optimizations in this module.+ --+ -- Perhaps we need a language construct that lets the user supply a+ -- custom optimization rule (similar to `sizeProp`)? `sizeProp` could+ -- probably be expressed in terms of this more general construct.++-- | @enumFrom m@: Enumerate the indexes from @m@ to 'maxBound'+enumFrom :: (Integral a) => Data a -> Vector (Data a)+enumFrom = flip enumFromTo (value maxBound)++-- | See 'enumFromTo'+(...) :: (Integral a) => Data a -> Data a -> Vector (Data a)+(...) = enumFromTo++-- | 'map' @f v@ is the 'Vector' obtained by applying f to each element of+-- @f@.+map :: (a -> b) -> Vector a -> Vector b+map _ Empty = Empty+map f (Indexed l ixf cont) = Indexed l (f . ixf) $ map f cont++-- | Zipping two 'Vector's+zip :: (Syntax a, Syntax b) => Vector a -> Vector b -> Vector (a,b)+zip v1 v2 = go (mergeSegments v1) (mergeSegments v2)+ where+ go Empty _ = Empty+ go _ Empty = Empty+ go (Indexed l1 ixf1 Empty) (Indexed l2 ixf2 Empty) =+ indexed (min l1 l2) ((,) <$> ixf1 <*> ixf2)++-- | Zipping three 'Vector's+zip3 :: (Syntax a, Syntax b, Syntax c)+ => Vector a -> Vector b -> Vector c -> Vector (a,b,c)+zip3 v1 v2 v3 = go (mergeSegments v1) (mergeSegments v2) (mergeSegments v3)+ where+ go Empty _ _ = Empty+ go _ Empty _ = Empty+ go _ _ Empty = Empty+ go (Indexed l1 ixf1 Empty) (Indexed l2 ixf2 Empty) (Indexed l3 ixf3 Empty) =+ indexed (Prelude.foldr1 min [l1,l2,l3]) ((,,) <$> ixf1 <*> ixf2 <*> ixf3)++-- | Zipping four 'Vector's+zip4 :: (Syntax a, Syntax b, Syntax c, Syntax d)+ => Vector a -> Vector b -> Vector c -> Vector d -> Vector (a,b,c,d)+zip4 v1 v2 v3 v4 = go (mergeSegments v1) (mergeSegments v2) (mergeSegments v3) (mergeSegments v4)+ where+ go Empty _ _ _ = Empty+ go _ Empty _ _ = Empty+ go _ _ Empty _ = Empty+ go _ _ _ Empty = Empty+ go (Indexed l1 ixf1 Empty) (Indexed l2 ixf2 Empty) (Indexed l3 ixf3 Empty) (Indexed l4 ixf4 Empty) =+ indexed (Prelude.foldr1 min [l1,l2,l3,l4]) ((,,,) <$> ixf1 <*> ixf2 <*> ixf3 <*> ixf4)++-- | Zipping five 'Vector's+zip5 :: (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e)+ => Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector (a,b,c,d,e)+zip5 v1 v2 v3 v4 v5 = go (mergeSegments v1) (mergeSegments v2) (mergeSegments v3) (mergeSegments v4) (mergeSegments v5)+ where+ go Empty _ _ _ _ = Empty+ go _ Empty _ _ _ = Empty+ go _ _ Empty _ _ = Empty+ go _ _ _ Empty _ = Empty+ go _ _ _ _ Empty = Empty+ go (Indexed l1 ixf1 Empty) (Indexed l2 ixf2 Empty) (Indexed l3 ixf3 Empty) (Indexed l4 ixf4 Empty) (Indexed l5 ixf5 Empty) =+ indexed (Prelude.foldr1 min [l1,l2,l3,l4,l5]) ((,,,,) <$> ixf1 <*> ixf2 <*> ixf3 <*> ixf4 <*> ixf5)++-- | Unzip to two 'Vector's+unzip :: Vector (a,b) -> (Vector a, Vector b)+unzip v = (map sel1 v, map sel2 v)++-- | Unzip to three 'Vector's+unzip3 :: Vector (a,b,c) -> (Vector a, Vector b, Vector c)+unzip3 v = (map sel1 v, map sel2 v, map sel3 v)++-- | Unzip to four 'Vector's+unzip4 :: Vector (a,b,c,d) -> (Vector a, Vector b, Vector c, Vector d)+unzip4 v = (map sel1 v, map sel2 v, map sel3 v, map sel4 v)++-- | Unzip to five 'Vector's+unzip5 :: Vector (a,b,c,d,e) -> (Vector a, Vector b, Vector c, Vector d, Vector e)+unzip5 v = (map sel1 v, map sel2 v, map sel3 v, map sel4 v, map sel5 v)++-- | Generalization of 'zip' using the supplied function instead of tupling+-- to combine the elements+zipWith :: (Syntax a, Syntax b) =>+ (a -> b -> c) -> Vector a -> Vector b -> Vector c+zipWith f a b = map (uncurryN f) $ zip a b++-- | Generalization of 'zip3' using the supplied function instead of tupling+-- to combine the elements+zipWith3 :: (Syntax a, Syntax b, Syntax c) =>+ (a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d+zipWith3 f a b c = map (uncurryN f) $ zip3 a b c++-- | Generalization of 'zip4' using the supplied function instead of tupling+-- to combine the elements+zipWith4 :: (Syntax a, Syntax b, Syntax c, Syntax d) =>+ (a -> b -> c -> d -> e) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e+zipWith4 f a b c d = map (uncurryN f) $ zip4 a b c d++-- | Generalization of 'zip5' using the supplied function instead of tupling+-- to combine the elements+zipWith5 :: (Syntax a, Syntax b, Syntax c, Syntax d, Syntax e) =>+ (a -> b -> c -> d -> e -> f) -> Vector a -> Vector b -> Vector c -> Vector d -> Vector e -> Vector f+zipWith5 f a b c d e = map (uncurryN f) $ zip5 a b c d e++-- | Corresponds to the standard 'foldl'.+fold :: (Syntax a) => (a -> b -> a) -> a -> Vector b -> a+fold _ x Empty = x+fold f x (Indexed l ixf cont) =+ fold f (forLoop l x $ \ix s -> f s (ixf ix)) cont++-- | Corresponds to the standard 'foldl1'.+fold1 :: Syntax a => (a -> a -> a) -> Vector a -> a+fold1 f a = fold f (head a) (tail a)++sum :: (Syntax a, Num a) => Vector a -> a+sum = fold (+) 0++maximum :: Ord a => Vector (Data a) -> Data a+maximum = fold1 max++minimum :: Ord a => Vector (Data a) -> Data a+minimum = fold1 min++-- | Scalar product of two vectors+scalarProd :: (Syntax a, Num a) => Vector a -> Vector a -> a+scalarProd a b = sum (zipWith (*) a b)++++--------------------------------------------------------------------------------+-- Misc.+--------------------------------------------------------------------------------++tVec :: Patch a a -> Patch (Vector a) (Vector a)+tVec _ = id++tVec1 :: Patch a a -> Patch (Vector (Data a)) (Vector (Data a))+tVec1 _ = id++tVec2 :: Patch a a -> Patch (Vector (Vector (Data a))) (Vector (Vector (Data a)))+tVec2 _ = id++instance (Arbitrary (Internal a), Syntax a) => Arbitrary (Vector a)+ where+ arbitrary = fmap value arbitrary++instance (Type a) => Wrap (Vector (Data a)) (Data [a]) where+ wrap = freezeVector++instance (Wrap t u, Type a, TL.Nat s) => Wrap (Vector1 a -> t) (Data' s [a] -> u) where+ wrap f = \(Data' d) -> wrap $ f $ thawVector $ setLength s' d where+ s' = fromInteger $ toInteger $ TL.toInt (undefined :: s)++instance Annotatable a => Annotatable (Vector a)+ where+ annotate _ Empty = Empty+ annotate info (Indexed len ixf cont) = Indexed+ (annotate (info Prelude.++ " (vector length)") len)+ (annotate (info Prelude.++ " (vector element)") . ixf)+ (annotate info cont)+
+ src/Feldspar/Vector/Push.hs view
@@ -0,0 +1,183 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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.Vector.Push where++import qualified Prelude++import Feldspar hiding (sugar,desugar)+import qualified Feldspar.Vector as V++import Language.Syntactic (Syntactic(..))++data PushVector a where+ Push :: ((Data Index -> a -> M ()) -> M ()) -> Data Length -> PushVector a++instance Syntax a => Syntactic (PushVector a)+ where+ type Domain (PushVector a) = FeldDomainAll+ type Internal (PushVector a) = [Internal a]+ desugar = desugar . freezePush+ sugar = thawPush . sugar++-- | Store push vectors in memory.+freezePush :: Syntax a => PushVector a -> Data [Internal a]+freezePush (Push k l) = runMutableArray $ do+ arr <- newArr_ l+ k (\i a -> setArr arr i (resugar a))+ return arr++-- | Store a push vector to memory and return it as an ordinary vector.+freezeToVector :: Syntax a => PushVector a -> V.Vector a+freezeToVector = V.map resugar . V.thawVector . freezePush++-- | Create a push vector from an array stored in memory.+thawPush :: Syntax a => Data [Internal a] -> PushVector a+thawPush arr = Push f (getLength arr)+ where f k = forM (getLength arr) $ \ix ->+ k ix (resugar (arr ! ix))++instance Syntax a => Syntax (PushVector a)++-- | Any kind of vector, push or pull, can cheaply be converted to a push vector+class Pushy arr where+ toPush :: Syntax a => arr a -> PushVector a++instance Pushy PushVector where+ toPush = id++instance Pushy V.Vector where+ toPush vec = Push (\k -> forM (length vec) (\i -> k i (vec!i))) (length vec)++instance Functor PushVector where+ fmap f (Push g l) = Push (\k -> g (\i a -> k i (f a))) l++-- | Concatenating two arrays.+(++) :: (Pushy arr, Syntax a) => arr a -> arr a -> PushVector a+v1 ++ v2 = Push (\func -> f func >>+ g (\i a -> func (l1 + i) a))+ (l1 + l2)+ where+ Push f l1 = toPush v1+ Push g l2 = toPush v2++-- | Given an array of pairs, flatten the array so that the elements of the+-- pairs end up next to each other in the resulting vector.+unpair :: (Pushy arr, Syntax a) => arr (a,a) -> PushVector a+unpair arr = Push (\k -> f (everyOther k)) (2 * l)+ where+ Push f l = toPush arr++everyOther :: (Data Index -> a -> M b)+ -> Data Index -> (a,a) -> M b+everyOther f = \ix (a1,a2) -> f (ix * 2) a1 >> f (ix * 2 + 1) a2++-- | Interleaves the elements of two vectors.+zipUnpair :: Syntax a => V.Vector a -> V.Vector a -> PushVector a+zipUnpair v1 v2 = unpair (V.zip v1 v2)++-- | An overloaded function for reordering elements of a vector.+class Ixmap arr where+ ixmap :: Syntax a => (Data Index -> Data Index) -> arr a -> arr a++instance Ixmap V.Vector where+ ixmap f vec = V.indexed (length vec) (\i -> vec ! (f i))++instance Ixmap PushVector where+ ixmap f (Push g l) = Push (\k -> g (\i a -> k (f i) a)) l++-- | Reverse a vector. Works for both push and pull vectors.+reverse :: (Ixmap arr, Len arr, Syntax a) =>+ arr a -> arr a+reverse arr = ixmap (\ix -> length arr - ix - 1) arr++-- | Split a pull vector in half.+--+-- If the input vector has an odd length the second result vector+-- will be one element longer than the first.+halve :: Syntax a => V.Vector a -> (V.Vector a, V.Vector a)+halve v = (V.indexed (l `div` 2) ixf+ ,V.indexed ((l+1) `div` 2) (\i -> ixf (i + (l `div` 2))))+ where l = length v+ ixf = (v!)++-- | Split a vector in half and interleave the two two halves.+riffle :: Syntax a => V.Vector a -> PushVector a+riffle = unpair . uncurry V.zip . halve++-- | A class for overloading `length` for both pull and push vectors+class Len arr where+ length :: arr a -> Data Length++instance Len V.Vector where+ length = V.length++instance Len PushVector where+ length (Push _ l) = l++-- | This function can distribute array computations on chunks of a large+-- pull vector. A call `chunk l f g v` will split the vector `v` into chunks+-- of size `l` and apply `f` to these chunks. In case the length of `v` is+-- not a multiple of `l` then the rest of `v` will be processed by `g`.+chunk :: (Pushy arr1, Pushy arr2, Syntax b)+ => Data Length -- ^ Size of the chunks+ -> (V.Vector a -> arr1 b) -- ^ Applied to every chunk+ -> (V.Vector a -> arr2 b) -- ^ Applied to the rest of the vector+ -> V.Vector a+ -> PushVector b+chunk c f g v = Push loop (noc * c)+ ++ toPush (g (V.drop (noc * c) v))+ where l = length v+ noc = l `div` c+ loop func = forM noc $ \i ->+ do let (Push k _) = toPush $ f (V.take c (V.drop (c*i) v))+ k (\j a -> func (c*i + j) a)++-- | The empty push vector.+empty :: PushVector a+empty = Push (const (return ())) 0++-- | Flattens a pull vector containing push vectors into an unnested push vector+--+-- Note that there are no restrictions on the lengths of the push vectors+-- inside the pull vector.+flatten :: Syntax a => V.Vector (PushVector a) -> PushVector a+flatten v = Push f len+ where len = V.sum (V.map length v)+ f k = do l <- newRef 0+ forM (length v) $ \i ->+ do let (Push g m) = v ! i+ n <- getRef l+ g (\j a -> k (n + j) a)+ setRef l (n+m)
+ src/Feldspar/Wrap.hs view
@@ -0,0 +1,90 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++--+-- Copyright (c) 2009-2011, 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 "Data.TypeLevel.Num.Aliases" is re-exported because+-- wrappers use type level numbers frequently+module Feldspar.Wrap+ ( Wrap(..)+ , Data'(..)+ , module Data.TypeLevel.Num.Aliases+ , D0+ , D1+ , D2+ , D3+ , D4+ , D5+ , D6+ , D7+ , D8+ , D9+ ) where+++import Feldspar.Core.Constructs+import Feldspar.Core.Types++import Language.Syntactic++import Data.TypeLevel.Num.Aliases+import Data.TypeLevel.Num.Reps (D0, D1, D2, D3, D4, D5, D6, D7, D8, D9 )+++-- | Wrapping Feldspar functions+class Wrap t w where+ wrap :: t -> w++-- | Basic instances to handle @Data a@ input and output.+-- Other instances are located in the concerned libraries.+instance Wrap (Data a) (Data a) where+ wrap = id++instance (Wrap t u) => Wrap (Data a -> t) (Data a -> u) where+ wrap f = wrap . f++-- | Extended 'Data' to be used in wrappers+data Data' s a =+ Data'+ { unData' :: Data a+ }++-- Syntactic instance for 'Data''++instance Type a => Syntactic (Data' s a)+ where+ type Domain (Data' s a) = FeldDomainAll+ type Internal (Data' s a) = a+ desugar = desugar . unData'+ sugar = Data' . sugar++instance Type a => Syntax (Data' s a)+
+ tests/DecorationTests.hs view
@@ -0,0 +1,19 @@+module Main where++-- To generate the golden files use a script similiar to this one+-- > ghc -e 'B.writeFile "tests/gold/example9.txt" $ B.pack $ showDecor example9' tests/DecorationTests.hs -iexamples++import Test.Framework+import Test.Golden++import qualified Data.ByteString.Lazy.Char8 as B++import Feldspar (showDecor)+import Examples.Simple.Basics++tests = testGroup "DecorationTests"+ [ goldenVsString "example9" "tests/gold/example9.txt" $ return $ B.pack $ showDecor example9+ ]++main = defaultMain [tests]+
+ tests/Feldspar/Range/Test.hs view
@@ -0,0 +1,501 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE ConstraintKinds #-}++--+-- Copyright (c) 2009-2011, 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.+--++-- | Bounded integer ranges++module Feldspar.Range.Test where++-- TODO This module should be broken up into smaller pieces. Since most+-- functions seem to be useful not only for Feldspar, it would probably be good+-- to make a separate package. In any case, the modules should go under+-- `Data.Range`. If there are functions that are very Feldspar specific, these+-- should go into `Feldspar.Core.Constructs.*` (or whereever suitable).+++import Feldspar.Range+import System.Random -- Should maybe be exported from QuickCheck+import Test.QuickCheck hiding ((.&.))+import qualified Test.QuickCheck as QC+import Test.Framework+import Test.Framework.Providers.QuickCheck2++import Data.Bits+import Data.Int+import Data.Word+import Data.Typeable++import Feldspar.Lattice++tests = [ testGroup "Range Int" $ typedTestsSigned "Int" (undefined :: Int)+ , testGroup "Range Int8" $ typedTestsSigned "Int8" (undefined :: Int8)+ , testGroup "Range Word8" $ typedTestsUnsigned "Word8" (undefined :: Word8)+ , testGroup "Range Word32" $ typedTestsUnsigned "Word32" (undefined :: Word32)+ ]++typedTests name typ =+ [ testProperty (unwords ["prop_empty" , name]) (prop_empty typ)+ , testProperty (unwords ["prop_full" , name]) (prop_full typ)+ , testProperty (unwords ["prop_isEmpty" , name]) (prop_isEmpty typ)+ , testProperty (unwords ["prop_singletonRange" , name]) (prop_singletonRange typ)+ , testProperty (unwords ["prop_singletonSize" , name]) (prop_singletonSize typ)+ , testProperty (unwords ["prop_emptySubRange1" , name]) (prop_emptySubRange1 typ)+ , testProperty (unwords ["prop_emptySubRange2" , name]) (prop_emptySubRange2 typ)+ , testProperty (unwords ["prop_rangeGap" , name]) (prop_rangeGap typ)+ , testProperty (unwords ["prop_union1" , name]) (prop_union1 typ)+ , testProperty (unwords ["prop_union2" , name]) (prop_union2 typ)+ , testProperty (unwords ["prop_union3" , name]) (prop_union3 typ)+ , testProperty (unwords ["prop_union4" , name]) (prop_union4 typ)+ , testProperty (unwords ["prop_intersect1" , name]) (prop_intersect1 typ)+ , testProperty (unwords ["prop_intersect2" , name]) (prop_intersect2 typ)+ , testProperty (unwords ["prop_intersect3" , name]) (prop_intersect3 typ)+ , testProperty (unwords ["prop_intersect4" , name]) (prop_intersect4 typ)+ , testProperty (unwords ["prop_intersect5" , name]) (prop_intersect5 typ)+ , testProperty (unwords ["prop_disjoint" , name]) (prop_disjoint typ)+ , testProperty (unwords ["prop_rangeLess1" , name]) (prop_rangeLess1 typ)+ , testProperty (unwords ["prop_rangeLess2" , name]) (prop_rangeLess2 typ)+ , testProperty (unwords ["prop_rangeLessEq" , name]) (prop_rangeLessEq typ)+ , testProperty (unwords ["prop_rangeByRange1" , name]) (prop_rangeByRange1 typ)+ , testProperty (unwords ["prop_rangeByRange2" , name]) (prop_rangeByRange2 typ)+ , testProperty (unwords ["prop_fromInteger" , name]) (prop_fromInteger typ)+ , testProperty (unwords ["prop_abs" , name]) (prop_abs typ)+ , testProperty (unwords ["prop_sign" , name]) (prop_sign typ)+ , testProperty (unwords ["prop_neg" , name]) (prop_neg typ)+ , testProperty (unwords ["prop_add" , name]) (prop_add typ)+ , testProperty (unwords ["prop_sub" , name]) (prop_sub typ)+ , testProperty (unwords ["prop_mul" , name]) (prop_mul typ)+ , testProperty (unwords ["prop_exp" , name]) (prop_exp typ)+ , testProperty (unwords ["prop_abs2" , name]) (prop_abs2 typ)+ , testProperty (unwords ["prop_or" , name]) (prop_or typ)+ , testProperty (unwords ["prop_and" , name]) (prop_and typ)+ , testProperty (unwords ["prop_xor" , name]) (prop_xor typ)+ , testProperty (unwords ["prop_rangeMax1" , name]) (prop_rangeMax1 typ)+ , testProperty (unwords ["prop_rangeMax2" , name]) (prop_rangeMax2 typ)+ , testProperty (unwords ["prop_rangeMax3" , name]) (prop_rangeMax3 typ)+ , testProperty (unwords ["prop_rangeMax4" , name]) (prop_rangeMax4 typ)+ , testProperty (unwords ["prop_rangeMax5" , name]) (prop_rangeMax5 typ)+ , testProperty (unwords ["prop_rangeMax6" , name]) (prop_rangeMax6 typ)+ , testProperty (unwords ["prop_rangeMax7" , name]) (prop_rangeMax7 typ)+ , testProperty (unwords ["prop_rangeMin1" , name]) (prop_rangeMin1 typ)+ , testProperty (unwords ["prop_rangeMin2" , name]) (prop_rangeMin2 typ)+ , testProperty (unwords ["prop_rangeMin3" , name]) (prop_rangeMin3 typ)+ , testProperty (unwords ["prop_rangeMin4" , name]) (prop_rangeMin4 typ)+ , testProperty (unwords ["prop_rangeMin5" , name]) (prop_rangeMin5 typ)+ , testProperty (unwords ["prop_rangeMin6" , name]) (prop_rangeMin6 typ)+ , testProperty (unwords ["prop_rangeMin7" , name]) (prop_rangeMin7 typ)+ , testProperty (unwords ["prop_rangeMod1" , name]) (prop_rangeMod1 typ)+ , testProperty (unwords ["prop_rangeMod2" , name]) (prop_rangeMod2 typ)+ , testProperty (unwords ["prop_rangeRem" , name]) (prop_rangeRem typ)+ , testProperty (unwords ["prop_rangeQuot" , name]) (prop_rangeQuot typ)+ ]++typedTestsUnsigned name typ = typedTests name typ +++ [ testProperty (unwords ["prop_mulU" , name]) (prop_mulU typ)+ , testProperty (unwords ["prop_subSat" , name]) (prop_subSat typ)+ ]++typedTestsSigned name typ = typedTests name typ +++ [ testProperty (unwords ["prop_isNegative" , name]) (prop_isNegative typ)+ , testProperty (unwords ["prop_rangeMod3" , name]) (prop_rangeMod3 typ)+ , testProperty (unwords ["prop_rangeRem1" , name]) (prop_rangeRem1 typ)+ , testProperty (unwords ["prop_rangeQuot1" , name]) (prop_rangeQuot1 typ)+ ]++--------------------------------------------------------------------------------+-- * Testing+--------------------------------------------------------------------------------++instance (BoundedInt a, Arbitrary a) => Arbitrary (Range a)+ where+ arbitrary = do+ [bound1,bound2] <- vectorOf 2 $ oneof+ [ arbitrary+ , elements [minBound,-1,0,1,maxBound]]+ frequency+ [ (10, return $+ Range (min bound1 bound2) (max bound1 bound2))+ , (1 , return $+ Range (max bound1 bound2) (min bound1 bound2)) -- Empty+ , (1 , return $+ Range bound1 bound1) -- Singleton+ ]++ shrink (Range x y) =+ [ Range x' y | x' <- shrink x ] +++ [ Range x y' | y' <- shrink y ]++#if __GLASGOW_HASKELL__ < 704+instance Random Word32 where+ random g = (fromIntegral i,g')+ where (i :: Int,g') = random g+ randomR (l,u) g = (fromIntegral i,g')+ where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g++instance Random Int8 where+ random g = (fromIntegral i,g')+ where (i :: Int,g') = random g+ randomR (l,u) g = (fromIntegral i,g')+ where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g++instance Random Word8 where+ random g = (fromIntegral i,g')+ where (i :: Int,g') = random g+ randomR (l,u) g = (fromIntegral i,g')+ where (i :: Integer, g') = randomR (fromIntegral l,fromIntegral u) g+#endif++fromRange :: BoundedInt a => Random a => Range a -> Gen a+fromRange r+ | isEmpty r = error "fromRange: empty range"+ | otherwise = choose (lowerBound r, upperBound r)++rangeTy :: Range t -> t -> Range t+rangeTy r _ = r++-- | Applies a (monadic) function to all the types we are interested in testing+-- with for Feldspar.+--+-- Example usage: 'atAllTypes (quickCheck . prop_mul)'+atAllTypes :: (Monad m) =>+ (forall t . (Show t, BoundedInt t, Random t, Arbitrary t, Typeable t) =>+ t -> m a)+ -> m ()+atAllTypes test = sequence_ [test (undefined :: Int)+ ,test (undefined :: Int8)+ ,test (undefined :: Word32)+ ,test (undefined :: Word8)+ ]++-- | Test if a operation is "strict" wrt. empty ranges+prop_isStrict1 t op ra = isEmpty ra ==> isEmpty (op ra)+ where _ = ra `rangeTy` t++-- | Test if an operation is "strict" wrt. empty ranges+prop_isStrict2 t op ra rb =+ isEmpty ra || isEmpty rb ==> isEmpty (op ra rb)+ where _ = ra `rangeTy` t++-- TODO Think about strictness of range operations (in the sense of `isStrict1`+-- and `isStrict2`). Probably all range propagation operations should be strict,+-- but many of them are currently not:+--+-- *Feldspar.Range> quickCheck (prop_isStrict2 (undefined :: Int) (+))+-- *** Failed! Falsifiable (after 1 test and 1 shrink):+-- Range {lowerBound = 0, upperBound = 1}+-- Range {lowerBound = 1, upperBound = 0}++++--------------------------------------------------------------------------------+-- ** Lattice operations+--------------------------------------------------------------------------------++prop_empty t = isEmpty (emptyRange `rangeTy` t)++prop_full t = isFull (fullRange `rangeTy` t)++prop_isEmpty t r = isEmpty r ==> (upperBound r < lowerBound (r `rangeTy` t))++prop_singletonRange t a = isSingleton (singletonRange (a `asTypeOf` t))++prop_singletonSize t r = isSingleton (r `rangeTy` t) ==> (rangeSize r == 1)++prop_emptySubRange1 t r1 r2 =+ isEmpty (r1 `rangeTy` t) ==> (not (isEmpty r2) ==>+ not (r2 `isSubRangeOf` r1))++prop_emptySubRange2 t r1 r2 =+ isEmpty (r1 `rangeTy` t) ==> (not (isEmpty r2) ==> (r1 `isSubRangeOf` r2))++prop_rangeGap t r1 r2 =+ (isEmpty gap1 && isEmpty gap2) || (gap1 == gap2)+ where+ gap1 = rangeGap r1 r2+ gap2 = rangeGap r2 r1+ _ = r1 `rangeTy` t++prop_union1 t x r1 r2 =+ ((x `inRange` r1) || (x `inRange` r2)) ==> (x `inRange` (r1\/r2))+ where _ = x `asTypeOf` t++prop_union2 t x r1 r2 =+ (x `inRange` (r1\/r2)) ==>+ ((x `inRange` r1) || (x `inRange` r2) || (x `inRange` rangeGap r1 r2))+ where _ = x `asTypeOf` t++prop_union3 t r1 r2 = (r1 `rangeTy` t) `isSubRangeOf` (r1\/r2)+prop_union4 t r1 r2 = (r2 `rangeTy` t) `isSubRangeOf` (r1\/r2)+++prop_intersect1 t x r1 r2 =+ ((x `inRange` r1) && (x `inRange` r2)) ==> (x `inRange` (r1/\r2))+ where _ = x `asTypeOf` t+prop_intersect2 t x r1 r2 =+ (x `inRange` (r1/\r2)) ==> ((x `inRange` r1) && (x `inRange` r2))+ where _ = x `asTypeOf` t++prop_intersect3 t r1 r2 = (r1/\r2) `isSubRangeOf` (r1 `rangeTy` t)+prop_intersect4 t r1 r2 = (r1/\r2) `isSubRangeOf` (r2 `rangeTy` t)++prop_intersect5 t r1 r2 =+ isEmpty r1 || isEmpty r2 ==> isEmpty (r1/\r2)+ where _ = r1 `rangeTy` t++prop_disjoint t x r1 r2 =+ disjoint r1 r2 ==> (x `inRange` r1) ==> not (x `inRange` r2)+ where _ = x `asTypeOf` t+++prop_rangeLess1 t r1 r2 =+ rangeLess r1 r2 ==> disjoint r1 (r2 `rangeTy` t)++prop_rangeLess2 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ forAll (fromRange r1) $ \x ->+ forAll (fromRange r2) $ \y ->+ rangeLess r1 r2 ==> x < y+ where _ = r1 `rangeTy` t++prop_rangeLessEq t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ forAll (fromRange r1) $ \x ->+ forAll (fromRange r2) $ \y ->+ rangeLessEq r1 r2 ==> x <= y+ where _ = r1 `rangeTy` t+++--------------------------------------------------------------------------------+-- ** Propagation+--------------------------------------------------------------------------------++prop_propagation1 :: (Show t, BoundedInt t, Random t) =>+ t -> (forall a . Num a => a -> a) -> Range t -> Property+prop_propagation1 _ op r =+ not (isEmpty r) ==>+ forAll (fromRange r) $ \x ->+ op x `inRange` op r++-- | This function is useful for range propagation functions like+-- 'rangeMax', 'rangeMod' etc.+-- It takes two ranges, picks an element out of either ranges and+-- checks if applying the operation to the individual elements is in+-- the resulting range after range propagation.+--+-- The third argument is a precondition that is satisfied before the test is+-- run. A good example is to make sure that the second argument is non-zero+-- when testing division.+rangePropagationSafetyPre :: (Show t, Random t, BoundedInt t, BoundedInt a) =>+ t ->+ (t -> t -> a) -> (Range t -> Range t -> Range a) ->+ (t -> t -> Bool) ->+ Range t -> Range t -> Property+rangePropagationSafetyPre _ op rop pre r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ forAll (fromRange r1) $ \v1 ->+ forAll (fromRange r2) $ \v2 ->+ pre v1 v2 ==>+ op v1 v2 `inRange` rop r1 r2++rangePropagationSafetyPre2 ::+ (Show t, Show t2, Random t, BoundedInt t, Random t2, BoundedInt t2, BoundedInt a) =>+ t -> t2 ->+ (t -> t2 -> a) -> (Range t -> Range t2 -> Range a) ->+ (t -> t2 -> Bool) ->+ Range t -> Range t2 -> Property+rangePropagationSafetyPre2 _ _ op rop pre r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ forAll (fromRange r1) $ \v1 ->+ forAll (fromRange r2) $ \v2 ->+ pre v1 v2 ==>+ op v1 v2 `inRange` rop r1 r2++rangePropagationSafety t op rop = rangePropagationSafetyPre t op rop noPre+ where+ noPre _ _ = True++rangePropSafety1 t op rop ran =+ not (isEmpty ran) ==>+ forAll (fromRange ran) $ \val ->+ op val `inRange` rop ran+ where _ = ran `rangeTy` t++prop_propagation2+ :: (Show t, BoundedInt t, Random t) => t -> (forall a . Num a => a -> a -> a)+ -> Range t -> Range t -> Property+prop_propagation2 t op = rangePropagationSafety t op op++prop_rangeByRange1 t ra rb =+ forAll (fromRange ra) $ \a ->+ forAll (fromRange rb) $ \b ->+ forAll (fromRange (Range a b)) $ \x ->+ not (isEmpty ra) && not (isEmpty rb) && not (isEmpty (Range a b)) ==>+ inRange x (rangeByRange ra rb)+ where _ = ra `rangeTy` t++prop_rangeByRange2 t = prop_isStrict2 t rangeByRange++prop_fromInteger t a = isSingleton (fromInteger a `rangeTy` t)++prop_abs t = prop_propagation1 t abs+prop_sign t = prop_propagation1 t signum+prop_neg t = prop_propagation1 t negate+prop_add t = prop_propagation2 t (+)+prop_sub t = prop_propagation2 t (-)+prop_mul t = prop_propagation2 t (*)++prop_exp t = rangePropagationSafetyPre t (^) rangeExp (\_ e -> e >= 0)++prop_mulU t = rangePropagationSafety t (*) rangeMulUnsigned++prop_subSat t = rangePropagationSafety t subSat rangeSubSat++prop_isNegative t r =+ not (isEmpty r) && (r /= Range minBound minBound) ==>+ isNegative r ==> not (isNegative $ negate r)+ where _ = rangeTy r t++prop_abs2 t r =+ lowerBound r /= (minBound `asTypeOf` t) ==> isNatural (abs r)++prop_or t = rangePropagationSafety t (.|.) rangeOr++prop_and t = rangePropagationSafety t (.&.) rangeAnd++prop_xor t = rangePropagationSafety t xor rangeXor++prop_shiftLU t1 t2+ = rangePropagationSafetyPre2 t1 t2 fixShiftL rangeShiftLU (\_ _ -> True)+ where fixShiftL a b = shiftL a (fromIntegral b)++prop_shiftRU t1 t2+ = rangePropagationSafetyPre2 t1 t2 fixShiftR rangeShiftRU (\_ _ -> True)+ where fixShiftR = correctShiftRU++prop_rangeMax1 t r1 = rangeMax r1 r1 == (r1 `rangeTy` t)++prop_rangeMax2 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ upperBound r1 <= upperBound max && upperBound r2 <= upperBound max+ where+ max = rangeMax r1 (r2 `rangeTy` t)++prop_rangeMax3 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ lowerBound (rangeMax r1 r2) == max (lowerBound r1) (lowerBound r2)+ where _ = r1 `rangeTy` t++prop_rangeMax4 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ rangeMax r1 r2 == rangeMax r2 r1+ where _ = r1 `rangeTy` t++prop_rangeMax5 t r1 r2 =+ (isEmpty r1 && not (isEmpty r2) ==>+ rangeMax r1 r2 == r2)+ QC..&.+ (isEmpty r2 && not (isEmpty r1) ==>+ rangeMax r1 r2 == r1)+ where _ = r1 `rangeTy` t++prop_rangeMax6 t v1 v2 =+ max v1 v2 `inRange` rangeMax (singletonRange v1) (singletonRange v2)+ where _ = v1 `asTypeOf` t++prop_rangeMax7 a = rangePropagationSafety a max rangeMax++prop_rangeMin1 t r1 = rangeMin r1 r1 == (r1 `rangeTy` t)++prop_rangeMin2 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ lowerBound min <= lowerBound r1 && lowerBound min <= lowerBound r2+ where+ min = rangeMin r1 (r2 `rangeTy` t)++prop_rangeMin3 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ upperBound (rangeMin r1 r2) == min (upperBound r1) (upperBound r2)+ where _ = r1 `rangeTy` t++prop_rangeMin4 t r1 r2 =+ not (isEmpty r1) && not (isEmpty r2) ==>+ rangeMin r1 r2 == rangeMin r2 r1+ where _ = r1 `rangeTy` t++prop_rangeMin5 t r1 r2 =+ (isEmpty r1 && not (isEmpty r2) ==>+ rangeMin r1 r2 == r2)+ QC..&.+ (isEmpty r2 && not (isEmpty r1) ==>+ rangeMin r1 r2 == r1)+ where _ = r1 `rangeTy` t++prop_rangeMin6 t v1 v2 =+ min v1 v2 `inRange` rangeMin (singletonRange v1) (singletonRange v2)+ where _ = v1 `asTypeOf` t++prop_rangeMin7 t = rangePropagationSafety t min rangeMin++prop_rangeMod1 t v1 v2 =+ v2 /= 0 ==>+ mod v1 v2 `inRange` rangeMod (singletonRange v1) (singletonRange v2)+ where _ = v1 `asTypeOf` t++prop_rangeMod2 t =+ rangePropagationSafetyPre t mod rangeMod divPre++prop_rangeMod3 t =+ isFull $ rangeMod (singletonRange (minBound `asTypeOf` t))+ (singletonRange (-1))++prop_rangeRem t =+ rangePropagationSafetyPre t rem rangeRem divPre++prop_rangeRem1 t =+ isFull $ rangeRem (singletonRange (minBound `asTypeOf` t))+ (singletonRange (-1))++prop_rangeQuot t =+ rangePropagationSafetyPre t quot rangeQuot divPre++prop_rangeQuot1 t =+ isFull $ rangeQuot (singletonRange (minBound `asTypeOf` t))+ (singletonRange (-1))++-- | Precondition for division like operators.+-- Avoids division by zero and arithmetic overflow.+divPre v1 v2 = v2 /= 0 && not (v1 == minBound && v2 == (-1))+
+ tests/Feldspar/Vector/Test.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE TemplateHaskell #-}++module Feldspar.Vector.Test where++import qualified Prelude as P+import qualified Data.List as P++import Feldspar+import Feldspar.Prelude+import Feldspar.Vector.Internal++import Test.Framework+import Test.Framework.TH+import Test.Framework.Providers.QuickCheck2++tests = $(testGroupGenerator)++prop_freeze_thaw = eval (freezeVector . thawVector) === (id :: [Index] -> [Index])+prop_thaw_freeze = eval (thawVector . freezeVector) === (id :: [Index] -> [Index])++prop_length = eval (length -:: tVec1 tIndex >-> tData tLength) === P.genericLength++prop_append = eval ((++) -:: tVec1 tIndex >-> id >-> id) === (P.++)+prop_take = eval (take -:: tData tLength >-> tVec1 tIndex >-> id) === P.genericTake+prop_drop = eval (drop -:: tData tLength >-> tVec1 tIndex >-> id) === P.genericDrop+prop_revrev = eval ((reverse . reverse) -:: tVec1 tIndex >-> id) === id+
+ tests/RangeTest.hs view
@@ -0,0 +1,8 @@+module Main where++import Feldspar.Range.Test++import Test.Framework++main = defaultMain tests+
+ tests/SemanticsTest.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE TemplateHaskell #-}++module Main where++import Test.Framework+import Test.Framework.TH+import Test.Framework.Providers.QuickCheck2++import Feldspar ((===), eval)+import Examples.Simple.Basics+import qualified Feldspar.Vector.Test++prop_example5 = eval example5 === (+)+prop_example9 = eval example9 === \a -> if a<5 then 3*(a+20) else 30*(a+20)++tests = $(testGroupGenerator)++main = defaultMain [ tests+ , Feldspar.Vector.Test.tests+ ]+