{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
module Synthesizer.LLVM.Filter.Chebyshev (
   parameterCausalA, parameterCausalB,
   parameterA, parameterB, Cascade.ParameterValue,
   Cascade.causal,  Cascade.causalPacked,
   Cascade.fixSize,
   ) where

import qualified Synthesizer.LLVM.Filter.SecondOrderCascade as Cascade
import qualified Synthesizer.LLVM.Filter.SecondOrder as Filt2
import qualified Synthesizer.LLVM.Causal.Private as Causal
import qualified Synthesizer.LLVM.Generator.Private as Sig

import qualified Synthesizer.Plain.Filter.Recursive.Chebyshev as Chebyshev
import qualified Synthesizer.Plain.Filter.Recursive.SecondOrder as Filt2Core
import Synthesizer.Plain.Filter.Recursive (Passband)
import Synthesizer.Causal.Class (($<))

import qualified LLVM.DSL.Expression as Expr

import qualified LLVM.Extra.Multi.Value.Marshal as Marshal
import qualified LLVM.Extra.Multi.Value as MultiValue
import qualified LLVM.Extra.Memory as Memory
import qualified LLVM.Extra.Arithmetic as A
import qualified LLVM.Extra.Control as U

import qualified LLVM.Core as LLVM
import Data.Word (Word)

import qualified Type.Data.Num.Decimal as TypeNum
import Type.Data.Num.Decimal.Number ((:*:))
import Type.Base.Proxy (Proxy)

import qualified Synthesizer.LLVM.Complex as Complex

import Control.Applicative (liftA2)

import qualified Algebra.Transcendental as Trans

import NumericPrelude.Numeric
import NumericPrelude.Base


{- |
@n@ must be at least one in order to allow amplification
by the first partial filter.
The causal processes should be more efficient
than 'parameterA' and 'parameterB'
because they use stack-based @alloca@ instead of @malloc@.
-}
parameterCausalA, parameterCausalB ::
   (TypeNum.Natural n, Trans.C a,
    Marshal.C a, MultiValue.RationalConstant a, MultiValue.Transcendental a) =>
   (TypeNum.Positive (n :*: LLVM.SizeOf (Marshal.Struct a)),
    TypeNum.Positive (n :*: LLVM.UnknownSize)) =>
   Proxy n -> Passband ->
   Causal.T (MultiValue.T a, MultiValue.T a) (Cascade.ParameterValue n a)
parameterCausalA :: forall n a.
(Natural n, C a, C a, RationalConstant a, Transcendental a,
 Positive (n :*: SizeOf (Struct a)),
 Positive (n :*: UnknownSize)) =>
Proxy n -> Passband -> T (T a, T a) (ParameterValue n a)
parameterCausalA Proxy n
n Passband
kind =
   (forall r.
 ((Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a))))),
  (T a, T a))
 -> CodeGenFunction r (ParameterValue n a))
-> T ((Value (Ptr (Array n (Struct (Struct a)))),
       Value (Ptr (Array n (ParameterStruct (Struct a))))),
      (T a, T a))
     (ParameterValue n a)
forall a b. (forall r. a -> CodeGenFunction r b) -> T a b
Causal.map
      (\((Value (Ptr (Array n (Struct (Struct a))))
psine, Value (Ptr (Array n (ParameterStruct (Struct a))))
ps), (T a
ratio, T a
freq)) ->
         (T (Parameter n a) -> ParameterValue n a)
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T (Parameter n a) -> ParameterValue n a
forall n a. T (Parameter n a) -> ParameterValue n a
Cascade.ParameterValue (CodeGenFunction r (T (Parameter n a))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$
         T a -> T (Parameter n a) -> CodeGenFunction r (T (Parameter n a))
forall n a filt2 r.
(Natural n, Parameter a ~ filt2, C a, IntegerConstant a,
 PseudoRing a) =>
T a -> T (Array n filt2) -> CodeGenFunction r (T (Array n filt2))
adjustAmplitude T a
ratio (T (Parameter n a) -> CodeGenFunction r (T (Parameter n a)))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (T (Parameter n a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
         (Passband
 -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a))
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
forall n a ae r.
(Positive (n :*: SizeOf (Struct a)), Positive (n :*: UnknownSize),
 Natural n, C a, C a, RationalConstant a, Transcendental a,
 Exp a ~ ae) =>
(Passband -> Int -> ae -> T ae -> ae -> Parameter ae)
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
parameter Passband -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a)
forall a. C a => Passband -> Int -> a -> T a -> a -> Parameter a
Chebyshev.partialParameterA Proxy n
n Passband
kind Value (Ptr (Struct (Array n (T a))))
Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (ParameterStruct n a))
Value (Ptr (Array n (ParameterStruct (Struct a))))
ps T a
ratio T a
freq)
   T ((Value (Ptr (Array n (Struct (Struct a)))),
    Value (Ptr (Array n (ParameterStruct (Struct a))))),
   (T a, T a))
  (ParameterValue n a)
