Module Hardcaml.Cyclesim

Cycle accurate simulator

module Port_list : sig ... end
type ('i, 'o) t

base type of the cycle based simulators

type t_port_list = (Port_list.tPort_list.t) t
val scheduling_deps : Signal.t -> Signal.t Hardcaml__.Import.list

Specialised signal dependencies that define a graph that breaks cycles through sequential elements. This is done by removing the input edges of registers and memories (excluding the read address, since hardcaml memories are read asynchronously).

Instantiations do not allow cycles from output to input ports, which is a valid assumption for the simulator, but not in general.

Note that all signals in the graph cannot be reached from just the outputs of a circuit using these dependencies. The (discarded) inputs to all registers and memories must also be included.

val cycle : (__) t -> Hardcaml__.Import.unit

advance by 1 clock cycle (check->comb->seq->comb)

val cycle_check : (__) t -> Hardcaml__.Import.unit

check inputs are valid before a simulation cycle

val cycle_before_clock_edge : (__) t -> Hardcaml__.Import.unit

update combinatorial logic before clock edge and relative to new inputs.

val cycle_at_clock_edge : (__) t -> Hardcaml__.Import.unit

update sequential logic - registers and memories.

val cycle_after_clock_edge : (__) t -> Hardcaml__.Import.unit

update combinatorial logic after clock edge

val reset : (__) t -> Hardcaml__.Import.unit

reset simulator

val in_port : (__) t -> Hardcaml__.Import.string -> Bits.t Hardcaml__.Import.ref

get input port given a name

val out_port : ?⁠clock_edge:Side.t -> (__) t -> Hardcaml__.Import.string -> Bits.t Hardcaml__.Import.ref

Get output port given a name. If clock_edge is Before the outputs are computed prior to the clock edge - After means the outputs are computed after the clock edge.

val inputs : ('i_) t -> 'i
val outputs : ?⁠clock_edge:Side.t -> (_'o) t -> 'o
val in_ports : (__) t -> Port_list.t
val out_ports : ?⁠clock_edge:Side.t -> (__) t -> Port_list.t
val internal_ports : (__) t -> Port_list.t

get list of internal nodes

val lookup_signal : (__) t -> Signal.Uid.t -> Bits.t Hardcaml__.Import.ref
val lookup_reg : (__) t -> Signal.Uid.t -> Bits.t Hardcaml__.Import.ref
type 'a with_create_options = ?⁠is_internal_port:(Signal.t -> Hardcaml__.Import.bool) -> ?⁠combinational_ops_database:Combinational_ops_database.t -> 'a
val create : (Circuit.t -> t_port_list) with_create_options

construct a simulator from a circuit

module Combine_error : sig ... end
val combine : ?⁠port_sets_may_differ:Hardcaml__.Import.bool -> ?⁠on_error:(Combine_error.t -> Hardcaml__.Import.unit) -> ('i'o) t -> ('i'o) t -> ('i'o) t

Combine 2 simulators. The inputs are set on the 1st simulator and copied to the 2nd. Outputs are checked and on_error is called if a difference is found. By default, on_error raises.

The simulators should have the same input and output port sets, unless port_sets_may_differ is true, in which case only ports which exist on both simulators are checked.

module With_interface : functor (I : Interface.S) -> functor (O : Interface.S) -> sig ... end
module Private : sig ... end