package hardcaml

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Always is a DSL that lets one describe a circuit in the same style as a Verliog always block.

if and switch control constructs are provided. (<--) is used for assignment.

Code is written as lists of assignments, if and control statements.

variables;

let var = wire (zero 8) in
let var = reg r_sync enable 8 in

assignment;

var <-- exp;

if statements;

if_ condition [ ... ] [ ... ]

switch statements;

switch condition [
  of_int ~width:3 0, [ ... ];
  of_int ~width:3 1, [ ... ];
  of_int ~width:3 2, [ ... ];
  of_int ~width:3 3, [ ... ];
]

signals;

let (s:signal) = q (v:guarded) in

compilation;

compile [ ... ]

example;

      let state = reg r_sync enable 2 in
      let a = wire 8 in
      compile [
        if_ (a.value ==:. 4) [
          a <-- of_int ~width:8 2
        ] [
          switch state.value [
          (of_int ~width:2 0) [
            a <--. 3;
            state <-- of_int ~width:2 1;
          ];
          (of_int ~width:2 1) [
            a <--. 2;
            state <-- of_int ~width:2 2;
          ];
          (of_int ~width:2 2) [
            a <--. 1;
            state <-- of_int ~width:2 3;
          ];
          (of_int ~width:2 3) [
            a <--. 0;
            state <-- of_int ~width:2 4;
          ]
        ]
      ];
      let state = state.value in
      let a = a.value in
      ....
type t
val sexp_of_t : t -> Ppx_sexp_conv_lib.Sexp.t
type always = t
module Variable : sig ... end

The type of variables in guarded assignments. Variables may be asychronous wires, or synchronous regs. The current value of the variable may be accessed through the value field below.

type 'a case = 'a * t Hardcaml__.Import.List.t
type 'a cases = 'a case Hardcaml__.Import.List.t
val if_ : Signal.t -> t Hardcaml__.Import.List.t -> t Hardcaml__.Import.List.t -> t

if statement

val elif : Signal.t -> t Hardcaml__.Import.List.t -> t Hardcaml__.Import.List.t -> t Hardcaml__.Import.List.t

else if branch

val when_ : Signal.t -> t Hardcaml__.Import.List.t -> t

if sel then ... else

val unless : Signal.t -> t Hardcaml__.Import.List.t -> t

if sel then else ...

val switch : Signal.t -> Signal.t cases -> t

switch statement

val proc : t Hardcaml__.Import.List.t -> t

Allows sequences of expressions to be inserted into the code; a syntactic nicety.

val (<--) : Variable.t -> Signal.t -> t

assignment

val (<--.) : Variable.t -> Base.Int.t -> t

assignment with an integer constant - width is inferred

module State_machine : sig ... end
val compile : t Hardcaml__.Import.List.t -> Hardcaml__.Import.Unit.t

compile to structural code

OCaml

Innovation. Community. Security.