123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354open!Importtypeinstobj=<i:string->Signal.t;o:string->Signal.t>letcreate?(lib="work")?(arch="rtl")?instance?(parameters=[])()~name~inputs~outputs=(* filter empty/0 width IOs *)(* {[
let inputs = List.filter (fun (_, s) -> s <> Empty) inputs in
let outputs = List.filter (fun (_, b) -> b <> 0) outputs in
]} *)letwidth=List.foldoutputs~init:0~f:(funa(_,i)->a+i)inletdeps=List.mapinputs~f:sndinletoutputs,_=List.foldoutputs~init:([],0)~f:(fun(o,a)(n,w)->(n,(w,a))::o,a+w)inletsignal=Signal.Inst(Signal.make_idwidthdeps,Signal.new_id(),{inst_name=name;inst_instance=(matchinstancewithNone->"the_"^name|Somei->i);inst_generics=parameters;inst_inputs=inputs;inst_outputs=outputs;inst_lib=lib;inst_arch=arch})inletfindname=letw,o=List.Assoc.find_exnoutputsname~equal:String.equalinSignal.selectsignal(o+w-1)oinobjectmethodiname=List.Assoc.find_exninputsname~equal:String.equalmethodoname=findnameendmoduleWith_interface(I:Interface.S)(O:Interface.S)=structletcreate?lib?arch?instance?parameters~nameinputs=lett=create()?lib?arch?instance?parameters~name~inputs:(I.to_list(I.map2I.tinputs~f:(fun(n,_)s->n,s)))~outputs:(O.to_listO.t)inO.mapO.t~f:(fun(n,_)->t#on)end