diff --git a/_oasis b/_oasis index ad160cac24124b2d03dd940cc68fb8f28e60ed78..917824a552c91e4aaf4e40baf2648bf1c1d7b55f 100644 --- a/_oasis +++ b/_oasis @@ -1,6 +1,6 @@ OASISFormat: 0.4 Name: lustre-v6 -Version: 1.750 +Version: 1.762 Synopsis: The Lustre V6 Verimag compiler Description: This package contains: - lv6: the (current) name of the compiler (and interpreter via -exec) diff --git a/lv6-ref-man/lv6-ref-man.pdf b/lv6-ref-man/lv6-ref-man.pdf index 414d9989f0032da98c5f99f1966a8be90c309bbb..8c5e09e95c89d153ac31746c18b89c896787d4ba 100644 Binary files a/lv6-ref-man/lv6-ref-man.pdf and b/lv6-ref-man/lv6-ref-man.pdf differ diff --git a/src/ast2lic.ml b/src/ast2lic.ml index b2a85bf951571ce4ca2e7ecf57a54fc6392dc9de..4c11f6af2d744227042c54ac7b0fc9d56aa5abcb 100644 --- a/src/ast2lic.ml +++ b/src/ast2lic.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 18/10/2017 (at 18:59) by Erwan Jahier> *) +(* Time-stamp: <modified the 03/12/2018 (at 17:16) by Erwan Jahier> *) open Lxm @@ -163,13 +163,13 @@ let get_abstract_static_params in List.map do_abstract_static_param spl ) | (None, nid) -> ( - try + (* try *) (* let spl = match AstTabSymbol.find_node symbols (Lv6Id.name_of_idref idref) lxm with *) let spl = match AstTabSymbol.find_node symbols nid lxm with | AstTabSymbol.Local ni -> ni.it.static_params | AstTabSymbol.Imported(imported_node, params) -> params in List.map do_abstract_static_param spl - with _ -> + (* with Compile_error(_,_) -> *) (* can occur for static node parameters, which cannot themselves have static parameters. A better solution ougth to be to add node static parameters in the AstTabSymbol.t @@ -183,7 +183,7 @@ let get_abstract_static_params Voir + bas ... *) - [] + (* [] *) ) @@ -191,13 +191,13 @@ let get_abstract_static_params let rec of_node (id_solver : IdSolver.t) (ne: AstCore.node_exp srcflagged) : Lic.node_exp = - + Lv6Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "\n\n#DBG: ENTERING Ast2lic.of_node \'"; - AstV6Dump.print_node_exp stderr ne.it; - Printf.fprintf stderr "'\n\n"; - - ); + Printf.fprintf stderr "\n\n#DBG: ENTERING Ast2lic.of_node \'"; + AstV6Dump.print_node_exp stderr ne.it; + Printf.fprintf stderr "'\n\n"; + + ); let lxm = ne.src in let (idref, static_args) = ne.it in (* pas tres beau : on corrige le idref des predefs ... *) @@ -229,35 +229,36 @@ let rec of_node let static_args_eff = match static_args with | [] -> [] | _ -> - (* on en proffite pour corriger le idref en y rajoutant l'eventuel pack *) - let static_params = get_abstract_static_params id_solver.all_srcs id_solver.global_symbols lxm idref in + let static_params = + get_abstract_static_params id_solver.all_srcs id_solver.global_symbols lxm idref + in let sp_l = List.length static_params and sa_l = List.length static_args in if (sp_l <> sa_l) then let msg = "Bad number of (static) arguments: " ^ - (string_of_int sp_l) ^ " expected, and " ^ - (string_of_int sa_l) ^ " provided." + (string_of_int sp_l) ^ " expected, and " ^ + (string_of_int sa_l) ^ " provided." in raise (Compile_error(lxm, msg)) else List.map2 (check_static_arg id_solver) static_params - static_args + static_args in let res = id_solver.id2node idref static_args_eff lxm in Lv6Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "\n#DBG: LEAVING Ast2lic.of_node \'"; - AstV6Dump.print_node_exp stderr ne.it; - Printf.fprintf stderr "'\n"; - Printf.fprintf stderr " RESULT:\n%s\n" (Lic.string_of_node_exp res); - ); + Printf.fprintf stderr "\n#DBG: LEAVING Ast2lic.of_node \'"; + AstV6Dump.print_node_exp stderr ne.it; + Printf.fprintf stderr "'\n"; + Printf.fprintf stderr " RESULT:\n%s\n" (Lic.string_of_node_exp res); + ); res and check_static_arg (node_id_solver: IdSolver.t) (asp: abstract_static_param) (sa: AstCore.static_arg srcflagged) - : Lic.static_arg = + : Lic.static_arg = ( (* 1ere passe : on utilise expected juste pour résoudre la nature, @@ -282,11 +283,11 @@ and check_static_arg ConstStaticArgLic (id, ceff) (* val_exp vs const *) | (StaticArgConst ce, ASP_const id) -> ( - let ceff = EvalConst.f node_id_solver ce in - match ceff with - | [ceff] -> ConstStaticArgLic (id,ceff) - | _ -> ConstStaticArgLic (id,Tuple_const_eff ceff) - ) + let ceff = EvalConst.f node_id_solver ce in + match ceff with + | [ceff] -> ConstStaticArgLic (id,ceff) + | _ -> ConstStaticArgLic (id,Tuple_const_eff ceff) + ) (* id vs node *) | (StaticArgLv6Id idref, ASP_node id) -> let sargs = [] in @@ -305,7 +306,7 @@ and check_static_arg | (_, ASP_node _) -> nature_error "node" in res ) - + (******************************************************************************) @@ -331,42 +332,42 @@ and (translate_left_part : IdSolver.t -> AstCore.left_part -> Lic.left) = let vi_eff = id_solver.id2var id.it id.src in LeftVarLic (vi_eff, id.src) | LeftField (lp, id) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in (* check that [lp_eff] is a struct that have a field named [id] *) - match teff with - | Struct_type_eff(_, fl) -> ( - try let (teff_field,_) = List.assoc id.it fl in - LeftFieldLic(lp_eff, id.it, teff_field) - with Not_found -> - raise (Compile_error(id.src, "bad field name in structure")) + match teff with + | Struct_type_eff(_, fl) -> ( + try let (teff_field,_) = List.assoc id.it fl in + LeftFieldLic(lp_eff, id.it, teff_field) + with Not_found -> + raise (Compile_error(id.src, "bad field name in structure")) + ) + | _ -> raise (Compile_error(id.src, "a structure was expected")) ) - | _ -> raise (Compile_error(id.src, "a structure was expected")) - ) | LeftArray (lp, vef) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in - let lxm = vef.src in - match teff with - | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) - | Array_type_eff(teff_elt, size) -> - let index = EvalConst.eval_array_index id_solver vef.it lxm in - LeftArrayLic(lp_eff, index, teff_elt) - - | _ -> raise (Compile_error(vef.src, "an array was expected")) - ) + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in + let lxm = vef.src in + match teff with + | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) + | Array_type_eff(teff_elt, size) -> + let index = EvalConst.eval_array_index id_solver vef.it lxm in + LeftArrayLic(lp_eff, index, teff_elt) + + | _ -> raise (Compile_error(vef.src, "an array was expected")) + ) | LeftSlice (lp, sif) -> ( - let lp_eff = translate_left_part id_solver lp in - let teff = Lic.type_of_left lp_eff in - match teff with - | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) - | Array_type_eff(teff_elt, size) -> - let sieff = translate_slice_info id_solver sif.it sif.src in - let size_slice = sieff.se_width in - let teff_slice = Array_type_eff(teff_elt, size_slice) in - LeftSliceLic(lp_eff, sieff, teff_slice) - | _ -> raise (Compile_error(sif.src, "an array was expected")) - ) + let lp_eff = translate_left_part id_solver lp in + let teff = Lic.type_of_left lp_eff in + match teff with + | Abstract_type_eff(_,Array_type_eff(teff_elt, size)) + | Array_type_eff(teff_elt, size) -> + let sieff = translate_slice_info id_solver sif.it sif.src in + let size_slice = sieff.se_width in + let teff_slice = Array_type_eff(teff_elt, size_slice) in + LeftSliceLic(lp_eff, sieff, teff_slice) + | _ -> raise (Compile_error(sif.src, "an array was expected")) + ) (* Translate and performs the checks *) @@ -376,183 +377,183 @@ and (translate_val_exp_check : IdSolver.t -> Lic.clock list -> UnifyClock.subst let s,vef = translate_val_exp id_solver s ve in let lxm = AstCore.lxm_of_val_exp ve in let lxms = List.map (fun _ -> lxm) exp_clks in - (* let vef, tl = EvalType.f id_solver vef in *) + (* let vef, tl = EvalType.f id_solver vef in *) EvalClock.f id_solver s vef lxms exp_clks - + and (translate_val_exp : IdSolver.t -> UnifyClock.subst -> AstCore.val_exp -> UnifyClock.subst * Lic.val_exp) = fun id_solver s ve -> (match ve with - | CallByPos({it=WITH_n(c,e1,e2)}, Oper vel) -> - assert (vel=[]); - if EvalConst.f id_solver c = [ Bool_const_eff true ] - then translate_val_exp id_solver s e1 - else translate_val_exp id_solver s e2 - | _ -> - let s, vef_core, lxm = - match ve with - | Merge_n(ve, cl) -> - let lxm_ve = ve.src in - let ve = ve.it in - let s,ve = translate_val_exp id_solver s ve in - let s, cl = - List.fold_left - (fun (s,cl) (id,ve) -> - let s, ve = translate_val_exp id_solver s ve in - let const = id_solver.id2const id.it id.src in - s,(flagit const id.src, ve)::cl - ) - (s, []) - cl - in - s, Lic.Merge(ve, List.rev cl), lxm_ve - | Merge_bool_n(ve, t, f) -> - let lxm_ve = ve.src in - let ve = ve.it in - let s,ve = translate_val_exp id_solver s ve in - let s,case_true = translate_val_exp id_solver s t in - let s,case_false = translate_val_exp id_solver s f in - let case_true = (flagit (Bool_const_eff true) lxm_ve, case_true) in - let case_false = (flagit (Bool_const_eff false) lxm_ve, case_false) in - s, Lic.Merge(ve, [case_true; case_false]), lxm_ve - - | CallByName(by_name_op, field_list) -> - let s,fl = List.fold_left - (fun (s,fl) f -> - let s,f = translate_field id_solver s f in - s,f::fl - ) - (s,[]) - field_list - in - let fl = List.rev fl in - let s, by_name_op = translate_by_name_op id_solver by_name_op s in - s, - (CallByNameLic(by_name_op, fl)), by_name_op.src - - | CallByPos(by_pos_op, Oper vel) -> - let s, vel_eff = - List.fold_left - (fun (s,vel) ve -> - let s, ve = translate_val_exp id_solver s ve in - s,ve::vel - ) - (s,[]) vel - in - let vel_eff = List.rev vel_eff in - let lxm = by_pos_op.src in - let by_pos_op = by_pos_op.it in - let mk_by_pos_op by_pos_op_eff = - CallByPosLic(flagit by_pos_op_eff lxm, vel_eff) - in - let mk_nary_pos_op by_pos_op_eff = - (* For nor and diese: internally, nor and diese takes an array of val_exp, - to make it easier the translation into boolred. - - It is the good spot to do that? what could be a better spot? - *) - let array_val_exp = - let lxm = Lxm.override_name "[ ]" lxm in - { ve_core = CallByPosLic(flagit Lic.ARRAY lxm, vel_eff); - ve_typ = [Array_type_eff(List.hd (List.hd vel_eff).ve_typ, - List.length vel_eff)]; - ve_clk = (List.hd vel_eff).ve_clk; - ve_src = lxm - } - in - CallByPosLic(flagit by_pos_op_eff lxm, [array_val_exp]) - in - - let s, vef_core = - match by_pos_op with - | WITH_n(_,_,_) -> assert false (* handled at the top of the function *) - (* put that in another module ? yes, see above.*) - | Predef_n({it=TRUE_n}) -> s,mk_by_pos_op(Lic.CONST (Bool_const_eff true)) - | Predef_n({it=FALSE_n}) -> s,mk_by_pos_op(Lic.CONST (Bool_const_eff false)) - | Predef_n({it=RCONST_n r}) -> s,mk_by_pos_op(Lic.CONST (Real_const_eff r)) - | Predef_n({it=ICONST_n i}) -> s, mk_by_pos_op(Lic.CONST (Int_const_eff i)) - - - | Predef_n({it=NOR_n;src=lxm}) -> s, mk_nary_pos_op( - Lic.PREDEF_CALL (flagit (AstPredef.op_to_long NOR_n,[]) lxm)) - | Predef_n({it=DIESE_n;src=lxm}) -> s, mk_nary_pos_op( - Lic.PREDEF_CALL (flagit (AstPredef.op_to_long DIESE_n,[]) lxm)) - | Predef_n(op) -> s, mk_by_pos_op( - Lic.PREDEF_CALL (flagit (AstPredef.op_to_long op.it,[]) op.src)) - | CALL_n node_exp_f -> - let neff = of_node id_solver node_exp_f in - let ceff = Lic.CALL (flagit neff.node_key_eff node_exp_f.src) in - Lv6Verbose.exe ~flag:dbg (fun () -> - Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL_n "; - AstV6Dump.print_node_exp stderr node_exp_f.it; - Printf.fprintf stderr " gives type: %s\n%!" - (Lic.string_of_type_profile (profile_of_node_exp neff)) - ) ; - (s, mk_by_pos_op ceff) - | IDENT_n idref -> ( - try - let var = id_solver.id2var idref.id_id lxm in - s, mk_by_pos_op(Lic.VAR_REF var.var_name_eff) - with _ -> - let s, const = UnifyClock.const_to_val_eff lxm false s - (id_solver.id2const idref lxm) - in - s, const.ve_core - ) - | CURRENT_n -> s, mk_by_pos_op (Lic.CURRENT None) - | PRE_n -> s, mk_by_pos_op Lic.PRE - - | ARROW_n -> s, mk_by_pos_op Lic.ARROW - - | FBY_n -> (* XXX temporary crutch: translate "e1 fby e2" into "e2 -> pre(e2)" *) - (match vel_eff with - | [e1;e2] -> - let ve_pre = CallByPosLic(flagit Lic.PRE lxm, [e2]) in - let ve_pre = { e2 with ve_core=ve_pre } in - let lxm = Lxm.override_name "->" lxm in - s,CallByPosLic(flagit Lic.ARROW lxm, [e1;ve_pre]) - | _ -> assert false - ) - (* | FBY_n -> s, mk_by_pos_op Lic.FBY *) - | CONCAT_n -> s, mk_by_pos_op Lic.CONCAT - | TUPLE_n -> s, mk_by_pos_op Lic.TUPLE - | ARRAY_n -> s, CallByPosLic(flagit Lic.ARRAY lxm, vel_eff) - | STRUCT_ACCESS_n fid -> - s, mk_by_pos_op (Lic.STRUCT_ACCESS (fid)) - - | WHEN_n Base -> s, mk_by_pos_op (Lic.WHEN BaseLic) - | WHEN_n (NamedClock { it = (cc,c) ; src = lxm }) -> - let var_info = id_solver.id2var c lxm in - let _, clk = var_info.var_clock_eff in - let ct = var_info.var_type_eff in - s, mk_by_pos_op (Lic.WHEN (On((cc,c,ct), clk))) - - | ARRAY_ACCES_n ve_index -> - s, mk_by_pos_op (Lic.ARRAY_ACCES( - EvalConst.eval_array_index id_solver ve_index lxm)) - - | ARRAY_SLICE_n si -> - s, mk_by_pos_op (Lic.ARRAY_SLICE( - EvalConst.eval_array_slice id_solver si lxm)) - - | HAT_n -> ( - match vel with - | [exp; ve_size] -> - let size_const_eff = EvalConst.f id_solver ve_size in - (match size_const_eff with - | [Int_const_eff sz] -> s, mk_by_pos_op (Lic.HAT(int_of_string sz)) - | _ -> assert false) - | _ -> assert false - ) - in - s, vef_core, lxm - in - let vef = { ve_core=vef_core; ve_typ=[]; ve_clk = []; ve_src = lxm } in - let vef, tl = EvalType.f id_solver vef in - s,vef + | CallByPos({it=WITH_n(c,e1,e2)}, Oper vel) -> + assert (vel=[]); + if EvalConst.f id_solver c = [ Bool_const_eff true ] + then translate_val_exp id_solver s e1 + else translate_val_exp id_solver s e2 + | _ -> + let s, vef_core, lxm = + match ve with + | Merge_n(ve, cl) -> + let lxm_ve = ve.src in + let ve = ve.it in + let s,ve = translate_val_exp id_solver s ve in + let s, cl = + List.fold_left + (fun (s,cl) (id,ve) -> + let s, ve = translate_val_exp id_solver s ve in + let const = id_solver.id2const id.it id.src in + s,(flagit const id.src, ve)::cl + ) + (s, []) + cl + in + s, Lic.Merge(ve, List.rev cl), lxm_ve + | Merge_bool_n(ve, t, f) -> + let lxm_ve = ve.src in + let ve = ve.it in + let s,ve = translate_val_exp id_solver s ve in + let s,case_true = translate_val_exp id_solver s t in + let s,case_false = translate_val_exp id_solver s f in + let case_true = (flagit (Bool_const_eff true) lxm_ve, case_true) in + let case_false = (flagit (Bool_const_eff false) lxm_ve, case_false) in + s, Lic.Merge(ve, [case_true; case_false]), lxm_ve + + | CallByName(by_name_op, field_list) -> + let s,fl = List.fold_left + (fun (s,fl) f -> + let s,f = translate_field id_solver s f in + s,f::fl + ) + (s,[]) + field_list + in + let fl = List.rev fl in + let s, by_name_op = translate_by_name_op id_solver by_name_op s in + s, + (CallByNameLic(by_name_op, fl)), by_name_op.src + + | CallByPos(by_pos_op, Oper vel) -> + let s, vel_eff = + List.fold_left + (fun (s,vel) ve -> + let s, ve = translate_val_exp id_solver s ve in + s,ve::vel + ) + (s,[]) vel + in + let vel_eff = List.rev vel_eff in + let lxm = by_pos_op.src in + let by_pos_op = by_pos_op.it in + let mk_by_pos_op by_pos_op_eff = + CallByPosLic(flagit by_pos_op_eff lxm, vel_eff) + in + let mk_nary_pos_op by_pos_op_eff = + (* For nor and diese: internally, nor and diese takes an array of val_exp, + to make it easier the translation into boolred. + + It is the good spot to do that? what could be a better spot? + *) + let array_val_exp = + let lxm = Lxm.override_name "[ ]" lxm in + { ve_core = CallByPosLic(flagit Lic.ARRAY lxm, vel_eff); + ve_typ = [Array_type_eff(List.hd (List.hd vel_eff).ve_typ, + List.length vel_eff)]; + ve_clk = (List.hd vel_eff).ve_clk; + ve_src = lxm + } + in + CallByPosLic(flagit by_pos_op_eff lxm, [array_val_exp]) + in + + let s, vef_core = + match by_pos_op with + | WITH_n(_,_,_) -> assert false (* handled at the top of the function *) + (* put that in another module ? yes, see above.*) + | Predef_n({it=TRUE_n}) -> s,mk_by_pos_op(Lic.CONST (Bool_const_eff true)) + | Predef_n({it=FALSE_n}) -> s,mk_by_pos_op(Lic.CONST (Bool_const_eff false)) + | Predef_n({it=RCONST_n r}) -> s,mk_by_pos_op(Lic.CONST (Real_const_eff r)) + | Predef_n({it=ICONST_n i}) -> s, mk_by_pos_op(Lic.CONST (Int_const_eff i)) + + + | Predef_n({it=NOR_n;src=lxm}) -> s, mk_nary_pos_op( + Lic.PREDEF_CALL (flagit (AstPredef.op_to_long NOR_n,[]) lxm)) + | Predef_n({it=DIESE_n;src=lxm}) -> s, mk_nary_pos_op( + Lic.PREDEF_CALL (flagit (AstPredef.op_to_long DIESE_n,[]) lxm)) + | Predef_n(op) -> s, mk_by_pos_op( + Lic.PREDEF_CALL (flagit (AstPredef.op_to_long op.it,[]) op.src)) + | CALL_n node_exp_f -> + let neff = of_node id_solver node_exp_f in + let ceff = Lic.CALL (flagit neff.node_key_eff node_exp_f.src) in + Lv6Verbose.exe ~flag:dbg (fun () -> + Printf.fprintf stderr "#DBG: Ast2lic.translate_val_exp CALL_n "; + AstV6Dump.print_node_exp stderr node_exp_f.it; + Printf.fprintf stderr " gives type: %s\n%!" + (Lic.string_of_type_profile (profile_of_node_exp neff)) + ) ; + (s, mk_by_pos_op ceff) + | IDENT_n idref -> ( + try + let var = id_solver.id2var idref.id_id lxm in + s, mk_by_pos_op(Lic.VAR_REF var.var_name_eff) + with _ -> + let s, const = UnifyClock.const_to_val_eff lxm false s + (id_solver.id2const idref lxm) + in + s, const.ve_core + ) + | CURRENT_n -> s, mk_by_pos_op (Lic.CURRENT None) + | PRE_n -> s, mk_by_pos_op Lic.PRE + + | ARROW_n -> s, mk_by_pos_op Lic.ARROW + + | FBY_n -> (* XXX temporary crutch: translate "e1 fby e2" into "e2 -> pre(e2)" *) + (match vel_eff with + | [e1;e2] -> + let ve_pre = CallByPosLic(flagit Lic.PRE lxm, [e2]) in + let ve_pre = { e2 with ve_core=ve_pre } in + let lxm = Lxm.override_name "->" lxm in + s,CallByPosLic(flagit Lic.ARROW lxm, [e1;ve_pre]) + | _ -> assert false + ) + (* | FBY_n -> s, mk_by_pos_op Lic.FBY *) + | CONCAT_n -> s, mk_by_pos_op Lic.CONCAT + | TUPLE_n -> s, mk_by_pos_op Lic.TUPLE + | ARRAY_n -> s, CallByPosLic(flagit Lic.ARRAY lxm, vel_eff) + | STRUCT_ACCESS_n fid -> + s, mk_by_pos_op (Lic.STRUCT_ACCESS (fid)) + + | WHEN_n Base -> s, mk_by_pos_op (Lic.WHEN BaseLic) + | WHEN_n (NamedClock { it = (cc,c) ; src = lxm }) -> + let var_info = id_solver.id2var c lxm in + let _, clk = var_info.var_clock_eff in + let ct = var_info.var_type_eff in + s, mk_by_pos_op (Lic.WHEN (On((cc,c,ct), clk))) + + | ARRAY_ACCES_n ve_index -> + s, mk_by_pos_op (Lic.ARRAY_ACCES( + EvalConst.eval_array_index id_solver ve_index lxm)) + + | ARRAY_SLICE_n si -> + s, mk_by_pos_op (Lic.ARRAY_SLICE( + EvalConst.eval_array_slice id_solver si lxm)) + + | HAT_n -> ( + match vel with + | [exp; ve_size] -> + let size_const_eff = EvalConst.f id_solver ve_size in + (match size_const_eff with + | [Int_const_eff sz] -> s, mk_by_pos_op (Lic.HAT(int_of_string sz)) + | _ -> assert false) + | _ -> assert false + ) + in + s, vef_core, lxm + in + let vef = { ve_core=vef_core; ve_typ=[]; ve_clk = []; ve_src = lxm } in + let vef, tl = EvalType.f id_solver vef in + s,vef ) - + and translate_by_name_op id_solver op s = let to_long idref = @@ -587,12 +588,12 @@ and translate_field id_solver s (id, ve) = and const_of_static_arg id_solver const_or_const_ident lxm = match const_or_const_ident with | StaticArgConst(c) -> ( - match EvalConst.f id_solver c with - | [x] -> x - | xl -> - (* EvalConst.f ne fabrique PAS de tuple, on le fait ici *) - Tuple_const_eff xl - ) + match EvalConst.f id_solver c with + | [x] -> x + | xl -> + (* EvalConst.f ne fabrique PAS de tuple, on le fait ici *) + Tuple_const_eff xl + ) | StaticArgLv6Id(id) -> id_solver.id2const id lxm | StaticArgType _ | StaticArgNode _ -> raise (Compile_error(lxm, "a constant was expected")) diff --git a/src/lv6version.ml b/src/lv6version.ml index 5ca482a343ba3fe43b8b05b37f7d3990a5075c11..296ad2d87fc571aa8d399131d8c3acf23d8d59de 100644 --- a/src/lv6version.ml +++ b/src/lv6version.ml @@ -1,7 +1,7 @@ (** Automatically generated from Makefile *) let tool = "lv6" let branch = "master" -let commit = "753" -let sha_1 = "cf9efb1c888171ba68650f907e65adf6d6618e94" +let commit = "762" +let sha_1 = "1f13ae8eb77b10d105a7e84aaabd50d2f5f75604" let str = (branch ^ "." ^ commit ^ " (" ^ sha_1 ^ ")") let maintainer = "erwan.jahier@univ-grenoble-alpes.fr" diff --git a/test/lus2lic.sum b/test/lus2lic.sum index 1c941fbcf4ea26e599fbfb29dd910de690c7a23d..6469322e53a474f2b3c3723c3a610a701a1d0f5a 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,5 +1,5 @@ ==> lus2lic0.sum <== -Test run by jahier on Mon Oct 8 15:16:04 +Test run by jahier on Mon Dec 3 11:11:28 Native configuration is x86_64-pc-linux-gnu === lus2lic0 tests === @@ -66,7 +66,7 @@ XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/lecte XFAIL: Test bad programs (assert): test_lus2lic_no_node should_fail/assert/s.lus ==> lus2lic1.sum <== -Test run by jahier on Mon Oct 8 15:16:06 +Test run by jahier on Mon Dec 3 11:11:29 Native configuration is x86_64-pc-linux-gnu === lus2lic1 tests === @@ -409,7 +409,7 @@ PASS: sh multipar.sh PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus {} ==> lus2lic2.sum <== -Test run by jahier on Mon Oct 8 15:16:37 +Test run by jahier on Mon Dec 3 11:11:54 Native configuration is x86_64-pc-linux-gnu === lus2lic2 tests === @@ -749,7 +749,7 @@ PASS: sh zzz2.sh PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz2.lus {} ==> lus2lic3.sum <== -Test run by jahier on Mon Oct 8 15:17:13 +Test run by jahier on Mon Dec 3 11:12:25 Native configuration is x86_64-pc-linux-gnu === lus2lic3 tests === @@ -1259,7 +1259,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {} ==> lus2lic4.sum <== -Test run by jahier on Mon Oct 8 15:17:54 +Test run by jahier on Mon Dec 3 11:13:04 Native configuration is x86_64-pc-linux-gnu === lus2lic4 tests === @@ -1776,14 +1776,14 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node zzz2.lus {} # of unexpected failures 7 =============================== # Total number of failures: 15 -lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 2 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 31 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 36 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 41 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 21 seconds +lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 1 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 25 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 30 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 39 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 17 seconds * Ref time: -71.69user 22.04system 2:11.00elapsed 71%CPU (0avgtext+0avgdata 280552maxresident)k -0inputs+143152outputs (0major+11022451minor)pagefaults 0swaps +59.55user 20.27system 1:52.76elapsed 70%CPU (0avgtext+0avgdata 280660maxresident)k +0inputs+143272outputs (0major+11018831minor)pagefaults 0swaps * Quick time (-j 4): -84.56user 23.21system 1:24.78elapsed 127%CPU (0avgtext+0avgdata 280056maxresident)k -19408inputs+142096outputs (21major+10952554minor)pagefaults 0swaps +66.52user 21.59system 0:57.33elapsed 153%CPU (0avgtext+0avgdata 280000maxresident)k +0inputs+137184outputs (0major+10636737minor)pagefaults 0swaps