let merge sgn1 sgn2 merge_info =
let merge_elem lst (k, info) = add_in_list lst k info merge_info in
let inputs = fold_num_inputs merge_elem sgn1.in_params sgn2 in
let outputs = fold_outputs merge_elem sgn1.outputs sgn2 in
let in_ctrl = match sgn1.in_ctrl, sgn2.in_ctrl with
| None, _ -> sgn2.in_ctrl
| _, None -> sgn1.in_ctrl
| Some i1, Some i2 -> Some (merge_info i1 i2)
in
assert (sgn1.in_implicits = [] && sgn2.in_implicits = []);
let out_ret = match sgn1.out_ret, sgn2.out_ret with
| None, _ -> sgn2.out_ret
| _, None -> sgn1.out_ret
| Some i1, Some i2 -> Some (merge_info i1 i2)
in
{ in_ctrl = in_ctrl; in_params = inputs ;
in_implicits = [] ;
out_ret = out_ret ; outputs = outputs }