Copyright | (C) 2013-2016, University of Twente |
---|---|
License | BSD2 (see the file LICENSE) |
Maintainer | Christiaan Baaij <christiaan.baaij@gmail.com> |
Safe Haskell | Unsafe |
Language | Haskell2010 |
Extensions |
|
CλaSH (pronounced ‘clash’) is a functional hardware description language that borrows both its syntax and semantics from the functional programming language Haskell. The merits of using a functional language to describe hardware comes from the fact that combinational circuits can be directly modeled as mathematical functions and that functional languages lend themselves very well at describing and (de-)composing mathematical functions.
This package provides:
- Prelude library containing datatypes and functions for circuit design
To use the library:
- Import CLaSH.Prelude
- Additionally import CLaSH.Prelude.Explicit if you want to design explicitly clocked circuits in a multi-clock setting
For now, CLaSH.Prelude is also the best starting point for exploring the library. A preliminary version of a tutorial can be found in CLaSH.Tutorial. Some circuit examples can be found in CLaSH.Examples.
- mealy :: (s -> i -> (s, o)) -> s -> Signal i -> Signal o
- mealyB :: (Bundle i, Bundle o) => (s -> i -> (s, o)) -> s -> Unbundled i -> Unbundled o
- (<^>) :: (Bundle i, Bundle o) => (s -> i -> (s, o)) -> s -> Unbundled i -> Unbundled o
- moore :: (s -> i -> s) -> (s -> o) -> s -> Signal i -> Signal o
- mooreB :: (Bundle i, Bundle o) => (s -> i -> s) -> (s -> o) -> s -> Unbundled i -> Unbundled o
- registerB :: Bundle a => a -> Unbundled a -> Unbundled a
- asyncRom :: (KnownNat n, Enum addr) => Vec n a -> addr -> a
- asyncRomPow2 :: (KnownNat (2 ^ n), KnownNat n) => Vec (2 ^ n) a -> Unsigned n -> a
- rom :: (KnownNat n, KnownNat m) => Vec n a -> Signal (Unsigned m) -> Signal a
- romPow2 :: (KnownNat (2 ^ n), KnownNat n) => Vec (2 ^ n) a -> Signal (Unsigned n) -> Signal a
- asyncRomFile :: (KnownNat m, Enum addr) => SNat n -> FilePath -> addr -> BitVector m
- asyncRomFilePow2 :: forall n m. (KnownNat m, KnownNat n, KnownNat (2 ^ n)) => FilePath -> Unsigned n -> BitVector m
- romFile :: (KnownNat m, KnownNat k) => SNat n -> FilePath -> Signal (Unsigned k) -> Signal (BitVector m)
- romFilePow2 :: forall n m. (KnownNat m, KnownNat n, KnownNat (2 ^ n)) => FilePath -> Signal (Unsigned n) -> Signal (BitVector m)
- asyncRam :: Enum addr => SNat n -> Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a
- asyncRamPow2 :: forall n a. (KnownNat (2 ^ n), KnownNat n) => Signal (Unsigned n) -> Signal (Unsigned n) -> Signal Bool -> Signal a -> Signal a
- blockRam :: (KnownNat n, Enum addr) => Vec n a -> Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a
- blockRamPow2 :: (KnownNat (2 ^ n), KnownNat n) => Vec (2 ^ n) a -> Signal (Unsigned n) -> Signal (Unsigned n) -> Signal Bool -> Signal a -> Signal a
- blockRamFile :: (KnownNat m, Enum addr) => SNat n -> FilePath -> Signal addr -> Signal addr -> Signal Bool -> Signal (BitVector m) -> Signal (BitVector m)
- blockRamFilePow2 :: forall n m. (KnownNat m, KnownNat n, KnownNat (2 ^ n)) => FilePath -> Signal (Unsigned n) -> Signal (Unsigned n) -> Signal Bool -> Signal (BitVector m) -> Signal (BitVector m)
- readNew :: Eq addr => (Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a) -> Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a
- readNew' :: Eq addr => SClock clk -> (Signal' clk addr -> Signal' clk addr -> Signal' clk Bool -> Signal' clk a -> Signal' clk a) -> Signal' clk addr -> Signal' clk addr -> Signal' clk Bool -> Signal' clk a -> Signal' clk a
- window :: (KnownNat n, Default a) => Signal a -> Vec (n + 1) (Signal a)
- windowD :: (KnownNat (n + 1), Default a) => Signal a -> Vec (n + 1) (Signal a)
- isRising :: (Bounded a, Eq a) => a -> Signal a -> Signal Bool
- isFalling :: (Bounded a, Eq a) => a -> Signal a -> Signal Bool
- assert :: (Eq a, Show a) => String -> Signal a -> Signal a -> Signal b -> Signal b
- stimuliGenerator :: forall l a. KnownNat l => Vec l a -> Signal a
- outputVerifier :: forall l a. (KnownNat l, Eq a, Show a) => Vec l a -> Signal a -> Signal Bool
- module CLaSH.Signal
- module CLaSH.Signal.Delayed
- module CLaSH.Prelude.DataFlow
- module CLaSH.Sized.BitVector
- module CLaSH.Prelude.BitIndex
- module CLaSH.Prelude.BitReduction
- module CLaSH.Sized.Signed
- module CLaSH.Sized.Unsigned
- module CLaSH.Sized.Index
- module CLaSH.Sized.Fixed
- module CLaSH.Sized.Vector
- module CLaSH.Sized.RTree
- module CLaSH.Annotations.TopEntity
- module GHC.TypeLits
- module GHC.TypeLits.Extra
- module CLaSH.Promoted.Nat
- module CLaSH.Promoted.Nat.Literals
- module CLaSH.Promoted.Nat.TH
- module CLaSH.Promoted.Ord
- class Lift t where
- deriveLift :: Name -> Q [Dec]
- module CLaSH.Class.BitPack
- module CLaSH.Class.Num
- module CLaSH.Class.Resize
- module Control.Applicative
- module Data.Bits
- module Data.Default
- module Prelude
Creating synchronous sequential circuits
:: (s -> i -> (s, o)) | Transfer function in mealy machine form:
|
-> s | Initial state |
-> Signal i -> Signal o | Synchronous sequential function with input and output matching that of the mealy machine |
Create a synchronous function from a combinational function describing a mealy machine
mac :: Int -- Current state -> (Int,Int) -- Input -> (Int,Int) -- (Updated state, output) mac s (x,y) = (s',s) where s' = x * y + s topEntity ::Signal
(Int, Int) ->Signal
Int topEntity =mealy
mac 0
>>>
simulate topEntity [(1,1),(2,2),(3,3),(4,4)]
[0,1,5,14...
Synchronous sequential functions can be composed just like their combinational counterpart:
dualMac :: (Signal
Int,Signal
Int) -> (Signal
Int,Signal
Int) ->Signal
Int dualMac (a,b) (x,y) = s1 + s2 where s1 =mealy
mac 0 (bundle
(a,x)) s2 =mealy
mac 0 (bundle
(b,y))
:: (Bundle i, Bundle o) | |
=> (s -> i -> (s, o)) | Transfer function in mealy machine form:
|
-> s | Initial state |
-> Unbundled i -> Unbundled o | Synchronous sequential function with input and output matching that of the mealy machine |
A version of mealy
that does automatic Bundle
ing
Given a function f
of type:
f :: Int -> (Bool, Int) -> (Int, (Int, Bool))
When we want to make compositions of f
in g
using mealy
, we have to
write:
g a b c = (b1,b2,i2) where (i1,b1) =unbundle
(mealy
f 0 (bundle
(a,b))) (i2,b2) =unbundle
(mealy
f 3 (bundle
(i1,c)))
Using mealyB
however we can write:
g a b c = (b1,b2,i2) where (i1,b1) =mealyB
f 0 (a,b) (i2,b2) =mealyB
f 3 (i1,c)
:: (Bundle i, Bundle o) | |
=> (s -> i -> (s, o)) | Transfer function in mealy machine form:
|
-> s | Initial state |
-> Unbundled i -> Unbundled o | Synchronous sequential function with input and output matching that of the mealy machine |
Infix version of mealyB
:: (s -> i -> s) | Transfer function in moore machine form:
|
-> (s -> o) | Output function in moore machine form:
|
-> s | Initial state |
-> Signal i -> Signal o | Synchronous sequential function with input and output matching that of the moore machine |
Create a synchronous function from a combinational function describing a moore machine
mac :: Int -- Current state -> (Int,Int) -- Input -> Int -- Updated state mac s (x,y) = x * y + s topEntity ::Signal
(Int, Int) ->Signal
Int topEntity =moore
mac id 0
>>>
simulate topEntity [(1,1),(2,2),(3,3),(4,4)]
[0,1,5,14...
Synchronous sequential functions can be composed just like their combinational counterpart:
dualMac :: (Signal
Int,Signal
Int) -> (Signal
Int,Signal
Int) ->Signal
Int dualMac (a,b) (x,y) = s1 + s2 where s1 =moore
mac id 0 (bundle
(a,x)) s2 =moore
mac id 0 (bundle
(b,y))
:: (Bundle i, Bundle o) | |
=> (s -> i -> s) | Transfer function in moore machine form:
|
-> (s -> o) | Output function in moore machine form:
|
-> s | Initial state |
-> Unbundled i -> Unbundled o | Synchronous sequential function with input and output matching that of the moore machine |
A version of moore
that does automatic Bundle
ing
Given a functions t
and o
of types:
t :: Int -> (Bool, Int) -> Int o :: Int -> (Int, Bool)
When we want to make compositions of t
and o
in g
using moore
, we have to
write:
g a b c = (b1,b2,i2) where (i1,b1) =unbundle
(moore
t o 0 (bundle
(a,b))) (i2,b2) =unbundle
(moore
t o 3 (bundle
(i1,c)))
Using mooreB
however we can write:
g a b c = (b1,b2,i2) where (i1,b1) =mooreB
t o 0 (a,b) (i2,b2) =mooreB
t o 3 (i1,c)
registerB :: Bundle a => a -> Unbundled a -> Unbundled a Source
Create a register
function for product-type like signals (e.g. '(Signal a, Signal b)')
rP :: (Signal Int,Signal Int) -> (Signal Int, Signal Int) rP = registerB (8,8)
>>>
simulateB rP [(1,1),(2,2),(3,3)] :: [(Int,Int)]
[(8,8),(1,1),(2,2),(3,3)...
ROMs
:: (KnownNat n, Enum addr) | |
=> Vec n a | ROM content NB: must be a constant |
-> addr | Read address |
-> a | The value of the ROM at address |
An asynchronous/combinational ROM with space for n
elements
Additional helpful information:
- See CLaSH.Sized.Fixed and CLaSH.Prelude.BlockRam for ideas on how to use ROMs and RAMs
:: (KnownNat (2 ^ n), KnownNat n) | |
=> Vec (2 ^ n) a | ROM content NB: must be a constant |
-> Unsigned n | Read address |
-> a | The value of the ROM at address |
An asynchronous/combinational ROM with space for 2^n
elements
Additional helpful information:
- See CLaSH.Sized.Fixed and CLaSH.Prelude.BlockRam for ideas on how to use ROMs and RAMs
:: (KnownNat n, KnownNat m) | |
=> Vec n a | ROM content NB: must be a constant |
-> Signal (Unsigned m) | Read address |
-> Signal a | The value of the ROM at address |
A ROM with a synchronous read port, with space for n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
Additional helpful information:
- See CLaSH.Sized.Fixed and CLaSH.Prelude.BlockRam for ideas on how to use ROMs and RAMs
:: (KnownNat (2 ^ n), KnownNat n) | |
=> Vec (2 ^ n) a | ROM content NB: must be a constant |
-> Signal (Unsigned n) | Read address |
-> Signal a | The value of the ROM at address |
A ROM with a synchronous read port, with space for 2^n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
Additional helpful information:
- See CLaSH.Sized.Fixed and CLaSH.Prelude.BlockRam for ideas on how to use ROMs and RAMs
ROMs initialised with a data file
:: (KnownNat m, Enum addr) | |
=> SNat n | Size of the ROM |
-> FilePath | File describing the content of the ROM |
-> addr | Read address |
-> BitVector m | The value of the ROM at address |
An asynchronous/combinational ROM with space for n
elements
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.ROM.File for more information on how to instantiate a ROM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
When you notice that
asyncRomFile
is significantly slowing down your simulation, give it a monomorphic type signature. So instead of leaving the type to be inferred:myRomData = asyncRomFile d512 "memory.bin"
or giving it a polymorphic type signature:
myRomData :: Enum addr => addr -> BitVector 16 myRomData = asyncRomFile d512 "memory.bin"
you should give it a monomorphic type signature:
myRomData :: Unsigned 9 -> BitVector 16 myRomData = asyncRomFile d512 "memory.bin"
:: (KnownNat m, KnownNat n, KnownNat (2 ^ n)) | |
=> FilePath | File describing the content of the ROM |
-> Unsigned n | Read address |
-> BitVector m | The value of the ROM at address |
An asynchronous/combinational ROM with space for 2^n
elements
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.ROM.File for more information on how to instantiate a ROM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
When you notice that
asyncRomFilePow2
is significantly slowing down your simulation, give it a monomorphic type signature. So instead of leaving the type to be inferred:myRomData = asyncRomFilePow2 "memory.bin"
you should give it a monomorphic type signature:
myRomData :: Unsigned 9 -> BitVector 16 myRomData = asyncRomFilePow2 "memory.bin"
:: (KnownNat m, KnownNat k) | |
=> SNat n | Size of the ROM |
-> FilePath | File describing the content of the ROM |
-> Signal (Unsigned k) | Read address |
-> Signal (BitVector m) | The value of the ROM at address |
A ROM with a synchronous read port, with space for n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.ROM.File for more information on how to instantiate a ROM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
:: (KnownNat m, KnownNat n, KnownNat (2 ^ n)) | |
=> FilePath | File describing the content of the ROM |
-> Signal (Unsigned n) | Read address |
-> Signal (BitVector m) | The value of the ROM at address |
A ROM with a synchronous read port, with space for 2^n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.ROM.File for more information on how to instantiate a ROM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
RAM primitives with a combinational read port
:: Enum addr | |
=> SNat n | Size |
-> Signal addr | Write address |
-> Signal addr | Read address |
-> Signal Bool | Write enable |
-> Signal a | Value to write (at address |
-> Signal a | Value of the |
Create a RAM with space for n
elements.
- NB: Initial content of the RAM is
undefined
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a RAM.
:: (KnownNat (2 ^ n), KnownNat n) | |
=> Signal (Unsigned n) | Write address |
-> Signal (Unsigned n) | Read address |
-> Signal Bool | Write enable |
-> Signal a | Value to write (at address |
-> Signal a | Value of the |
Create a RAM with space for 2^n
elements
- NB: Initial content of the RAM is
undefined
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a RAM.
BlockRAM primitives
:: (KnownNat n, Enum addr) | |
=> Vec n a | Initial content of the BRAM, also
determines the size, NB: MUST be a constant. |
-> Signal addr | Write address |
-> Signal addr | Read address |
-> Signal Bool | Write enable |
-> Signal a | Value to write (at address |
-> Signal a | Value of the |
Create a blockRAM with space for n
elements.
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
bram40 ::Signal
(Unsigned
6) -> Signal (Unsigned
6) ->Signal
Bool ->Signal
Bit
-> SignalBit
bram40 =blockRam
(replicate
d40 1)
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a Block RAM.
- Use the adapter
readNew
for obtaining write-before-read semantics like this:readNew (blockRam inits) wr rd en dt
.
:: (KnownNat (2 ^ n), KnownNat n) | |
=> Vec (2 ^ n) a | Initial content of the BRAM, also
determines the size, NB: MUST be a constant. |
-> Signal (Unsigned n) | Write address |
-> Signal (Unsigned n) | Read address |
-> Signal Bool | Write enable |
-> Signal a | Value to write (at address |
-> Signal a | Value of the |
Create a blockRAM with space for 2^n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
bram32 ::Signal
(Unsigned
5) -> Signal (Unsigned
5) ->Signal
Bool ->Signal
Bit
->Signal
Bit
bram32 =blockRamPow2
(replicate
d32 1)
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a Block RAM.
- Use the adapter
readNew
for obtaining write-before-read semantics like this:readNew (blockRamPow2 inits) wr rd en dt
.
BlockRAM primitives initialised with a data file
:: (KnownNat m, Enum addr) | |
=> SNat n | Size of the blockRAM |
-> FilePath | File describing the initial content of the blockRAM |
-> Signal addr | Write address |
-> Signal addr | Read address |
-> Signal Bool | Write enable |
-> Signal (BitVector m) | Value to write (at address |
-> Signal (BitVector m) | Value of the |
Create a blockRAM with space for n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a Block RAM.
- Use the adapter
readNew
for obtaining write-before-read semantics like this:readNew (blockRamFile size file) wr rd en dt
. - See CLaSH.Prelude.BlockRam.File for more information on how to instantiate a Block RAM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
:: (KnownNat m, KnownNat n, KnownNat (2 ^ n)) | |
=> FilePath | File describing the initial content of the blockRAM |
-> Signal (Unsigned n) | Write address |
-> Signal (Unsigned n) | Read address |
-> Signal Bool | Write enable |
-> Signal (BitVector m) | Value to write (at address |
-> Signal (BitVector m) | Value of the |
Create a blockRAM with space for 2^n
elements
- NB: Read value is delayed by 1 cycle
- NB: Initial output value is
undefined
NB: This function might not work for specific combinations of code-generation backends and hardware targets. Please check the support table below:
| VHDL | Verilog | SystemVerilog | ===============+==========+==========+===============+ Altera/Quartus | Broken | Works | Works | Xilinx/ISE | Works | Works | Works | ASIC | Untested | Untested | Untested | ===============+==========+==========+===============+
Additional helpful information:
- See CLaSH.Prelude.BlockRam for more information on how to use a Block RAM.
- Use the adapter
readNew
for obtaining write-before-read semantics like this:readNew (blockRamFilePow2 file) wr rd en dt
. - See CLaSH.Prelude.BlockRam.File for more information on how to instantiate a Block RAM with the contents of a data file.
- See CLaSH.Sized.Fixed for ideas on how to create your own data files.
BlockRAM read/write conflict resolution
readNew :: Eq addr => (Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a) -> Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a Source
Create read-after-write blockRAM from a read-before-write one (synchronised to system clock)
>>>
import CLaSH.Prelude
>>>
:t readNew (blockRam (0 :> 1 :> Nil))
readNew (blockRam (0 :> 1 :> Nil)) :: (Enum addr, Eq addr, Num a) => Signal addr -> Signal addr -> Signal Bool -> Signal a -> Signal a
readNew' :: Eq addr => SClock clk -> (Signal' clk addr -> Signal' clk addr -> Signal' clk Bool -> Signal' clk a -> Signal' clk a) -> Signal' clk addr -> Signal' clk addr -> Signal' clk Bool -> Signal' clk a -> Signal' clk a Source
Create read-after-write blockRAM from a read-before-write one (synchronised to specified clock)
Utility functions
:: (KnownNat n, Default a) | |
=> Signal a | Signal to create a window over |
-> Vec (n + 1) (Signal a) | Window of at least size 1 |
Give a window over a Signal
window4 :: Signal Int -> Vec 4 (Signal Int) window4 = window
>>>
simulateB window4 [1::Int,2,3,4,5] :: [Vec 4 Int]
[<1,0,0,0>,<2,1,0,0>,<3,2,1,0>,<4,3,2,1>,<5,4,3,2>...
:: (KnownNat (n + 1), Default a) | |
=> Signal a | Signal to create a window over |
-> Vec (n + 1) (Signal a) | Window of at least size 1 |
Give a delayed window over a Signal
windowD3 :: Signal Int -> Vec 3 (Signal Int) windowD3 = windowD
>>>
simulateB windowD3 [1::Int,2,3,4] :: [Vec 3 Int]
[<0,0,0>,<1,0,0>,<2,1,0>,<3,2,1>,<4,3,2>...
Testbench functions
:: (Eq a, Show a) | |
=> String | Additional message |
-> Signal a | Checked value |
-> Signal a | Expected value |
-> Signal b | Return value |
-> Signal b |
Compares the first two Signal
s for equality and logs a warning when they
are not equal. The second Signal
is considered the expected value. This
function simply returns the third Signal
unaltered as its result. This
function is used by outputVerifier
.
NB: This function can be used in synthesizable designs.
To be used as one of the functions to create the "magical" testInput
value, which the CλaSH compiler looks for to create the stimulus generator
for the generated VHDL testbench.
Example:
testInput ::Signal
Int testInput =stimuliGenerator
$(v
[(1::Int),3..21])
>>>
sampleN 13 testInput
[1,3,5,7,9,11,13,15,17,19,21,21,21]
:: (KnownNat l, Eq a, Show a) | |
=> Vec l a | Samples to compare with |
-> Signal a | Signal to verify |
-> Signal Bool | Indicator that all samples are verified |
To be used as one of the functions to generate the "magical" expectedOutput
function, which the CλaSH compiler looks for to create the signal verifier
for the generated VHDL testbench.
Example:
expectedOutput ::Signal
Int ->Signal
Bool expectedOutput =outputVerifier
$(v
([70,99,2,3,4,5,7,8,9,10]::[Int]))
>>>
import qualified Data.List as List
>>>
sampleN 12 (expectedOutput (fromList ([0..10] List.++ [10,10,10])))
[ cycle(system1000): 0, outputVerifier expected value: 70, not equal to actual value: 0 False, cycle(system1000): 1, outputVerifier expected value: 99, not equal to actual value: 1 False,False,False,False,False, cycle(system1000): 6, outputVerifier expected value: 7, not equal to actual value: 6 False, cycle(system1000): 7, outputVerifier expected value: 8, not equal to actual value: 7 False, cycle(system1000): 8, outputVerifier expected value: 9, not equal to actual value: 8 False, cycle(system1000): 9, outputVerifier expected value: 10, not equal to actual value: 9 False,True,True]
Exported modules
Synchronous signals
module CLaSH.Signal
module CLaSH.Signal.Delayed
DataFlow interface
module CLaSH.Prelude.DataFlow
Datatypes
Bit vectors
module CLaSH.Sized.BitVector
module CLaSH.Prelude.BitIndex
module CLaSH.Prelude.BitReduction
Arbitrary-width numbers
module CLaSH.Sized.Signed
module CLaSH.Sized.Unsigned
module CLaSH.Sized.Index
Fixed point numbers
module CLaSH.Sized.Fixed
Fixed size vectors
module CLaSH.Sized.Vector
Perfect depth trees
module CLaSH.Sized.RTree
Annotations
module CLaSH.Annotations.TopEntity
Type-level natural numbers
module GHC.TypeLits
module GHC.TypeLits.Extra
module CLaSH.Promoted.Nat
module CLaSH.Promoted.Nat.Literals
module CLaSH.Promoted.Nat.TH
Type-level functions
module CLaSH.Promoted.Ord
Template Haskell
class Lift t where
Lift Bool | |
Lift Char | |
Lift Double | |
Lift Float | |
Lift Int | |
Lift Int8 | |
Lift Int16 | |
Lift Int32 | |
Lift Int64 | |
Lift Integer | |
Lift Word | |
Lift Word8 | |
Lift Word16 | |
Lift Word32 | |
Lift Word64 | |
Lift () | |
Lift Natural | |
Lift a => Lift [a] | |
Integral a => Lift (Ratio a) | |
Lift a => Lift (Maybe a) | |
KnownNat n => Lift (Index n) | |
KnownNat n => Lift (BitVector n) | |
KnownNat n => Lift (Signed n) | |
KnownNat n => Lift (Unsigned n) | |
(Lift a, Lift b) => Lift (Either a b) | |
(Lift a, Lift b) => Lift (a, b) | |
Lift a => Lift (Signal' clk a) | |
Lift a => Lift (Vec n a) | |
(Lift a, Lift b, Lift c) => Lift (a, b, c) | |
(Lift (rep ((+) int frac)), KnownNat frac, KnownNat int, Typeable (Nat -> *) rep) => Lift (Fixed rep int frac) | |
Lift a => Lift (DSignal' clk delay a) | |
(Lift a, Lift b, Lift c, Lift d) => Lift (a, b, c, d) | |
(Lift a, Lift b, Lift c, Lift d, Lift e) => Lift (a, b, c, d, e) | |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f) => Lift (a, b, c, d, e, f) | |
(Lift a, Lift b, Lift c, Lift d, Lift e, Lift f, Lift g) => Lift (a, b, c, d, e, f, g) |
deriveLift :: Name -> Q [Dec]
Derive Lift instances for the given datatype.
Type classes
CLaSH
module CLaSH.Class.BitPack
module CLaSH.Class.Num
module CLaSH.Class.Resize
Other
module Control.Applicative
module Data.Bits
module Data.Default
Haskell Prelude
CLaSH.Prelude re-exports most of the Haskell Prelude with the exception of the following: (++), (!!), concat, drop, foldl, foldl1, foldr, foldr1, head, init, iterate, last, length, map, repeat, replicate, reverse, scanl, scanr, splitAt, tail, take, unzip, unzip3, zip, zip3, zipWith, zipWith3.
It instead exports the identically named functions defined in terms of
Vec
at CLaSH.Sized.Vector.
module Prelude