Module Hardcaml.Always
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 inassignment;
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) incompilation;
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
      ....- 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- valuefield below.
- type 'a case- = 'a * t Hardcaml__.Import.list
- type 'a cases- = 'a case Hardcaml__.Import.list
- val if_ : Signal.t -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list -> t
- if statement 
- val elif : Signal.t -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list -> t Hardcaml__.Import.list
- else if branch 
- val when_ : Signal.t -> t Hardcaml__.Import.list -> t
- if sel then - ...else
- val unless : Signal.t -> t Hardcaml__.Import.list -> t
- if sel then - else- ...
- val proc : t Hardcaml__.Import.list -> t
- Allows sequences of expressions to be inserted into the code; a syntactic nicety. 
- val (<--) : Variable.t -> Signal.t -> t
- assignment 
- val (<--.) : Variable.t -> Hardcaml__.Import.int -> t
- assignment with an integer constant - width is inferred 
module State_machine : sig ... end- val compile : t Hardcaml__.Import.list -> Hardcaml__.Import.unit
- compile to structural code