Skip to content
Snippets Groups Projects
Commit 41fb42c6 authored by Erwan Jahier's avatar Erwan Jahier
Browse files

Soc2c: make sure to use memcpy (ie, gen_assign) everywhere it is necessary.

I've sligthly modified the profile of gen_assign to explicitly ask for the
size of the data structure to be copied.

nb:  unexpected failures 131 -> 127
parent cda63b94
No related branches found
No related tags found
No related merge requests found
(* Time-stamp: <modified the 20/06/2014 (at 17:23) by Erwan Jahier> *)
(* Time-stamp: <modified the 24/06/2014 (at 14:28) by Erwan Jahier> *)
(* exported *)
let rec (gen_assign : Data.t -> string -> string -> string) =
fun t vi vo ->
let rec (gen_assign : Data.t -> string -> string -> string -> string) =
fun t vi vo size ->
match t with
| Alias(_,t) -> gen_assign t vi vo
| Alias(_,t) -> gen_assign t vi vo size
| Enum _
| Struct(_) (* should I rather use memcpy for struct? *)
| Bool | Int | Real ->
Printf.sprintf " %s = %s;\n" vi vo
| Alpha(_) (* dead code ? *)
| Array(_) ->
Printf.sprintf " memcpy(%s, %s, sizeof(%s));\n" vi vo vo
Printf.sprintf " memcpy(%s, %s, %s);\n" vi vo size
| Extern (id) ->
(* what should i do for extern types? Ask the user to provide the
......@@ -48,7 +48,7 @@ let (gen_step_call : Soc.t -> Soc.t -> string list -> string list ->
let inputs = fst called_soc.profile in
let l = try (
List.map2 (fun (name, t) ve ->
gen_assign t (Printf.sprintf "%s.%s" ctx name) ve)
gen_assign t (Printf.sprintf "%s.%s" ctx name) ve (Printf.sprintf "sizeof(%s)" ve))
inputs vel_in
) with _ -> assert false (* are all parameters necessaryly used? *)
in
......@@ -59,9 +59,9 @@ let (gen_step_call : Soc.t -> Soc.t -> string list -> string list ->
let outputs = snd called_soc.profile in
let l = try (
List.map2
(fun (name,t) ve ->
gen_assign t ve
(Printf.sprintf "%s.%s" ctx name)) outputs vel_out
(fun (name,t) ve ->
let ve2 = Printf.sprintf "%s.%s" ctx name in
gen_assign t ve ve2 (Printf.sprintf "sizeof(%s)" ve2)) outputs vel_out
) with _ -> assert false
in
(String.concat "" l) ^"\n"
......
(* Time-stamp: <modified the 23/06/2014 (at 16:54) by Erwan Jahier> *)
(* Time-stamp: <modified the 24/06/2014 (at 15:22) by Erwan Jahier> *)
open Data
open Soc
......@@ -6,6 +6,9 @@ open Soc2cIdent
(* A boring but simple module... *)
(* XXX should i use gen_assign here? for the time being, its useless as
there is no binop (nor unop) over arrays.
*)
let (lustre_binop : Soc.key -> string -> string) =
fun sk op ->
let ctx = get_ctx_name sk in
......@@ -14,24 +17,31 @@ let (lustre_binop : Soc.key -> string -> string) =
let (lustre_unop : Soc.key -> string -> string) =
fun sk op ->
let ctx = get_ctx_name sk in
(* use gen_assign? *)
Printf.sprintf" %s.z = %s %s.x;\n" ctx op ctx
let (lustre_ite : Soc.key -> string) =
fun sk ->
let ctx = get_ctx_name sk in
Printf.sprintf" %s.z = (%s.c)? %s.xt : %s.xe;\n" ctx ctx ctx ctx
let (_,_::t::_,_) = sk in
(* Printf.sprintf" %s.z = (%s.c)? %s.xt : %s.xe;\n" ctx ctx ctx ctx *)
Soc2cUtil.gen_assign t (Printf.sprintf "%s.z" ctx)
(Printf.sprintf "(%s.c)? %s.xt : %s.xe" ctx ctx ctx)
(Printf.sprintf "sizeof(%s.z)" ctx)
let (lustre_impl : Soc.key -> string) =
fun sk ->
let ctx = get_ctx_name sk in
Printf.sprintf" %s.z = (!%s.x || %s.y);\n" ctx ctx ctx
(* use gen_assign? *)
Printf.sprintf" %s.z = (!%s.x || %s.y);\n" ctx ctx ctx
let (lustre_arrow : Soc.key -> string) =
fun sk ->
(* let ctx = get_ctx_name sk in *)
(* let x,y,z = ctx^".x", ctx^".y", ctx^".z" in *)
let x,y,z = "ctx->x", "ctx->y", "ctx->z" in
(Printf.sprintf" %s = (ctx->_memory)? %s : %s;\n" z x y) ^
let (_,t::_,_) = sk in
let vo = Printf.sprintf"((ctx->_memory)? %s : %s)" x y in
let size = Printf.sprintf "sizeof(%s)" x in
(Soc2cUtil.gen_assign t z vo size) ^
(" ctx->_memory = _false;\n")
let (lustre_merge : Soc.key -> string) =
......@@ -66,7 +76,7 @@ let (lustre_hat : Soc.key -> string) =
let buff = ref "" in
for j=0 to i-1 do
buff := !buff^(Soc2cUtil.gen_assign t (Printf.sprintf "%s.z[%d]" ctx j)
(Printf.sprintf "%s.x" ctx));
(Printf.sprintf "%s.x" ctx) (Printf.sprintf "sizeof(%s.x)" ctx));
done;
!buff
......@@ -80,7 +90,8 @@ let (lustre_array: Soc.key -> string) =
let buff = ref "" in
for j=0 to i-1 do
buff := !buff^(Soc2cUtil.gen_assign t (Printf.sprintf "%s.z[%d]" ctx j)
(Printf.sprintf "%s.x%d" ctx (j+1)));
(Printf.sprintf "%s.x%d" ctx (j+1))
(Printf.sprintf "sizeof(%s.x%d)" ctx (j+1)));
done;
!buff
......@@ -122,7 +133,9 @@ let (lustre_slice: Soc.key -> string) =
for i = b to e do
if (i-b) mod step = 0 then (
buff := !buff^(Soc2cUtil.gen_assign t (Printf.sprintf "%s.z[%d]" ctx !j)
(Printf.sprintf "%s.x[%d]" ctx i));
(Printf.sprintf "%s.x[%d]" ctx i)
(Printf.sprintf "sizeof(%s.x[%d])" ctx i)
);
incr j);
done;
!buff
......@@ -254,7 +267,8 @@ let (get_iterator : Soc.t -> string -> Soc.t -> int -> string) =
let type_in = snd (List.hd iter_inputs) in
let a_in = ctx_access ^ (fst (List.hd iter_inputs)) in
let a_out = ctx_access ^ (fst (List.hd iter_outputs)) in
buff := !buff^(Soc2cUtil.gen_assign type_in a_out a_in) (* a_out=a_n *)
buff := !buff^(Soc2cUtil.gen_assign type_in a_out a_in
(Printf.sprintf "sizeof(%s)" a_in)) (* a_out=a_n *)
);
!buff
......
Test Run By jahier on Tue Jun 24 15:01:05 2014
Test Run By jahier on Tue Jun 24 15:23:11 2014
Native configuration is i686-pc-linux-gnu
=== lus2lic tests ===
......@@ -55,7 +55,7 @@ PASS: ./lus2lic {-ec -o /tmp/Gyroscope2.ec should_work/Gyroscope2.lus}
PASS: ./myec2c {-o /tmp/Gyroscope2.c /tmp/Gyroscope2.ec}
FAIL: Try to compare lus2lic -exec and ecexe: ../utils/test_lus2lic_no_node should_work/Gyroscope2.lus
PASS: ./lus2lic {-2c should_work/Gyroscope2.lus -n Gyroscope2}
FAIL: Check that the generated C code compiles : gcc Gyroscope2_Gyroscope2.c Gyroscope2_Gyroscope2_loop.c
PASS: gcc Gyroscope2_Gyroscope2.c Gyroscope2_Gyroscope2_loop.c
PASS: ./lus2lic {-o /tmp/mouse2.lic should_work/mouse2.lus}
PASS: ./lus2lic {-ec -o /tmp/mouse2.ec should_work/mouse2.lus}
PASS: ./myec2c {-o /tmp/mouse2.c /tmp/mouse2.ec}
......@@ -365,7 +365,7 @@ PASS: ./lus2lic {-ec -o /tmp/is_stable.ec should_work/is_stable.lus}
PASS: ./myec2c {-o /tmp/is_stable.c /tmp/is_stable.ec}
PASS: ../utils/test_lus2lic_no_node should_work/is_stable.lus
PASS: ./lus2lic {-2c should_work/is_stable.lus -n is_stable}
FAIL: Check that the generated C code compiles : gcc is_stable_is_stable.c is_stable_is_stable_loop.c
PASS: gcc is_stable_is_stable.c is_stable_is_stable_loop.c
PASS: ./lus2lic {-o /tmp/test_clash.lic should_work/test_clash.lus}
PASS: ./lus2lic {-ec -o /tmp/test_clash.ec should_work/test_clash.lus}
PASS: ./myec2c {-o /tmp/test_clash.c /tmp/test_clash.ec}
......@@ -1156,7 +1156,7 @@ PASS: ./lus2lic {-ec -o /tmp/hanane.ec should_work/hanane.lus}
PASS: ./myec2c {-o /tmp/hanane.c /tmp/hanane.ec}
FAIL: Try to compare lus2lic -exec and ecexe: ../utils/test_lus2lic_no_node should_work/hanane.lus
PASS: ./lus2lic {-2c should_work/hanane.lus -n hanane}
FAIL: Check that the generated C code compiles : gcc hanane_hanane.c hanane_hanane_loop.c
PASS: gcc hanane_hanane.c hanane_hanane_loop.c
PASS: ./lus2lic {-o /tmp/lustre.lic should_work/lustre.lus}
PASS: ./lus2lic {-ec -o /tmp/lustre.ec should_work/lustre.lus}
PASS: ./myec2c {-o /tmp/lustre.c /tmp/lustre.ec}
......@@ -1280,7 +1280,7 @@ PASS: ./lus2lic {-ec -o /tmp/arrays.ec should_work/arrays.lus}
PASS: ./myec2c {-o /tmp/arrays.c /tmp/arrays.ec}
PASS: ../utils/test_lus2lic_no_node should_work/arrays.lus
PASS: ./lus2lic {-2c should_work/arrays.lus -n arrays}
FAIL: Check that the generated C code compiles : gcc arrays_arrays.c arrays_arrays_loop.c
PASS: gcc arrays_arrays.c arrays_arrays_loop.c
PASS: ./lus2lic {-o /tmp/nc3.lic should_work/nc3.lus}
PASS: ./lus2lic {-ec -o /tmp/nc3.ec should_work/nc3.lus}
PASS: ./myec2c {-o /tmp/nc3.c /tmp/nc3.ec}
......@@ -1482,9 +1482,9 @@ XPASS: Test bad programs (semantics): lus2lic {-o /tmp/bug.lic should_fail/seman
=== lus2lic Summary ===
# of expected passes 1281
# of unexpected failures 131
# of expected passes 1285
# of unexpected failures 127
# of unexpected successes 21
# of expected failures 37
testcase ./lus2lic.tests/non-reg.exp completed in 137 seconds
testcase ./lus2lic.tests/non-reg.exp completed in 138 seconds
testcase ./lus2lic.tests/progression.exp completed in 0 seconds
testcase ./lus2lic.tests/non-reg.exp completed in 137 seconds
testcase ./lus2lic.tests/non-reg.exp completed in 138 seconds
testcase ./lus2lic.tests/progression.exp completed in 0 seconds
......@@ -51,52 +51,46 @@ http://www.di.ens.fr/~pouzet/bib/lctes12.pdf
** TODO les programmes qui ne passent pas le test:
1. file:test/should_work/Gyroscope2.lus
2. file:test/should_work/mouse2.lus
3. file:test/should_work/mappredef.lus
4. file:test/should_work/predefOp.lus
5. file:test/should_work/matrice2.lus
6. file:test/should_work/ply02.lus
7. file:test/should_work/is.lus
8. file:test/should_work/onlyroll2.lus
9. file:test/should_work/morel3.lus
10. file:test/should_work/ply03.lus
11. file:test/should_work/plus.lus
12. file:test/should_work/xx.lus
13. file:test/should_work/call07.lus
14. file:test/should_work/morel5.lus
15. file:test/should_work/test.lus
16. file:test/should_work/clock.lus
17. file:test/should_work/morel4.lus
18. file:test/should_work/bad.lus
19. file:test/should_work/onlyroll.lus
20. file:test/should_work/mapinf.lus
21. file:test/should_work/over2.lus
22. file:test/should_work/over3.lus
23. file:test/should_work/test.lus
24. file:test/should_work/carV2.lus
25. file:test/should_work/test.lus
26. file:test/should_work/CURRENT.lus
27. file:test/should_work/left.lus
28. file:test/should_work/morel.lus
29. file:test/should_work/matrice.lus
30. file:test/should_work/exclusion.lus
31. file:test/should_work/pack1.lus
32. file:test/should_work/bob.lus
33. file:test/should_work/morel2.lus
34. file:test/should_work/xxx.lus
35. file:test/should_work/filliter.lus
36. file:test/should_work/Gyroscope.lus
37. file:test/should_work/mapdeRed.lus
38. file:test/should_work/simpleRed.lus
39. file:test/should_work/hanane.lus
40. file:test/should_work/ck7.lus
41. file:test/should_work/redoptest.lus
42. file:test/should_work/cond01.lus
43. file:test/should_work/arrays.lus
44. file:test/should_work/overload.lus
45. file:test/should_work/simple.lus
46. file:test/should_work/minus.lus
1. file:test/should_work/mouse2.lus lus2lic -2c should_work/mouse2.lus -n mouse2
2. file:test/should_work/mappredef.lus lus2lic -2c should_work/mappredef.lus -n mappredef
3. file:test/should_work/predefOp.lus lus2lic -2c should_work/predefOp.lus -n predefOp
4. file:test/should_work/matrice2.lus lus2lic -2c should_work/matrice2.lus -n matrice2
5. file:test/should_work/ply02.lus lus2lic -2c should_work/ply02.lus -n ply02
6. file:test/should_work/onlyroll2.lus lus2lic -2c should_work/onlyroll2.lus -n onlyroll2
7. file:test/should_work/morel3.lus lus2lic -2c should_work/morel3.lus -n morel3
8. file:test/should_work/ply03.lus lus2lic -2c should_work/ply03.lus -n ply03
9. file:test/should_work/plus.lus lus2lic -2c should_work/plus.lus -n plus
10. file:test/should_work/xx.lus lus2lic -2c should_work/xx.lus -n xx
11. file:test/should_work/call07.lus lus2lic -2c should_work/call07.lus -n call07
12. file:test/should_work/test.lus lus2lic -2c should_work/test.lus -n test
13. file:test/should_work/clock.lus lus2lic -2c should_work/clock.lus -n clock
14. file:test/should_work/morel4.lus lus2lic -2c should_work/morel4.lus -n morel4
15. file:test/should_work/bad.lus lus2lic -2c should_work/bad.lus -n bad
16. file:test/should_work/onlyroll.lus lus2lic -2c should_work/onlyroll.lus -n onlyroll
17. file:test/should_work/mapinf.lus lus2lic -2c should_work/mapinf.lus -n mapinf
18. file:test/should_work/over2.lus lus2lic -2c should_work/over2.lus -n over2
19. file:test/should_work/over3.lus lus2lic -2c should_work/over3.lus -n over3
20. file:test/should_work/test.lus lus2lic -2c should_work/test.lus -n test
21. file:test/should_work/carV2.lus lus2lic -2c should_work/carV2.lus -n carV2
22. file:test/should_work/test.lus lus2lic -2c should_work/test.lus -n test
23. file:test/should_work/CURRENT.lus lus2lic -2c should_work/CURRENT.lus -n CURRENT
24. file:test/should_work/left.lus lus2lic -2c should_work/left.lus -n left
25. file:test/should_work/morel.lus lus2lic -2c should_work/morel.lus -n morel
26. file:test/should_work/matrice.lus lus2lic -2c should_work/matrice.lus -n matrice
27. file:test/should_work/exclusion.lus lus2lic -2c should_work/exclusion.lus -n exclusion
28. file:test/should_work/pack1.lus lus2lic -2c should_work/pack1.lus -n pack1
29. file:test/should_work/bob.lus lus2lic -2c should_work/bob.lus -n bob
30. file:test/should_work/morel2.lus lus2lic -2c should_work/morel2.lus -n morel2
31. file:test/should_work/xxx.lus lus2lic -2c should_work/xxx.lus -n xxx
32. file:test/should_work/filliter.lus lus2lic -2c should_work/filliter.lus -n filliter
33. file:test/should_work/mapdeRed.lus lus2lic -2c should_work/mapdeRed.lus -n mapdeRed
34. file:test/should_work/simpleRed.lus lus2lic -2c should_work/simpleRed.lus -n simpleRed
35. file:test/should_work/ck7.lus lus2lic -2c should_work/ck7.lus -n ck7
36. file:test/should_work/redoptest.lus lus2lic -2c should_work/redoptest.lus -n redoptest
37. file:test/should_work/cond01.lus lus2lic -2c should_work/cond01.lus -n cond01
38. file:test/should_work/overload.lus lus2lic -2c should_work/overload.lus -n overload
39. file:test/should_work/simple.lus lus2lic -2c should_work/simple.lus -n simple
40. file:test/should_work/minus.lus lus2lic -2c should_work/minus.lus -n minus
* Packages, modeles, etc.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment