packages feed

accelerate-examples-0.15.0.0: accelerate-examples.cabal

Name:                   accelerate-examples
Version:                0.15.0.0
Cabal-version:          >=1.6
Tested-with:            GHC == 7.8.*
Build-type:             Simple

Synopsis:               Examples using the Accelerate library
Description:
  This package demonstrates a number of computation kernels and applications
  showcasing the /Accelerate/ language and associated backend implementations.
  It is also used for performance and regression testing.
  .
  Refer to the main /Accelerate/ package for more information:
  <http://hackage.haskell.org/package/accelerate>
  .

License:                BSD3
License-file:           LICENSE
Author:                 The Accelerate Team
Maintainer:             Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
Homepage:               https://github.com/AccelerateHS/accelerate-examples
Bug-reports:            https://github.com/AccelerateHS/accelerate/issues

Category:               Compilers/Interpreters, Concurrency, Data, Parallelism
Stability:              Experimental

Extra-source-files:     data/hashcat/README.md
                        data/matrices/README.md

Flag gui
  Description:          Enable gloss-based GUIs, where applicable. If not
                        enabled, the application always runs in benchmark mode.
  Default:              True

Flag ekg
  Description:          Enable EKG remote monitoring server at <http://localhost:8000>
  Default:              True

Flag cuda
  Description:          Enable the CUDA parallel backend for NVIDIA GPUs
  Default:              True

Flag opencl
  Description:          Enable the OpenCL parallel backend
  Default:              False

Flag llvm-cpu
  Description:          Enable the LLVM backend for multicore CPUs
  Default:              True

Flag llvm-gpu
  Description:          Enable the LLVM backend for NVIDIA CPUs
  Default:              True

Flag llvm-multi
  Description:          Enable the multi-device LLVM backend
  Default:              True


-- Flags to specify which programs to build
--
Flag nofib
  Description:          Regression test suite
  Default:              True

Flag smvm
  Description:          Sparse-matrix vector multiplication benchmark
  Default:              True

Flag crystal
  Description:          A visualisation of a sum of waves in a plane
  Default:              True

Flag canny
  Description:          Canny edge detection benchmark
  Default:              True

Flag mandelbrot
  Description:          A Mandelbrot fractal benchmark
  Default:              True

Flag fluid
  Description:          An interactive particle-based fluid simulation
  Default:              True

Flag nbody
  Description:          Simulation of gravitational attraction between solid particles
  Default:              True

Flag smoothlife
  Description:          A cellular automata simulation
  Default:              True

Flag hashcat
  Description:          A "password recovery" application for MD5 cracking
  Default:              True

Flag fft
  Description:          Simple FFT-based high/low-pass image filtering
  Default:              True

Flag pagerank
  Description:          Implementation of the PageRank algorithm
  Default:              True

Flag ray
  Description:          A simple real-time ray tracer
  Default:              True

Flag kmeans
  Description:          An implementation of k-means clustering in a plane
  Default:              True


-- The main test program. This includes randomised quickcheck testing for array
-- primitives, unit tests, imaginary/spectral/real programs, and benchmarks.
--
-- TODO: add an analysis script to scrape benchmark results
--
Executable accelerate-nofib
  Main-is:              Main.hs
  hs-source-dirs:       lib
                        examples/nofib
                        examples/smvm

  other-modules:        Config ParseArgs Monitoring
                        QuickCheck.Arbitrary.Array
                        QuickCheck.Arbitrary.Shape
                        Test.Base
                        Test.FFT
                        Test.IO
                        Test.IO.Ptr
                        Test.IO.Vector
                        Test.Imaginary
                        Test.Imaginary.DotP
                        Test.Imaginary.SASUM
                        Test.Imaginary.SAXPY
                        Test.Issues
                        Test.Issues.Issue93
                        Test.Issues.Issue102
                        Test.Issues.Issue114
                        Test.Issues.Issue119
                        Test.Issues.Issue123
                        Test.Issues.Issue137
                        Test.Issues.Issue168
                        Test.Issues.Issue184
                        Test.Issues.Issue185
                        Test.Issues.Issue187
                        Test.Prelude
                        Test.Prelude.Filter
                        Test.Prelude.IndexSpace
                        Test.Prelude.Mapping
                        Test.Prelude.PrefixSum
                        Test.Prelude.Reduction
                        Test.Prelude.Replicate
                        Test.Prelude.Stencil
                        Test.Sharing
                        Test.Spectral
                        Test.Spectral.BlackScholes
                        Test.Spectral.SMVM
                        Test.Spectral.RadixSort

  ghc-options:          -Wall -O2
                        -threaded
                        -fpedantic-bottoms
                        -fno-full-laziness
                        -fno-excess-precision
                        -eventlog
                        -rtsopts

  ghc-prof-options:     -auto-all

  extra-libraries:      stdc++
  c-sources:            examples/nofib/Test/IO/fill_with_values.cpp
                        examples/nofib/Test/Spectral/BlackScholes.cpp

  if flag(cuda)
    CPP-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda                 == 0.15.*
    other-modules:      Test.Foreign

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native          == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx             == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                             >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(nofib)
    buildable:          False
  else
    build-depends:      accelerate                      == 0.15.*,
                        accelerate-fft                  == 0.15.*,
                        accelerate-io                   == 0.15.*,
                        base                            == 4.7.*,
                        array                           >= 0.3,
                        containers                      >= 0.5,
                        criterion                       >= 0.5 && < 1.0,
                        fclabels                        >= 2.0,
                        HUnit                           >= 1.2,
                        QuickCheck                      >= 2.7,
                        test-framework                  >= 0.5,
                        test-framework-hunit            >= 0.3,
                        test-framework-quickcheck2      >= 0.2,
                        random


-- Sparse matrix vector multiplication
-- -----------------------------------

Executable accelerate-smvm
  hs-source-dirs:       examples/smvm lib
  Main-is:              Main.hs
  other-modules:        ParseArgs Monitoring
                        Config
                        Matrix
                        MatrixMarket
                        SMVM

  ghc-options:          -O2 -Wall -threaded -rtsopts -eventlog
  ghc-prof-options:     -auto-all

  if impl(ghc >= 7.6)
    ghc-options:        -fsimpl-tick-factor=130

  if flag(cuda)
    CPP-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(smvm)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        base                    == 4.7.*,
                        attoparsec              >= 0.10,
                        bytestring              >= 0.9,
                        bytestring-lexing       >= 0.2,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        primitive               >= 0.5,
                        mwc-random              >= 0.8,
                        vector                  >= 0.7,
                        vector-algorithms       >= 0.4


-- A quasicrystal demo as the sum of waves in a plane
-- --------------------------------------------------

Executable accelerate-crystal
  hs-source-dirs:       examples/crystal lib
  Main-is:              Main.hs
  other-modules:        Config ParseArgs Monitoring

  ghc-options:          -O2 -Wall -threaded -rtsopts -eventlog
  ghc-prof-options:     -auto-all

  if flag(gui)
    CPP-options:        -DACCELERATE_ENABLE_GUI

  if flag(cuda)
    CPP-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(crystal)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        gloss-raster-accelerate >= 1.7


-- Image edge detection
-- --------------------

Executable accelerate-canny
  hs-source-dirs:       examples/canny/src-acc lib
  Main-is:              Main.hs
  other-modules:        Config ParseArgs Canny Wildfire Monitoring

  ghc-options:          -Wall
                        -threaded
                        -Odph
                        -fllvm
                        -optlo-O3
                        -eventlog
                        -rtsopts

  ghc-prof-options:     -auto-all

  if flag(cuda)
    CPP-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(canny)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        repa                    >= 3.1,
                        repa-io                 >= 3.1,
                        vector                  >= 0.7


-- A simple mandelbrot generator
-- -----------------------------

Executable accelerate-mandelbrot
  hs-source-dirs:       examples/mandelbrot lib
  Main-is:              Main.hs
  other-modules:        Config World Mandel ParseArgs Monitoring

  ghc-options:          -O2 -Wall -threaded -eventlog -rtsopts
  ghc-prof-options:     -auto-all

  if flag(gui)
    CPP-options:        -DACCELERATE_ENABLE_GUI

  if flag(cuda)
    CPP-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*,
                        accelerate-llvm

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(llvm-cpu) && flag(llvm-gpu) && flag(llvm-multi)
    CPP-options:        -DACCELERATE_LLVM_MULTIDEV_BACKEND
    build-depends:      accelerate-llvm-multidev== 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(mandelbrot)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        gloss                   >= 1.7,
                        gloss-accelerate        >= 1.7


-- A stable fluid simulation
-- -------------------------

Executable accelerate-fluid
  Main-is:              Main.hs
  hs-source-dirs:       examples/fluid/src-acc lib
  other-modules:        Config ParseArgs Monitoring
                        Event
                        Fluid
                        Type
                        World

  ghc-options:          -O2 -Wall -threaded -eventlog -rtsopts
  ghc-prof-options:     -auto-all

  if flag(gui)
    CPP-options:        -DACCELERATE_ENABLE_GUI

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(fluid)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        bmp                     >= 1.2,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        gloss                   >= 1.7


-- Simulation of gravitational attraction between solid particles
-- --------------------------------------------------------------

Executable accelerate-nbody
  Main-is:              Main.hs
  hs-source-dirs:       examples/n-body lib
  other-modules:        Config ParseArgs Monitoring
                        Common.Body
                        Common.Dump
                        Common.Tree
                        Common.Type
                        Common.Util
                        Common.World
                        Gloss.Draw
                        Gloss.Event
                        Gloss.Simulate
                        Random.Array
                        Random.Position
                        Solver.BarnsHut
                        Solver.Naive1
                        Solver.Naive2

  ghc-options:          -O2 -Wall -threaded -eventlog -rtsopts
  ghc-prof-options:     -auto-all

  if flag(gui)
    cpp-options:        -DACCELERATE_ENABLE_GUI

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(nbody)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        gloss                   >= 1.7,
                        mwc-random              >= 0.8


-- A celular automata
-- ------------------

Executable accelerate-smoothlife
  Main-is:              Main.hs
  hs-source-dirs:       examples/smoothlife lib
  other-modules:        Config ParseArgs Monitoring
                        SmoothLife
                        Gloss.Draw
                        Gloss.Event
                        Gloss.Simulate
                        Random.Array
                        Random.Splat

  ghc-options:          -O2 -Wall -threaded -threaded -rtsopts
  ghc-prof-options:     -auto-all

  if flag(gui)
    cpp-options:        -DACCELERATE_ENABLE_GUI

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(smoothlife)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-fft          == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        gloss                   >= 1.7,
                        gloss-accelerate        >= 1.7,
                        mwc-random              >= 0.8


-- A password recovery tool
-- ------------------------

Executable accelerate-hashcat
  Main-is:              Main.hs
  hs-source-dirs:       examples/hashcat lib
  other-modules:        Config ParseArgs Monitoring
                        Digest
                        MD5
                        Util

  ghc-options:          -O2 -Wall -threaded -threaded -rtsopts
  ghc-prof-options:     -auto-all

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    CPP-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if !flag(hashcat)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        base                    == 4.7.*,
                        bytestring              >= 0.9,
                        bytestring-lexing       >= 0.2,
                        cereal                  >= 0.3,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        mwc-random              >= 0.8

-- FFT examples
-- ------------

Executable accelerate-fft
  Main-is:              Main.hs
  hs-source-dirs:       examples/fft/src-acc lib
  other-modules:        Config
                        ParseArgs
                        HighPass
                        FFT

  ghc-options:          -O2 -Wall -threaded -threaded -rtsopts
  ghc-prof-options:     -auto-all

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if !flag(fft)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        accelerate-fft          == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 2.0,
                        filepath                >= 1.0

-- PageRank
-- --------

Executable accelerate-pagerank
  Main-is:              Main.hs
  hs-source-dirs:       examples/pagerank lib
  other-modules:        Config
                        Page
                        Progress
                        Rank
                        Step
                        Count
                        Rank
                        Step
                        Load
  ghc-options:          -rtsopts -threaded -O2

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         == 0.15.*

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if !flag(pagerank)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        bytestring              >= 0.9.2,
                        containers              >= 0.4.2,
                        criterion               >= 0.5 && < 1.0,
                        directory               >= 1.1,
                        fclabels                >= 1.0,
                        vector                  >= 0.9,
                        vector-algorithms       >= 0.5.4


-- Ray tracer
-- ----------

Executable accelerate-ray
  Main-is:              Main.hs
  hs-source-dirs:       examples/ray lib
  other-modules:        ParseArgs Monitoring
                        Config
                        Vec3
                        Gloss.Draw
                        Gloss.Event
                        Ray.Intersect
                        Ray.Trace
                        Scene.Light
                        Scene.Object
                        Scene.State
                        Scene.World

  if !flag(ray)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        accelerate-io           == 0.15.*,
                        base                    == 4.7.*,
                        criterion               >= 0.5 && < 1.0,
                        fclabels                >= 1.0,
                        gloss                   == 1.8.*,
                        gloss-accelerate        == 1.8.*,
                        gloss-raster-accelerate == 1.8.*

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         >= 0.15

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(llvm-cpu) && flag(llvm-gpu) && flag(llvm-multi)
    CPP-options:        -DACCELERATE_LLVM_MULTIDEV_BACKEND
    build-depends:      accelerate-llvm-multidev== 0.15.*

  if flag(ekg)
    cpp-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  if flag(gui)
    CPP-options:        -DACCELERATE_ENABLE_GUI

  ghc-options:          -Wall -O2 -threaded -threaded -rtsopts
  ghc-prof-options:     -auto-all


-- K-means
-- -------

Executable accelerate-kmeans
  Main-is:              Main.hs
  hs-source-dirs:       examples/kmeans lib
  other-modules:        ParseArgs Monitoring
                        Config
                        Main
                        Kmeans

  if !flag(kmeans)
    buildable:          False
  else
    build-depends:      accelerate              == 0.15.*,
                        base                    == 4.7.*,
                        binary                  >= 0.7,
                        criterion               >= 0.5 && < 1.0,
                        normaldistribution,
                        random

  if flag(cuda)
    cpp-options:        -DACCELERATE_CUDA_BACKEND
    build-depends:      accelerate-cuda         >= 0.15

  if flag(llvm-cpu)
    CPP-options:        -DACCELERATE_LLVM_NATIVE_BACKEND
    build-depends:      accelerate-llvm-native  == 0.15.*

  if flag(llvm-gpu)
    CPP-options:        -DACCELERATE_LLVM_PTX_BACKEND
    build-depends:      accelerate-llvm-ptx     == 0.15.*

  if flag(ekg)
    cpp-options:        -DACCELERATE_ENABLE_EKG
    build-depends:      ekg                     >= 0.3
    ghc-options:        -with-rtsopts=-T

  ghc-options:          -Wall -O2 -threaded -threaded -rtsopts
  ghc-prof-options:     -auto-all


source-repository head
  type:                 git
  location:             https://github.com/AccelerateHS/accelerate-examples

-- vim: nospell
--