10418197c8
The compiler still does not support unsafe functions that well. For example, putting an assert()/exit() in an automaton's state does not work correctly.
79 lines
3.4 KiB
OCaml
79 lines
3.4 KiB
OCaml
open Misc
|
|
open Names
|
|
open Signature
|
|
open Java
|
|
open Java_printer
|
|
|
|
(** returns the vd and the pat of a fresh ident from [name] *)
|
|
let mk_var ty name =
|
|
let id = Idents.gen_var "java_main" name in
|
|
mk_var_dec id ty, Pvar id
|
|
|
|
let program p =
|
|
(*Scalarize*)
|
|
let p = Compiler_utils.pass "Scalarize" true Scalarize.program p Obc_compiler.pp in
|
|
let p_java = Obc2java.program p in
|
|
let dir = Compiler_utils.build_path "java" in
|
|
Compiler_utils.ensure_dir dir;
|
|
|
|
(* Compile and output the nodes *)
|
|
output_program dir p_java;
|
|
|
|
(* Create a runnable main simulation *)
|
|
if !Compiler_options.simulation
|
|
then (
|
|
let class_name = Obc2java.fresh_classe (!Compiler_options.simulation_node ^ "_sim") in
|
|
Idents.enter_node class_name;
|
|
let field_step_dnb, id_step_dnb =
|
|
let id = Idents.gen_var "java_main" "default_step_nb" in
|
|
mk_field ~static:true ~final:true ~value:(Some (Sint 30000)) Tint id, id
|
|
in
|
|
let main_methode =
|
|
let vd_step, pat_step = mk_var Tint "step" in
|
|
let vd_args, pat_args =
|
|
mk_var (Tarray (Tclass (Names.pervasives_qn "String"), (Sint 0))) "args" in
|
|
let body =
|
|
let vd_main, e_main, q_main, ty_main =
|
|
let q_main = !Compiler_options.simulation_node |> Modules.qualify_value in (*qual*)
|
|
let ty_main =
|
|
(Modules.find_value q_main).node_outputs |> types_of_arg_list |> Types.prod in
|
|
let q_main = Obc2java.qualname_to_package_classe q_main in (*java qual*)
|
|
let id = Idents.gen_var "java_main" "main" in
|
|
mk_var_dec id (Tclass q_main), Eval (Pvar id), q_main, ty_main
|
|
in
|
|
let acts =
|
|
let integer = Eval(Pclass(Names.pervasives_qn "Integer")) in
|
|
let args1 = Eval(Parray_elem(pat_args, Sint 1)) in
|
|
let out = Eval(Pclass(Names.qualname_of_string "java.lang.System.out")) in
|
|
let jarrays = Eval(Pclass(Names.qualname_of_string "java.util.Arrays")) in
|
|
let jint = Eval(Pclass(Names.qualname_of_string "Integer")) in
|
|
let jfloat = Eval(Pclass(Names.qualname_of_string "Float")) in
|
|
let jbool = Eval(Pclass(Names.qualname_of_string "Boolean")) in
|
|
let ret = Emethod_call(e_main, "step", []) in
|
|
let print_ret = match ty_main with
|
|
| Types.Tarray (Types.Tarray _, _) -> Emethod_call(jarrays, "deepToString", [ret])
|
|
| Types.Tarray _ -> Emethod_call(jarrays, "toString", [ret])
|
|
| t when t = Initial.tint -> Emethod_call(jint, "toString", [ret])
|
|
| t when t = Initial.tfloat -> Emethod_call(jfloat, "toString", [ret])
|
|
| t when t = Initial.tbool -> Emethod_call(jbool, "toString", [ret])
|
|
| _ -> Emethod_call(ret, "toString", [])
|
|
in
|
|
[ Anewvar(vd_main, Enew (Tclass q_main, []));
|
|
Aifelse( Efun(Names.pervasives_qn ">", [Eval (Pfield (pat_args, "length")); Sint 1])
|
|
, mk_block [Aassgn(pat_step, Emethod_call(integer, "parseInt", [args1]))]
|
|
, mk_block [Aassgn(pat_step, Eval (Pvar id_step_dnb))]);
|
|
Obc2java.fresh_for (Eval pat_step)
|
|
(fun i ->
|
|
[Aexp (Emethod_call(out, "printf",
|
|
[Sstring "%d => %s\\n"; Eval (Pvar i); print_ret]))]
|
|
)
|
|
]
|
|
in
|
|
mk_block ~locals:[vd_step] acts
|
|
in
|
|
mk_methode ~static:true ~args:[vd_args] body "main"
|
|
in
|
|
let c = mk_classe ~fields:[field_step_dnb] ~methodes:[main_methode] class_name in
|
|
output_program dir [c]
|
|
)
|