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

-2cw7 now calls ogensim. Also, commands are executed via a script (sh).

parent 66664b22
No related branches found
No related tags found
No related merge requests found
(* Time-stamp: <modified the 13/05/2015 (at 09:38) by Erwan Jahier> *)
(* Time-stamp: <modified the 11/09/2015 (at 11:22) by Erwan Jahier> *)
(* let put (os: out_channel) (fmt:('a, unit, string, unit) format4) : 'a = *)
......@@ -440,8 +440,8 @@ let (gen_loop_file : Soc.t -> out_channel -> Soc.tbl -> unit) =
let (n,_,_) = soc.key in
let n = id2s n in
let inputs,outputs = soc.profile in
let inputs_io = SocVar.expand_profile true false inputs in
let outputs_io = SocVar.expand_profile true false outputs in
let inputs_io = SocVar.expand_profile true false inputs in
let outputs_io = SocVar.expand_profile true false outputs in
let inputs_exp = SocVar.expand_profile true true inputs in
let outputs_exp= SocVar.expand_profile true true outputs in
Lv6util.entete oc "/*" "*/";
......@@ -635,45 +635,144 @@ int main(){
}
"
let (gen_loop_file4ogensim : Soc.t -> out_channel -> Soc.tbl -> unit) =
fun soc oc stbl ->
let base = (string_of_soc_key soc.key) in
let putc s = output_string oc s in
let ctx = get_ctx_name soc.key in
let step = Soc2cDep.step_name soc.key "step" in
let (n,_,_) = soc.key in
let n = id2s n in
let inputs,outputs = soc.profile in
let inputs_io = SocVar.expand_profile true false inputs in
let outputs_io = SocVar.expand_profile true false outputs in
let inputs_exp = SocVar.expand_profile true true inputs in
let outputs_exp= SocVar.expand_profile true true outputs in
let define_define i (var_name,_) =
putc (Printf.sprintf "#define _%s\t 0xe%07X\n" var_name ((i+1)*8));
in
Lv6util.entete oc "/*" "*/";
putc ("#include \""^base ^".h\"
#define tickBegin 0xe0000000
");
List.iteri define_define (inputs_io@ outputs_io);
putc (
"/* Main procedure *************************/
int main(){" ^ (
match io_transmit_mode () with
| Lv6MainArgs.Stack ->
let to_c_decl (n,t) = ((Soc2cUtil.data_type_to_c t n)^ ";\n ") in
let inputs_t = List.map to_c_decl inputs in
let outputs_t = List.map to_c_decl outputs in
let inputs_decl = Printf.sprintf "\n %s" (String.concat "" inputs_t) in
let outputs_decl = Printf.sprintf "%s" (String.concat "" outputs_t) in
let ctx_decl = if SocUtils.is_memory_less soc then "" else
ctx^"_type* ctx = "^ ctx^"_new_ctx(NULL);\n"
in
inputs_decl ^ outputs_decl ^ ctx_decl
| Lv6MainArgs.Heap -> ("
/* Context allocation */
" ^ (if SocUtils.is_memory_less soc then ctx^"_type* ctx = &"^ctx^";\n"
else ctx^"_type* ctx = "^ ctx^"_new_ctx(NULL);")
)
| Lv6MainArgs.HeapStack -> ("
/* Context allocation */
" ^ (if SocUtils.is_memory_less soc then ctx^""
else ctx^"_type* ctx ;\n"^ ctx^"_reset(ctx);")
)
));
let to_rif_decl (n,t) = ("\\\""^n^"\\\":" ^(type_to_string t)) in
let inputs_t = List.map to_rif_decl inputs_io in
let outputs_t = List.map to_rif_decl outputs_io in
let inputs_decl = Printf.sprintf "#inputs %s" (String.concat " " inputs_t) in
let outputs_decl = Printf.sprintf "#outputs %s" (String.concat " " outputs_t) in
putc ("
/* Main loop */
while(1){
// notify the simulator that it is time to load the inputs from Lurette
// to the specified address
*((unsigned int*)tickBegin) = 0;
// load inputs from the memory locations
");
List.iter2
(fun (id,t) (id_flat,_) ->
let t = Soc2cUtil.data_type_to_c t "" in
let str =
Printf.sprintf " %s = *((%s*)_%s);\n" id t id_flat
in
putc str
)
inputs_exp inputs_io;
assert (io_transmit_mode () = Lv6MainArgs.Stack);
let i = fst (List.split inputs) in
let o = List.map (fun (n,t) -> match t with Data.Array(_,_) -> n | _ ->"&"^n) outputs in
let io = String.concat "," (i@o) in
let io = if SocUtils.is_memory_less soc then io else if io = "" then "ctx" else io^",ctx" in
putc (" " ^ step^"("^io^");
// now write the output to the memory which will be output to Lurette
");
List.iter2
(fun (id,t) (id_flat,_) ->
let t = Soc2cUtil.data_type_to_c t "" in
let str = Printf.sprintf " *((%s*)_%s) = %s;\n" t id id_flat in
putc str
)
outputs_io outputs_exp;
putc "}\n return 1;
}
"
(****************************************************************************)
(* The entry point for lus2lic --to-c *)
let (f : Lv6MainArgs.t -> Soc.key -> Soc.tbl -> LicPrg.t -> unit) =
fun args msoc stbl licprg ->
let socs = Soc.SocMap.bindings stbl in
let socs = snd (List.split socs) in
(* XXX que fait-on pour les soc predef ? *)
(* let _, socs = List.partition is_predef socs in *)
let base =
if args.Lv6MainArgs.outfile = "" then
string_of_soc_key msoc
let socs = Soc.SocMap.bindings stbl in
let socs = snd (List.split socs) in
(* XXX que fait-on pour les soc predef ? *)
(* let _, socs = List.partition is_predef socs in *)
let base =
if args.Lv6MainArgs.outfile = "" then
string_of_soc_key msoc
else
Filename.basename (
Filename.basename (
try Filename.chop_extension args.Lv6MainArgs.outfile
with Invalid_argument _ -> args.Lv6MainArgs.outfile)
in
let hfile = base ^ ".h" in
let cfile = base ^ ".c" in
let ext_cfile = Printf.sprintf "%s_ext.c" base in
let ext_hfile = Printf.sprintf "%s_ext.h" base in
let loopfile = base^"_loop.c" in
let occ = open_out cfile in
let och = open_out hfile in
let ocl = open_out loopfile in
try
let putc s = output_string occ s in
let puth s = output_string och s in
let main_soc = Soc.SocMap.find msoc stbl in
in
let hfile = base ^ ".h" in
let cfile = base ^ ".c" in
let ext_cfile = Printf.sprintf "%s_ext.c" base in
let ext_hfile = Printf.sprintf "%s_ext.h" base in
let loopfile = base^"_loop.c" in
let occ = open_out cfile in
let och = open_out hfile in
let ocl = open_out loopfile in
try
let putc s = output_string occ s in
let puth s = output_string och s in
let main_soc = Soc.SocMap.find msoc stbl in
(* Generate ext files if necessary *)
let needs_cfile, needs_hfile =
Soc2cExtern.gen_files main_soc stbl licprg ext_cfile ext_hfile hfile
in
Lv6util.entete occ "/*" "*/" ;
Lv6util.entete och "/*" "*/";
let needs_cfile, needs_hfile =
Soc2cExtern.gen_files main_soc stbl licprg ext_cfile ext_hfile hfile
in
Lv6util.entete occ "/*" "*/" ;
Lv6util.entete och "/*" "*/";
if args.Lv6MainArgs.gen_wcet then
gen_loop_file4ogensim main_soc ocl stbl
else
gen_loop_file main_soc ocl stbl;
if args.Lv6MainArgs.gen_wcet then gen_main_wcet_file main_soc base stbl;
output_string och "
if args.Lv6MainArgs.gen_wcet then gen_main_wcet_file main_soc base stbl;
output_string och "
#include <stdlib.h>
#include <string.h>
......@@ -723,32 +822,105 @@ typedef float _float;
Printf.printf "%s has been generated.\n" hfile;
Printf.printf "%s has been generated.\n" cfile;
flush stdout;
let execfile = if args.Lv6MainArgs.outfile = "" then "a.out"
let node = args.main_node in
let execfile = if args.Lv6MainArgs.outfile = "" then (node^"4otawa.out")
else args.Lv6MainArgs.outfile
in
let cflags = try Sys.getenv "CFLAGS" with Not_found -> "" in
let main_file,gcc =
if args.Lv6MainArgs.gen_wcet then base^"_main.c","arm-elf-gcc -g" else loopfile,"gcc"
let ocsh = open_out (node ^".sh") in
let main_file, ogensim_main_file, gcc =
if args.Lv6MainArgs.gen_wcet then
base^"_main.c",base^"_loop.c","arm-elf-gcc --specs=linux.specs -g"
else
loopfile, "I am a dead string...", "gcc"
in
let gcc =
let ogensim_exe = node^"4ogensim.out" in
let gcc, gcc_ogensim =
if needs_cfile then
Printf.sprintf "%s -o %s %s %s %s %s" gcc execfile cfile cflags ext_cfile main_file
Printf.sprintf "%s -o %s \\\n\t%s %s %s %s" gcc execfile cfile cflags ext_cfile main_file,
Printf.sprintf "%s -o %s \\\n\t%s %s %s %s" gcc ogensim_exe cfile cflags
ext_cfile ogensim_main_file
else
Printf.sprintf "%s -o %s %s %s %s" gcc execfile cfile cflags main_file
in
let main_step = (string_of_soc_key msoc)^"_step" in
Printf.sprintf "%s -o %s \\\n\t%s %s %s" gcc execfile cfile cflags main_file,
Printf.sprintf "%s -o %s \\\n\t%s %s %s" gcc ogensim_exe cfile cflags ogensim_main_file
in let main_step = (string_of_soc_key msoc)^"_step" in
let gcc = if args.Lv6MainArgs.gen_wcet then
(gcc ^ " > owcet.out; owcet.arm "^execfile^ " " ^
(* " --add-prop otawa::ilp::OUTPUT_PATH="^main_step^".0.lp "^ *)
main_step^" 2>&1 | grep WCET")
("#!/bin/bash
set -x
otawa=\"true\"
ogensim=\"true\"
xpdf=\"true\"
if [ $# -gt 0 ]
then
case \"$1\" in
\"otawa\")
otawa=\"true\"
ogensim=\"false\"
xpdf=\"false\"
;;
\"ogensim\")
otawa=\"false\"
ogensim=\"true\"
xpdf=\"false\"
;;
esac
fi
cfile="^cfile^ "
execfile="^execfile^ "
main_step="^main_step^ "
n="^node^ "
n_n="^base ^ "
freeport=`python -c 'import socket; s=socket.socket(); s.bind((\"\", 0)); print(s.getsockname()[1]); s.close()'`
if [ \"$otawa\" = \"true\" ]
then
# ZZZ otawa won't work with programs that use division because of orange (!?)
# Let's compile the c files for otawa\n" ^
gcc ^ " > \\\n\t$n_n.owcet.log 2>&1 &&\n\n"^
"orange $cfile ${n_n}_step -o $n_n.ffx > $n_n.orange.log 2>&1 &&\n" ^
"# Let's run otawa (owcet.arm)\n" ^
"owcet.arm $execfile $main_step -f $n_n.ffx \\\n\t>"^
"$n_n.owcet.arm.log 2>&1 && \n"^
"grep WCET $n_n.owcet.arm.log | cut -d \" \" -f 3 > "^
"$n.wcet &&\n\n" ^
"WCET=`cat $n.wcet` \n\n" ^
"# Let's compile the c files for ogensim \n" ^
"
fi
if [ \"$ogensim\" = \"true\" ]
then
# Now let's run ogensim \n(" ^
gcc_ogensim ^ " >>$n_n.owcet.log 2>&1 &&\n"^
"lus2lic "^(String.concat " " args.infiles)^" -n $n"^
" -interface > $n.io &&\n"^
"lus2lic "^(String.concat " " args.infiles)^" -n $n --gen-autotest &&\n\n"^
"# Now let's run ogensim \n" ^
"(ogensim.arm "^ogensim_exe^" -ul 1 \\\n\t-e $main_step"^
" -cl $n.cycles -lp $freeport \\\n\t-iol $n.io > $n_n"^
".ogensim.log 2>&1&) && \n\nsleep 1 &&\n"^
"(lurettetop -l 1000 -go -ns2c -o ogensim.rif \\\n\t \
-rp \"sut:socket:127.0.0.1:$freeport:\" \\\n\t \
-rp \"env:lutin:_${n}_env.lut:${n}_env\" || true)) &&\n\n"^
"getstat.r $n.cycles $WCET
fi
if [ \"$xpdf\" = \"true\" ]
then
xpdf $n.cycles.pdf &
fi
"
)
else gcc
in
output_string ocsh (gcc^"\n\n");
flush ocsh;
close_out ocsh;
let call_script = "sh "^node^".sh" in
if args.Lv6MainArgs.launch_cc then (
print_string (gcc^"\n\n"); flush stdout;
if (Sys.command gcc)=0 then () else
print_string ("sys call: '"^gcc^"' failed\n")
if (Sys.command call_script)=0 then () else
print_string ("sys call: '"^call_script^"' failed\n")
) else
print_string ("you can compile those files doing, e.g.,\n "^gcc^"\n");
print_string ("you can compile those files calling: "^call_script^"\n");
flush stdout
with
| Delete_C_files ->
......
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