{-# 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
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
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