-> SignalOf
     T
     (Value (Ptr (Array n (Struct (Struct a)))),
      Value (Ptr (Array n (ParameterStruct (Struct a)))))
-> T (T a, T a) (ParameterValue n a)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process a -> process b c
$<
   SignalOf
  T
  (Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a)))))
T (Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a)))))
forall a b.
(IsSized a, IsSized b) =>
T (Value (Ptr a), Value (Ptr b))
allocaArrays

parameterCausalB :: forall n a.
(Natural n, C a, C a, RationalConstant a, Transcendental a,
 Positive (n :*: SizeOf (Struct a)),
 Positive (n :*: UnknownSize)) =>
Proxy n -> Passband -> T (T a, T a) (ParameterValue n a)
parameterCausalB Proxy n
n Passband
kind =
   (forall r.
 ((Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a))))),
  (T a, T a))
 -> CodeGenFunction r (ParameterValue n a))
-> T ((Value (Ptr (Array n (Struct (Struct a)))),
       Value (Ptr (Array n (ParameterStruct (Struct a))))),
      (T a, T a))
     (ParameterValue n a)
forall a b. (forall r. a -> CodeGenFunction r b) -> T a b
Causal.map
      (\((Value (Ptr (Array n (Struct (Struct a))))
psine, Value (Ptr (Array n (ParameterStruct (Struct a))))
ps), (T a
ratio, T a
freq)) ->
         (T (Parameter n a) -> ParameterValue n a)
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T (Parameter n a) -> ParameterValue n a
forall n a. T (Parameter n a) -> ParameterValue n a
Cascade.ParameterValue (CodeGenFunction r (T (Parameter n a))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$
         (Passband
 -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a))
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
forall n a ae r.
(Positive (n :*: SizeOf (Struct a)), Positive (n :*: UnknownSize),
 Natural n, C a, C a, RationalConstant a, Transcendental a,
 Exp a ~ ae) =>
(Passband -> Int -> ae -> T ae -> ae -> Parameter ae)
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
parameter Passband -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a)
forall a. C a => Passband -> Int -> a -> T a -> a -> Parameter a
Chebyshev.partialParameterB Proxy n
n Passband
kind Value (Ptr (Struct (Array n (T a))))
Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (ParameterStruct n a))
Value (Ptr (Array n (ParameterStruct (Struct a))))
ps T a
ratio T a
freq)
   T ((Value (Ptr (Array n (Struct (Struct a)))),
    Value (Ptr (Array n (ParameterStruct (Struct a))))),
   (T a, T a))
  (ParameterValue n a)
-> SignalOf
     T
     (Value (Ptr (Array n (Struct (Struct a)))),
      Value (Ptr (Array n (ParameterStruct (Struct a)))))
-> T (T a, T a) (ParameterValue n a)
forall (process :: * -> * -> *) a b c.
C process =>
process (a, b) c -> SignalOf process a -> process b c
$<
   SignalOf
  T
  (Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a)))))
T (Value (Ptr (Array n (Struct (Struct a)))),
   Value (Ptr (Array n (ParameterStruct (Struct a)))))
