blarney
Copyright(c) Matthew Naylor 2019
(c) Alexandre Joannou 2019-2021
LicenseMIT
Maintainermattfn@gmail.com
Stabilityexperimental
Safe HaskellSafe-Inferred

Blarney.Core.Module

Description

We split the RTL monad into a Module monad and an Action monad, giving a more familiar HDL structure in which modules instantiate other modules, and express behaviour through always blocks containing actions. Actions cannot instantiate modules.

Synopsis

Modules and actions

newtype Module a Source #

A module is just a wrapper around the RTL monad

Constructors

M 

Fields

Instances

Instances details
MonadFail Module # 
Instance details

Defined in Blarney.Core.Module

Methods

fail :: String -> Module a #

MonadFix Module # 
Instance details

Defined in Blarney.Core.Module

Methods

mfix :: (a -> Module a) -> Module a

Applicative Module # 
Instance details

Defined in Blarney.Core.Module

Methods

pure :: a -> Module a #

(<*>) :: Module (a -> b) -> Module a -> Module b #

liftA2 :: (a -> b -> c) -> Module a -> Module b -> Module c

(*>) :: Module a -> Module b -> Module b #

(<*) :: Module a -> Module b -> Module a #

Functor Module # 
Instance details

Defined in Blarney.Core.Module

Methods

fmap :: (a -> b) -> Module a -> Module b #

(<$) :: a -> Module b -> Module a #

Monad Module # 
Instance details

Defined in Blarney.Core.Module

Methods

(>>=) :: Module a -> (a -> Module b) -> Module b #

(>>) :: Module a -> Module b -> Module b #

return :: a -> Module a #

Interface a => Modular (Module a) # 
Instance details

Defined in Blarney.Core.Interface

Methods

makeMod :: Int -> Module a -> Declare () Source #

makeInst :: String -> InstanceInfo -> Int -> Declare () -> Maybe CustomNetlist -> Module a Source #

ToNetlist (Module ()) #

Convert Module monad to a netlist

Instance details

Defined in Blarney.Core.Flatten

Methods

toNetlist :: Module () -> Netlist Source #

ToSP (SP t0 t1) t0 t1 #

ToSP instance for StreamProcessor itself

Instance details

Defined in Blarney.Stream

Methods

toSP :: SP t0 t1 -> SP t0 t1 Source #

newtype Action a Source #

An action is just a wrapper around the RTL monad

Constructors

A 

Fields

Instances

Instances details
MonadFix Action # 
Instance details

Defined in Blarney.Core.Module

Methods

mfix :: (a -> Action a) -> Action a

Applicative Action # 
Instance details

Defined in Blarney.Core.Module

Methods

pure :: a -> Action a #

(<*>) :: Action (a -> b) -> Action a -> Action b #

liftA2 :: (a -> b -> c) -> Action a -> Action b -> Action c

(*>) :: Action a -> Action b -> Action b #

(<*) :: Action a -> Action b -> Action a #

Functor Action # 
Instance details

Defined in Blarney.Core.Module

Methods

fmap :: (a -> b) -> Action a -> Action b #

(<$) :: a -> Action b -> Action a #

Monad Action # 
Instance details

Defined in Blarney.Core.Module

Methods

(>>=) :: Action a -> (a -> Action b) -> Action b #

(>>) :: Action a -> Action b -> Action b #

return :: a -> Action a #

Interface a => Interface (Action a) # 
Instance details

Defined in Blarney.Core.Interface

Interface a => Method (Action a) # 
Instance details

Defined in Blarney.Core.Interface

a ~ () => Displayable (Action a) #

Display statement

Instance details

Defined in Blarney.Core.Module

Methods

disp :: Format -> Format -> Action a Source #

When (Bit 1) Action #

Overloaded conditional for actions

Instance details

Defined in Blarney.Core.Module

Methods

when :: Bit 1 -> Action () -> Action () Source #

Bits a => IfThenElse (Bit 1) (Action a) #

Overloaded if-then-else

Instance details

Defined in Blarney.Core.Module

Methods

ifThenElse :: Bit 1 -> Action a -> Action a -> Action a Source #

Lift actions to modules

always :: Action a -> Module a Source #

Execute an action on every clock cycle

Action of doing nothing

noAction :: Action () Source #

Action of doing nothing

Conditional actions

