retroclash-lib-0.1.0: src/RetroClash/Clock.hs
{-# LANGUAGE ScopedTypeVariables, NumericUnderscores, PartialTypeSignatures #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
module RetroClash.Clock
( HzToPeriod
, Seconds
, Milliseconds
, Microseconds
, Nanoseconds
, Picoseconds
, ClockDivider
, risePeriod
, riseRate
) where
import Clash.Prelude
type HzToPeriod (rate :: Nat) = Seconds 1 `Div` rate
type Seconds (s :: Nat) = Milliseconds (1_000 * s)
type Milliseconds (ms :: Nat) = Microseconds (1_000 * ms)
type Microseconds (us :: Nat) = Nanoseconds (1_000 * us)
type Nanoseconds (ns :: Nat) = Picoseconds (1_000 * ns)
type Picoseconds (ps :: Nat) = ps
type ClockDivider dom ps = ps `Div` DomainPeriod dom
risePeriod
:: forall ps dom. (HiddenClockResetEnable dom, _)
=> SNat ps
-> Signal dom Bool
risePeriod _ = riseEvery (SNat @(ClockDivider dom ps))
riseRate
:: forall rate dom. (HiddenClockResetEnable dom, _)
=> SNat rate
-> Signal dom Bool
riseRate _ = risePeriod (SNat @(HzToPeriod rate))