From 9af5091ae35a87355220fe60907b0c3db3a31a1e Mon Sep 17 00:00:00 2001 From: Erwan Jahier <jahier@imag.fr> Date: Fri, 22 Mar 2013 09:58:51 +0100 Subject: [PATCH] The -exec mode now supports array concatenation. --- src/lic2soc.ml | 13 ++++++--- src/socExecEvalPredef.ml | 36 ++++++++++++++--------- src/socPredef.ml | 62 +++++++++++++++++++++++----------------- 3 files changed, 67 insertions(+), 44 deletions(-) diff --git a/src/lic2soc.ml b/src/lic2soc.ml index b8024c5a..4ad101e3 100644 --- a/src/lic2soc.ml +++ b/src/lic2soc.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 21/03/2013 (at 16:47) by Erwan Jahier> *) +(** Time-stamp: <modified the 22/03/2013 (at 09:36) by Erwan Jahier> *) open Lxm open Lic @@ -466,10 +466,9 @@ let rec (actions_of_expression_acc: Lxm.t -> Soc.tbl -> assert false | CallByPosLic (by_pos_op_flg, val_exp_list) -> ( match by_pos_op_flg.it with - (* handled via get_leaf *) | Lic.ARRAY_SLICE _ | Lic.VAR_REF _ | Lic.CONST_REF _ | Lic.ARRAY_ACCES _ | Lic.STRUCT_ACCESS _ | Lic.TUPLE - -> assert false (* XXX FINISH ME!!! *) + -> assert false (* should not occur: handled via get_leaf *) | Lic.WHEN ck -> (assert false (* XXX FINISH ME!!! *) (* (* L'opérateur when n'est pas un composant, il modifie *) @@ -698,7 +697,13 @@ let f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = | Undef_soc (sk,lxm,pos_op, types) -> let soc = SocPredef.soc_interface_of_pos_op lxm pos_op types in - assert (sk=soc.key); + if sk<>soc.key then ( + print_string ("Soc key mismatch :\n\t" ^ + (SocUtils.string_of_soc_key sk) ^ "\n<>\n\t" ^ + (SocUtils.string_of_soc_key soc.key) ^ "\n"); + flush stdout; + assert false + ); let acc_comp = SocMap.add soc.key soc acc_comp in let t = List.hd types in (* The arrow is translated into a if. So we make sure that the "if" diff --git a/src/socExecEvalPredef.ml b/src/socExecEvalPredef.ml index 0bcab4ea..b88571ed 100644 --- a/src/socExecEvalPredef.ml +++ b/src/socExecEvalPredef.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 21/03/2013 (at 17:04) by Erwan Jahier> *) +(* Time-stamp: <modified the 22/03/2013 (at 09:58) by Erwan Jahier> *) open SocExecValue open Soc @@ -207,18 +207,27 @@ let lustre_array tl ctx = let a = Array.of_list l in { ctx with s = sadd ctx.s ("z"::ctx.cpath) (A a) } - let lustre_hat tl ctx = - let i = match tl with - | [_;Soc.Array(_,i)] -> i - | _ -> assert false - in - let (vn,vv) = - match ([get_val "x" ctx]) with - | [U] -> "z"::ctx.cpath,U - | [v] -> "z"::ctx.cpath,A(Array.make i v) - | _ -> assert false - in - { ctx with s = sadd ctx.s vn vv } +let lustre_concat ctx = + let (vn,vv) = + match ([get_val "x" ctx; get_val "y" ctx]) with + | [A a1; A a2] -> "z"::ctx.cpath, A (Array.append a1 a2) + | [U;_] | [_;U] -> "z"::ctx.cpath, U + | _ -> assert false + in + { ctx with s = sadd ctx.s vn vv } + +let lustre_hat tl ctx = + let i = match tl with + | [_;Soc.Array(_,i)] -> i + | _ -> assert false + in + let (vn,vv) = + match ([get_val "x" ctx]) with + | [U] -> "z"::ctx.cpath,U + | [v] -> "z"::ctx.cpath,A(Array.make i v) + | _ -> assert false + in + { ctx with s = sadd ctx.s vn vv } (* That one is different *) let lustre_xor ctx = assert false @@ -260,6 +269,7 @@ let (get: Soc.key -> (ctx -> ctx)) = | "Lustre::hat" -> lustre_hat tl | "Lustre::array" -> lustre_array tl + | "Lustre::concat" -> lustre_concat | "Lustre::xor" -> lustre_xor | "Lustre::diese" -> lustre_diese diff --git a/src/socPredef.ml b/src/socPredef.ml index 77cc3664..639b2565 100644 --- a/src/socPredef.ml +++ b/src/socPredef.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 21/03/2013 (at 17:06) by Erwan Jahier> *) +(* Time-stamp: <modified the 22/03/2013 (at 09:50) by Erwan Jahier> *) (** Synchronous Object Code for Predefined operators. *) @@ -134,13 +134,6 @@ let of_soc_key : Soc.key -> Soc.t = }; ]; precedences = ["set", ["get"]]; - (* init = Some { *) - (* name = "init"; *) - (* lxm = Lxm.dummy "predef soc"; *) - (* idx_ins = [] ; (* XXX ??? *) *) - (* idx_outs = []; *) - (* impl = None; *) - (* }; *) } | "Lustre::arrow" -> let prof = sp tl in @@ -172,16 +165,7 @@ let of_soc_key : Soc.key -> Soc.t = ]; precedences = ["update_first_instant",["step"]]; have_mem = Some (Bool, Some (Const("true",Bool))); - - (* init = Some { *) - (* name = "init"; *) - (* lxm = Lxm.dummy "predef soc"; *) - (* idx_ins = [0]; *) - (* idx_outs = [0]; *) - (* impl = Some([],[Call([init], Assign, [Const("false",Bool)])]); *) - (* }; *) } - | "Lustre::fby" -> assert false (* replace fby by '->' + 'pre' ? @@ -358,6 +342,27 @@ let make_array_soc: int -> Soc.var_type -> Soc.t = have_mem = None; } +let make_array_concat_soc: int -> int -> Soc.var_type -> Soc.t = + fun s1 s2 t -> + let iprof = (["x", Array(t,s1); "y", Array(t,s2)], ["z", Array(t,s1+s2)])in + let key_prof = [Array(t,s1); Array(t,s2); Array(t,s1+s2)] in + { + key = ("Lustre::concat", key_prof, None); + profile = iprof; + instances = []; + step = [ + { + name = "step"; + lxm = Lxm.dummy "predef array concat soc"; + idx_ins = [0;1]; + idx_outs = [0]; + impl = None; + }; + ]; + precedences = []; + have_mem = None; + } + let make_hat_soc: int -> Soc.var_type -> Soc.t = fun i t -> @@ -483,30 +488,33 @@ let (soc_interface_of_pos_op: | Lic.FBY, _ -> let concrete_type = List.nth types 0 in let soc = of_soc_key (("Lustre::fby"), types@[concrete_type], None) in - instanciate_soc soc concrete_type + instanciate_soc soc concrete_type | Lic.PRE, _ -> let concrete_type = List.nth types 0 in let soc = of_soc_key (("Lustre::pre"), types@[concrete_type], None) in - instanciate_soc soc concrete_type + instanciate_soc soc concrete_type | Lic.CURRENT, _ -> let concrete_type = List.nth types 0 in let soc = of_soc_key (("Lustre::current"), types@[concrete_type], None) in - instanciate_soc soc concrete_type + instanciate_soc soc concrete_type | Lic.ARROW, _ -> let concrete_type = List.nth types 0 in let soc = of_soc_key (("Lustre::arrow"), types@[concrete_type], None) 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) + let elt_type = List.nth types 0 in + (make_hat_soc 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) - - | Lic.CONCAT ,_-> finish_me lxm ; assert false + let elt_type = List.nth types 0 in + let i = (List.length types) in + (make_array_soc i elt_type) + + | Lic.CONCAT , [Array (t1, s1); Array (t2, s2)]-> + assert (t1=t2); + (make_array_concat_soc s1 s2 t1) + | Lic.CONCAT , _ -> assert false | Lic.CALL _,_ -> assert false (* XXX todo *) -- GitLab