whenAction :: Bit 1 -> Action a -> Action a Source #

Conditional block over actions with return value

switch :: Bits a => a -> [(a, Action ())] -> Action () Source #

Switch statement over actions

(-->) :: a -> b -> (a, b) infixl 0 Source #

Operator for switch statement alternatives

Validity of a value

class Valid t where Source #

Validity of a value

Methods

valid :: t -> Bit 1 Source #

Variable value (read)

class Val v a | v -> a where Source #

Variable value (read)

Methods

val :: v -> a Source #

Instances

Instances details
Val PulseWire (Bit 1) #

Val instance for PulseWire, returning whether the wire was pulsed

Instance details

Defined in Blarney.PulseWire

Methods

val :: PulseWire -> Bit 1 Source #

Val (ReadWrite t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: ReadWrite t -> t Source #

Val (Reg t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: Reg t -> t Source #

Val (Wire t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: Wire t -> t Source #

Val (Reg t) t #

Register read and write

Instance details

Defined in Blarney.Core.Module

Methods

val :: Reg t -> t Source #

Val (Wire t) t #

Wire read and write

Instance details

Defined in Blarney.Core.Module

Methods

val :: Wire t -> t Source #

Variable assignment (write)

class Assign v where Source #

Variable assignment (write)

Methods

(<==) :: Bits a => v a -> a -> Action () infix 1 Source #

Instances

Instances details
Assign ReadWrite # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => ReadWrite a -> a -> Action () Source #

Assign Reg # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Reg a -> a -> Action () Source #

Assign Wire # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Wire a -> a -> Action () Source #

Assign WriteOnly # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => WriteOnly a -> a -> Action () Source #

Assign Reg # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Reg a -> a -> Action () Source #

Assign Wire # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Wire a -> a -> Action () Source #

Naming hints

withNameHint :: NameHint -> Module a -> Module a Source #

Set name hint

withName :: String -> Module a -> Module a Source #

Set name hint

noName :: Module a -> Module a Source #

Tell plugin not to generate name

Registers

data Reg t Source #

Blarney's register Module type

Constructors

Reg 

Fields

Instances

Instances details
Assign Reg # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Reg a -> a -> Action () Source #

HasField "val" (Reg t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

getField :: Reg t -> t #

Generic (Reg t) # 
Instance details

Defined in Blarney.Core.Module

Associated Types

type Rep (Reg t) :: Type -> Type #

Methods

from :: Reg t -> Rep (Reg t) x #

to :: Rep (Reg t) x -> Reg t #

(Interface a, Bits a) => Interface (Reg a) # 
Instance details

Defined in Blarney.Core.Interface

Val (Reg t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: Reg t -> t Source #

type Rep (Reg t) # 
Instance details

Defined in Blarney.Core.Module

type Rep (Reg t) = D1 ('MetaData "Reg" "Blarney.Core.Module" "main" 'False) (C1 ('MetaCons "Reg" 'PrefixI 'True) (S1 ('MetaSel ('Just "readReg") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 t) :*: S1 ('MetaSel ('Just "writeReg") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (t -> Action ()))))

makeReg :: Bits a => a -> Module (Reg a) Source #

Create register with initial value

makeRegU :: Bits a => Module (Reg a) Source #

Create wire with don't care initial value

makeDReg :: Bits a => a -> Module (Reg a) Source #

A DReg holds the assigned value only for one cycle. At all other times, it has the given default value.

Wires

data Wire t Source #

Blarney's wire Module type

Constructors

Wire 

Fields

Instances

Instances details
Assign Wire # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => Wire a -> a -> Action () Source #

HasField "val" (Wire t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

getField :: Wire t -> t #

Generic (Wire t) # 
Instance details

Defined in Blarney.Core.Module

Associated Types

type Rep (Wire t) :: Type -> Type #

Methods

from :: Wire t -> Rep (Wire t) x #

to :: Rep (Wire t) x -> Wire t #

(Interface a, Bits a) => Interface (Wire a) # 
Instance details

Defined in Blarney.Core.Interface

Val (Wire t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: Wire t -> t Source #

type Rep (Wire t) # 
Instance details

Defined in Blarney.Core.Module

type Rep (Wire t) = D1 ('MetaData "Wire" "Blarney.Core.Module" "main" 'False) (C1 ('MetaCons "Wire" 'PrefixI 'True) (S1 ('MetaSel ('Just "readWire") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 t) :*: (S1 ('MetaSel ('Just "writeWire") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (t -> Action ())) :*: S1 ('MetaSel ('Just "active") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Bit 1)))))

makeWire :: Bits a => a -> Module (Wire a) Source #

Create wire with default value

makeWireU :: Bits a => Module (Wire a) Source #

Create wire with don't care default value

Read-Write and Write-Only interfaces

data ReadWrite a Source #

Read-Write interface

Constructors

ReadWrite 

Fields

Instances

Instances details
Assign ReadWrite # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => ReadWrite a -> a -> Action () Source #

HasField "val" (ReadWrite t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

getField :: ReadWrite t -> t #

Generic (ReadWrite a) # 
Instance details

Defined in Blarney.Core.Module

Associated Types

type Rep (ReadWrite a) :: Type -> Type #

Methods

from :: ReadWrite a -> Rep (ReadWrite a) x #

to :: Rep (ReadWrite a) x -> ReadWrite a #

(Interface a, Bits a) => Interface (ReadWrite a) # 
Instance details

Defined in Blarney.Core.Interface

Val (ReadWrite t) t # 
Instance details

Defined in Blarney.Core.Module

Methods

val :: ReadWrite t -> t Source #

type Rep (ReadWrite a) # 
Instance details

Defined in Blarney.Core.Module

type Rep (ReadWrite a) = D1 ('MetaData "ReadWrite" "Blarney.Core.Module" "main" 'False) (C1 ('MetaCons "ReadWrite" 'PrefixI 'True) (S1 ('MetaSel ('Just "rwReadVal") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: S1 ('MetaSel ('Just "rwWriteVal") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (a -> Action ()))))

data WriteOnly a Source #

Write-Only interface

Constructors

WriteOnly 

Fields

Instances

Instances details
Assign WriteOnly # 
Instance details

Defined in Blarney.Core.Module

Methods

(<==) :: Bits a => WriteOnly a -> a -> Action () Source #

Generic (WriteOnly a) # 
Instance details

Defined in Blarney.Core.Module

Associated Types

type Rep (WriteOnly a) :: Type -> Type #

Methods

from :: WriteOnly a -> Rep (WriteOnly a) x #

to :: Rep (WriteOnly a) x -> WriteOnly a #

(Interface a, Bits a) => Interface (WriteOnly a) # 
Instance details

Defined in Blarney.Core.Interface

type Rep (WriteOnly a) # 
Instance details

Defined in Blarney.Core.Module

type Rep (WriteOnly a) = D1 ('MetaData "WriteOnly" "Blarney.Core.Module" "main" 'False) (C1 ('MetaCons "WriteOnly" 'PrefixI 'True) (S1 ('MetaSel ('Just "woWriteVal") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (a -> Action ()))))

Register files

data RegFile a d Source #

Constructors

RegFile 

Fields

Instances

Instances details
Lookup (RegFile a d) a d #

Index a register file

Instance details

Defined in Blarney.Core.Lookup

Methods

(!) :: RegFile a d -> a -> d Source #

makeRegFileInit :: forall a d. (Bits a, Bits d) => String -> Module (RegFile a d) Source #

Create register file with initial contents

makeRegFile :: forall a d. (Bits a, Bits d) => Module (RegFile a d) Source #

Create uninitialised register file

Other actions

finish :: Action () Source #

Terminate simulator

display :: Displayable a => a Source #

Display statement

display_ :: Displayable a => a Source #

Display statement (without new line)

assert :: Bit 1 -> String -> Action () Source #

Assert that a predicate holds

dynamicAssert :: Bit 1 -> String -> Action () Source #

Simulation-time assertion

staticAssert :: Bool -> String -> Module () Source #

Elaboration-time assertion

External inputs and outputs

input :: KnownNat n => String -> Module (Bit n) Source #

External input declaration

inputBV :: String -> Width -> Module BV Source #

External input declaration (untyped)

output :: String -> Bit n -> Module () Source #

External output declaration

outputBV :: String -> BV -> Module () Source #

External output declaration (untyped)

Add a BV as a netlist root

addRoots :: [BV] -> Module () Source #

Add roots

Run a pure module

runPureModule :: Module a -> String -> a Source #

Run a pure module, i.e. a module that has no side effects. If the module has side effects, raise an error.