diff --git a/src/lv6MainArgs.ml b/src/lv6MainArgs.ml index bee48879131a5cd8ff8384204268774770e03ac8..8052c99beafc0e787f8b54b0349597d8e3bd967a 100644 --- a/src/lv6MainArgs.ml +++ b/src/lv6MainArgs.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 12/02/2015 (at 10:35) by Erwan Jahier> *) +(* Time-stamp: <modified the 12/02/2015 (at 17:25) by Erwan Jahier> *) (* Le manager d'argument adapté de celui de lutin, plus joli N.B. solution un peu batarde : les options sont stockées, comme avant, dans Global, diff --git a/src/soc2cStack.ml b/src/soc2cStack.ml index a153b6c7a9fe9352fb2ca491bfd64c2db7529f5f..09b62b5ef524e6067afe5e29408490feb115254c 100644 --- a/src/soc2cStack.ml +++ b/src/soc2cStack.ml @@ -1,4 +1,4 @@ -(* Time-stamp: <modified the 12/02/2015 (at 10:01) by Erwan Jahier> *) +(* Time-stamp: <modified the 12/02/2015 (at 17:14) by Erwan Jahier> *) open Soc2cUtil open Soc2cIdent @@ -11,6 +11,38 @@ let (mem_interface_out : Soc.t -> string -> bool) = let _,outs = soc.profile in List.mem_assoc id outs +let (not_an_array : Data.t -> bool) = function + | Data.Array(_,_) -> false | _ -> true + + +let rec (ve_not_an_array : Soc.var_expr -> bool) = + fun v -> + match v with + | Var(_,t) + | Const(_,t) + | Field(_,_,t) + | Index(_,_,t) -> not_an_array t + | Slice(_,_,_,_,_,_) -> false + +let rec (ve_not_a_field : Soc.var_expr -> bool) = + fun v -> + match v with + | Var(_,_) + | Const(_,_) + | Index(_,_,_) + | Slice(_,_,_,_,_,_) -> true + | Field(_,_,t) -> false + +(* exported : returns true if v is an output of soc *) +let rec (is_soc_output : Soc.var_expr -> Soc.t -> bool) = + fun v soc -> + match v with + | Var(n,t) -> List.mem (n,t) (snd soc.profile) + | Const(_) -> false + | Index(ve,_,t) + | Field(ve,_,t) + | Slice(ve,_,_,_,_,t) -> false (* is_soc_output ve soc *) + let rec (string_of_var_expr: Soc.t -> Soc.var_expr -> string) = fun soc -> function | Const("true", _) -> "_true" @@ -18,7 +50,10 @@ let rec (string_of_var_expr: Soc.t -> Soc.var_expr -> string) = | Const(id, _) -> id2s id | Var ("_memory",_) -> (* Clutch! it's not an interface var... *) "ctx->_memory" | Var (id,_) -> id2s id - | Field(f, id,_) -> Printf.sprintf "%s.%s" (string_of_var_expr soc f) (id2s id) + | Field(f, id,_) -> + if is_soc_output f soc + then Printf.sprintf "%s->%s" (string_of_var_expr soc f) (id2s id) + else 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) -> assert false (* should not occur *) @@ -38,16 +73,6 @@ let rec (gen_assign : Data.t -> string -> string -> string -> string) = | Data.Extern (id) -> Printf.sprintf " _assign_%s(&%s, &%s, sizeof(%s));\n" (id2s id) vi vo vo - -let rec (is_soc_output : Soc.var_expr -> Soc.t -> bool) = - fun v soc -> - match v with - | Var(v) -> List.mem v (snd soc.profile) - | Const(_) -> false - | Index(ve,_,_) - | Field(ve,_,_) - | Slice(ve,_,_,_,_,_) -> is_soc_output ve soc - let (gen_assign_var_expr : Soc.t -> Soc.var_expr -> Soc.var_expr -> string) = @@ -56,7 +81,8 @@ fun soc vi vo -> | Slice _, _ | _, Slice _ -> assert false | _,_ -> let left = string_of_var_expr soc vi in - let left = if is_soc_output vi soc then "*"^left else left in + let left = if is_soc_output vi soc && ve_not_an_array vi && ve_not_a_field vi + then "*"^left else left in gen_assign (Soc.data_type_of_var_expr vi) left (string_of_var_expr soc vo) (Printf.sprintf "sizeof(%s)" (string_of_var_expr soc vo)) @@ -111,12 +137,14 @@ let (inline_soc : Soc.t -> Soc.t -> Soc.var_expr list -> Soc.var_expr list -> s then let vel_in_str = List.map (string_of_var_expr soc) vel_in in let vel_in = List.map2 - (fun v s -> if is_soc_output v soc then "*"^s else s) vel_in vel_in_str + (fun v s -> if is_soc_output v soc && ve_not_an_array v + then "*"^s else s) vel_in vel_in_str in let vel_out_str = List.map (string_of_var_expr soc) vel_out in let vel_out = List.map2 - (fun v s -> if is_soc_output v soc then "*"^s else s) vel_out vel_out_str + (fun v s -> if is_soc_output v soc && ve_not_an_array v + then "*"^s else s) vel_out vel_out_str in Some (Soc2cPredef.gen_call called_soc_name soc vel_out vel_in) else @@ -140,11 +168,17 @@ let (gen_step_call : Soc.t -> Soc.t -> Soc.var_expr list -> Soc.var_expr list -> | None -> let vel_in_str = List.map (string_of_var_expr soc) vel_in in let vel_in = - List.map2 (fun v s -> if is_soc_output v soc then "*"^s else s) vel_in vel_in_str + List.map2 (fun v s -> if is_soc_output v soc && ve_not_an_array v + then "*"^s else s) vel_in vel_in_str in let vel_out_str = List.map (string_of_var_expr soc) vel_out in let vel_out = - List.map2 (fun v s -> if is_soc_output v soc then s else "&"^s) vel_out vel_out_str + List.map2 + (fun v s -> + if (not (is_soc_output v soc) && ve_not_an_array v ) + then "&"^s + else s) + vel_out vel_out_str in let step_arg = if step_arg = "" then [] else [step_arg] in let step_arg = String.concat "," (vel_in@vel_out@step_arg) in @@ -190,13 +224,14 @@ let (get_step_prototype : Soc.step_method -> Soc.t -> string * string) = let outputs = SocUtils.filter_step_params sm.Soc.idx_outs outputs in let to_param_decl is_an_output (id,dt) = match is_an_output, dt with - | true, Data.Array(_,_) (* arrays are already pointers... *) + | true, Data.Array(_,_) -> Soc2cUtil.data_type_to_c dt "" ^"/*out*/" + (* arrays are already pointers... *) | false, _ -> Soc2cUtil.data_type_to_c dt "" | true, _ -> Soc2cUtil.data_type_to_c dt "*" in let to_param out (id,dt) = match out, dt with - | true, Data.Array(_,_) + | true, Data.Array(_,_) -> Soc2cUtil.data_type_to_c dt id ^"/*out*/" | false, _ -> Soc2cUtil.data_type_to_c dt id | true, _ -> Soc2cUtil.data_type_to_c dt ("*"^id) in diff --git a/src/soc2cStack.mli b/src/soc2cStack.mli index f463499580b5ff7a8bb78df3d59fd0af9f544df2..5027868eb3cb04d6f837e54da9c258d3f5b942cf 100644 --- a/src/soc2cStack.mli +++ b/src/soc2cStack.mli @@ -1,8 +1,13 @@ -(* Time-stamp: <modified the 09/02/2015 (at 16:44) by Erwan Jahier> *) +(* Time-stamp: <modified the 12/02/2015 (at 17:14) by Erwan Jahier> *) (** Gathers all entities (functions, types) that implement the heap-based C generator. *) + +(* [is_soc_output ve soc] is true if ve is an output of soc *) +val is_soc_output : Soc.var_expr -> Soc.t -> bool + + (** [gen_assign t vi vo size] generated the C code that assign vo to vi, using memcpy or = depending on the type t *) val gen_assign : Data.t -> string -> string -> string -> string diff --git a/src/socPredef2cStack.ml b/src/socPredef2cStack.ml index 3a4c219eb42ab2950f7b8f15a0ae0e173e247cfd..701368004f9e1ffebe96cb96dec25eb06de6dbe9 100644 --- a/src/socPredef2cStack.ml +++ b/src/socPredef2cStack.ml @@ -1,5 +1,5 @@ -(* Time-stamp: <modified the 11/02/2015 (at 17:53) by Erwan Jahier> *) +(* Time-stamp: <modified the 12/02/2015 (at 17:17) by Erwan Jahier> *) open Data open Soc @@ -189,6 +189,8 @@ let rec type_elt_of_array = function | Data.Array(t,_) -> t | Data.Alias(_,t) -> type_elt_of_array t | _ -> assert false +let (not_an_array : Data.t -> bool) = function + | Data.Array(_,_) -> false | _ -> true (* exported *) @@ -201,7 +203,11 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) = | [] -> ( let (array_index : int -> Soc.var -> Soc.var_expr) = fun i (vn,vt) -> (* Var(Printf.sprintf "%s[%d]" vn i, type_elt_of_array vt) *) - Index(Var (vn,Data.Array(vt,i)),i,vt) + let vt_elt = match vt with + | Data.Array(vt,_) -> vt + | _ -> assert false + in + Index(Var (vn,vt),i,vt_elt) in Array.make n "", Array.make n (get_ctx_name it_soc.key), @@ -214,7 +220,11 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) = let ctx = List.map (fun sn -> ("ctx->"^(id2s sn))) inst_names in let (array_index : int -> var -> Soc.var_expr) = fun i (vn,vt) -> - Index(Var (Printf.sprintf "%s" vn, Data.Array(vt,i)),i,vt) + let vt_elt = match vt with + | Data.Array(vt,_) -> vt + | _ -> assert false + in + Index(Var (Printf.sprintf "%s" vn, Data.Array(vt,i)),i,vt_elt) (* Var(Printf.sprintf "%s[%d]" vn i,vt) *) in Array.of_list step_args, @@ -244,7 +254,11 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) = if iterator <> "map" then ( let type_in = (snd (List.hd iter_inputs)) in let a_in = (fst (List.hd iter_inputs)) in - let a_out = "*" ^ (fst (List.hd iter_outputs)) in + let a_out = + let o,t = List.hd iter_outputs in + if Soc2cStack.is_soc_output (Var(o,t)) soc && not_an_array t + then "*"^o else o + in buff := !buff^(Soc2cStack.gen_assign type_in a_out a_in (Printf.sprintf "sizeof(%s)" a_in)) (* a_out=a_n *) ); diff --git a/test/lus2lic.sum b/test/lus2lic.sum index ece0a148a03d1239e5b00abd067ed58fe3b126c5..c39ff13203f3ea54770ce9beb7e4ffb375125d4c 100644 --- a/test/lus2lic.sum +++ b/test/lus2lic.sum @@ -1,5 +1,5 @@ ==> lus2lic0.sum <== -Test Run By jahier on Thu Feb 12 10:46:28 +Test Run By jahier on Thu Feb 12 17:26:11 Native configuration is x86_64-unknown-linux-gnu === lus2lic0 tests === @@ -63,7 +63,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 Thu Feb 12 10:46:30 +Test Run By jahier on Thu Feb 12 17:26:02 Native configuration is x86_64-unknown-linux-gnu === lus2lic1 tests === @@ -397,7 +397,7 @@ PASS: gcc -o multipar.exec multipar_multipar.c multipar_multipar_loop.c PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c multipar.lus {} ==> lus2lic2.sum <== -Test Run By jahier on Thu Feb 12 10:46:32 +Test Run By jahier on Thu Feb 12 17:26:07 Native configuration is x86_64-unknown-linux-gnu === lus2lic2 tests === @@ -727,7 +727,7 @@ PASS: gcc -o zzz2.exec zzz2_zzz2.c zzz2_zzz2_loop.c PASS: /home/jahier/lus2lic/test/../utils/compare_exec_and_2c zzz2.lus {} ==> lus2lic3.sum <== -Test Run By jahier on Thu Feb 12 10:46:34 +Test Run By jahier on Thu Feb 12 17:26:05 Native configuration is x86_64-unknown-linux-gnu === lus2lic3 tests === @@ -1230,7 +1230,7 @@ PASS: ./myec2c {-o multipar.c multipar.ec} PASS: /home/jahier/lus2lic/test/../utils/test_lus2lic_no_node multipar.lus {} ==> lus2lic4.sum <== -Test Run By jahier on Thu Feb 12 10:46:37 +Test Run By jahier on Thu Feb 12 17:26:09 Native configuration is x86_64-unknown-linux-gnu === lus2lic4 tests === @@ -1727,11 +1727,11 @@ 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 6 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 47 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 74 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 45 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 77 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 45 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 71 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 48 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 76 seconds * Ref time: * Quick time (-j 4): -0.04user 0.02system 1:25.96elapsed 0%CPU (0avgtext+0avgdata 5100maxresident)k -160inputs+0outputs (0major+5549minor)pagefaults 0swaps +0.02user 0.03system 1:23.36elapsed 0%CPU (0avgtext+0avgdata 5108maxresident)k +160inputs+0outputs (0major+5552minor)pagefaults 0swaps diff --git a/test/lus2lic.time b/test/lus2lic.time index 34882fa3e5d98dbd004e2b40a2b8a559bb6b058d..d9b79b59e204c8e9cced531d5f55eadee80ef6d1 100644 --- a/test/lus2lic.time +++ b/test/lus2lic.time @@ -1,9 +1,9 @@ lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 6 seconds -lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 47 seconds -lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 74 seconds -lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 45 seconds -lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 77 seconds +lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 45 seconds +lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 71 seconds +lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 48 seconds +lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 76 seconds * Ref time: * Quick time (-j 4): -0.04user 0.02system 1:25.96elapsed 0%CPU (0avgtext+0avgdata 5100maxresident)k -160inputs+0outputs (0major+5549minor)pagefaults 0swaps +0.02user 0.03system 1:23.36elapsed 0%CPU (0avgtext+0avgdata 5108maxresident)k +160inputs+0outputs (0major+5552minor)pagefaults 0swaps diff --git a/test/should_work/ELMU.lus b/test/should_work/ELMU.lus index 39159460ee029991ebf34ad4286500001c0ff2b8..47d510240e1a904beb0799094054af905788c590 100644 --- a/test/should_work/ELMU.lus +++ b/test/should_work/ELMU.lus @@ -79,12 +79,12 @@ type T_ComChgNBC = T_ComChg^NBC; -- Utilitaires ---------------------------------------- -- "copie" d'un tableau a l'identite -node id(elt_in : int) returns (elt_out : int); -- OK +function id(elt_in : int) returns (elt_out : int); -- OK let elt_out = elt_in; tel -- remplissage d'un tableau avec 0; 1; 2; ... -node incr_acc( acc_in : int) returns ( acc_out: int; res : int); -- OK +function incr_acc( acc_in : int) returns ( acc_out: int; res : int); -- OK let res = acc_in; acc_out = res + 1; @@ -97,7 +97,7 @@ tel ------------------------------------------------- -- Extraction des infos globales pour traiter_chg ------------------------------------------------- -node extract_info_chg_glob (EntreeGlob : T_EntreeGlob) +function extract_info_chg_glob (EntreeGlob : T_EntreeGlob) returns (InfoChgGlob : T_InfoChgGlob); -- OK let InfoChgGlob = T_InfoChgGlob {chg2gen = map<<id;NBC>>(EntreeGlob.chg2gen)}; @@ -114,13 +114,13 @@ tel ------------------------------------------------------ -- Extraction des infos individuelles pour traiter_chg ------------------------------------------------------ -node int2InfoChgIndiv (m : int) -- OK +function int2InfoChgIndiv (m : int) -- OK returns (InfoChgIndiv : T_InfoChgIndiv); let InfoChgIndiv = T_InfoChgIndiv{mesure_chg = m}; tel -node extract_tab_info_chg_indiv (EntreeGlob : T_EntreeGlob) -- OK +function extract_tab_info_chg_indiv (EntreeGlob : T_EntreeGlob) -- OK returns (TabInfoChgIndiv : T_InfoChgIndiv^NBC); let TabInfoChgIndiv = map<<int2InfoChgIndiv; NBC>>(EntreeGlob.mesure_chgs); @@ -136,7 +136,7 @@ tel ------------------------------------------------- -- Extraction des infos globales pour traiter_gen ------------------------------------------------- -node extract_info_gen_glob (EntreeGlob : T_EntreeGlob) -- OK +function extract_info_gen_glob (EntreeGlob : T_EntreeGlob) -- OK returns (InfoGenGlob : T_InfoGenGlob); let InfoGenGlob = T_InfoGenGlob{ @@ -149,13 +149,13 @@ tel ------------------------------------------------------ -- Extraction des infos individuelles pour traiter_gen ------------------------------------------------------ -node int2InfoGenIndiv (m : int) -- OK +function int2InfoGenIndiv (m : int) -- OK returns (InfoGenIndiv : T_InfoGenIndiv); let InfoGenIndiv = T_InfoGenIndiv{mesure_gen = m}; tel -node extract_tab_info_gen_indiv (EntreeGlob : T_EntreeGlob) -- OK +function extract_tab_info_gen_indiv (EntreeGlob : T_EntreeGlob) -- OK returns (TabInfoGenIndiv : T_InfoGenIndiv^NBG); let TabInfoGenIndiv = map<<int2InfoGenIndiv; NBG>>(EntreeGlob.mesure_gens); @@ -176,7 +176,7 @@ tel --qui est lui-meme un map de fusion_une_com --------------------------------------------------- -- accessoire : prendre (ou non) une ComChg -node fusion_une_com (in_com : T_ComChg ; --- OK +function fusion_une_com (in_com : T_ComChg ; --- OK cur_com : T_ComChg ; cur_val : bool) returns (out_com : T_ComChg); @@ -185,7 +185,7 @@ let tel -- accessoire : completer un tableau de ComChg modulo un tableau de bool -node fusion_tab_com (acc_in : T_ComChg^NBC; -- OK +function fusion_tab_com (acc_in : T_ComChg^NBC; -- OK TabCom : T_ComChg^NBC; TabVal : bool^NBC) returns (acc_out : T_ComChg^NBC); @@ -194,7 +194,7 @@ let tel -- Le VRAI noeud de fusion -node fusion_com (AllTabComChg : T_ComChgNBC^NBG ; -- OK +function fusion_com (AllTabComChg : T_ComChgNBC^NBG ; -- OK AllTabComVal : BOOLNBC^NBG) returns (TabComChg : T_ComChgNBC); var @@ -211,13 +211,13 @@ tel --Maquette du noeud traite_chg : -- on fait abstraction de la fonctionnalite ---------------------------------------------------- -node trChItere(acc_in : int; elt : int) returns (acc_out : int); -- OK +function trChItere(acc_in : int; elt : int) returns (acc_out : int); -- OK -- Pour l'instant, calcul du max let acc_out = if(acc_in>elt) then acc_in else elt; tel -node traite_charge(InfoChgIndiv : T_InfoChgIndiv; -- un entier --OK +function traite_charge(InfoChgIndiv : T_InfoChgIndiv; -- un entier --OK InfoChgGlob : T_InfoChgGlob)-- un tableau de NBC entier returns (EtatCharge : T_EtatCharge);-- un entier -- Pour l'instant, determine le max @@ -238,7 +238,7 @@ tel -- On a juste mis le calcul du TabComVal, -- le reste etant realise par un ``noeud'' abstrait ---------------------------------------------------- -node traite_genCore_itere(acc_in : int; -- OK +function traite_genCore_itere(acc_in : int; -- OK elt1 : bool; elt2 : int) returns (acc_out : int; elt : int); @@ -249,7 +249,7 @@ let acc_out = acc_in; tel -node traite_gen_core (indice_gen : int ; -- OK +function traite_gen_core (indice_gen : int ; -- OK InfoGenIndiv : T_InfoGenIndiv ; InfoGenGlob : T_InfoGenGlob ; TabEtatCharge : T_EtatCharge^NBC; @@ -263,7 +263,7 @@ tel -node egal_indice(indice, val : int) returns (r : bool); -- OK +function egal_indice(indice, val : int) returns (r : bool); -- OK let r = val = indice; tel @@ -272,7 +272,7 @@ tel -node traite_gen(indice_gen : int ; -- OK +function traite_gen(indice_gen : int ; -- OK InfoGenIndiv : T_InfoGenIndiv ; InfoGenGlob : T_InfoGenGlob ; TabEtatCharge : T_EtatCharge^NBC; @@ -298,7 +298,7 @@ tel -node copie(acc_in : int) -- OK +function copie(acc_in : int) -- OK returns (acc_out : int; elt : int); let acc_out = acc_in; @@ -313,7 +313,7 @@ tel ------------------------------------------------------------------- -- extraction des charges a partir des Entrees globales ------------------------------------------------------------------- -node extrCharge(EntreeGlob : T_EntreeGlob) -- OK +function extrCharge(EntreeGlob : T_EntreeGlob) -- OK returns (TabInfoChgIndiv : T_InfoChgIndiv^NBC; TabInfoChgGlob : T_InfoChgGlob^NBC); let @@ -337,7 +337,7 @@ tel ------------------------------------------------------------------- -- extraction des generateurs a partir des Entrees globales ------------------------------------------------------------------- -node extrGen(EntreeGlob : T_EntreeGlob) -- OK +function extrGen(EntreeGlob : T_EntreeGlob) -- OK returns (TabInfoGenIndiv : T_InfoGenIndiv^NBG; TabInfoGenGlob : T_InfoGenGlob^NBG; TabIndiceGen : INTNBG;); @@ -364,7 +364,7 @@ tel ----------------------------------------------------------------- -- Traitement Global des charges ----------------------------------------------------------------- -node traiteChg(TabInfoChgIndiv : T_InfoChgIndiv^NBC; -- tableau de NBC entiers --OK +function traiteChg(TabInfoChgIndiv : T_InfoChgIndiv^NBC; -- tableau de NBC entiers --OK TabInfoChgGlob : T_InfoChgGlob^NBC) -- tableau de NBC*NBC entiers returns (TabEtatCharge : T_EtatCharge^NBC);-- tableau de NBC entiers let @@ -384,7 +384,7 @@ tel ------------------------------------------------------------------- -- Traitement Global des generateurs ------------------------------------------------------------------- -node traiteGen(TabIndiceGen : INTNBG; -- OK +function traiteGen(TabIndiceGen : INTNBG; -- OK TabInfoGenIndiv : T_InfoGenIndiv^NBG; TabInfoGenGlob : T_InfoGenGlob^NBG; TabEtatCharge : T_EtatCharge^NBC) @@ -407,7 +407,7 @@ tel ------------------------------------------------------- -- Noeud principal ------------------------------------------------------- -node ELMU(EntreeGlob : T_EntreeGlob) --Contient (au moins) les valeurs des charges et des generateurs du systeme +function ELMU(EntreeGlob : T_EntreeGlob) --Contient (au moins) les valeurs des charges et des generateurs du systeme -- OK OK OK returns (TabComChg : T_ComChg^NBC); var