Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
lustre-v6
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
verimag
synchrone
lustre-v6
Commits
885ce8d4
Commit
885ce8d4
authored
9 years ago
by
Erwan Jahier
Browse files
Options
Downloads
Patches
Plain Diff
-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
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/soc2c.ml
+220
-48
220 additions, 48 deletions
src/soc2c.ml
with
220 additions
and
48 deletions
src/soc2c.ml
+
220
−
48
View file @
885ce8d4
(* Time-stamp: <modified the 1
3
/0
5
/2015 (at
09:38
) by Erwan Jahier> *)
(* Time-stamp: <modified the 1
1
/0
9
/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\n
sleep 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
->
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment