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

Expand type (struct and enums) of extern nodes.

parent e8725f9d
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,11 @@ doc:
cp ~/slides/lv6/*.pdf $(RELNAME)/doc
lus2lic:
cd $(LUS2LICDIR)/src ; make
cd $(LUS2LICDIR)/src ; make nc
cp $(LUS2LIC) $(RELNAME)/bin/
lus2licbc:
cd $(LUS2LICDIR)/src ; make bc
cp $(LUS2LIC) $(RELNAME)/bin/
lic2c:
......@@ -36,13 +40,16 @@ test_files:
cp $$f $(RELNAME)/test/; \
done
# ($(RELNAME)/bin/lic2c --out-format loc /tmp/xx.lus > /dev/null || (echo "*** lic2c $$f failed" ; exit 1)) && \
# ($(RELNAME)/bin/lic2c --out-format loc /tmp/xx.lus > /dev/null || (echo "*** lic2c $$f failed" ; exit 1)) &&
$(RELNAME).tgz:
tar cvfz $(RELNAME).tgz $(RELNAME)
WWW_DIR=/usr/local/www/DIST-TOOLS/SYNCHRONE/lustre-v6
www: $(RELNAME).tgz
cp $(RELNAME).tgz $(WWW_DIR)
cp $(LUS2LICDIR)/lv6-ref-man/lv6-ref-man.pdf $(WWW_DIR)/doc/
verimag:
......
(** Time-stamp: <modified the 13/04/2010 (at 18:12) by Erwan Jahier> *)
(** Time-stamp: <modified the 14/04/2010 (at 14:43) by Erwan Jahier> *)
open Lxm
......@@ -1001,11 +1001,15 @@ and (node_check_do: t -> Eff.node_key -> Lxm.t -> SymbolTab.t ->
in
let res_struct =
if
!Global.expand_structs
(!Global.expand_structs
&& not (res.is_polym_eff)
&& ((not !Global.expand_nodes) || is_main_node) (* it is useless otherwise *)
) || is_extern_oper
then
StructArrayExpand.node node_id_solver local_env res
(
Verbose.printf ~level:3 "-- Expand node %s \n" (Ident.long_to_string (fst nk));
StructArrayExpand.node node_id_solver local_env res
)
else
res
in
......@@ -1014,7 +1018,7 @@ and (node_check_do: t -> Eff.node_key -> Lxm.t -> SymbolTab.t ->
(
if not !Global.expand_nodes || is_extern_oper || is_main_node then
if res.is_polym_eff then
Polymorphism.push_on_polymorphic_node_stack (node_id_solver,local_env,res)
Polymorphism.push_on_polymorphic_node_stack (node_id_solver,local_env,res_struct)
else
let str = LicDump.node_of_node_exp_eff res_struct in
output_string !Global.oc str
......
(** Time-stamp: <modified the 13/05/2009 (at 16:24) by Erwan Jahier> *)
(** Time-stamp: <modified the 14/04/2010 (at 11:19) by Erwan Jahier> *)
(**
nb : only user nodes are expanded.
Expand nodes:
------------
if n is a node defined as follows
node n(x,y) returns(a,b);
var v1,v2;
let
v1 = x+y;
v2 = x*y;
a = v1*x;
b = v2*y;
tel
equations such as :
o1,o2 = n(i1, i2);
becomes
h1 = i1+i2;
h2 = i1*i2;
o1 = h1*i1;
o2 = h2*i2;
where h1 and h2 are fresh local vars
In other terms, we need to
- create a fresh local var for each local var of n
- take all the equations of n, and substitute
- the inputs parameters by intput args
- the outputs parameters by lhs list
- the local vars by the fresh local var names
nb : to simplify, for equations like
f.a = n(t[1], 3);
we first create fresh vars for "f.a", "t[1]", and "3"
_v1 = t[1];
_v2 = 3;
f.a = _v3;
_v3 = n(_v1,_v2);
and then we apply the transformation
Expand assertions:
-----------------
In order to deal with assertions on nodes, i.e., of the form
assert (n(i1,i2));
we first transform it into
assert_var = n(i1,i2);
assert(assert_var);
where assert_var is a fresh bool local var, and we apply the transformation
on the first equation.
*)
open Lxm
open Eff
......
(** Time-stamp: <modified the 08/01/2009 (at 14:59) by Erwan Jahier> *)
(** Time-stamp: <modified the 14/04/2010 (at 11:19) by Erwan Jahier> *)
(**
nb : only user nodes are expanded.
Expand nodes:
------------
if n is a node defined as follows
node n(x,y) returns(a,b);
var v1,v2;
let
v1 = x+y;
v2 = x*y;
a = v1*x;
b = v2*y;
tel
equations such as :
o1,o2 = n(i1, i2);
becomes
h1 = i1+i2;
h2 = i1*i2;
o1 = h1*i1;
o2 = h2*i2;
where h1 and h2 are fresh local vars
In other terms, we need to
- create a fresh local var for each local var of n
- take all the equations of n, and substitute
- the inputs parameters by intput args
- the outputs parameters by lhs list
- the local vars by the fresh local var names
nb : to simplify, for equations like
f.a = n(t[1], 3);
we first create fresh vars for "f.a", "t[1]", and "3"
_v1 = t[1];
_v2 = 3;
f.a = _v3;
_v3 = n(_v1,_v2);
and then we apply the transformation
Expand assertions:
-----------------
In order to deal with assertions on nodes, i.e., of the form
assert (n(i1,i2));
we first transform it into
assert_var = n(i1,i2);
assert(assert_var);
where assert_var is a fresh bool local var, and we apply the transformation
on the first equation.
*)
val f : Eff.local_env -> Eff.node_exp -> Eff.node_exp
(** Time-stamp: <modified the 08/04/2010 (at 17:23) by Erwan Jahier> *)
(** Time-stamp: <modified the 14/04/2010 (at 14:28) by Erwan Jahier> *)
(* Replace structures and arrays by as many variables as necessary.
Since structures can be recursive, it migth be a lot of new variables...
......@@ -553,33 +553,36 @@ and (expand_var_info: Eff.local_env -> Eff.id_solver -> var_info list * acc ->
let rec (node : Eff.id_solver -> Eff.local_env -> Eff.node_exp -> Eff.node_exp) =
fun is n_env n ->
match n.def_eff with
| ExternEff
| AbstractEff None -> n
| AbstractEff (Some pn) ->
{ n with def_eff = AbstractEff (Some (node is n_env pn)) }
| BodyEff b ->
let loclist = match n.loclist_eff with None -> [] | Some l -> l in
let inlist = n.inlist_eff in
let outlist = n.outlist_eff in
let acc = ([],[],[]) in
let inlist, acc = List.fold_left (expand_var_info n_env is) ([],acc) inlist in
let outlist, acc = List.fold_left (expand_var_info n_env is) ([],acc) outlist in
let loclist, acc = List.fold_left (expand_var_info n_env is) ([],acc) loclist in
let acc = List.fold_left (expand_eq n_env is) acc b.eqs_eff in
let acc = List.fold_left (expand_assert n_env is) acc b.asserts_eff in
let (asserts,neqs, nv) = acc in
let nb = {
eqs_eff = neqs ;
asserts_eff = asserts
}
in
let res =
{ n with
inlist_eff = List.rev inlist;
outlist_eff = List.rev outlist;
loclist_eff = Some (List.rev_append loclist nv);
def_eff = BodyEff nb
}
in
res
let inlist = n.inlist_eff in
let outlist = n.outlist_eff in
let acc = ([],[],[]) in
let inlist, acc = List.fold_left (expand_var_info n_env is) ([],acc) inlist in
let outlist, acc = List.fold_left (expand_var_info n_env is) ([],acc) outlist in
let n =
match n.def_eff with
| ExternEff
| AbstractEff None -> n
| AbstractEff (Some pn) ->
{ n with def_eff = AbstractEff (Some (node is n_env pn)) }
| BodyEff b ->
let loclist = match n.loclist_eff with None -> [] | Some l -> l in
let loclist, acc = List.fold_left (expand_var_info n_env is) ([],acc) loclist in
let acc = List.fold_left (expand_eq n_env is) acc b.eqs_eff in
let acc = List.fold_left (expand_assert n_env is) acc b.asserts_eff in
let (asserts,neqs, nv) = acc in
let nb = {
eqs_eff = neqs ;
asserts_eff = asserts
}
in
{ n with
loclist_eff = Some (List.rev_append loclist nv);
def_eff = BodyEff nb
}
in
{ n with
inlist_eff = List.rev inlist;
outlist_eff = List.rev outlist;
}
......@@ -11893,18 +11893,77 @@ extern function decl::f1(
b1:_decl::couleur;
c1:_decl::couleur)
returns (
d1:A_bool_2);
d1_0:bool;
d1_1:bool);
 
extern node decl::n2(
a1:A__decl::t1_8;
b1:A__decl::t1_8;
c1:A__decl::t1_8;
a1_0:_decl::t1;
a1_1:_decl::t1;
a1_2:_decl::t1;
a1_3:_decl::t1;
a1_4:_decl::t1;
a1_5:_decl::t1;
a1_6:_decl::t1;
a1_7:_decl::t1;
b1_0:_decl::t1;
b1_1:_decl::t1;
b1_2:_decl::t1;
b1_3:_decl::t1;
b1_4:_decl::t1;
b1_5:_decl::t1;
b1_6:_decl::t1;
b1_7:_decl::t1;
c1_0:_decl::t1;
c1_1:_decl::t1;
c1_2:_decl::t1;
c1_3:_decl::t1;
c1_4:_decl::t1;
c1_5:_decl::t1;
c1_6:_decl::t1;
c1_7:_decl::t1;
d1:bool)
returns (
e1:A_A__decl::t1_8_5);
e1_0_0:_decl::t1;
e1_0_1:_decl::t1;
e1_0_2:_decl::t1;
e1_0_3:_decl::t1;
e1_0_4:_decl::t1;
e1_0_5:_decl::t1;
e1_0_6:_decl::t1;
e1_0_7:_decl::t1;
e1_1_0:_decl::t1;
e1_1_1:_decl::t1;
e1_1_2:_decl::t1;
e1_1_3:_decl::t1;
e1_1_4:_decl::t1;
e1_1_5:_decl::t1;
e1_1_6:_decl::t1;
e1_1_7:_decl::t1;
e1_2_0:_decl::t1;
e1_2_1:_decl::t1;
e1_2_2:_decl::t1;
e1_2_3:_decl::t1;
e1_2_4:_decl::t1;
e1_2_5:_decl::t1;
e1_2_6:_decl::t1;
e1_2_7:_decl::t1;
e1_3_0:_decl::t1;
e1_3_1:_decl::t1;
e1_3_2:_decl::t1;
e1_3_3:_decl::t1;
e1_3_4:_decl::t1;
e1_3_5:_decl::t1;
e1_3_6:_decl::t1;
e1_3_7:_decl::t1;
e1_4_0:_decl::t1;
e1_4_1:_decl::t1;
e1_4_2:_decl::t1;
e1_4_3:_decl::t1;
e1_4_4:_decl::t1;
e1_4_5:_decl::t1;
e1_4_6:_decl::t1;
e1_4_7:_decl::t1);
-- automatically defined aliases:
type A_A__decl::t1_8_5 = A__decl::t1_8^5;
type A_bool_2 = bool^2;
type A__decl::t1_8 = _decl::t1^8;
----------------------------------------------------------------------
====> ../lus2lic -vl 2 should_work/demo/declaration.lus
......@@ -11937,7 +11996,8 @@ extern function declaration::f1(
b1:_declaration::couleur;
c1:_declaration::couleur)
returns (
d1:A_bool_2);
d1_0:bool;
d1_1:bool);
 
extern node declaration::n1(
a1:_declaration::t1;
......@@ -11947,12 +12007,72 @@ returns (
d1:bool);
 
extern node declaration::n2(
a1:A__declaration::t1_8;
b1:A__declaration::t1_8;
c1:A__declaration::t1_8;
a1_0:_declaration::t1;
a1_1:_declaration::t1;
a1_2:_declaration::t1;
a1_3:_declaration::t1;
a1_4:_declaration::t1;
a1_5:_declaration::t1;
a1_6:_declaration::t1;
a1_7:_declaration::t1;
b1_0:_declaration::t1;
b1_1:_declaration::t1;
b1_2:_declaration::t1;
b1_3:_declaration::t1;
b1_4:_declaration::t1;
b1_5:_declaration::t1;
b1_6:_declaration::t1;
b1_7:_declaration::t1;
c1_0:_declaration::t1;
c1_1:_declaration::t1;
c1_2:_declaration::t1;
c1_3:_declaration::t1;
c1_4:_declaration::t1;
c1_5:_declaration::t1;
c1_6:_declaration::t1;
c1_7:_declaration::t1;
d1:bool)
returns (
e1:A_A__declaration::t1_8_5);
e1_0_0:_declaration::t1;
e1_0_1:_declaration::t1;
e1_0_2:_declaration::t1;
e1_0_3:_declaration::t1;
e1_0_4:_declaration::t1;
e1_0_5:_declaration::t1;
e1_0_6:_declaration::t1;
e1_0_7:_declaration::t1;
e1_1_0:_declaration::t1;
e1_1_1:_declaration::t1;
e1_1_2:_declaration::t1;
e1_1_3:_declaration::t1;
e1_1_4:_declaration::t1;
e1_1_5:_declaration::t1;
e1_1_6:_declaration::t1;
e1_1_7:_declaration::t1;
e1_2_0:_declaration::t1;
e1_2_1:_declaration::t1;
e1_2_2:_declaration::t1;
e1_2_3:_declaration::t1;
e1_2_4:_declaration::t1;
e1_2_5:_declaration::t1;
e1_2_6:_declaration::t1;
e1_2_7:_declaration::t1;
e1_3_0:_declaration::t1;
e1_3_1:_declaration::t1;
e1_3_2:_declaration::t1;
e1_3_3:_declaration::t1;
e1_3_4:_declaration::t1;
e1_3_5:_declaration::t1;
e1_3_6:_declaration::t1;
e1_3_7:_declaration::t1;
e1_4_0:_declaration::t1;
e1_4_1:_declaration::t1;
e1_4_2:_declaration::t1;
e1_4_3:_declaration::t1;
e1_4_4:_declaration::t1;
e1_4_5:_declaration::t1;
e1_4_6:_declaration::t1;
e1_4_7:_declaration::t1);
node declaration::n4(a1:bool) returns (b1:bool);
var
c1:bool;
......@@ -11974,8 +12094,6 @@ let
tel
-- end of node declaration::n5
-- automatically defined aliases:
type A_A__declaration::t1_8_5 = A__declaration::t1_8^5;
type A_bool_2 = bool^2;
type A__declaration::t1_8 = _declaration::t1^8;
----------------------------------------------------------------------
====> ../lus2lic -vl 2 should_work/demo/def.lus
......
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