forall a b.
(IsSized a, IsSized b) =>
T (Value (Ptr a), Value (Ptr b))
allocaArrays

allocaArrays ::
   (LLVM.IsSized a, LLVM.IsSized b) =>
   Sig.T (LLVM.Value (LLVM.Ptr a), LLVM.Value (LLVM.Ptr b))
allocaArrays :: forall a b.
(IsSized a, IsSized b) =>
T (Value (Ptr a), Value (Ptr b))
allocaArrays = (Value (Ptr a) -> Value (Ptr b) -> (Value (Ptr a), Value (Ptr b)))
-> T (Value (Ptr a))
-> T (Value (Ptr b))
-> T (Value (Ptr a), Value (Ptr b))
forall a b c. (a -> b -> c) -> T a -> T b -> T c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) T (Value (Ptr a))
forall a. IsSized a => T (Value (Ptr a))
Sig.alloca T (Value (Ptr b))
forall a. IsSized a => T (Value (Ptr a))
Sig.alloca

parameterA, parameterB ::
   (TypeNum.Natural n, Trans.C a,
    Marshal.C a, MultiValue.RationalConstant a, MultiValue.Transcendental a) =>
   (TypeNum.Positive (n :*: LLVM.SizeOf (Marshal.Struct a)),
    TypeNum.Positive (n :*: LLVM.UnknownSize)) =>
   Proxy n -> Passband -> MultiValue.T a -> MultiValue.T a ->
   LLVM.CodeGenFunction r (Cascade.ParameterValue n a)
parameterA :: forall n a r.
(Natural n, C a, C a, RationalConstant a, Transcendental a,
 Positive (n :*: SizeOf (Struct a)),
 Positive (n :*: UnknownSize)) =>
