diff --git a/_oasis b/_oasis index b8ed30563083144cea403cb035e6a3e6747c9c89..8f43809c9f7196806e6f150a97bd46d6683d62df 100644 --- a/_oasis +++ b/_oasis @@ -1,6 +1,6 @@ OASISFormat: 0.4 Name: lustre-v6 -Version: 1.715 +Version: 1.716 Synopsis: The Lustre V6 Verimag compiler Description: This package contains: (1) lus2lic: the (current) name of the compiler (and interpreter via -exec). diff --git a/src/ast2lic.ml b/src/ast2lic.ml index 734c697593b8fe75daf57b726b11e9fb8a420c62..d632f5bf428f2451faea8d578db3635a250e8534 100644 --- a/src/ast2lic.ml +++ b/src/ast2lic.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 21/07/2017 (at 16:45) by Erwan Jahier> *) +(* Time-stamp: <modified the 07/09/2017 (at 15:17) by Erwan Jahier> *) open Lxm @@ -452,12 +452,13 @@ and (translate_val_exp : IdSolver.t -> UnifyClock.subst -> AstCore.val_exp It is the good spot to do that? what could be a better spot? *) - let array_val_exp = + 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 + ve_src = lxm } in CallByPosLic(flagit by_pos_op_eff lxm, [array_val_exp]) diff --git a/src/lic2soc.ml b/src/lic2soc.ml index 2446fb49b13e759d6113a18051ba121df907bd0c..03bddb40486c66a684e746f4165b17037e53da17 100644 --- a/src/lic2soc.ml +++ b/src/lic2soc.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 17/08/2017 (at 18:24) by Erwan Jahier> *) +(** Time-stamp: <modified the 07/09/2017 (at 14:13) by Erwan Jahier> *) (* XXX ce module est mal écrit. A reprendre. (R1) *) @@ -564,9 +564,7 @@ let rec (actions_of_expression_acc: Lxm.t -> Soc.tbl -> in let mems = mems@mems2 in let deps = ActionsDeps.concat deps deps2 in - let actions = - (clk, inputs, lpl, Soc.Assign,cc_flg.src)::actions@actions2 - in + let actions = actions@actions2 in ctx, actions, inputs, mems, deps ) acc @@ -970,7 +968,7 @@ let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = let (soc_of_extern: Lic.node_exp -> Soc.tbl -> (ctx * Soc.t * Soc.tbl) option) = fun node soc_tbl -> try - let soc = SocPredef.of_soc_key soc_key in + let soc = SocPredef.of_soc_key lxm soc_key in Some(ctx, soc, soc_tbl) with _ -> (* This extern node is not a predef *) diff --git a/src/lv6version.ml b/src/lv6version.ml index 5503d93278f2e1c0c34096e435a03e776137b763..23044f6b9774bc3f7556d18fe14b1330d7233e4a 100644 --- a/src/lv6version.ml +++ b/src/lv6version.ml @@ -1,7 +1,7 @@ (** Automatically generated from Makefile *) let tool = "lus2lic" let branch = "master" -let commit = "715" -let sha_1 = "f4e24e44d35687d99fd07d55d1ffb567a25195bc" +let commit = "716" +let sha_1 = "7654ff44fd22fa505ddd7580a9f4c8f9d5dececf" let str = (branch ^ "." ^ commit ^ " (" ^ sha_1 ^ ")") let maintainer = "erwan.jahier@univ-grenoble-alpes.fr" diff --git a/src/lxm.ml b/src/lxm.ml index 86adea53871d39a121795473b15c9dec773c6902..d94fc38d3a4ae5c88e9b86d56e925a9e7d34f2ac 100644 --- a/src/lxm.ml +++ b/src/lxm.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 26/02/2015 (at 11:22) by Erwan Jahier> *) +(* Time-stamp: <modified the 07/09/2017 (at 15:14) by Erwan Jahier> *) (** Common to lus2lic and lic2loc *) @@ -44,6 +44,9 @@ let position lxm = ( Printf.sprintf "line:%d, col:%d to %d" lxm._line lxm._cstart lxm._cend ) +let (override_name : string -> t -> t) = + fun nname lxm -> + { lxm with _str=nname } (* constructeur de type flaggé avec un lexeme *) type 'a srcflagged = { diff --git a/src/lxm.mli b/src/lxm.mli index bae67cdf8bb373376b788af3f08def21d39cc9bf..e417cdc9e4b5133dd4d5428be4944da1d73e1785 100644 --- a/src/lxm.mli +++ b/src/lxm.mli @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 26/02/2015 (at 13:45) by Erwan Jahier> *) +(* Time-stamp: <modified the 07/09/2017 (at 15:14) by Erwan Jahier> *) (** Lexemes *) @@ -16,6 +16,8 @@ val line : t -> int val file : t -> string val pragma : t -> pragma list +val override_name : string -> t -> t + (** column numbers *) val cstart : t -> int val cend : t -> int diff --git a/src/socExecDbg.ml b/src/socExecDbg.ml index 738633b100c1d015bf909d384675fa209ef67cf4..d88da240b2a2acc1ab41bdcbe767a9c37daca8e7 100644 --- a/src/socExecDbg.ml +++ b/src/socExecDbg.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 06/09/2017 (at 11:57) by Erwan Jahier> *) +(* Time-stamp: <modified the 08/09/2017 (at 10:33) by Erwan Jahier> *) open Soc open Data open SocExecValue @@ -36,6 +36,101 @@ let (assign_expr : SocExecValue.ctx -> var_expr -> var_expr -> SocExecValue.ctx) Lv6Verbose.exe ~flag:dbg (fun () -> print_string (" Done!"); flush stdout); res +let make_sinfo lxm name_opt ectx in_subst out_subst = + let l = Lxm.line lxm in + (* if l <= 0 then None else *) + Some(fun () -> + let atom = + { + Event.str = (match name_opt with Some n -> n | None -> Lxm.str lxm); + (* Event.str = (Lxm.str lxm); *) + Event.file = Lxm.file lxm ; + Event.line = Lxm.line lxm ,Lxm.line lxm ; + Event.char = Lxm.cstart lxm, Lxm.cend lxm; + Event.stack = + match ectx.Event.sinfo with + | None -> None + | Some si -> Some (List.hd ((si()).Event.atoms)); + } + in + { + Event.expr = Expr.Var (Lxm.str lxm); + Event.atoms = [atom]; + Event.more = None; (* yet *) + Event.in_subst = in_subst ; + Event.out_subst = out_subst ; + } + ) +let sinfo_subst arg var = + match arg with + | Var v -> v,var + | Const v -> v,var + | Field (_,_,t) + | Index (_,_,t) + | Slice (_,_,_,_,_,t) -> (SocUtils.string_of_filter arg, t), var + + +let (assign_expr_dbg : Lxm.t -> SocExecValue.ctx -> var_expr -> var_expr -> Event.t -> + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + fun lxm ctx ve_in ve_out ectx cont -> (* ve_out := ve_in (in ctx) *) + let val_ve_in = SocExecValue.get_value ctx ve_in in + let res = + { ctx with + s = + let v = val_ve_in in + sadd_partial ctx.s ve_out ctx.cpath v + } + in + (* let (datal:Data.subst list) = SocExecValue.get_vals res in *) + let (datal:Data.subst list) = ["rhs",val_ve_in] in + let n = ectx.Event.nb in + let ectx = { ectx with + Event.nb = ectx.Event.nb+1; + Event.depth = ectx.Event.depth+1; + } + in + let t = data_type_of_var_expr ve_in in + let sinfo = make_sinfo lxm (Some ":=") ectx + [sinfo_subst ve_in ("rhs", t)] + [sinfo_subst ve_out ("lhs", t)] + in + let cont2 local_ectx val_ctx = + let (datal:Data.subst list) = [("rhs",val_ve_in);("lhs",val_ve_in)] in + let nectx = Event.incr_event_nb local_ectx in + let nectx = Event.decr_event_depth nectx in + { + Event.kind = Event.Exit; + Event.name = "Assign"; + Event.lang = "lustre"; + Event.inputs = [("rhs", t)]; + Event.outputs = ["lhs", t]; + Event.locals = []; + + Event.step = ectx.Event.step; + Event.nb = local_ectx.Event.nb; + Event.depth = ectx.Event.depth; + Event.sinfo = sinfo; + Event.data = datal; + Event.next = (fun () -> cont nectx val_ctx); + Event.terminate = ectx.Event.terminate; + } + in + { ectx with + Event.kind = Event.Call; + Event.name = "Assign"; + Event.lang = "lustre"; + Event.inputs = [("rhs", t)]; + Event.outputs = ["lhs", t]; + Event.locals = []; + + Event.sinfo = sinfo; + Event.step = ectx.Event.step; + Event.nb = n; + Event.data = datal; + Event.next = (fun () -> cont2 ectx res); + } + + (* [array_index i v] returns the var_expr v[i] *) let (array_index : int -> var -> var_expr) = fun i (vn,vt) -> @@ -57,427 +152,473 @@ exception SourceInfoError of (string * string) let rec (soc_step : Lxm.t -> Soc.step_method -> Soc.tbl -> Soc.t -> - Event.t -> SocExecValue.ctx -> - (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + Event.t -> SocExecValue.ctx -> + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = fun lxm step soc_tbl soc ectx val_ctx cont -> - profile_info ("SocExecDbg.soc_step \n"); - let soc_name,_,_ = soc.key in - let event = - match step.impl with - | Extern -> - print_string ( - "\nextern nodes and functions not yet supported in the interpreter, sorry.\n"^ - "Please use the C code generator (-2c)." - ); - exit 2 - | Predef -> ( - try - let val_ctx = SocExecEvalPredef.get soc.key val_ctx in - cont ectx val_ctx - with Not_found -> (* Not a predef op *) print_string ( - "*** internal error in "^soc_name^". Is it defined in SocExecEvalPredef?\n"); - flush stdout; assert false - ) - | Gaol(vl,gaol) -> do_gaol soc_tbl ectx gaol val_ctx cont - - | Boolred(i,j,k) -> ( - (* XXX mettre ce code dans socPredef ? (ou socMetaopPredef)*) - let inputs, outputs = soc.profile in - let b_array = (List.hd inputs) in - let cpt = ref 0 in - for i = 0 to k-1 do - let a_i = array_index i b_array in - let v = SocExecValue.get_value val_ctx a_i in - if v = B true then incr cpt; - done; - let res = B (!cpt >= i && !cpt <= j) in - let res_var = fst (List.hd outputs) in - let s = sadd val_ctx.s (res_var::val_ctx.cpath) res in - cont ectx { val_ctx with s = s } - ) - | Condact(node_sk, dft_cst) -> ( - let clk = SocExecValue.get_value val_ctx (Var ("activate",Bool)) in - let vel_in, vel_out = soc.profile in - let vel_in = List.map (fun x -> Var x) (List.tl vel_in) in - let vel_out = List.map (fun x -> Var x) vel_out in - let node_soc = SocUtils.find lxm node_sk soc_tbl in - let inst_name = - match soc.instances with - | [] -> let (proc_name,_,_) = node_soc.key in proc_name - | [inst] -> fst inst + profile_info ("SocExecDbg.soc_step \n"); + let soc_name,_,_ = soc.key in + let event = + match step.impl with + | Extern -> + print_string ( + "\nextern nodes and functions not yet supported in the interpreter, sorry.\n"^ + "Please use the C code generator (-2c)." + ); + exit 2 + | Predef -> ( + try + let val_ctx = SocExecEvalPredef.get soc.key val_ctx in + cont ectx val_ctx + with Not_found -> (* Not a predef op *) print_string ( + "*** internal error in "^soc_name^". Is it defined in SocExecEvalPredef?\n"); + flush stdout; assert false + ) + | Gaol(vl,gaol) -> do_gaol soc_tbl ectx gaol val_ctx cont + + | Boolred(i,j,k) -> ( + (* XXX mettre ce code dans socPredef ? (ou socMetaopPredef)*) + let inputs, outputs = soc.profile in + let b_array = (List.hd inputs) in + let cpt = ref 0 in + for i = 0 to k-1 do + let a_i = array_index i b_array in + let v = SocExecValue.get_value val_ctx a_i in + if v = B true then incr cpt; + done; + let res = B (!cpt >= i && !cpt <= j) in + let res_var = fst (List.hd outputs) in + let s = sadd val_ctx.s (res_var::val_ctx.cpath) res in + cont ectx { val_ctx with s = s } + ) + | Condact(node_sk, dft_cst) -> ( + let clk = SocExecValue.get_value val_ctx (Var ("activate",Bool)) in + let vel_in, vel_out = soc.profile in + let vel_in = List.map (fun x -> Var x) (List.tl vel_in) in + let vel_out = List.map (fun x -> Var x) vel_out in + let node_soc = SocUtils.find lxm node_sk soc_tbl in + let inst_name = + match soc.instances with + | [] -> let (proc_name,_,_) = node_soc.key in proc_name + | [inst] -> fst inst + | _ -> assert false + in + let path_saved = val_ctx.cpath in + let val_ctx = { val_ctx with cpath=inst_name::val_ctx.cpath } in + if clk = B true then ( + let node_step = match node_soc.step with + [step] -> step | _ -> assert false in - let path_saved = val_ctx.cpath in - let val_ctx = { val_ctx with cpath=inst_name::val_ctx.cpath } in - if clk = B true then ( - let node_step = match node_soc.step with - [step] -> step - | _ -> assert false - in - let cont ectx val_ctx = - let val_ctx = - { - cpath=path_saved; - s = sadd val_ctx.s ("_memory"::val_ctx.cpath) (B false) - } - in - cont ectx val_ctx - in - do_soc_step lxm inst_name node_step val_ctx soc_tbl node_soc - vel_in vel_out ectx cont - ) else ( - let first_step = Var ("_memory",Bool) in - let val_ctx = { val_ctx with cpath=path_saved } in - let v = get_value val_ctx first_step in + let cont ectx val_ctx = let val_ctx = - if v = U || v = B true then - (* We are on the first step of node_soc; - - we assign the output var to the default values *) - (assert (List.length dft_cst = List.length vel_out); - List.fold_left2 assign_expr val_ctx dft_cst vel_out) - else - (* We are not on the first step of node_soc; hence we do nothing - and the output will keep their previous value. *) - val_ctx - in - let val_ctx = { val_ctx with - s = sadd val_ctx.s ("_memory"::val_ctx.cpath) (B false) } + { + cpath=path_saved; + s = sadd val_ctx.s ("_memory"::val_ctx.cpath) (B false) + } in cont ectx val_ctx - ) - ) - | Iterator(iter, node_sk, n) -> - let node_soc = SocUtils.find lxm node_sk soc_tbl in - let node_step = match node_soc.step with [step] -> step | _ -> assert false in - let iter_inputs,iter_outputs = soc.profile in - let (proc_name,_,_) = node_soc.key in - let inst_name = - match soc.instances with - | [] -> Array.make n proc_name - | _ -> Array.of_list (List.map fst soc.instances) in - (* As we need to iterate on an (instance) array, we locally switch + do_soc_step lxm inst_name node_step val_ctx soc_tbl node_soc + vel_in vel_out ectx cont + ) else ( + let first_step = Var ("_memory",Bool) in + let val_ctx = { val_ctx with cpath=path_saved } in + let v = get_value val_ctx first_step in + let val_ctx = + if v = U || v = B true then + (* We are on the first step of node_soc; + - we assign the output var to the default values *) + (assert (List.length dft_cst = List.length vel_out); + List.fold_left2 assign_expr val_ctx dft_cst vel_out) + (* XXX use assign_expr_dbg *) + else + (* We are not on the first step of node_soc; hence we do nothing + and the output will keep their previous value. *) + val_ctx + in + let val_ctx = { val_ctx with + s = sadd val_ctx.s ("_memory"::val_ctx.cpath) (B false) } + in + cont ectx val_ctx + ) + ) + | Iterator(iter, node_sk, n) -> + let node_soc = SocUtils.find lxm node_sk soc_tbl in + let node_step = match node_soc.step with [step] -> step | _ -> assert false in + let iter_inputs,iter_outputs = soc.profile in + let (proc_name,_,_) = node_soc.key in + let inst_name = + match soc.instances with + | [] -> Array.make n proc_name + | _ -> Array.of_list (List.map fst soc.instances) + in + (* As we need to iterate on an (instance) array, we locally switch to the evildark side *) - let rval_ctx = ref val_ctx in - let ref_event = ref ectx (* XXX dummy ?? *) in - for i = 0 to n-1 do - rval_ctx := { !rval_ctx with cpath = inst_name.(i)::val_ctx.cpath }; - let vel_in, vel_out = - match iter with - | "map" -> (List.map (array_index i) iter_inputs, - List.map (array_index i) iter_outputs) - | "fold" | "red" | "fill" | "fillred" -> + let rval_ctx = ref val_ctx in + let ref_event = ref ectx (* XXX dummy ?? *) in + for i = 0 to n-1 do + rval_ctx := { !rval_ctx with cpath = inst_name.(i)::val_ctx.cpath }; + let vel_in, vel_out = + match iter with + | "map" -> (List.map (array_index i) iter_inputs, + List.map (array_index i) iter_outputs) + | "fold" | "red" | "fill" + | "fillred" -> let a_in = Var (List.hd iter_inputs) in ( a_in::(List.map (array_index i) (List.tl iter_inputs)), a_in::(List.map (array_index i) (List.tl iter_outputs))) - | _ -> assert false (* should not occur *) - in - let cont ectx val_ctx = (* necessary? correct? *) - rval_ctx := val_ctx; - ref_event := ectx; - cont ectx val_ctx - in - ref_event := do_soc_step lxm inst_name.(i) node_step !rval_ctx soc_tbl - node_soc vel_in vel_out !ref_event cont; - - rval_ctx := { !rval_ctx with cpath = List.tl !rval_ctx.cpath }; - done; - if iter <> "map" then ( - let a_in = Var (List.hd iter_inputs) in - let a_out = Var (List.hd iter_outputs) in - rval_ctx := assign_expr !rval_ctx a_in a_out); (* a_out=a_n *) - cont !ref_event !rval_ctx - in - event + | _ -> assert false (* should not occur *) + in + let cont ectx val_ctx = (* necessary? correct? *) + rval_ctx := val_ctx; + ref_event := ectx; + cont ectx val_ctx + in + ref_event := + do_soc_step lxm inst_name.(i) node_step !rval_ctx soc_tbl + node_soc vel_in vel_out !ref_event cont; + + rval_ctx := { !rval_ctx with cpath = List.tl !rval_ctx.cpath }; + done; + if iter <> "map" then ( + let a_in = Var (List.hd iter_inputs) in + let a_out = Var (List.hd iter_outputs) in + rval_ctx := assign_expr !rval_ctx a_in a_out); (* a_out=a_n *) + (* XXX use assign_expr_dbg *) + cont !ref_event !rval_ctx + in + event and (do_gaol : Soc.tbl -> Event.t -> gao list -> SocExecValue.ctx -> - (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = - fun soc_tbl ectx gaol val_ctx cont -> match gaol with + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + fun soc_tbl ectx gaol val_ctx cont -> + match gaol with | [] -> assert false | [gao] -> do_gao soc_tbl ectx gao val_ctx cont | gao::gaol -> - let cont ectx val_ctx = do_gaol soc_tbl ectx gaol val_ctx cont in - do_gao soc_tbl ectx gao val_ctx cont + let cont ectx val_ctx = do_gaol soc_tbl ectx gaol val_ctx cont in + do_gao soc_tbl ectx gao val_ctx cont and (do_gao : Soc.tbl -> Event.t -> gao -> SocExecValue.ctx -> - (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = fun soc_tbl ectx gao val_ctx cont -> - match gao with - | Case(id, id_gao_l,lxm) -> ( - try - let id_val = get_enum id val_ctx in - let gaol = List.assoc id_val id_gao_l in - do_gaol soc_tbl ectx gaol val_ctx cont - with Not_found -> cont ectx val_ctx - ) - | Call(vel_out, Assign, vel_in, lxm) -> ( - let val_ctx = - assert (List.length vel_in = List.length vel_out); - List.fold_left2 assign_expr val_ctx vel_in vel_out - in - cont ectx val_ctx - ) - | Call(vel_out, Procedure sk, vel_in, lxm) -> ( - let (proc_name,_,_) = sk in - let path_saved = val_ctx.cpath in - let val_ctx = { val_ctx with cpath = proc_name::val_ctx.cpath } in - let soc = SocUtils.find lxm sk soc_tbl in - let step = match soc.step with [step] -> step | _ -> assert false in - let cont ectx val_ctx = - let val_ctx = { val_ctx with cpath = path_saved } in - cont ectx val_ctx + match gao with + | Case(id, id_gao_l,lxm) -> ( + try + let id_val = get_enum id val_ctx in + let gaol = List.assoc id_val id_gao_l in + (* do_gaol soc_tbl ectx gaol val_ctx cont *) + + let v = Data.E(id_val, SocUtils.get_rank id_val id_gao_l) in + let t = Enum(id,List.map fst id_gao_l) in + let clk_var = Var(id,t) in + let (datal:Data.subst list) = ["clock", v] in + + let clock = ("clock", t) in + let n = ectx.Event.nb in + let ectx = { ectx with + Event.nb = ectx.Event.nb+1; + (* Event.depth = ectx.Event.depth+1; *) + } in - let cont ectx val_ctx = - do_soc_step lxm proc_name step val_ctx soc_tbl soc vel_in vel_out ectx cont + let sinfo = make_sinfo lxm (Some "when") ectx + [sinfo_subst clk_var clock] + [] in - cont ectx val_ctx - ) - | Call(vel_out, Method((inst_name,sk),step_name), vel_in, lxm) -> ( - let path_saved = val_ctx.cpath in - let val_ctx = { val_ctx with cpath = inst_name::val_ctx.cpath } in - let soc = SocUtils.find lxm sk soc_tbl in - let step = try List.find (fun sm -> sm.name = step_name) soc.step - with Not_found -> assert false - in - let cont ectx val_ctx = - let val_ctx = { val_ctx with cpath = path_saved } in - cont ectx val_ctx + let cont2 local_ectx val_ctx = + let nectx = Event.incr_event_nb local_ectx in + (* let nectx = Event.decr_event_depth nectx in *) + { + Event.kind = Event.Exit; + Event.name = "when"; + Event.lang = "lustre"; + Event.inputs = [clock]; + Event.outputs = []; + Event.locals = []; + + Event.step = ectx.Event.step; + Event.nb = local_ectx.Event.nb; + Event.depth = ectx.Event.depth+1; + Event.sinfo = sinfo; + Event.data = datal; + Event.next = (fun () -> cont nectx val_ctx); + Event.terminate = ectx.Event.terminate; + } in - let cont ectx val_ctx = - do_soc_step lxm inst_name step val_ctx soc_tbl soc vel_in vel_out ectx cont + { ectx with + Event.kind = Event.Call; + Event.name = "when"; + Event.lang = "lustre"; + Event.inputs = [clock]; + Event.outputs = []; + Event.locals = []; + + Event.depth = ectx.Event.depth+1; + Event.sinfo = sinfo; + Event.step = ectx.Event.step; + Event.nb = n; + Event.data = datal; + Event.next = (fun () -> do_gaol soc_tbl ectx gaol val_ctx cont2); + } + + + with Not_found -> cont ectx val_ctx + ) + | Call(vel_out, Assign, vel_in, lxm) -> ( + assert (List.length vel_in = List.length vel_out); + (* + let val_ctx = + assert (List.length vel_in = List.length vel_out); + List.fold_left2 assign_expr val_ctx vel_in vel_out + in + cont ectx val_ctx + *) + let fcont = + List.fold_left2 + (fun acc_cont ve_in ve_out -> + let ncont ectx val_ctx = + assign_expr_dbg lxm val_ctx ve_in ve_out ectx acc_cont in + ncont + ) + cont + vel_in + vel_out in - cont ectx val_ctx - ) -and (do_soc_step : Lxm.t -> Lv6Id.t -> step_method -> SocExecValue.ctx -> - Soc.tbl -> Soc.t -> var_expr list -> var_expr list -> Event.t -> - (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = - fun lxm name step val_ctx soc_tbl soc vel_in vel_out ectx cont -> - profile_info ("SocExecDbg.do_soc_step "^name^"\n"); - let soc_in_vars, soc_out_vars = soc.profile in - let step_in_vars = filter_params soc soc_in_vars step.idx_ins in - let step_out_vars = filter_params soc soc_out_vars step.idx_outs in - let new_s = substitute_args_and_params vel_in step_in_vars val_ctx in - let val_ctx = { val_ctx with s = new_s } in + fcont ectx val_ctx + ) + | Call(vel_out, Procedure sk, vel_in, lxm) -> ( + let (proc_name,_,_) = sk in + let path_saved = val_ctx.cpath in + let val_ctx = { val_ctx with cpath = proc_name::val_ctx.cpath } in + let soc = SocUtils.find lxm sk soc_tbl in + let step = match soc.step with [step] -> step | _ -> assert false in let cont ectx val_ctx = - let s_out = substitute_params_and_args step_out_vars vel_out val_ctx in - cont ectx { val_ctx with s = s_out } + let val_ctx = { val_ctx with cpath = path_saved } in + cont ectx val_ctx in - (* let (datal:Data.subst list) = get_all_subst val_ctx.s in *) - let datal = get_input_vals val_ctx step_in_vars in - let (soc_name,_,_) = soc.key in - let step_name = match soc.step with - [_] -> soc_name - | _ -> soc_name^"."^step.name - in - let locals = if soc.step = [] then [] else - match (List.hd soc.step).impl with - | Gaol (var_list, _) -> var_list - | Iterator _ - | Boolred _ - | Condact _ - | Predef - | Extern -> [] + let cont ectx val_ctx = + do_soc_step lxm proc_name step val_ctx soc_tbl soc vel_in vel_out ectx cont in - let sinfo_subst arg var = - match arg with - | Var v -> v,var - | Const v -> v,var - | Field (_,_,t) - | Index (_,_,t) - | Slice (_,_,_,_,_,t) -> (SocUtils.string_of_filter arg, t), var + cont ectx val_ctx + ) + | Call(vel_out, Method((inst_name,sk),step_name), vel_in, lxm) -> ( + let path_saved = val_ctx.cpath in + let val_ctx = { val_ctx with cpath = inst_name::val_ctx.cpath } in + let soc = SocUtils.find lxm sk soc_tbl in + let step = try List.find (fun sm -> sm.name = step_name) soc.step + with Not_found -> assert false in - (* let soc_step_in, soc_step_out = step.profile in *) - let sinfo = - let l = Lxm.line lxm in - if l <= 0 then None else - Some(fun () -> - let atom = - { - Event.str = Lxm.str lxm; - Event.file = Lxm.file lxm ; - Event.line = Lxm.line lxm ,Lxm.line lxm ; - Event.char = Lxm.cstart lxm, Lxm.cend lxm; - Event.stack = - match ectx.Event.sinfo with - | None -> None - | Some si -> Some (List.hd ((si()).Event.atoms)); - } - in - { - Event.expr = Expr.Var "dummy" ; (* XXX *) - Event.atoms = [atom]; - Event.more = None; (* yet *) - Event.in_subst = List.map2 sinfo_subst vel_in step_in_vars; - Event.out_subst = List.map2 sinfo_subst vel_out step_out_vars; - } - ) + let cont ectx val_ctx = + let val_ctx = { val_ctx with cpath = path_saved } in + cont ectx val_ctx in - let initial_sinfo = ectx.Event.sinfo in - let ectx = { - ectx with - Event.name = step_name; - Event.depth = ectx.Event.depth+1; - Event.data = datal; - Event.inputs = fst soc.profile; - Event.outputs = snd soc.profile; - Event.locals = locals; - Event.sinfo = sinfo; - } + let cont ectx val_ctx = + do_soc_step lxm inst_name step val_ctx soc_tbl soc vel_in vel_out ectx cont in - let cont2 local_ectx val_ctx = -(* let (datal:Data.subst list) = List.map + cont ectx val_ctx + ) +and (do_soc_step : Lxm.t -> Lv6Id.t -> step_method -> SocExecValue.ctx -> + Soc.tbl -> Soc.t -> var_expr list -> var_expr list -> Event.t -> + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + fun lxm name step val_ctx soc_tbl soc vel_in vel_out ectx cont -> + profile_info ("SocExecDbg.do_soc_step "^name^"\n"); + let soc_in_vars, soc_out_vars = soc.profile in + let step_in_vars = filter_params soc soc_in_vars step.idx_ins in + let step_out_vars = filter_params soc soc_out_vars step.idx_outs in + let new_s = substitute_args_and_params vel_in step_in_vars val_ctx in + let val_ctx = { val_ctx with s = new_s } in + let cont ectx val_ctx = + let s_out = substitute_params_and_args step_out_vars vel_out val_ctx in + cont ectx { val_ctx with s = s_out } + in + (* let (datal:Data.subst list) = get_all_subst val_ctx.s in *) + let datal = get_input_vals val_ctx step_in_vars in + let (soc_name,_,_) = soc.key in + let step_name = match soc.step with + [_] -> soc_name + | _ -> soc_name^"."^step.name + in + let locals = if soc.step = [] then [] else + match (List.hd soc.step).impl with + | Gaol (var_list, _) -> var_list + | Iterator _ + | Boolred _ + | Condact _ + | Predef + | Extern -> [] + in + (* let soc_step_in, soc_step_out = step.profile in *) + let name = if (List.hd soc.step).impl = Predef then Some step_name else None in + let sinfo = make_sinfo lxm (None) ectx + (List.map2 sinfo_subst vel_in step_in_vars) + (List.map2 sinfo_subst vel_out step_out_vars) + in + let initial_sinfo = ectx.Event.sinfo in + let ectx = { + ectx with + Event.name = step_name; + Event.depth = ectx.Event.depth+1; + Event.data = datal; + Event.inputs = fst soc.profile; + Event.outputs = snd soc.profile; + Event.locals = locals; + Event.sinfo = sinfo; + } + in + let cont2 local_ectx val_ctx = + (* let (datal:Data.subst list) = List.map (fun v -> fst v, SocExecValue.get_val (fst v) val_ctx) step_out_vars in *) - let (datal:Data.subst list) = SocExecValue.get_vals val_ctx in - let nectx = Event.incr_event_nb local_ectx in - let nectx = Event.decr_event_depth nectx in - let nectx = { nectx with Event.sinfo = initial_sinfo } in - { - Event.step = ectx.Event.step; - Event.nb = local_ectx.Event.nb; - Event.depth = ectx.Event.depth; - Event.kind = Event.Exit; - Event.lang = "lustre"; - Event.name = step_name; - Event.inputs = ectx.Event.inputs; - Event.outputs = ectx.Event.outputs; - Event.locals = ectx.Event.locals; - Event.sinfo = sinfo; - Event.data = datal; - Event.next = (fun () -> cont nectx val_ctx); - Event.terminate = ectx.Event.terminate; - } - in - { + let (datal:Data.subst list) = SocExecValue.get_vals val_ctx in + let nectx = Event.incr_event_nb local_ectx in + let nectx = Event.decr_event_depth nectx in + let nectx = { nectx with Event.sinfo = initial_sinfo } in + { Event.step = ectx.Event.step; - Event.nb = ectx.Event.nb; + Event.nb = local_ectx.Event.nb; Event.depth = ectx.Event.depth; - Event.kind = Event.Call; + Event.kind = Event.Exit; Event.lang = "lustre"; Event.name = step_name; Event.inputs = ectx.Event.inputs; Event.outputs = ectx.Event.outputs; Event.locals = ectx.Event.locals; Event.sinfo = sinfo; - Event.data = ectx.Event.data; - Event.next = (fun () -> - assert (List.mem step soc.step); - let ectx = Event.incr_event_nb ectx in - soc_step lxm step soc_tbl soc ectx { val_ctx with s=new_s } cont2 - ); + Event.data = datal; + Event.next = (fun () -> cont nectx val_ctx); Event.terminate = ectx.Event.terminate; - } + } + in + { + Event.step = ectx.Event.step; + Event.nb = ectx.Event.nb; + Event.depth = ectx.Event.depth; + Event.kind = Event.Call; + Event.lang = "lustre"; + Event.name = step_name; + Event.inputs = ectx.Event.inputs; + Event.outputs = ectx.Event.outputs; + Event.locals = ectx.Event.locals; + Event.sinfo = sinfo; + Event.data = ectx.Event.data; + Event.next = (fun () -> + assert (List.mem step soc.step); + let ectx = Event.incr_event_nb ectx in + soc_step lxm step soc_tbl soc ectx { val_ctx with s=new_s } cont2 + ); + Event.terminate = ectx.Event.terminate; + } (* get the step params from its soc params *) and (filter_params : Soc.t -> Soc.var list -> int list -> Soc.var list) = fun soc el il -> - let local_nth i l = - try List.nth l i - with _ -> - print_string ( + let local_nth i l = + try List.nth l i + with _ -> + print_string ( "\n*** Cannot get the " ^ (string_of_int (i+1)) ^ "the element of a list of size " ^ (string_of_int (List.length l))^"\n"); - flush stdout; - assert false - in - let res = List.map (fun i -> local_nth i el) il in - res + flush stdout; + assert false + in + let res = List.map (fun i -> local_nth i el) il in + res (* End of XXX duplication of SocExec ! *) (****************************************************************************) - + (* exported *) and (do_step_dbg : Soc.tbl -> Soc.t -> Event.t -> SocExecValue.ctx -> - (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = + (Event.t -> SocExecValue.ctx -> Event.t) -> Event.t) = fun soc_tbl soc ectx val_ctx cont -> - let soc_in_vars, soc_out_vars = soc.profile in - (* let (datal:Data.subst list) = get_all_subst val_ctx.s in *) - let (datal:Data.subst list) = get_input_vals val_ctx soc_in_vars in - let (soc_name,_,_) = soc.key in - let lxm = (List.hd soc.step).lxm in - let locals = if soc.step = [] then [] else - match (List.hd soc.step).impl with - | Gaol (var_list, _) -> var_list - | Iterator _ - | Boolred _ - | Condact _ - | Predef - | Extern -> [] - in - let sinfo = - Some(fun () -> - let atom = - { - Event.str = soc_name; - Event.file = Lxm.file lxm; - Event.line = Lxm.line lxm,Lxm.line lxm; - Event.char = Lxm.cstart lxm, Lxm.cend lxm; - Event.stack = None; - } - in - { - Event.expr = Expr.Var "dummy" ; (* XXX *) - Event.atoms = [atom]; - Event.more = None; (* yet *) - Event.in_subst = []; - Event.out_subst = []; - } - ) - in - let ectx = { - ectx with - Event.name = soc_name; - Event.depth = ectx.Event.depth+1; - Event.data = datal; - Event.inputs = fst soc.profile; - Event.outputs = snd soc.profile; - Event.locals = locals; - Event.sinfo = sinfo; - } - in - let cont2 local_ectx val_ctx = - (* je pourrais enlver les entrées... *) - let (datal:Data.subst list) = SocExecValue.get_vals val_ctx in - let nectx = { ectx with - Event.nb = local_ectx.Event.nb+1; - Event.data = datal; - Event.depth = ectx.Event.depth-1; - } - in - { - Event.step = ectx.Event.step; - Event.nb = local_ectx.Event.nb; - Event.depth = ectx.Event.depth; - Event.kind = Event.Exit; - Event.lang = "lustre"; - Event.name = soc_name; - Event.inputs = fst soc.profile; - Event.outputs = snd soc.profile; - Event.locals = locals; - Event.sinfo = sinfo; - Event.data = datal; - Event.next = (fun () -> cont nectx val_ctx); - Event.terminate = ectx.Event.terminate; - } + let soc_in_vars, soc_out_vars = soc.profile in + (* let (datal:Data.subst list) = get_all_subst val_ctx.s in *) + let (datal:Data.subst list) = get_input_vals val_ctx soc_in_vars in + let (soc_name,_,_) = soc.key in + let lxm = (List.hd soc.step).lxm in + let locals = if soc.step = [] then [] else + match (List.hd soc.step).impl with + | Gaol (var_list, _) -> var_list + | Iterator _ + | Boolred _ + | Condact _ + | Predef + | Extern -> [] + in + let sinfo = + Some(fun () -> + let atom = + { + Event.str = soc_name; + Event.file = Lxm.file lxm; + Event.line = Lxm.line lxm,Lxm.line lxm; + Event.char = Lxm.cstart lxm, Lxm.cend lxm; + Event.stack = None; + } + in + { + Event.expr = Expr.Var "dummy" ; (* XXX *) + Event.atoms = [atom]; + Event.more = None; (* yet *) + Event.in_subst = []; + Event.out_subst = []; + } + ) + in + let ectx = { + ectx with + Event.name = soc_name; + Event.depth = ectx.Event.depth+1; + Event.data = datal; + Event.inputs = fst soc.profile; + Event.outputs = snd soc.profile; + Event.locals = locals; + Event.sinfo = sinfo; + } + in + let cont2 local_ectx val_ctx = + (* je pourrais enlver les entrées... *) + let (datal:Data.subst list) = SocExecValue.get_vals val_ctx in + let nectx = { ectx with + Event.nb = local_ectx.Event.nb+1; + Event.data = datal; + Event.depth = ectx.Event.depth-1; + } in { Event.step = ectx.Event.step; - Event.nb = ectx.Event.nb; + Event.nb = local_ectx.Event.nb; Event.depth = ectx.Event.depth; - Event.kind = Event.Call; + Event.kind = Event.Exit; Event.lang = "lustre"; Event.name = soc_name; - Event.inputs = ectx.Event.inputs; - Event.outputs = ectx.Event.outputs; + Event.inputs = fst soc.profile; + Event.outputs = snd soc.profile; Event.locals = locals; Event.sinfo = sinfo; - Event.data = ectx.Event.data; - Event.next = (fun () -> - let step = match soc.step with [step] -> step | _ -> assert false in - let ectx = Event.incr_event_nb ectx in - soc_step step.lxm step soc_tbl soc ectx val_ctx cont2 - ); + Event.data = datal; + Event.next = (fun () -> cont nectx val_ctx); Event.terminate = ectx.Event.terminate; - } + } + in + { + Event.step = ectx.Event.step; + Event.nb = ectx.Event.nb; + Event.depth = ectx.Event.depth; + Event.kind = Event.Call; + Event.lang = "lustre"; + Event.name = soc_name; + Event.inputs = ectx.Event.inputs; + Event.outputs = ectx.Event.outputs; + Event.locals = locals; + Event.sinfo = sinfo; + Event.data = ectx.Event.data; + Event.next = (fun () -> + let step = match soc.step with [step] -> step | _ -> assert false in + let ectx = Event.incr_event_nb ectx in + soc_step step.lxm step soc_tbl soc ectx val_ctx cont2 + ); + Event.terminate = ectx.Event.terminate; + } diff --git a/src/socPredef.ml b/src/socPredef.ml index 2efbdf76b54f4df13c5f592de59f4ea253ddc31e..c7e6205e3a54900f8eb06317e33ff51ba4747132 100644 --- a/src/socPredef.ml +++ b/src/socPredef.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 17/08/2017 (at 18:39) by Erwan Jahier> *) +(* Time-stamp: <modified the 06/09/2017 (at 16:45) by Erwan Jahier> *) (** Synchronous Object Code for Predefined operators. *) @@ -38,16 +38,16 @@ let (soc_profile_of_types_nary : Data.t list -> var list * var list) = List.tl inputs, ["out",Bool] -let step11 str = { (* a useful alias again *) +let step11 lxm str = { (* a useful alias again *) name = "step"; - lxm = Lxm.dummy str; + lxm = lxm; idx_ins = [0]; idx_outs = [0]; impl = Predef; } -let step21 impl str = { (* a useful alias again *) +let step21 lxm impl str = { (* a useful alias again *) name = "step"; - lxm = Lxm.dummy str; + lxm = lxm; idx_ins = [0;1]; idx_outs = [0]; impl = Predef; @@ -78,10 +78,10 @@ let (get_mem_name : Soc.key -> Data.t -> string) = | _ -> "mem_"^k *) -let dummy = Lxm.dummy "predef" +(* let dummy = Lxm.dummy "predef" *) -let of_fby_soc_key : Soc.var_expr -> Soc.key -> Soc.t = - fun init sk -> +let of_fby_soc_key :Lxm.t -> Soc.var_expr -> Soc.key -> Soc.t = + fun lxm init sk -> let _,tl,_ = sk in let t = List.hd tl in let pre_mem:var = (get_mem_name sk t, t) in @@ -98,10 +98,10 @@ let of_fby_soc_key : Soc.var_expr -> Soc.key -> Soc.t = (* faire qque chose de init maintenant !!! *) { name = "get"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = []; idx_outs = [0]; - impl = Gaol([pre_mem],[Call([Var(vout)], Assign, [Var(pre_mem)], dummy + impl = Gaol([pre_mem],[Call([Var(vout)], Assign, [Var(pre_mem)], lxm )]); (* impl = Gaol([pre_mem],[ *) (* Case("$first_step", (["t", [Call([Var(vout)], Assign, [Var(v1)])]; *) @@ -110,10 +110,10 @@ let of_fby_soc_key : Soc.var_expr -> Soc.key -> Soc.t = }; { name = "set"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [1]; idx_outs = []; - impl = Gaol([pre_mem],[Call([Var(pre_mem)], Assign, [Var(v2)], dummy)]); + impl = Gaol([pre_mem],[Call([Var(pre_mem)], Assign, [Var(v2)], lxm)]); }; ]; precedences = ["set", ["get"]]; @@ -121,55 +121,55 @@ let of_fby_soc_key : Soc.var_expr -> Soc.key -> Soc.t = } (* exported *) -let of_soc_key : Soc.key -> Soc.t = - fun sk -> +let of_soc_key : Lxm.t -> Soc.key -> Soc.t = + fun lxm sk -> let (id, tl, _) = sk in let sp = soc_profile_of_types in let sp_nary = soc_profile_of_types_nary in match id with | "Lustre::ruminus" | "Lustre::iuminus" - | "Lustre::uminus" -> (make_soc sk (sp tl) [step11 id]) - | "Lustre::not" -> (make_soc sk (sp tl) [step11 id]) - | "Lustre::real2int" -> (make_soc sk (sp tl) [step11 id]) - | "Lustre::int2real" -> (make_soc sk (sp tl) [step11 id]) + | "Lustre::uminus" -> (make_soc sk (sp tl) [step11 lxm id]) + | "Lustre::not" -> (make_soc sk (sp tl) [step11 lxm id]) + | "Lustre::real2int" -> (make_soc sk (sp tl) [step11 lxm id]) + | "Lustre::int2real" -> (make_soc sk (sp tl) [step11 lxm id]) - | "Lustre::mod" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::mod" -> (make_soc sk (sp tl) [step21 lxm None id]) | "Lustre::iplus" | "Lustre::rplus" - | "Lustre::plus" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::plus" -> (make_soc sk (sp tl) [step21 lxm None id]) | "Lustre::times" | "Lustre::itimes" - | "Lustre::rtimes" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::rtimes" -> (make_soc sk (sp tl) [step21 lxm None id]) | "Lustre::slash" | "Lustre::islash" - | "Lustre::rslash" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::rslash" -> (make_soc sk (sp tl) [step21 lxm None id]) | "Lustre::div" | "Lustre::idiv" - | "Lustre::rdiv" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::rdiv" -> (make_soc sk (sp tl) [step21 lxm None id]) | "Lustre::minus" | "Lustre::iminus" - | "Lustre::rminus" -> (make_soc sk (sp tl) [step21 None id]) - - | "Lustre::lt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::gt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::lte" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::gte" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::ilt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::igt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::ilte" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::igte" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::rlt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::rgt" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::rlte" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::rgte" -> (make_soc sk (sp tl) [step21 None id]) - - | "Lustre::and" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::eq" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::neq" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::or" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::xor" -> (make_soc sk (sp tl) [step21 None id]) - | "Lustre::impl" -> (make_soc sk (sp tl) [step21 None id]) + | "Lustre::rminus" -> (make_soc sk (sp tl) [step21 lxm None id]) + + | "Lustre::lt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::gt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::lte" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::gte" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::ilt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::igt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::ilte" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::igte" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::rlt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::rgt" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::rlte" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::rgte" -> (make_soc sk (sp tl) [step21 lxm None id]) + + | "Lustre::and" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::eq" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::neq" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::or" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::xor" -> (make_soc sk (sp tl) [step21 lxm None id]) + | "Lustre::impl" -> (make_soc sk (sp tl) [step21 lxm None id]) (* Those have instances *) | "Lustre::current" -> ( @@ -192,7 +192,7 @@ let of_soc_key : Soc.key -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0;1]; idx_outs = [0]; impl = @@ -200,9 +200,9 @@ let of_soc_key : Soc.key -> Soc.t = [Case((fst cv),[ (Lv6Id.string_of_long false cc, [Call([Var(mem)], Assign, [Var(vin)], - dummy)])], - dummy); - Call([Var(vout)], Assign, [Var(mem)], dummy )]) + lxm)])], + lxm); + Call([Var(vout)], Assign, [Var(mem)], lxm )]) }; ]; precedences = []; @@ -224,20 +224,20 @@ let of_soc_key : Soc.key -> Soc.t = step = [ { name = "get"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = []; idx_outs = [0]; (* impl = Predef; *) - impl = Gaol([],[Call([Var(vout)], Assign, [Var(pre_mem)], dummy)]); + impl = Gaol([],[Call([Var(vout)], Assign, [Var(pre_mem)], lxm)]); (*impl = Gaol([pre_mem],[Call([Var(vout)], Assign, [Var(pre_mem)])]); *) }; { name = "set"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0]; idx_outs = []; (* impl = Predef; *) - impl = Gaol([],[Call([Var(pre_mem)], Assign, [Var(v1)], dummy )]); + impl = Gaol([],[Call([Var(pre_mem)], Assign, [Var(v1)], lxm )]); (* impl = Gaol([pre_mem],[Call([Var(pre_mem)], Assign, [Var(v1)])]); *) }; ]; @@ -253,7 +253,7 @@ let of_soc_key : Soc.key -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0;1]; idx_outs = [0]; impl = Predef; @@ -274,7 +274,7 @@ let of_soc_key : Soc.key -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0; 1; 2]; idx_outs = [0]; impl = Predef; @@ -296,7 +296,7 @@ let of_soc_key : Soc.key -> Soc.t = Soc.step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0]; idx_outs = [0]; impl = Boolred(0, 0, size); @@ -322,7 +322,7 @@ let of_soc_key : Soc.key -> Soc.t = Soc.step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0]; idx_outs = [0]; impl = Boolred(0,1, size); @@ -389,8 +389,8 @@ let instanciate_soc: Soc.t -> Data.t -> Soc.t = idem pour "x^n" (Hat_n). *) -let make_array_slice_soc : Lic.slice_info -> int -> Data.t -> Soc.t = - fun si s t -> +let make_array_slice_soc : Lxm.t -> Lic.slice_info -> int -> Data.t -> Soc.t = + fun lxm si s t -> let size = si.Lic.se_width in let array_type_in = Array(t,s) in let array_type_out = Array(t,size) in @@ -403,7 +403,7 @@ let make_array_slice_soc : Lic.slice_info -> int -> Data.t -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0]; idx_outs = [0]; impl = Predef; @@ -414,8 +414,8 @@ let make_array_slice_soc : Lic.slice_info -> int -> Data.t -> Soc.t = memory = No_mem; } -let make_array_soc: int -> Data.t -> Soc.t = - fun i t -> +let make_array_soc: Lxm.t -> int -> Data.t -> Soc.t = + fun lxm i t -> let iprof = let res = ref [] in for k=i downto 1 do @@ -432,7 +432,7 @@ let make_array_soc: int -> Data.t -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = SocUtils.gen_index_list i; idx_outs = [0]; impl = Predef; @@ -444,8 +444,8 @@ let make_array_soc: int -> Data.t -> Soc.t = } -let make_array_concat_soc: int -> int -> Data.t -> Soc.t = - fun s1 s2 t -> +let make_array_concat_soc: Lxm.t -> int -> int -> Data.t -> Soc.t = + fun lxm s1 s2 t -> let iprof = (["i1", Array(t,s1); "i2", Array(t,s2)], ["out", Array(t,s1+s2)])in let key_prof = [Array(t,s1); Array(t,s2); Array(t,s1+s2)] in { @@ -455,7 +455,7 @@ let make_array_concat_soc: int -> int -> Data.t -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm; idx_ins = [0;1]; idx_outs = [0]; impl = Predef; @@ -466,8 +466,8 @@ let make_array_concat_soc: int -> int -> Data.t -> Soc.t = memory = No_mem; } -let make_hat_soc: int -> Data.t -> Soc.t = - fun i t -> +let make_hat_soc: Lxm.t -> int -> Data.t -> Soc.t = + fun lxm i t -> let array_type = match t with | Data.Alpha _ -> assert false @@ -480,7 +480,7 @@ let make_hat_soc: int -> Data.t -> Soc.t = step = [ { name = "step"; - lxm = Lxm.dummy "predef"; + lxm = lxm ; idx_ins = [0]; idx_outs = [0]; impl = Predef; @@ -523,51 +523,51 @@ let (soc_interface_of_pos_op: | Lic.PREDEF_CALL ({Lxm.it=("Lustre","if"),[]}),_ ,_ -> let concrete_type = List.nth types 1 in - let soc = of_soc_key ("Lustre::if", types@[concrete_type], Nomore) in + let soc = of_soc_key lxm ("Lustre::if", types@[concrete_type], Nomore) in instanciate_soc soc concrete_type | Lic.PREDEF_CALL {Lxm.it=(op,sargs)}, _, _ -> assert (sargs=[]); let soc_name = Lv6Id.string_of_long false op in let out_type = output_type_of_op soc_name types in - let soc = of_soc_key (soc_name, types@[out_type], Nomore) in + let soc = of_soc_key lxm (soc_name, types@[out_type], Nomore) in soc | Lic.FBY, _, Some init -> let concrete_type = List.nth types 0 in - let soc = of_fby_soc_key init (("Lustre::fby"), + let soc = of_fby_soc_key lxm init (("Lustre::fby"), types@[concrete_type], MemInit init) in instanciate_soc soc concrete_type | Lic.FBY, _, None -> assert false (* should ot occur *) | Lic.PRE, _, _ -> let concrete_type = List.nth types 0 in - let soc = of_soc_key (("Lustre::pre"), types@[concrete_type], Nomore) in + let soc = of_soc_key lxm (("Lustre::pre"), types@[concrete_type], Nomore) in instanciate_soc soc concrete_type | Lic.CURRENT (Some(cc)), _, _ -> let concrete_type = try List.nth types 1 with _ -> assert false in - let soc = of_soc_key (("Lustre::current"), types@[concrete_type], Curr(cc)) in + let soc = of_soc_key lxm (("Lustre::current"), types@[concrete_type], Curr(cc)) in instanciate_soc soc concrete_type | Lic.CURRENT (_), _, _ -> assert false (* sno *) | Lic.ARROW, _, _ -> let concrete_type = List.nth types 0 in - let soc = of_soc_key (("Lustre::arrow"), types@[concrete_type], + let soc = of_soc_key lxm (("Lustre::arrow"), types@[concrete_type], MemInit(Const("_true", Data.Bool))) in let soc = instanciate_soc soc concrete_type in soc | Lic.HAT i,_, _ -> let elt_type = List.nth types 0 in - (make_hat_soc i elt_type) + (make_hat_soc lxm i elt_type) | Lic.ARRAY, _, _ -> let elt_type = List.nth types 0 in let i = (List.length types) in - (make_array_soc i elt_type) + (make_array_soc lxm i elt_type) - | Lic.ARRAY_SLICE sinfo, [Array (t, s)], _ -> (make_array_slice_soc sinfo s t) + | Lic.ARRAY_SLICE sinfo, [Array (t, s)], _ -> (make_array_slice_soc lxm sinfo s t) | Lic.ARRAY_SLICE sinfo, _, _ -> assert false | Lic.CONCAT, [Array (t1, s1); Array (t2, s2)], _-> assert (t1=t2); - (make_array_concat_soc s1 s2 t1) + (make_array_concat_soc lxm s1 s2 t1) | Lic.CONCAT , _, _ -> assert false | Lic.CALL _,_,_ -> assert false diff --git a/src/socPredef.mli b/src/socPredef.mli index df6da2e74e244776293e90a03b68cf9084a1f78c..2922410ee8c9e096993d791281f9ec3a2ca78477 100644 --- a/src/socPredef.mli +++ b/src/socPredef.mli @@ -1,9 +1,9 @@ -(* Time-stamp: <modified the 07/01/2015 (at 16:18) by Erwan Jahier> *) +(* Time-stamp: <modified the 06/09/2017 (at 16:32) by Erwan Jahier> *) (** Synchronous Object Code for Predefined operators. *) -val of_soc_key : Soc.key -> Soc.t +val of_soc_key : Lxm.t -> Soc.key -> Soc.t (** Associe un opérateur Lustre et le type de ses opérandes à un SOC et sa fonction de typage. diff --git a/src/socUtils.ml b/src/socUtils.ml index a2404578783b363a1d2472f474fc75fc03dfb3bc..3b1bcfb6ac657825361b19b448c21940a14ef4a7 100644 --- a/src/socUtils.ml +++ b/src/socUtils.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 21/07/2017 (at 15:30) by Erwan Jahier> *) +(** Time-stamp: <modified the 07/09/2017 (at 17:02) by Erwan Jahier> *) open Soc @@ -360,7 +360,17 @@ let (ctx_is_global : Soc.t -> bool) = | Lv6MainArgs.Heap -> is_memory_less soc | Lv6MainArgs.Stack | Lv6MainArgs.HeapStack -> false - +let (get_rank : 'a -> ('a * 'b) list -> int) = + fun x l -> + let rec aux i l = + match l with + | [] -> 0 + | (y,_)::l -> if x = y then i else aux (i+1) l + in + aux 1 l + +let _ = assert (get_rank 5 [(1,4);(3,4);(5,5)] = 3) + let (filter_step_params : int list -> 'a list -> 'a list) = fun il vl -> (* we suppose that the index list is in increasing order *) diff --git a/src/socUtils.mli b/src/socUtils.mli index 4b35a4304750c3992608d3a3c705803899d6f003..83531dc7f0365c81a8941a05ddf4db23d482ccf8 100644 --- a/src/socUtils.mli +++ b/src/socUtils.mli @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 03/07/2017 (at 10:22) by Erwan Jahier> *) +(** Time-stamp: <modified the 07/09/2017 (at 17:02) by Erwan Jahier> *) (** Donne toute les méthodes d'un composant. *) @@ -69,3 +69,5 @@ filter_step_params [0;1;4] [v1;v2;v3;v4;v5] = [v1;v2;v5] nb : we suppose that the index list is in increasing order. *) val filter_step_params : int list -> 'a list -> 'a list + +val get_rank : 'a -> ('a * 'b) list -> int diff --git a/test/lus2lic.sum b/test/lus2lic.sum index c263d411d313f8cf69d5ed36a026fe1633d0566c..e04bfcb2844583afa396b6338103647f8604257a 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,5 +1,5 @@ ==> lus2lic0.sum <== -Test Run By jahier on Mon Aug 28 17:05:56 +Test Run By jahier on Fri Sep 8 10:38:01 Native configuration is x86_64-unknown-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 Aug 28 17:05:57 +Test Run By jahier on Fri Sep 8 10:38:01 Native configuration is x86_64-unknown-linux-gnu === lus2lic1 tests === @@ -412,7 +412,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 Aug 28 17:06:49 +Test Run By jahier on Fri Sep 8 10:38:55 Native configuration is x86_64-unknown-linux-gnu === lus2lic2 tests === @@ -752,7 +752,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 Aug 28 17:07:47 +Test Run By jahier on Fri Sep 8 10:39:54 Native configuration is x86_64-unknown-linux-gnu === lus2lic3 tests === @@ -1266,7 +1266,7 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {} ==> lus2lic4.sum <== -Test Run By jahier on Mon Aug 28 17:09:00 +Test Run By jahier on Fri Sep 8 10:41:11 Native configuration is x86_64-unknown-linux-gnu === lus2lic4 tests === @@ -1784,13 +1784,13 @@ PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node zzz2.lus {} =============================== # Total number of failures: 14 lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 0 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 52 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 58 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 73 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 46 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 54 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 59 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 77 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 47 seconds * Ref time: -0.06user 0.00system 3:51.51elapsed 0%CPU (0avgtext+0avgdata 5588maxresident)k -0inputs+0outputs (0major+6187minor)pagefaults 0swaps +0.07user 0.00system 3:57.18elapsed 0%CPU (0avgtext+0avgdata 5692maxresident)k +32inputs+0outputs (0major+6203minor)pagefaults 0swaps * Quick time (-j 4): -0.05user 0.02system 1:58.38elapsed 0%CPU (0avgtext+0avgdata 5704maxresident)k -0inputs+0outputs (0major+6193minor)pagefaults 0swaps +0.05user 0.02system 1:41.39elapsed 0%CPU (0avgtext+0avgdata 5608maxresident)k +32inputs+0outputs (0major+6183minor)pagefaults 0swaps