123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176moduletypeConfig=sigvalstructural_const:boolvalstructural_mux:boolvalstructural_concat:boolvalstructural_select:boolendmoduletypeStructural=sigtypename=stringtypeid=inttypewidth=inttypesignal=|Empty(* module interface *)|Module_inputofid*name*width*Rtl_attribute.tlistref|Module_outputofid*name*width*signalref*Rtl_attribute.tlistref|Module_tristateofid*name*width*signallistref*Rtl_attribute.tlistref(* internal wires *)|Internal_wireofid*width*signalref|Internal_triwireofid*width*signallistref(* instantiations *)|Instantiation_outputofid*name(** reference to instantiation *)|Instantiation_tristateofid*name|Instantiationofid*name*(string*generic)list*(string*signal)list(* inputs (read) *)*(string*signal)list(* outputs (write; drive wires/module outputs *)*(string*signal)list(* tristate (write; drive triwires/module tristates *)*stringoption*Rtl_attribute.tlist(* basic RTL operators *)|Rtl_opofid*width*rtl_opandrtl_op=|Constantofstring|Selectofint*int*signal|Concatofsignallist|Muxofsignal*signallistandgeneric=|GIntofint|GFloatoffloat|GStringofstring|GUnquotedofstringtypecircuit={name:string;id:id;mutablesignals:signallist}exceptionInvalid_submodule_input_connectionofstring*string*signalexceptionInvalid_submodule_output_connectionofstring*string*signalexceptionInvalid_submodule_tristate_connectionofstring*string*signalexceptionWire_already_assignedofsignalexceptionInvalid_assignment_targetofsignalexceptionCant_assign_wire_withofsignalexceptionCant_assign_triwire_withofsignalexceptionInvalid_nameofsignalexceptionInvalid_widthofsignalexceptionInvalid_idofsignalexceptionInvalid_constantofstringexceptionRtl_op_arg_not_readableofsignalexceptionToo_few_mux_data_elementsexceptionToo_many_mux_data_elementsofintexceptionAll_mux_data_elements_must_be_same_widthofintlistexceptionNo_elements_to_concatexceptionSelect_index_errorofint*intexceptionBinop_arg_widths_differentofstringexceptionNo_circuitexceptionCircuit_already_started(** Clears the circuit database and resets all internal state back to initial values. *)valreset_circuit_database:unit->unit(** start circuit *)valstart_circuit:string->unit(** complete circuit, add to database *)valend_circuit:unit->unit(** find circuit in database *)valfind_circuit:string->circuitvalcreate_circuit:string->(unit->unit)->circuit(** Add an attribute to the signal. Currently only works on input and outputs. *)valadd_attribute:signal->Rtl_attribute.t->unitvalwidth:signal->intvalmk_input:string->int->signalvalmk_output:string->int->signalvalmk_tristate:string->int->signalvalmk_wire:int->signalvalmk_triwire:int->signalval(<==):signal->signal->unitvalis_connected:signal->boolvalinst:?instance_name:string->?attributes:Rtl_attribute.tlist->?g:(string*generic)list->?i:(string*signal)list->?o:(string*signal)list->?t:(string*signal)list->string->unitval(==>):'a->'b->'a*'bvalof_bit_string:string->signalvalz:int->signalvalmux:signal->signallist->signalvalconcat_msb:signallist->signalvalselect:signal->int->int->signalmoduletypeConfig=Configvalprefix:string(** the comb API must be (rebuilt) between each circuit *)moduleBase(C:Config):Comb.Primitiveswithtypet=signal(** progressively more structural APIs *)moduleBase0:Comb.Primitiveswithtypet=signal(** includes mux, concat, select *)moduleBase1:Comb.Primitiveswithtypet=signal[@@deprecated"[since 2017-11] Waiting on further work."](** includes consts *)moduleBase2:Comb.Primitiveswithtypet=signal[@@deprecated"[since 2017-11] Waiting on further work."]valwrite_verilog:(string->unit)->circuit->unitmoduleLib:sigvalreg:clock:signal->en:signal->signal->signalvalreg_r:clock:signal->reset:signal->?def:int->en:signal->signal->signalvalreg_c:clock:signal->clear:signal->?def:int->en:signal->signal->signalvalreg_rc:clock:signal->reset:signal->clear:signal->?def:int->en:signal->signal->signalvaltristate_buffer:en:signal->i:signal->t:signal->signalendmoduleWith_interface(I:Interface.S)(O:Interface.S)(T:Interface.S):sigvalcreate_circuit:string->(signalI.t->signalO.t->signalT.t->unit)->circuitvalinst:?instance_name:string->?attributes:Rtl_attribute.tlist->?g:(string*generic)list->string->signalI.t->signalO.t->signalT.t->unitendend