diff --git a/_tags b/_tags index cc4ff346bce5a5fc7475c7cc12483afdeec741f6..9437835e4b6c49aa44730eadd5f148a69cd586a0 100644 --- a/_tags +++ b/_tags @@ -25,3 +25,4 @@ <src/*.ml{,i}>: pkg_str <src/*.ml{,i}>: pkg_unix # OASIS_STOP + diff --git a/src/lic2soc.ml b/src/lic2soc.ml index 5f5d4a269aca20362a05393ffa47134d0fcb408d..6f81befb212a9402ed87e7b0340c91eede82b663 100644 --- a/src/lic2soc.ml +++ b/src/lic2soc.ml @@ -1,4 +1,6 @@ -(** Time-stamp: <modified the 20/06/2014 (at 08:14) by Erwan Jahier> *) +(** Time-stamp: <modified the 23/06/2014 (at 16:24) by Erwan Jahier> *) + +(* XXX ce module est mal écrit. A reprendre. (R1) *) open Lxm open Lic @@ -258,18 +260,29 @@ let soc_profile_of_node: Lic.node_exp -> Soc.var list * Soc.var list = let outputs = List.map lic_to_soc_var n.Lic.outlist_eff in inputs, outputs -let (make_soc_key_of_node_exp : Lic.node_key -> Lic.slice_info option -> Data.t list -> Soc.key) = -fun nk si_opt vl -> - LicDump.string_of_node_key_rec false nk, vl, - (match si_opt with - | None -> Soc.Nomore - | Some si -> Soc.Slic(si.Lic.se_first,si.Lic.se_last,si.Lic.se_step)) +let (make_soc_key_of_node_key : Lic.node_key -> Lic.slice_info option -> Data.t list -> Soc.key) = + fun nk si_opt vl -> + let key_opt = + (match si_opt with + | None -> Soc.Nomore + | Some si -> Soc.Slic(si.Lic.se_first,si.Lic.se_last,si.Lic.se_step)) + in + let key_opt = + if (snd (fst nk)) = "condact" then ( + assert (key_opt=Soc.Nomore); + Soc.MemInit(Soc.Const("_true", Data.Bool)) (* the first step flag *) + ) else ( + key_opt + ) + in + LicDump.string_of_node_key_rec false nk, vl, key_opt + let (soc_key_of_node_exp : Lic.node_exp -> Soc.key) = fun n -> let svi,svo = soc_profile_of_node n in - let sk = make_soc_key_of_node_exp n.node_key_eff None (List.map snd (svi@svo)) in - sk + let (id,tl,key_opt) = make_soc_key_of_node_key n.node_key_eff None (List.map snd (svi@svo)) in + (id,tl,key_opt) (* XXX duplicated code with get_leaf *) let rec (val_exp_to_filter: LicPrg.t -> Lic.val_exp -> Soc.var_expr) = @@ -401,7 +414,7 @@ let (make_instance : | [] -> ( match soc.Soc.have_mem with | None -> ctx, None - | Some (_) -> (* pre/fby *) + | Some (_) -> (* pre/fby/arrow/condact *) let ctx, m = create_instance_from_soc ctx soc in ctx, Some(m) ) @@ -418,19 +431,20 @@ let (make_instance : type e2a_acc = ctx * action list * Soc.var_expr list * Soc.instance list * ActionsDeps.t -(* Béquille en attendant mieux *) -let by_pos_op_to_soc_ident = function - | PRE -> "Lustre::pre" - | ARROW -> "Lustre::arrow" - | FBY-> "Lustre::fby" - | CURRENT -> "Lustre::current" - | CONCAT-> "Lustre::concat" - | ARRAY -> "Lustre::array" - | ARRAY_SLICE _ -> "Lustre::array_slice" - | HAT _ -> "Lustre::hat" - | PREDEF_CALL n - | CALL n -> LicDump.string_of_node_key_rec false n.it - | _ -> assert false +(* XXX Béquille en attendant mieux *) +let (node_key_of_pos_op : Lic.by_pos_op -> Lic.node_key) = fun op -> + match op with + | PRE -> ("","Lustre::pre"),[] + | ARROW -> ("","Lustre::arrow" ),[] + | FBY-> ("","Lustre::fby"),[] + | CURRENT -> ("","Lustre::current"),[] + | CONCAT-> ("","Lustre::concat"),[] + | ARRAY -> ("","Lustre::array"),[] + | ARRAY_SLICE _ -> ("","Lustre::array_slice"),[] + | HAT _ -> ("","Lustre::hat"),[] + | CALL n | PREDEF_CALL n -> n.it + | _ -> assert false + let (get_exp_type : Soc.var_expr list -> Data.t list) = @@ -506,7 +520,6 @@ let rec (actions_of_expression_acc: Lxm.t -> Soc.tbl -> | CALL _ | PREDEF_CALL _ | HAT _ | ARRAY | PRE | ARROW | FBY | CONCAT -> ( (* retreive the soc of "expr" in soc_tbl *) - let id = by_pos_op_to_soc_ident by_pos_op_flg.it in let soc : Soc.t = let args_types : Data.t list = List.map lic_to_data_type @@ -518,24 +531,25 @@ let rec (actions_of_expression_acc: Lxm.t -> Soc.tbl -> let si_opt = match by_pos_op_flg.it with Lic.ARRAY_SLICE si -> Some si | _ -> None in - let sk = make_soc_key_of_node_exp (("",id),[]) si_opt full_profile in + let node_key = node_key_of_pos_op by_pos_op_flg.it in + let sk = make_soc_key_of_node_key node_key si_opt full_profile in let (sk_name, sk_prof,_) = sk in let sk,fby_init_opt = let init = val_exp_to_filter ctx.prg (List.hd val_exp_list) in - if by_pos_op_flg.it = Lic.FBY then + if by_pos_op_flg.it = Lic.FBY then (sk_name, sk_prof, Soc.MemInit init), Some init - else if by_pos_op_flg.it = Lic.ARROW then + else if by_pos_op_flg.it = Lic.ARROW then let init = Soc.Const("_true", Data.Bool) in (sk_name, sk_prof, Soc.MemInit init), Some init else sk, None in - try Soc.SocMap.find sk soc_tbl + try Soc.SocMap.find sk soc_tbl with Not_found -> Verbose.exe ~flag:dbg (fun () -> let l = Soc.SocMap.bindings soc_tbl in let kl = fst (List.split l) in - let klstr = List.map SocUtils.string_of_soc_key kl in + let klstr = List.map SocUtils.string_of_soc_key kl in print_string ("\n********* Cannot find the soc.key " ^ (SocUtils.string_of_soc_key sk) ^ " in \n\t" ^ (String.concat "\n\t" klstr)^"\n"); @@ -555,7 +569,7 @@ let rec (actions_of_expression_acc: Lxm.t -> Soc.tbl -> (* let res_type = List.map lic_to_data_type expr.ve_typ in *) let res_type = get_exp_type lpl in let full_profile = args_types @ res_type in - let sk = make_soc_key_of_node_exp (("Lustre","merge"),[]) None full_profile in + let sk = make_soc_key_of_node_key (("Lustre","merge"),[]) None full_profile in try Soc.SocMap.find sk soc_tbl with Not_found -> Verbose.exe ~flag:dbg (fun () -> @@ -654,6 +668,7 @@ let info msg = let t = Sys.time() in Verbose.exe ~level:1 (fun () -> Printf.eprintf "%4.4f: %s%!" t msg; flush stderr) + let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = fun prog mnk -> let rec (process_node : Lic.node_key -> Soc.tbl -> Soc.key * Soc.tbl) = @@ -724,8 +739,12 @@ let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = | ctx,Some inst -> ctx,[inst] | ctx,None -> ctx,[] in + let soc_key = + let x,y,_=soc_key in + x,y, Soc.MemInit(Soc.Const("_true", Data.Bool)) (* the first step flag *) + in let soc = { - Soc.key = soc_key; + Soc.key = soc_key ; Soc.profile = soc_profile_of_node node; Soc.instances = inst ; Soc.step = [ @@ -737,7 +756,7 @@ let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = impl = Condact(nsk, List.flatten (List.map lic2soc_const vel)); } ]; - Soc.have_mem = None; + Soc.have_mem = Some Data.Bool; (* to hold the first step flag *) Soc.precedences = []; } in @@ -749,7 +768,7 @@ let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = info "Lic2soc.soc_of_node...\n"; let io_list = node.Lic.inlist_eff @ node.Lic.outlist_eff in let io_type = List.map (fun vi -> lic_to_data_type vi.var_type_eff) io_list in - let soc_key = make_soc_key_of_node_exp node.Lic.node_key_eff None io_type in + let soc_key = make_soc_key_of_node_key node.Lic.node_key_eff None io_type in let lxm = node.Lic.lxm in let ctx = create_context licprg in let (soc_of_body: Lic.node_body -> Soc.tbl -> (ctx * Soc.t * Soc.tbl) option) = @@ -850,7 +869,8 @@ let rec f: (LicPrg.t -> Lic.node_key -> Soc.key * Soc.tbl) = | ("condact"), [ ConstStaticArgLic("dflt",const); NodeStaticArgLic ("oper",condact_node) ] -> ( - let soc_tbl,soc = make_condact_soc node condact_node soc_key soc_tbl ctx lxm [const] in + let soc_tbl,soc = + make_condact_soc node condact_node soc_key soc_tbl ctx lxm [const] in Some(ctx, soc, soc_tbl) ) | e -> diff --git a/src/soc2c.ml b/src/soc2c.ml index 800e945e1adce962fa65410f9ebf799d403447ac..5938276c8e58b301b59ddc966fecb5219c76d6f2 100644 --- a/src/soc2c.ml +++ b/src/soc2c.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 20/06/2014 (at 10:00) by Erwan Jahier> *) +(* Time-stamp: <modified the 20/06/2014 (at 16:44) by Erwan Jahier> *) (* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *) @@ -64,32 +64,10 @@ let (string_of_soc_key : Soc.key -> string) = let string_of_flow_decl (id, t) = Printf.sprintf " %s;\n" (type_to_string t (id2s id)) -let (mem_interface : Soc.t -> string -> bool) = - fun soc id -> - let ins,outs = soc.profile in - List.mem_assoc id ins || List.mem_assoc id outs -let (is_memory_less : Soc.t -> bool) = - fun soc -> - soc.have_mem = None && soc.instances = [] - -let rec (string_of_var_expr: Soc.t -> Soc.var_expr -> string) = - fun soc -> function - | Const("true", _) -> "_true" - | Const("false", _) -> "_false" - | Const(id, _) -> id2s id - | Var ("_memory",_) -> (* Clutch! it's not an interface var... *) "ctx->_memory" - | Var (id,_) -> - if not (mem_interface soc id) then id2s id - else if is_memory_less soc then - sprintf "%s.%s" (get_ctx_name soc.key) (id2s id) - else - sprintf "ctx->%s" (id2s id) - | Field(f, id,_) -> sprintf "%s.%s" (string_of_var_expr soc f) (id2s id) - | Index(f, index,_) -> sprintf "%s[%i]" (string_of_var_expr soc f) index - | Slice(f,fi,la,st,wi,vt) -> sprintf "%s[%i..%i step %i]; // XXX fixme!\n" - (string_of_var_expr soc f) fi la st +let (is_memory_less : Soc.t -> bool) = SocUtils.is_memory_less +let string_of_var_expr = Soc2cUtil.string_of_var_expr open Soc let (gao2c : Soc.tbl -> 'a soc_pp -> Soc.gao -> unit) = @@ -110,7 +88,7 @@ let (gao2c : Soc.tbl -> 'a soc_pp -> Soc.gao -> unit) = let ctx_opt = let il,ol = sp.soc.profile in if List.mem_assoc id il || List.mem_assoc id ol then - (if is_memory_less sp.soc then Soc2cUtil.ML_IO sp.soc.key + (if SocUtils.is_memory_less sp.soc then Soc2cUtil.ML_IO sp.soc.key else Soc2cUtil.M_IO) else Soc2cUtil.Local in diff --git a/src/soc2cUtil.ml b/src/soc2cUtil.ml index 35bbd87abb8dcbdaca0f3e04cda51720c3aa2f4a..5f749b70ab7475b00e7592d6b9131793526f90e9 100644 --- a/src/soc2cUtil.ml +++ b/src/soc2cUtil.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/06/2014 (at 10:42) by Erwan Jahier> *) +(* Time-stamp: <modified the 20/06/2014 (at 17:23) by Erwan Jahier> *) (* exported *) @@ -27,7 +27,6 @@ let (step_name : Soc.key -> string -> string) = let str = Printf.sprintf "%s_%s" (Soc2cIdent.get_soc_name sk) sm in id2s str - type var_kind = (* XXX poor names: fixme! *) | ML_IO of Soc.key (* for idents that are part of a MemoryLess soc interface *) | M_IO (* for idents that are part of a soc interface with Memories*) @@ -51,7 +50,7 @@ let (gen_step_call : Soc.t -> Soc.t -> string list -> string list -> List.map2 (fun (name, t) ve -> gen_assign t (Printf.sprintf "%s.%s" ctx name) ve) inputs vel_in - ) with _ -> assert false (* XXX not all parameters are necessaryly used! *) + ) with _ -> assert false (* are all parameters necessaryly used? *) in (String.concat "" l) in @@ -70,3 +69,27 @@ let (gen_step_call : Soc.t -> Soc.t -> string list -> string list -> let str = Printf.sprintf " %s(%s); \n" (step_name called_soc.key sname) step_arg in (si_str ^ str ^ so_str) + +let (mem_interface : Soc.t -> string -> bool) = + fun soc id -> + let ins,outs = soc.profile in + List.mem_assoc id ins || List.mem_assoc id outs + +open Soc2cIdent + +let rec (string_of_var_expr: Soc.t -> Soc.var_expr -> string) = + fun soc -> function + | Const("true", _) -> "_true" + | Const("false", _) -> "_false" + | Const(id, _) -> id2s id + | Var ("_memory",_) -> (* Clutch! it's not an interface var... *) "ctx->_memory" + | Var (id,_) -> + if not (mem_interface soc id) then id2s id + else if SocUtils.is_memory_less soc then + Printf.sprintf "%s.%s" (get_ctx_name soc.key) (id2s id) + else + Printf.sprintf "ctx->%s" (id2s id) + | Field(f, id,_) -> Printf.sprintf "%s.%s" (string_of_var_expr soc f) (id2s id) + | Index(f, index,_) -> Printf.sprintf "%s[%i]" (string_of_var_expr soc f) index + | Slice(f,fi,la,st,wi,vt) -> Printf.sprintf "%s[%i..%i step %i]; // XXX fixme!\n" + (string_of_var_expr soc f) fi la st diff --git a/src/socExec.ml b/src/socExec.ml index d595cd8c78c47b7ed8ccad38bd630c7f5e2fbc97..6815febbdb08c0f64cf93bc44b7b74e38781f837 100644 --- a/src/socExec.ml +++ b/src/socExec.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 19/06/2014 (at 14:32) by Erwan Jahier> *) +(* Time-stamp: <modified the 20/06/2014 (at 11:29) by Erwan Jahier> *) open Soc open Data @@ -60,7 +60,7 @@ let rec (soc_step : Soc.step_method -> Soc.tbl -> Soc.t -> SocExecValue.ctx let clk = SocExecValue.get_value ctx (Var ("i0",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 vel_out = List.map (fun x -> Var x) vel_out in let node_soc = SocUtils.find step.lxm node_sk soc_tbl in let inst_name = match soc.instances with diff --git a/src/socPredef2c.ml b/src/socPredef2c.ml index f3c36c1b5c76b329640bf505f79ec67f226ff882..76e2d716797ac1c0c3c08840672ab696bfe697d9 100644 --- a/src/socPredef2c.ml +++ b/src/socPredef2c.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 20/06/2014 (at 10:12) by Erwan Jahier> *) +(* Time-stamp: <modified the 23/06/2014 (at 16:54) by Erwan Jahier> *) open Data open Soc @@ -207,7 +207,6 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) = fun soc iterator it_soc n -> let iter_inputs,iter_outputs = soc.profile in let node_step = match soc.step with [step] -> step.name | _ -> assert false in - let step_args, ctx, array_index,ctx_access = match soc.instances with | [] -> ( @@ -261,45 +260,45 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) = + (* exported *) let (get_condact : Soc.t -> Soc.t -> var_expr list -> string ) = fun soc condact_soc el -> - "" -(* | Condact(node_sk, dft_cst) -> ( - let clk = SocExecValue.get_value ctx (Var ("i0",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 step.lxm node_sk soc_tbl in + let ctx = get_ctx_name soc.key in + let buff = ref "" in + let add str = buff:=!buff^(str^"\n") in + + let clk = Printf.sprintf "ctx->i0" in + let string_of_var_soc (id,_) = "ctx->"^(id2s id) in + let vel_in,vel_out = soc.profile in + let vel_in = List.tl vel_in in + let vel_in = List.map string_of_var_soc vel_in in + let vel_out = List.map string_of_var_soc vel_out in + + add (Printf.sprintf " if (%s == _true) { " clk); + if SocUtils.is_memory_less condact_soc then + let condact_ctx = get_ctx_name condact_soc.key in + add (Soc2cUtil.gen_step_call soc condact_soc vel_out vel_in condact_ctx "step" "") + else ( + let condact_ctx = let inst_name = match soc.instances with - | [] -> let (proc_name,_,_) = node_soc.key in proc_name - | [inst] -> fst inst + | [inst] -> (id2s (fst inst)) | _ -> assert false in - let path_saved = ctx.cpath in - let ctx = { ctx with cpath=inst_name::ctx.cpath } in - let ctx = - if clk = B true then - let node_step = match node_soc.step with [step] -> step | _ -> assert false in - let ctx = do_step inst_name node_step ctx soc_tbl node_soc vel_in vel_out in - { ctx with cpath=path_saved } - else - let first_step = Var ("$first_step",Bool) in - let v = get_value ctx first_step in - 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 *) - let ctx = { ctx with cpath=path_saved } in - List.fold_left2 assign_expr 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. *) - { ctx with cpath=path_saved } - in - let ctx = { ctx with s = sadd ctx.s ("$first_step"::ctx.cpath) (B false) } in - ctx - *) + Printf.sprintf "ctx->%s" inst_name + in + add (Soc2cUtil.gen_step_call soc condact_soc vel_out vel_in + condact_ctx "step" ("&"^condact_ctx)) + ); + add " ctx->_memory = _false;"; + add " } else if (ctx->_memory == _true) {"; + List.iter2 (fun var ve -> + add (Printf.sprintf " %s = %s;" var (Soc2cUtil.string_of_var_expr soc ve) ) + ) vel_out el ; + add " ctx->_memory = _false;"; + add " }"; + !buff (* exported *) diff --git a/src/socUtils.ml b/src/socUtils.ml index 7bfb506d831c9afe2c04165ac3ac34e3b6c906c8..b743e5b09fce6e7953e0a794207a22407279b44c 100644 --- a/src/socUtils.ml +++ b/src/socUtils.ml @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 11/06/2014 (at 18:16) by Erwan Jahier> *) +(** Time-stamp: <modified the 20/06/2014 (at 10:32) by Erwan Jahier> *) open Soc @@ -347,3 +347,7 @@ let (my_string_of_float_precision : int option -> float -> string) = | Some p -> let precision_str = string_of_int p in format_float ("%." ^ precision_str ^ "f") f + +let (is_memory_less : Soc.t -> bool) = + fun soc -> + soc.have_mem = None && soc.instances = [] diff --git a/src/socUtils.mli b/src/socUtils.mli index 71ab4b1ac84b680cb5544f6c8b4003e653e60e27..890089420b395808a237cd7a692d61b459006b53 100644 --- a/src/socUtils.mli +++ b/src/socUtils.mli @@ -1,4 +1,4 @@ -(** Time-stamp: <modified the 04/04/2014 (at 14:45) by Erwan Jahier> *) +(** Time-stamp: <modified the 20/06/2014 (at 10:32) by Erwan Jahier> *) (** Donne toute les méthodes d'un composant. *) @@ -48,3 +48,5 @@ val find_no_exc : Soc.key -> Soc.tbl -> Soc.t (* gen_index_list 5 = [0;1;2;3;4] *) val gen_index_list : int -> int list val my_string_of_float_precision : int option -> float -> string + +val is_memory_less : Soc.t -> bool diff --git a/test/lus2lic.sum b/test/lus2lic.sum index 218f042e4926a84e3f91dc77117813a40dfa9747..7587c6ee10ae6b0c94ef65165981c37ac994a336 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,4 +1,4 @@ -Test Run By jahier on Fri Jun 20 10:12:30 2014 +Test Run By jahier on Mon Jun 23 16:54:59 2014 Native configuration is i686-pc-linux-gnu === lus2lic tests === @@ -567,9 +567,6 @@ PASS: ./lus2lic {-2c should_work/morel4.lus -n morel4} FAIL: Check that the generated C code compiles : gcc morel4_morel4.c morel4_morel4_loop.c PASS: ./lus2lic {-o /tmp/trivial_array.lic should_work/trivial_array.lus} FAIL: Generate ec code : ./lus2lic {-ec -o /tmp/trivial_array.ec should_work/trivial_array.lus} -FAIL: Try to compare lus2lic -exec and ecexe: ../utils/test_lus2lic_no_node should_work/trivial_array.lus -PASS: ./lus2lic {-2c should_work/trivial_array.lus -n trivial_array} -PASS: gcc trivial_array_trivial_array.c trivial_array_trivial_array_loop.c PASS: ./lus2lic {-o /tmp/param_node4.lic should_work/param_node4.lus} PASS: ./lus2lic {-ec -o /tmp/param_node4.ec should_work/param_node4.lus} PASS: ./myec2c {-o /tmp/param_node4.c /tmp/param_node4.ec} @@ -1485,9 +1482,9 @@ XPASS: Test bad programs (semantics): lus2lic {-o /tmp/bug.lic should_fail/seman === lus2lic Summary === -# of expected passes 1271 -# of unexpected failures 144 +# of expected passes 1269 +# of unexpected failures 143 # of unexpected successes 21 # of expected failures 37 -testcase ./lus2lic.tests/non-reg.exp completed in 137 seconds -testcase ./lus2lic.tests/progression.exp completed in 1 seconds +testcase ./lus2lic.tests/non-reg.exp completed in 130 seconds +testcase ./lus2lic.tests/progression.exp completed in 0 seconds diff --git a/test/lus2lic.time b/test/lus2lic.time index 191e57e3a805c474d95fafa25eb0f269f76f1008..6879740d65575caa2a8a41db20e481570208f3e8 100644 --- a/test/lus2lic.time +++ b/test/lus2lic.time @@ -1,2 +1,2 @@ -testcase ./lus2lic.tests/non-reg.exp completed in 137 seconds -testcase ./lus2lic.tests/progression.exp completed in 1 seconds +testcase ./lus2lic.tests/non-reg.exp completed in 130 seconds +testcase ./lus2lic.tests/progression.exp completed in 0 seconds diff --git a/test/should_work/test_condact.lus b/test/should_work/test_condact.lus index 8578352ff3322b764951723d0d9f351d67382e75..f1aaf7ac5787019c449119d7ecbcf15343749dc7 100644 --- a/test/should_work/test_condact.lus +++ b/test/should_work/test_condact.lus @@ -5,6 +5,12 @@ let y = 0 fby y + 1; z = x fby z + a; tel +node toto_nm(a,b: int) returns (x,y,z: int); +let + x = a + b; + y = 1; + z = a; +tel node test_condact(c: bool; a,b:int) returns (x,y,z: int); let