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

soc2c: add an eponymous --2c-no-switch (hidden) option

parent 244b252d
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,7 @@ Executable lus2lic
BuildDepends: str,unix,num,rdbg-plugin
Build:true
CompiledObject: native
# CompiledObject: byte
# CompiledObject: byte
# to use ocamldebug:
# - here: set CompiledObject from native to byte
......
(* Time-stamp: <modified the 03/10/2014 (at 11:26) by Erwan Jahier> *)
(* Time-stamp: <modified the 09/10/2014 (at 16:33) by Erwan Jahier> *)
(*
Le manager d'argument adapt de celui de lutin, plus joli
N.B. solution un peu batarde : les options sont stockes, comme avant, dans Global,
......@@ -54,6 +54,7 @@ type global_opt = {
mutable line_num : int;
mutable line_start_pos : int;
mutable c_code_gen : c_code_gen_kind;
mutable soc2c_no_switch : bool;
}
let (global_opt:global_opt) =
{
......@@ -68,6 +69,7 @@ let (global_opt:global_opt) =
current_file = "";
expand_enums = AsInt;
c_code_gen = Heap;
soc2c_no_switch = false
}
let (make_opt : unit -> t) =
fun () ->
......@@ -345,6 +347,11 @@ let mkoptab (opt:t) : unit = (
["Test the syntactic analysis"]
;
*)
mkopt opt ~hide:true
["--2c-no-switch"]
(Arg.Unit (fun () -> global_opt.soc2c_no_switch <-true))
["Use if-then-else instead of switch when generating C codes"]
;
mkopt opt ~hide:true
["-interface"]
(Arg.Unit (fun () -> opt.print_interface<-true))
......
......@@ -51,6 +51,7 @@ type global_opt = {
mutable line_num : int;
mutable line_start_pos : int;
mutable c_code_gen : c_code_gen_kind;
mutable soc2c_no_switch : bool;
}
val paranoid : Verbose.flag
......
(** Automatically generated from Makefile *)
let tool = "lus2lic"
let branch = "(no"
let commit = "536"
let sha_1 = "6c4f5c6abdf19fe5558e0caed3388f80ed4f7cfb"
let commit = "537"
let sha_1 = "244b252de2d9002b9e87972eb28532fea2fedcad"
let str = (branch ^ "." ^ commit ^ " (" ^ sha_1 ^ ")")
let maintainer = "jahier@imag.fr"
(* Time-stamp: <modified the 08/10/2014 (at 18:35) by Erwan Jahier> *)
(* Time-stamp: <modified the 09/10/2014 (at 15:56) by Erwan Jahier> *)
(* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *)
......@@ -61,9 +61,9 @@ let (gao2c : Soc.tbl -> 'a soc_pp -> Soc.gao -> unit) =
match gao with
| Case(id, id_gao_l) -> (
let to_case_str (v,gaol) =
let gaol_str = (List.map gao2str gaol)@["break;"] in
let gaol_block = String.concat " " gaol_str in
sprintf "\n case %s:\n %s" (id2s v) gaol_block
let gaol_str = (List.map gao2str gaol) in
let gaol_block = String.concat "" gaol_str in
(id2s v), gaol_block
in
let cases = List.map to_case_str id_gao_l in
let ctx_opt =
......@@ -73,9 +73,7 @@ let (gao2c : Soc.tbl -> 'a soc_pp -> Soc.gao -> unit) =
else Soc2cUtil.M_IO)
else Soc2cUtil.Local
in
let str = sprintf " switch(%s){%s\n }\n"
(Soc2cDep.ctx_var ctx_opt id)
(String.concat "\n" cases) in
let str = Soc2cUtil.gen_c_switch (Soc2cDep.ctx_var ctx_opt id) cases in
str
)
| Call(vel_out, Assign, vel_in) -> (
......@@ -102,7 +100,6 @@ let (gao2c : Soc.tbl -> 'a soc_pp -> Soc.gao -> unit) =
raise Delete_C_files
);
Soc2cDep.gen_step_call sp.soc called_soc vel_out vel_in ctx "step" ""
)
in
sp.cput (gao2str gao)
......
(* Time-stamp: <modified the 03/10/2014 (at 10:21) by Erwan Jahier> *)
(* Time-stamp: <modified the 09/10/2014 (at 16:31) by Erwan Jahier> *)
open Soc2cIdent
open Data
......@@ -69,3 +69,20 @@ let rec (lic_type_to_c_old: Lic.type_ -> string -> string) =
| Lic.TypeVar Lic.AnyNum -> assert false
(* exported *)
let (gen_c_switch : string -> (string * string) list -> string) =
fun cond_var cases ->
if Lv6MainArgs.global_opt.soc2c_no_switch then
let l = List.map
(fun (v,code) -> Printf.sprintf " if (%s == %s) {\n%s\n } else {\n" cond_var v code)
cases
in
let switch = String.concat "" l in
let closing_curly = String.concat "" (List.map (fun _ -> "}") cases) in
Printf.sprintf "%s %s" switch closing_curly
else
let case_list = List.map
(fun (v, code) -> Printf.sprintf " case %s:\n%s break;\n" v code) cases
in
let cases = String.concat "" case_list in
Printf.sprintf " switch (%s){\n%s}\n" cond_var cases
(* Time-stamp: <modified the 03/10/2014 (at 10:17) by Erwan Jahier> *)
(* Time-stamp: <modified the 09/10/2014 (at 15:37) by Erwan Jahier> *)
(** *)
......@@ -10,3 +10,25 @@ 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*)
| Local (* for soc local variables *)
(** Dependending on Lv6MainArgs.global.soc2_no_switch
[gen_c_switch "c" ["case1","stmt1" ; "case2","stmt2" ; ... ]
returns
switch(c) {
case case1: stmt1 ; break;
case case2: stmt2 ; break;
...
}
or
if (c == case1) { stmt1 } else {
if (c == case2) { stmt2 } else {
...
nop;
}....}
*)
val gen_c_switch : string -> (string * string) list -> string
(* Time-stamp: <modified the 08/10/2014 (at 17:44) by Erwan Jahier> *)
(* Time-stamp: <modified the 09/10/2014 (at 16:09) by Erwan Jahier> *)
open Data
open Soc
......@@ -54,16 +54,17 @@ let (lustre_merge : Soc.key -> string) =
Printf.sprintf" %s.z = (%s.clk) ? %s.x1 : %s.x2 ;\n" ctx ctx ctx ctx
| Enum(en,el) ->
let case_list = List.mapi
(fun i e -> Printf.sprintf " case %s: %s.x%i; break;\n" (id2s e) ctx i) el
(fun i e -> (id2s e), Printf.sprintf "%s.x%i;" ctx i) el
in
let cases = String.concat "" case_list in
Printf.sprintf" %s.z =\n switch (%s.clk){\n%s}\n" ctx ctx cases
let switch = Soc2cUtil.gen_c_switch (Printf.sprintf"%s.clk" ctx) case_list in
Printf.sprintf" %s.z =\n %s" ctx switch
| Int ->
let case_list = List.mapi
(fun i e -> Printf.sprintf " case %i: %s.z = %s.x%i; break;\n" i ctx ctx i) tl
(fun i e -> (string_of_int i), (Printf.sprintf " %s.z = %s.x%i;" ctx ctx i))
tl
in
let cases = String.concat "" case_list in
Printf.sprintf" switch (%s.clk){\n%s}\n" ctx cases
Soc2cUtil.gen_c_switch (Printf.sprintf"%s.clk" ctx) case_list
| _ -> assert false
......
==> lus2lic0.sum <==
Test Run By jahier on Thu Oct 9 10:16:53
Test Run By jahier on Thu Oct 9 16:24:18
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 Oct 9 10:16:55
Test Run By jahier on Thu Oct 9 16:24:19
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 Oct 9 10:16:57
Test Run By jahier on Thu Oct 9 16:24:38
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 Oct 9 10:17:01
Test Run By jahier on Thu Oct 9 16:25:39
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 Oct 9 10:16:59
Test Run By jahier on Thu Oct 9 16:25:57
Native configuration is x86_64-unknown-linux-gnu
=== lus2lic4 tests ===
......@@ -1727,13 +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 0 seconds
lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 27 seconds
lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 68 seconds
lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 21 seconds
lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 68 seconds
lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 19 seconds
lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 61 seconds
lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 18 seconds
lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 65 seconds
* Ref time:
0.04user 0.09system 3:31.78elapsed 0%CPU (0avgtext+0avgdata 3004maxresident)k
120inputs+0outputs (0major+14863minor)pagefaults 0swaps
0.06user 0.07system 2:44.11elapsed 0%CPU (0avgtext+0avgdata 3000maxresident)k
120inputs+0outputs (0major+14855minor)pagefaults 0swaps
* Quick time (-j 4):
0.06user 0.08system 1:14.05elapsed 0%CPU (0avgtext+0avgdata 3004maxresident)k
120inputs+0outputs (0major+14862minor)pagefaults 0swaps
lus2lic0.log:testcase ./lus2lic.tests/test0.exp completed in 0 seconds
lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 27 seconds
lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 68 seconds
lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 21 seconds
lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 68 seconds
lus2lic1.log:testcase ./lus2lic.tests/test1.exp completed in 19 seconds
lus2lic2.log:testcase ./lus2lic.tests/test2.exp completed in 61 seconds
lus2lic3.log:testcase ./lus2lic.tests/test3.exp completed in 18 seconds
lus2lic4.log:testcase ./lus2lic.tests/test4.exp completed in 65 seconds
* Ref time:
0.04user 0.09system 3:31.78elapsed 0%CPU (0avgtext+0avgdata 3004maxresident)k
120inputs+0outputs (0major+14863minor)pagefaults 0swaps
0.06user 0.07system 2:44.11elapsed 0%CPU (0avgtext+0avgdata 3000maxresident)k
120inputs+0outputs (0major+14855minor)pagefaults 0swaps
* Quick time (-j 4):
0.06user 0.08system 1:14.05elapsed 0%CPU (0avgtext+0avgdata 3004maxresident)k
120inputs+0outputs (0major+14862minor)pagefaults 0swaps
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