|
|
|
@ -489,12 +489,16 @@ let rec translate_eq map call_context
|
|
|
|
|
let action = Aop (q, List.map (translate_extvalue_to_exp map) args) in
|
|
|
|
|
v, si, j, (control map ck action) :: s
|
|
|
|
|
|
|
|
|
|
| pat, Minils.Eapp ({ Minils.a_op = Minils.Efun _ | Minils.Enode _ } as app, e_list, r) ->
|
|
|
|
|
| pat, Minils.Eapp
|
|
|
|
|
({ Minils.a_op =
|
|
|
|
|
Minils.Efun _ | Minils.Enode _ | Minils.Easync _ } as app,
|
|
|
|
|
e_list, r) ->
|
|
|
|
|
let name_list = translate_pat map e.Minils.e_ty pat in
|
|
|
|
|
let c_list = List.map (translate_extvalue_to_exp map) e_list in
|
|
|
|
|
let v', si', j', action = mk_node_call map call_context
|
|
|
|
|
app loc name_list c_list e.Minils.e_ty in
|
|
|
|
|
let action = List.map (control map ck) action in
|
|
|
|
|
(* TODO(Arduino): add Easync? *)
|
|
|
|
|
let s = (match r, app.Minils.a_op with
|
|
|
|
|
| Some r, Minils.Enode _ ->
|
|
|
|
|
let ck = Clocks.Con (ck, Initial.ptrue, r) in
|
|
|
|
@ -533,6 +537,9 @@ and translate_eq_list map call_context act_list =
|
|
|
|
|
let rev_act = List.rev act_list in
|
|
|
|
|
List.fold_left (translate_eq map call_context) ([], [], [], []) rev_act
|
|
|
|
|
|
|
|
|
|
and translate_ack { Minils.ack_name = name; Minils.ack_params = params } =
|
|
|
|
|
{ ack_name = name; ack_params = params }
|
|
|
|
|
|
|
|
|
|
and mk_node_call map call_context app loc (name_list : Obc.pattern list) args ty =
|
|
|
|
|
match app.Minils.a_op with
|
|
|
|
|
| Minils.Efun f when Mls_utils.is_op f ->
|
|
|
|
@ -572,22 +579,33 @@ and mk_node_call map call_context app loc (name_list : Obc.pattern list) args ty
|
|
|
|
|
let env = List.fold_left2 build Env.empty nd.Minils.n_input args in
|
|
|
|
|
v @ nd.Minils.n_local, si, j, subst_act_list env s
|
|
|
|
|
|
|
|
|
|
| Minils.Enode f | Minils.Efun f ->
|
|
|
|
|
| Minils.Enode f | Minils.Efun f | Minils.Easync (f, _) ->
|
|
|
|
|
let id = match app.Minils.a_id with
|
|
|
|
|
| None -> gen_obj_ident f
|
|
|
|
|
| Some id -> id
|
|
|
|
|
in
|
|
|
|
|
let o = mk_obj_call_from_context call_context id in
|
|
|
|
|
let ack = match app.Minils.a_op with
|
|
|
|
|
| Minils.Easync (_, ack) -> Some (translate_ack ack)
|
|
|
|
|
| _ -> None
|
|
|
|
|
in
|
|
|
|
|
let obj =
|
|
|
|
|
{ o_ident = obj_ref_name o; o_class = f;
|
|
|
|
|
o_params = app.Minils.a_params;
|
|
|
|
|
o_ack = ack;
|
|
|
|
|
o_size = size_from_call_context call_context; o_loc = loc } in
|
|
|
|
|
let si = match app.Minils.a_op with
|
|
|
|
|
| Minils.Efun _ -> []
|
|
|
|
|
| Minils.Enode _ -> [reinit o]
|
|
|
|
|
(* TODO(Arduino): is it correct? *)
|
|
|
|
|
| Minils.Easync _ -> []
|
|
|
|
|
| _ -> assert false
|
|
|
|
|
in
|
|
|
|
|
let s = [Acall (name_list, o, Mstep, args)] in
|
|
|
|
|
let m = match app.Minils.a_op with
|
|
|
|
|
| Minils.Easync _ -> MstepAsync
|
|
|
|
|
| _ -> Mstep
|
|
|
|
|
in
|
|
|
|
|
let s = [Acall (name_list, o, m, args)] in
|
|
|
|
|
[], si, [obj], s
|
|
|
|
|
| _ -> assert false
|
|
|
|
|
|
|
|
|
|