123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188open!Core0moduletypeFunctions=sigmoduleSignal:Signal.SmoduleAlways:Always.SwithmoduleSignal:=Signaltype'atvaladd_clear:Signal.tt->Signal.t->Signal.ttvalto_spec:Signal.tt->Signal.Reg_spec.tvalto_spec_no_clear:Signal.tt->Signal.Reg_spec.tvalclock:Signal.tt->Signal.tvalreg:Signal.tt->?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.t->Signal.tvalcut_through_reg:Signal.tt->?clear:Signal.t->?clear_to:Signal.t->enable:Signal.t->Signal.t->Signal.tvalreg_no_clear:Signal.tt->?enable:Signal.t->Signal.t->Signal.tvalpipeline:?attributes:Rtl_attribute.tlist->?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->n:int->Signal.t->Signal.tvalpipeline_no_clear:?attributes:Rtl_attribute.tlist->?enable:Signal.t->Signal.tt->n:int->Signal.t->Signal.tvalreg_fb:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->f:(Signal.t->Signal.t)->Signal.tvalreg_fb_and_next:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->f:(Signal.t->Signal.t)->Signal.t*Signal.tvalreg_fb_and_next_no_clear:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->f:(Signal.t->Signal.t)->Signal.t*Signal.tvalreg_fb_no_clear:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->f:(Signal.t->Signal.t)->Signal.tmoduleVar:sigvalreg:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->Always.Variable.tvalreg_no_clear:?enable:Signal.t->Signal.tt->width:int->Always.Variable.tvalcut_through_reg:?enable:Signal.t->?clear:Signal.t->?clear_to:Signal.t->Signal.tt->width:int->Always.Variable.tvalreg_with_int_default:?enable:Signal.t->?clear:Signal.t->Signal.tt->width:int->clear_to:int->Always.Variable.tend(** Utility functions for clock domain crossings. *)moduleCdc:sig(** Take a single cycle input pulse, and stretch it for [n] cycles. The output goes
high on the same cycle as the input. *)valstretch:Signal.tt->n:int->Signal.t->Signal.tvalstretch_no_clear:Signal.tt->n:int->Signal.t->Signal.t(** Take a [Signal.t With_valid.t] that is in a slower clock and convert the [valid]
pulse to a pulse in the faster clock. *)valwith_valid_pulse_detect_rising_edge:Signal.tt->Signal.tWith_valid.t->Signal.tWith_valid.t(** Create [1 + num_additional_pipeline_stages] registers in a pipeline with
[async_reg] attribute set. Note this does not add any false path or timing
constraints, the user needs to do that separately. *)valreg_no_clear_with_async_reg_annotation:num_additional_pipeline_stages:int->Signal.tt->Signal.t->Signal.tendendmoduleUntyped=structtype'at={clock:'a;clear:'a}[@@derivinghardcaml]endmoduletypeS=sigtype'at={clock:'a;clear:'a}[@@derivinghardcaml]valto_untyped:'at->'aUntyped.tvalof_untyped:'aUntyped.t->'atincludeFunctionswithmoduleSignal:=SignalandmoduleAlways:=Alwaysandtype'at:='atmoduleClocked:sigtypenonrec'at='at={clock:'a;clear:'a}(** Interface is included here with the type reexported intentionally. This is so that
users can write [module Clocking = Clocking.Clocked] at the top of modules that
just use the Clocked_signal.t versions of the functions above. *)includeInterface.Swithtype'at:='atincludeFunctionswithmoduleSignal:=Clocked_signalandmoduleAlways:=Always.Clockedwithtype'at:='atendendmoduletypeClocking=sigmoduletypeS=SmoduleMake():SincludeSwithtype'at='aUntyped.tend