diff --git a/src/tools/tiny/tiny_utils.ml b/src/tools/tiny/tiny_utils.ml index 0e3980c4ea8feb89d11d831483d6768153859de2..96c8825e10d9695b5e96b739db8a7eb1d7edda8c 100644 --- a/src/tools/tiny/tiny_utils.ml +++ b/src/tools/tiny/tiny_utils.ml @@ -10,12 +10,23 @@ let lloc_to_tloc loc = Tiny.Location.location_of_positions loc.Location.loc_star let tloc_to_lloc loc = assert false (*Location.dummy_loc (*TODO*) *) -let ltyp_to_ttyp t = +let rec ltyp_to_ttyp t = + if Types.is_tuple_type t then + match Types.type_list_of_type t with + | [t] -> ltyp_to_ttyp t + | _ -> ( + Format.eprintf "Issues converting type %a to a Tiny datatype@.@?" Types.print_ty t; + assert false (* not covered yet *) + ) + else if Types.is_real_type t then Tiny.Ast.RealT else if Types.is_int_type t then Tiny.Ast.IntT else if Types.is_bool_type t then Tiny.Ast.BoolT - else assert false (* not covered yet *) - + else ( + Format.eprintf "Issues converting type %a to a Tiny datatype@.@?" Types.print_ty t; + assert false (* not covered yet *) + ) + let cst_bool loc b = { Ast.expr_desc = if b then @@ -50,7 +61,7 @@ let instr_loc i = | Some eq -> lloc_to_tloc eq.eq_loc -let build_instr d v = +let build_expr d v = Ast.{ expr_desc = d; expr_loc = gen_loc (); expr_type = v } @@ -60,7 +71,9 @@ let cst_true = Ast.Cst (Q.one, "true") let rec lval_to_texpr m loc _val = - let build = build_instr in + Format.eprintf "lval_to_texpr %a (type %a)@." (Machine_code_common.pp_val m) _val Types.print_ty _val.value_type; + let res = + let build = build_expr in let new_desc = match _val.Machine_code_types.value_desc with | Machine_code_types.Cst cst -> ( @@ -113,7 +126,9 @@ let rec lval_to_texpr m loc _val = | _ -> assert false (* no array. access or power *) in build new_desc (ltyp_to_ttyp _val.value_type) - + in + Format.eprintf "DONE lval_to_texpr %a = %a@." (Machine_code_common.pp_val m) _val Ast.fprint_expr res; + res (* let machine_init_to_ast m = @@ -205,7 +220,7 @@ let machine_body_to_ast init m = match Corelang.node_name fun_name, ol with | "_arrow", [o] -> ( (* init_var := Some o.var_id; *) - Ast.Asn (loc, o.var_id, build_instr (if init then cst_true else cst_false) Ast.BoolT); + Ast.Asn (loc, o.var_id, build_expr (if init then cst_true else cst_false) Ast.BoolT); (* We set the arrow to false: we are not anymore in init state *) @@ -223,8 +238,13 @@ let machine_body_to_ast init m = assert false ) else ( - Format.eprintf "No tiny translation for function call %s@.@?" id; - assert false + (* Converting basic library functions *) + match id, List.map (lval_to_texpr m loc) args, ol with + | ("sin"| "cos" | "sqrt" | "exp" | "ln" | "atan" | "tan" | "tanh"), [x], [o] -> + Ast.Asn (loc, o.var_id, build_expr (Ast.Call (id, [x])) Ast.RealT) + | _ -> + Format.eprintf "No tiny translation for function call %s@.@?" id; + assert false ) | MReset id | MNoReset id -> assert false (* no more calls or functions, ie. no reset *)