Proxy n
-> Passband -> T a -> T a -> CodeGenFunction r (ParameterValue n a)
parameterA Proxy n
n Passband
kind T a
ratio T a
freq =
   (Value (Ptr (Array n (Struct (Struct a))))
 -> Value (Ptr (Array n (ParameterStruct (Struct a))))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b r c.
(IsSized a, IsSized b) =>
(Value (Ptr a) -> Value (Ptr b) -> CodeGenFunction r c)
-> CodeGenFunction r c
withArrays ((Value (Ptr (Array n (Struct (Struct a))))
  -> Value (Ptr (Array n (ParameterStruct (Struct a))))
  -> CodeGenFunction r (ParameterValue n a))
 -> CodeGenFunction r (ParameterValue n a))
-> (Value (Ptr (Array n (Struct (Struct a))))
    -> Value (Ptr (Array n (ParameterStruct (Struct a))))
    -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$ \Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (Array n (ParameterStruct (Struct a))))
ps ->
      (T (Parameter n a) -> ParameterValue n a)
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T (Parameter n a) -> ParameterValue n a
forall n a. T (Parameter n a) -> ParameterValue n a
Cascade.ParameterValue (CodeGenFunction r (T (Parameter n a))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$
      T a -> T (Parameter n a) -> CodeGenFunction r (T (Parameter n a))
forall n a filt2 r.
(Natural n, Parameter a ~ filt2, C a, IntegerConstant a,
 PseudoRing a) =>
T a -> T (Array n filt2) -> CodeGenFunction r (T (Array n filt2))
adjustAmplitude T a
ratio (T (Parameter n a) -> CodeGenFunction r (T (Parameter n a)))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (T (Parameter n a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
      (Passband
 -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a))
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
forall n a ae r.
(Positive (n :*: SizeOf (Struct a)), Positive (n :*: UnknownSize),
 Natural n, C a, C a, RationalConstant a, Transcendental a,
 Exp a ~ ae) =>
(Passband -> Int -> ae -> T ae -> ae -> Parameter ae)
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
parameter Passband -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a)
forall a. C a => Passband -> Int -> a -> T a -> a -> Parameter a
Chebyshev.partialParameterA Proxy n
n Passband
kind Value (Ptr (Struct (Array n (T a))))
Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (ParameterStruct n a))
Value (Ptr (Array n (ParameterStruct (Struct a))))
ps T a
ratio T a
freq

parameterB :: forall n a r.
(Natural n, C a, C a, RationalConstant a, Transcendental a,
 Positive (n :*: SizeOf (Struct a)),
 Positive (n :*: UnknownSize)) =>
Proxy n
-> Passband -> T a -> T a -> CodeGenFunction r (ParameterValue n a)
parameterB Proxy n
n Passband
kind T a
ratio T a
freq =
   (Value (Ptr (Array n (Struct (Struct a))))
 -> Value (Ptr (Array n (ParameterStruct (Struct a))))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b r c.
(IsSized a, IsSized b) =>
(Value (Ptr a) -> Value (Ptr b) -> CodeGenFunction r c)
-> CodeGenFunction r c
withArrays ((Value (Ptr (Array n (Struct (Struct a))))
  -> Value (Ptr (Array n (ParameterStruct (Struct a))))
  -> CodeGenFunction r (ParameterValue n a))
 -> CodeGenFunction r (ParameterValue n a))
-> (Value (Ptr (Array n (Struct (Struct a))))
    -> Value (Ptr (Array n (ParameterStruct (Struct a))))
    -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$ \Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (Array n (ParameterStruct (Struct a))))
ps ->
      (T (Parameter n a) -> ParameterValue n a)
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap T (Parameter n a) -> ParameterValue n a
forall n a. T (Parameter n a) -> ParameterValue n a
Cascade.ParameterValue (CodeGenFunction r (T (Parameter n a))
 -> CodeGenFunction r (ParameterValue n a))
-> CodeGenFunction r (T (Parameter n a))
-> CodeGenFunction r (ParameterValue n a)
forall a b. (a -> b) -> a -> b
$
      (Passband
 -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a))
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
forall n a ae r.
(Positive (n :*: SizeOf (Struct a)), Positive (n :*: UnknownSize),
 Natural n, C a, C a, RationalConstant a, Transcendental a,
 Exp a ~ ae) =>
(Passband -> Int -> ae -> T ae -> ae -> Parameter ae)
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
parameter Passband -> Int -> Exp a -> T (Exp a) -> Exp a -> Parameter (Exp a)
forall a. C a => Passband -> Int -> a -> T a -> a -> Parameter a
Chebyshev.partialParameterB Proxy n
n Passband
kind Value (Ptr (Struct (Array n (T a))))
Value (Ptr (Array n (Struct (Struct a))))
psine Value (Ptr (ParameterStruct n a))
Value (Ptr (Array n (ParameterStruct (Struct a))))
ps T a
ratio T a
freq

withArrays ::
   (LLVM.IsSized a, LLVM.IsSized b) =>
   (LLVM.Value (LLVM.Ptr a) -> LLVM.Value (LLVM.Ptr b) ->
    LLVM.CodeGenFunction r c) ->
   LLVM.CodeGenFunction r c
withArrays :: forall a b r c.
(IsSized a, IsSized b) =>
(Value (Ptr a) -> Value (Ptr b) -> CodeGenFunction r c)
-> CodeGenFunction r c
withArrays Value (Ptr a) -> Value (Ptr b) -> CodeGenFunction r c
act = do
   Value (Ptr a)
psine <- CodeGenFunction r (Value (Ptr a))
forall a r. IsSized a => CodeGenFunction r (Value (Ptr a))
LLVM.malloc
   Value (Ptr b)
ps <- CodeGenFunction r (Value (Ptr b))
forall a r. IsSized a => CodeGenFunction r (Value (Ptr a))
LLVM.malloc
   c
x <- Value (Ptr a) -> Value (Ptr b) -> CodeGenFunction r c
act Value (Ptr a)
psine Value (Ptr b)
ps
   Value (Ptr a) -> CodeGenFunction r ()
forall a r. IsType a => Value (Ptr a) -> CodeGenFunction r ()
LLVM.free Value (Ptr a)
psine
   Value (Ptr b) -> CodeGenFunction r ()
forall a r. IsType a => Value (Ptr a) -> CodeGenFunction r ()
LLVM.free Value (Ptr b)
ps
   c -> CodeGenFunction r c
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return c
x


-- | adjust amplification of the first filter
adjustAmplitude ::
   (TypeNum.Natural n, Filt2.Parameter a ~ filt2,
    Marshal.C a, MultiValue.IntegerConstant a, MultiValue.PseudoRing a) =>
   MultiValue.T a -> MultiValue.T (MultiValue.Array n filt2) ->
   LLVM.CodeGenFunction r (MultiValue.T (MultiValue.Array n filt2))
adjustAmplitude :: forall n a filt2 r.
(Natural n, Parameter a ~ filt2, C a, IntegerConstant a,
 PseudoRing a) =>
T a -> T (Array n filt2) -> CodeGenFunction r (T (Array n filt2))
adjustAmplitude T a
ratio (MultiValue.Cons Repr (Array n filt2)
pv) = do
   Parameter (T a)
filt0 <- Value (Struct (Parameter a)) -> CodeGenFunction r (Parameter (T a))
Value (ParameterStruct (Struct (Repr a)))
-> CodeGenFunction r (Parameter (T a))
forall a r.
C a =>
Value (Struct (Parameter a)) -> CodeGenFunction r (Parameter (T a))
Filt2.decomposeParameterMV (Value (ParameterStruct (Struct (Repr a)))
 -> CodeGenFunction r (Parameter (T a)))
-> CodeGenFunction r (Value (ParameterStruct (Struct (Repr a))))
-> CodeGenFunction r (Parameter (T a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value (Array n (ParameterStruct (Struct (Repr a))))
-> Word
-> CodeGenFunction
     r
     (Value
        (ValueType (Array n (ParameterStruct (Struct (Repr a)))) Word))
forall r agg i.
GetValue agg i =>
Value agg -> i -> CodeGenFunction r (Value (ValueType agg i))
LLVM.extractvalue Repr (Array n filt2)
Value (Array n (ParameterStruct (Struct (Repr a))))
pv (Word
0::Word)
   (Value (Array n (ParameterStruct (Struct (Repr a))))
 -> T (Array n filt2))
-> CodeGenFunction
     r (Value (Array n (ParameterStruct (Struct (Repr a)))))
-> CodeGenFunction r (T (Array n filt2))
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Repr (Array n filt2) -> T (Array n filt2)
Value (Array n (ParameterStruct (Struct (Repr a))))
-> T (Array n filt2)
forall a. Repr a -> T a
MultiValue.Cons (CodeGenFunction
   r (Value (Array n (ParameterStruct (Struct (Repr a)))))
 -> CodeGenFunction r (T (Array n filt2)))
-> CodeGenFunction
     r (Value (Array n (ParameterStruct (Struct (Repr a)))))
-> CodeGenFunction r (T (Array n filt2))
forall a b. (a -> b) -> a -> b
$
      (Value (ParameterStruct (Struct (Repr a)))
 -> Word
 -> CodeGenFunction
      r (Value (Array n (ParameterStruct (Struct (Repr a))))))
-> Word
-> Value (ParameterStruct (Struct (Repr a)))
-> CodeGenFunction
     r (Value (Array n (ParameterStruct (Struct (Repr a)))))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Value (Array n (ParameterStruct (Struct (Repr a))))
-> Value
     (ValueType (Array n (ParameterStruct (Struct (Repr a)))) Word)
-> Word
-> CodeGenFunction
     r (Value (Array n (ParameterStruct (Struct (Repr a)))))
forall r agg i.
GetValue agg i =>
Value agg
-> Value (ValueType agg i) -> i -> CodeGenFunction r (Value agg)
LLVM.insertvalue Repr (Array n filt2)
Value (Array n (ParameterStruct (Struct (Repr a))))
pv) (Word
0::Word) (Value (ParameterStruct (Struct (Repr a)))
 -> CodeGenFunction
      r (Value (Array n (ParameterStruct (Struct (Repr a))))))
-> CodeGenFunction r (Value (ParameterStruct (Struct (Repr a))))
-> CodeGenFunction
     r (Value (Array n (ParameterStruct (Struct (Repr a)))))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
      Parameter (T a) -> CodeGenFunction r (Value (Struct (Parameter a)))
Parameter (T a)
-> CodeGenFunction r (Value (ParameterStruct (Struct (Repr a))))
forall a r.
C a =>
Parameter (T a) -> CodeGenFunction r (Value (Struct (Parameter a)))
Filt2.composeParameterMV (Parameter (T a)
 -> CodeGenFunction r (Value (ParameterStruct (Struct (Repr a)))))
-> CodeGenFunction r (Parameter (T a))
-> CodeGenFunction r (Value (ParameterStruct (Struct (Repr a))))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
      (Exp a -> Parameter (Exp a) -> Parameter (Exp a))
-> T a -> Parameter (T a) -> CodeGenFunction r (Parameter (T a))
forall ae am be bm ce cm r.
(Aggregate ae am, Aggregate be bm, Aggregate ce cm) =>
(ae -> be -> ce) -> am -> bm -> CodeGenFunction r cm
Expr.unliftM2 Exp a -> Parameter (Exp a) -> Parameter (Exp a)
forall a. C a => a -> Parameter a -> Parameter a
Filt2Core.amplify T a
ratio Parameter (T a)
filt0

parameter ::
   (TypeNum.Positive (n :*: LLVM.SizeOf (Marshal.Struct a)),
    TypeNum.Positive (n :*: LLVM.UnknownSize),
    TypeNum.Natural n, Trans.C a,
    Marshal.C a, MultiValue.RationalConstant a, MultiValue.Transcendental a,
    Expr.Exp a ~ ae) =>
   (Passband -> Int -> ae -> Complex.T ae -> ae -> Filt2Core.Parameter ae) ->
   Proxy n -> Passband ->
   LLVM.Value (LLVM.Ptr (Marshal.Struct (MultiValue.Array n (Complex.T a)))) ->
   LLVM.Value (LLVM.Ptr (Cascade.ParameterStruct n a)) ->
   MultiValue.T a -> MultiValue.T a ->
   LLVM.CodeGenFunction r (MultiValue.T (Cascade.Parameter n a))
parameter :: forall n a ae r.
(Positive (n :*: SizeOf (Struct a)), Positive (n :*: UnknownSize),
 Natural n, C a, C a, RationalConstant a, Transcendental a,
 Exp a ~ ae) =>
(Passband -> Int -> ae -> T ae -> ae -> Parameter ae)
-> Proxy n
-> Passband
-> Value (Ptr (Struct (Array n (T a))))
-> Value (Ptr (ParameterStruct n a))
-> T a
-> T a
-> CodeGenFunction r (T (Parameter n a))
parameter Passband -> Int -> ae -> T ae -> ae -> Parameter ae
partialParameter Proxy n
n Passband
kind Value (Ptr (Struct (Repr (Array n (T a)))))
psine Value (Ptr (Struct (Repr (Parameter n a))))
ps T a
ratio T a
freq = do
   let order :: Int
order = Proxy n -> Int
forall n a. (Integer n, Num a) => Proxy n -> a
TypeNum.integralFromProxy Proxy n
n
   let evalSines :: (Trans.C a) => mv a -> Int -> [Complex.T a]
       evalSines :: forall a (mv :: * -> *). C a => mv a -> Int -> [T a]
evalSines mv a
_ = Int -> [T a]
forall a. C a => Int -> [T a]
Chebyshev.makeCirclePoints
   let sines :: T (Array n (T a))
sines = Proxy n -> [T a] -> T (Array n (T a))
forall n a. (Natural n, C a) => Proxy n -> [a] -> T (Array n a)
Cascade.constArray Proxy n
n ([T a] -> T (Array n (T a))) -> [T a] -> T (Array n (T a))
forall a b. (a -> b) -> a -> b
$ T a -> Int -> [T a]
forall a (mv :: * -> *). C a => mv a -> Int -> [T a]
evalSines T a
freq Int
order
   T (Array n (T a))
-> Value (Ptr (Struct (T (Array n (T a))))) -> CodeGenFunction r ()
forall r.
T (Array n (T a))
-> Value (Ptr (Struct (T (Array n (T a))))) -> CodeGenFunction r ()
forall llvmValue r.
C llvmValue =>
llvmValue -> Value (Ptr (Struct llvmValue)) -> CodeGenFunction r ()
Memory.store T (Array n (T a))
sines Value (Ptr (Struct (Repr (Array n (T a)))))
Value (Ptr (Struct (T (Array n (T a)))))
psine
   Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
s <- Value (Ptr (Array n (Struct (Struct a))))
-> (Value Word, ())
-> CodeGenFunction
     r
     (Value
        (Ptr
           (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ()))))
forall o i r.
GetElementPtr o i =>
Value (Ptr o)
-> i -> CodeGenFunction r (Value (Ptr (ElementPtrType o i)))
LLVM.getElementPtr0 Value (Ptr (Struct (Repr (Array n (T a)))))
Value (Ptr (Array n (Struct (Struct a))))
psine (Word -> Value Word
forall a. IsConst a => a -> Value a
LLVM.valueOf (Word
0::Word), ())
   Value
  (Ptr
     (ElementPtrType
        (Array n (ParameterStruct (Struct a))) (Value Word, ())))
p <- Value (Ptr (Array n (ParameterStruct (Struct a))))
-> (Value Word, ())
-> CodeGenFunction
     r
     (Value
        (Ptr
           (ElementPtrType
              (Array n (ParameterStruct (Struct a))) (Value Word, ()))))
forall o i r.
GetElementPtr o i =>
Value (Ptr o)
-> i -> CodeGenFunction r (Value (Ptr (ElementPtrType o i)))
LLVM.getElementPtr0 Value (Ptr (Struct (Repr (Parameter n a))))
Value (Ptr (Array n (ParameterStruct (Struct a))))
ps (Word -> Value Word
forall a. IsConst a => a -> Value a
LLVM.valueOf (Word
0::Word), ())
   let len :: Value Word
len = Word -> Value Word
forall a. IsConst a => a -> Value a
LLVM.valueOf (Proxy n -> Word
forall n a. (Integer n, Num a) => Proxy n -> a
TypeNum.integralFromProxy Proxy n
n :: Word)
   Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
_ <- Value Word
-> Value
     (Ptr
        (ElementPtrType
           (Array n (ParameterStruct (Struct a))) (Value Word, ())))
-> Value
     (Ptr
        (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
-> (Value
      (Ptr
         (ElementPtrType
            (Array n (ParameterStruct (Struct a))) (Value Word, ())))
    -> Value
         (Ptr
            (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
    -> CodeGenFunction
         r
         (Value
            (Ptr
               (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))))
-> CodeGenFunction
     r
     (Value
        (Ptr
           (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ()))))
forall a b i r.
(Phi a, IsType b, Num i, IsConst i, IsInteger i, CmpRet i,
 IsPrimitive i) =>
Value i
-> Value (Ptr b)
-> a
-> (Value (Ptr b) -> a -> CodeGenFunction r a)
-> CodeGenFunction r a
U.arrayLoop Value Word
len Value
  (Ptr
     (ElementPtrType
        (Array n (ParameterStruct (Struct a))) (Value Word, ())))
p Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
s ((Value
    (Ptr
       (ElementPtrType
          (Array n (ParameterStruct (Struct a))) (Value Word, ())))
  -> Value
       (Ptr
          (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
  -> CodeGenFunction
       r
       (Value
          (Ptr
             (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))))
 -> CodeGenFunction
      r
      (Value
         (Ptr
            (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))))
-> (Value
      (Ptr
         (ElementPtrType
            (Array n (ParameterStruct (Struct a))) (Value Word, ())))
    -> Value
         (Ptr
            (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
    -> CodeGenFunction
         r
         (Value
            (Ptr
               (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))))
-> CodeGenFunction
     r
     (Value
        (Ptr
           (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ()))))
forall a b. (a -> b) -> a -> b
$ \Value
  (Ptr
     (ElementPtrType
        (Array n (ParameterStruct (Struct a))) (Value Word, ())))
ptri Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
si -> do
      T (T a)
c <- Value (Ptr (Struct (T (T a)))) -> CodeGenFunction r (T (T a))
forall llvmValue r.
C llvmValue =>
Value (Ptr (Struct llvmValue)) -> CodeGenFunction r llvmValue
forall r.
Value (Ptr (Struct (T (T a)))) -> CodeGenFunction r (T (T a))
Memory.load Value (Ptr (Struct (T (T a))))
Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
si
      (Value (ParameterStruct (Struct a))
 -> Value
      (Ptr
         (ElementPtrType
            (Array n (ParameterStruct (Struct a))) (Value Word, ())))
 -> CodeGenFunction r ())
-> Value
     (Ptr
        (ElementPtrType
           (Array n (ParameterStruct (Struct a))) (Value Word, ())))
-> Value (ParameterStruct (Struct a))
-> CodeGenFunction r ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Value (ParameterStruct (Struct a))
-> Value (Ptr (Struct (Value (ParameterStruct (Struct a)))))
-> CodeGenFunction r ()
Value (ParameterStruct (Struct a))
-> Value
     (Ptr
        (ElementPtrType
           (Array n (ParameterStruct (Struct a))) (Value Word, ())))
-> CodeGenFunction r ()
forall llvmValue r.
C llvmValue =>
llvmValue -> Value (Ptr (Struct llvmValue)) -> CodeGenFunction r ()
forall r.
Value (ParameterStruct (Struct a))
-> Value (Ptr (Struct (Value (ParameterStruct (Struct a)))))
-> CodeGenFunction r ()
Memory.store Value
  (Ptr
     (ElementPtrType
        (Array n (ParameterStruct (Struct a))) (Value Word, ())))
ptri (Value (ParameterStruct (Struct a)) -> CodeGenFunction r ())
-> CodeGenFunction r (Value (ParameterStruct (Struct a)))
-> CodeGenFunction r ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
         Parameter (T a) -> CodeGenFunction r (Value (Struct (Parameter a)))
Parameter (T a)
-> CodeGenFunction r (Value (ParameterStruct (Struct a)))
forall a r.
C a =>
Parameter (T a) -> CodeGenFunction r (Value (Struct (Parameter a)))
Filt2.composeParameterMV (Parameter (T a)
 -> CodeGenFunction r (Value (ParameterStruct (Struct a))))
-> CodeGenFunction r (Parameter (T a))
-> CodeGenFunction r (Value (ParameterStruct (Struct a)))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
         (ae -> T ae -> ae -> Parameter ae)
-> T a -> T (T a) -> T a -> CodeGenFunction r (Parameter (T a))
forall ae am be bm ce cm de dm r.
(Aggregate ae am, Aggregate be bm, Aggregate ce cm,
 Aggregate de dm) =>
(ae -> be -> ce -> de) -> am -> bm -> cm -> CodeGenFunction r dm
Expr.unliftM3 (Passband -> Int -> ae -> T ae -> ae -> Parameter ae
partialParameter Passband
kind Int
order) T a
ratio T (T a)
c T a
freq
      Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
-> CodeGenFunction
     r
     (Value
        (Ptr
           (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ()))))
forall a r. Value (Ptr a) -> CodeGenFunction r (Value (Ptr a))
A.advanceArrayElementPtr Value
  (Ptr
     (ElementPtrType (Array n (Struct (Struct a))) (Value Word, ())))
si

   Value (Ptr (Struct (T (Parameter n a))))
-> CodeGenFunction r (T (Parameter n a))
forall llvmValue r.
C llvmValue =>
Value (Ptr (Struct llvmValue)) -> CodeGenFunction r llvmValue
forall r.
Value (Ptr (Struct (T (Parameter n a))))
-> CodeGenFunction r (T (Parameter n a))
Memory.load Value (Ptr (Struct (Repr (Parameter n a))))
Value (Ptr (Struct (T (Parameter n a))))
ps