module Copilot.Library.MTL
( eventually, eventuallyPrev, always, alwaysBeen,
until, release, since, Copilot.Library.MTL.trigger, matchingUntil,
matchingRelease, matchingSince, matchingTrigger ) where
import Copilot.Language
import qualified Prelude as P
import Copilot.Library.Utils
eventually :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
eventually :: a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
eventually a
l a
u Stream a
clk a
dist Stream Bool
s = Stream a -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ a
0 = Stream Bool
false
res Stream a
c Stream Bool
s a
k =
Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
&& ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s) Stream Bool -> Stream Bool -> Stream Bool
|| Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k)
nextRes :: Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k = Stream a -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
eventuallyPrev :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
eventuallyPrev :: a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
eventuallyPrev a
l a
u Stream a
clk a
dist Stream Bool
s = Stream a -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
res :: Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ a
0 = Stream Bool
false
res Stream a
c Stream Bool
s a
k =
Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
&& ((Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s) Stream Bool -> Stream Bool -> Stream Bool
|| Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k)
nextRes :: Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k = Stream a -> Stream Bool -> a -> Stream Bool
res ([a
0] [a] -> Stream a -> Stream a
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream a
c) ([Bool
False] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s) (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
always :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
always :: a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
always a
l a
u Stream a
clk a
dist Stream Bool
s = Stream a -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ a
0 = Stream Bool
true
res Stream a
c Stream Bool
s a
k =
Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
==> Stream Bool
s) Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k)
nextRes :: Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k = Stream a -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
alwaysBeen :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
alwaysBeen :: a -> a -> Stream a -> a -> Stream Bool -> Stream Bool
alwaysBeen a
l a
u Stream a
clk a
dist Stream Bool
s = Stream a -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
res :: Stream a -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ a
0 = Stream Bool
true
res Stream a
c Stream Bool
s a
k =
Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
< Stream a
mins Stream Bool -> Stream Bool -> Stream Bool
|| ((Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
==> Stream Bool
s) Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k)
nextRes :: Stream a -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s a
k = Stream a -> Stream Bool -> a -> Stream Bool
res ([a
0] [a] -> Stream a -> Stream a
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream a
c) ([Bool
True] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s) (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
until :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
until :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
until a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s0 Stream Bool
s1 (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
false
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
&& ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
|| (Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k))
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
since :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
since :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
since a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s0 Stream Bool
s1 (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
false
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
&& ((Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
|| (Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k))
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res ([a
0] [a] -> Stream a -> Stream a
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream a
c) ([Bool
True] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s) ([Bool
False] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
release :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
release :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
release a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 =
(Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
clk Stream Bool -> Stream Bool -> Stream Bool
|| Stream a
clk Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s1) Stream Bool -> Stream Bool -> Stream Bool
&&
(Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
clk) Stream Bool
s0 (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s1) (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist)
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
true
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
|| ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
c Stream Bool -> Stream Bool -> Stream Bool
|| Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k)
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
trigger :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
trigger :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
trigger a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 =
(Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
clk Stream Bool -> Stream Bool -> Stream Bool
|| Stream a
clk Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s1) Stream Bool -> Stream Bool -> Stream Bool
&&
(Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res ([a
0] [a] -> Stream a -> Stream a
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream a
clk) Stream Bool
s0 ([Bool
True] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s1) (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist)
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
- (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
true
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
|| ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
c Stream Bool -> Stream Bool -> Stream Bool
|| Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k)
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res ([a
0] [a] -> Stream a -> Stream a
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream a
c) ([Bool
False] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s) ([Bool
True] [Bool] -> Stream Bool -> Stream Bool
forall a. Typed a => [a] -> Stream a -> Stream a
++ Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
matchingUntil :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingUntil :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingUntil a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s0 Stream Bool
s1 (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
false
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
&& ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
<= Stream a
c Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
|| Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k)
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
matchingSince :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingSince :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingSince a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 = a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
forall a.
(Typed a, Integral a) =>
a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
since a
l a
u Stream a
clk a
dist Stream Bool
s0 (Stream Bool
s0 Stream Bool -> Stream Bool -> Stream Bool
&& Stream Bool
s1)
matchingRelease :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingRelease :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingRelease a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
forall a.
(Num a, Eq a) =>
Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
clk Stream Bool
s0 Stream Bool
s1 (a -> Stream Bool) -> a -> Stream Bool
forall a b. (a -> b) -> a -> b
$ (a
u a -> a -> a
forall a. Integral a => a -> a -> a
`P.div` a
dist) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
where
mins :: Stream a
mins = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
l)
maxes :: Stream a
maxes = Stream a
clk Stream a -> Stream a -> Stream a
forall a. Num a => a -> a -> a
+ (a -> Stream a
forall a. Typed a => a -> Stream a
constant a
u)
res :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res Stream a
_ Stream Bool
_ Stream Bool
_ a
0 = Stream Bool
true
res Stream a
c Stream Bool
s Stream Bool
s' a
k =
Stream Bool
s Stream Bool -> Stream Bool -> Stream Bool
|| ((Stream a
mins Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
c Stream Bool -> Stream Bool -> Stream Bool
|| Stream a
c Stream a -> Stream a -> Stream Bool
forall a. (Ord a, Typed a) => Stream a -> Stream a -> Stream Bool
> Stream a
maxes Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s') Stream Bool -> Stream Bool -> Stream Bool
&& Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k)
nextRes :: Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
nextRes Stream a
c Stream Bool
s Stream Bool
s' a
k = Stream a -> Stream Bool -> Stream Bool -> a -> Stream Bool
res (Int -> Stream a -> Stream a
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream a
c) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s) (Int -> Stream Bool -> Stream Bool
forall a. Typed a => Int -> Stream a -> Stream a
drop Int
1 Stream Bool
s') (a
k a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
matchingTrigger :: ( Typed a, Integral a ) =>
a -> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingTrigger :: a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
matchingTrigger a
l a
u Stream a
clk a
dist Stream Bool
s0 Stream Bool
s1 =
a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
forall a.
(Typed a, Integral a) =>
a
-> a -> Stream a -> a -> Stream Bool -> Stream Bool -> Stream Bool
Copilot.Library.MTL.trigger a
l a
u Stream a
clk a
dist Stream Bool
s0 (Stream Bool
s0 Stream Bool -> Stream Bool -> Stream Bool
|| Stream Bool
s1)