a lustre v6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n);...
TRANSCRIPT
![Page 1: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/1.jpg)
1
![Page 2: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/2.jpg)
A Lustre V6 tutorial
Verimag
December 4, 2008 - Synchron’08 - Aussois
![Page 3: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/3.jpg)
Outline
Lustre
Lustre V6
The Lustre V6 compiler
3
![Page 4: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/4.jpg)
Outline
Lustre
Lustre V6
P. Raymond & the Synchronous group et al.
The Lustre V6 compiler
P. Raymond, J. Ballet, E. Jahier
4
![Page 5: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/5.jpg)
Lustre
a Data-flow Synchronous Language
Generalised synchronous circuits: wires hold numerics
Operators + wires structured into nodes
Pre-defined operators
Boolean: and, not, ...
Arithmetic: +, -, ...
Temporal: pre, when, current
5
![Page 6: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/6.jpg)
Lustre
Targetting reactive critical systems
Time constraints
→ we want a predictable bound on execution time
Memory constraints
→ we want a predictable bound on memory usage
→ (we want that bound to be as small as possible)
⇒ No loops, first-order
6
![Page 7: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/7.jpg)
Lustre
a loop-free first-order language
But Can those limitations be overlooked ?
![Page 8: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/8.jpg)
Lustre
a loop-free first-order language
But Can those limitations be overlooked ?
→ Yes: loops and genericity were introduced in V4
7
![Page 9: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/9.jpg)
Lustre
Example of loops and genericity in V4
node add(const n:int; t1,t2 : int ^ n)
returns (res:int ^ n);
letres = t1 + t2; -- for i=0..n-1, res[i] = t1[i] + t2[i];
tel
![Page 10: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/10.jpg)
Lustre
Example of loops and genericity in V4
node add(const n:int; t1,t2 : int ^ n)
returns (res:int ^ n);
letres = t1 + t2; -- for i=0..n-1, res[i] = t1[i] + t2[i];
tel
this is legal as long as n is a ground constant whichvalue is known at compile time
![Page 11: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/11.jpg)
Lustre
Example of loops and genericity in V4
node add(const n:int; t1,t2 : int ^ n)
returns (res:int ^ n);
letres = t1 + t2; -- for i=0..n-1, res[i] = t1[i] + t2[i];
tel
this is legal as long as n is a ground constant whichvalue is known at compile time → static genericity
![Page 12: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/12.jpg)
Lustre
Example of loops and genericity in V4
node add(const n:int; t1,t2 : int ^ n)
returns (res:int ^ n);
letres = t1 + t2; -- for i=0..n-1, res[i] = t1[i] + t2[i];
tel
this is legal as long as n is a ground constant whichvalue is known at compile time → static genericity
Pushing that idea further ⇒ Lustre V6
8
![Page 13: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/13.jpg)
Outline
Lustre
Lustre V6
a statically generic (1.5-order) Lustre
The Lustre V6 compiler
9
![Page 14: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/14.jpg)
Lustre V6
What’s new (compared to V4)
Structure and enumerated types
Package mechanism (Ada-like)
→ Name space
→ Encapsulation
(Static) Genericity
→ Parametric packages
→ Parametric nodes (well-typed macros)
→ Static recursion
→ Array iterators (versus homomorphic extension – not new;
different)
10
![Page 15: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/15.jpg)
Lustre V6
Structures
type complex = struct {re : real = 0.;
im : real = 0.
};
![Page 16: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/16.jpg)
Lustre V6
Structures
type complex = struct {re : real = 0.;
im : real = 0.
};
node plus (a, b : complex) returns (c : complex);
letc = complex { re = a.re+b.re ; im = a.im+b.im };
tel
11
![Page 17: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/17.jpg)
Lustre V6
Enumerated type
type trival = enum { Pile, Face, Tranche };
12
![Page 18: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/18.jpg)
Lustre V6
Enumerated clocks + merge ( c©Pouzet)
type trival = enum { Pile, Face, Tranche };
![Page 19: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/19.jpg)
Lustre V6
Enumerated clocks + merge ( c©Pouzet)
type trival = enum { Pile, Face, Tranche };node merge_node(clk: trival;
![Page 20: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/20.jpg)
Lustre V6
Enumerated clocks + merge ( c©Pouzet)
type trival = enum { Pile, Face, Tranche };node merge_node(clk: trival;
i1 when Pile(clk); i2 when Face(clk);
i3 when Tranche(clk))
returns (y: int);
![Page 21: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/21.jpg)
Lustre V6
Enumerated clocks + merge ( c©Pouzet)
type trival = enum { Pile, Face, Tranche };node merge_node(clk: trival;
i1 when Pile(clk); i2 when Face(clk);
i3 when Tranche(clk))
returns (y: int);
lety = merge clk
(Pile: i1)
(Face: i2)
(Tranche: i3);
tel
13
![Page 22: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/22.jpg)
Lustre V6
Packages
package complex
providestype t; -- Encapsulationconst i:t;
node re(c: t) returns (r:real);
![Page 23: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/23.jpg)
Lustre V6
Packages
package complex
providestype t; -- Encapsulationconst i:t;
node re(c: t) returns (r:real);
bodytype t = struct { re : real ; im : real };const i:t = t { re = 0. ; im = 1. };node re(c: t) returns (re:real);
let re = c.re; tel;end
14
![Page 24: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/24.jpg)
Lustre V6
Generic packages
model modSimple
needs type t;
providesnode fby1(init, fb: t) returns (next: t);
![Page 25: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/25.jpg)
Lustre V6
Generic packages
model modSimple
needs type t;
providesnode fby1(init, fb: t) returns (next: t);
bodynode fby1(init, fb: t) returns (next: t);
let next = init -> pre fb; telend
![Page 26: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/26.jpg)
Lustre V6
Generic packages
model modSimple
needs type t;
providesnode fby1(init, fb: t) returns (next: t);
bodynode fby1(init, fb: t) returns (next: t);
let next = init -> pre fb; telendpackage pint is modSimple(t=int);
15
![Page 27: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/27.jpg)
Lustre V6
Generic nodes
node mk_tab<<type t; const init: t; const size: int>>
(a:t) returns (res: t^size);
letres = init ^ size;
tel
![Page 28: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/28.jpg)
Lustre V6
Generic nodes
node mk_tab<<type t; const init: t; const size: int>>
(a:t) returns (res: t^size);
letres = init ^ size;
telnode tab_int3 = mk_tab<<int, 0, 3>>;
![Page 29: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/29.jpg)
Lustre V6
Generic nodes
node mk_tab<<type t; const init: t; const size: int>>
(a:t) returns (res: t^size);
letres = init ^ size;
telnode tab_int3 = mk_tab<<int, 0, 3>>;
node tab_bool4 = mk_tab<<bool, true, 4>>;
16
![Page 30: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/30.jpg)
Lustre V6
Generic nodes
node toto_n<<
node f(a, b: int) returns (x: int);
const n : int
>>(a: int) returns (x: int^n);
var v : int;
letv = f(a, 1);
x = v ^ n;
tel
![Page 31: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/31.jpg)
Lustre V6
Generic nodes
node toto_n<<
node f(a, b: int) returns (x: int);
const n : int
>>(a: int) returns (x: int^n);
var v : int;
letv = f(a, 1);
x = v ^ n;
telnode toto_3 = toto_n<<Lustre::iplus, 3>>;
17
![Page 32: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/32.jpg)
Lustre V6
Static recursion
node consensus<<const n : int>>(T: bool^n)
returns (a: bool);
leta = with (n = 1) then T[0]
else T[0] and consensus << n-1 >> (T[1 .. n-1]);
tel
node main = consensus<<8>>;
18
![Page 33: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/33.jpg)
Lustre V6
Are parametric nodes necessary?
Indeed, parametric nodes could be emulated with thepackage mechanism
→ but we keep them to keep the syntax ligth
→ we didn’t really want to have recursive packages
19
![Page 34: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/34.jpg)
Lustre V6
Arrays
As in Lustre V4
→ The array size is static (var mat23: int ˆ 2 ˆ 3;)
→ Array slices (T1[3..5] = T2[0..2];)
But no more homomorphic extension
where t1 + t2 means ∀i ∈ {0, .., size− 1}, t1[i] + t2[i]
⇒ operate on arrays via iterators
20
![Page 35: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/35.jpg)
Lustre V6
The fill iterator
![Page 36: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/36.jpg)
Lustre V6
The fill iterator
node incr (acc : int) returns (acc’, res : int);
fill<<incr; 4>>(0) (4, [0,1,2,3])
21
![Page 37: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/37.jpg)
Lustre V6
The red iterator
![Page 38: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/38.jpg)
Lustre V6
The red iterator
red<<+; 3>>(0, [1,2,3]) 6
22
![Page 39: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/39.jpg)
Lustre V6
fill+red=mapred, fillred, fold
![Page 40: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/40.jpg)
Lustre V6
fill+red=mapred, fillred, fold
fill<<incr; 4>>(0) ≡ fold<<incr; 4>>(0)
red<<+; 3>>(0, [1,2,3]) ≡ fold<<+; 3>>(0, [1,2,3])
23
![Page 41: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/41.jpg)
Lustre V6
The fold iterator
node cumul(acc in,x:int) returns (acc out,y:int)
let
y = acc in+x;
acc out = y;
tel
fold<<cumul>>(0, [1,2,3])
![Page 42: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/42.jpg)
Lustre V6
The fold iterator
node cumul(acc in,x:int) returns (acc out,y:int)
let
y = acc in+x;
acc out = y;
tel
fold<<cumul>>(0, [1,2,3]) (6, [1,3,6])
![Page 43: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/43.jpg)
Lustre V6
The fold iterator
node cumul(acc in,x:int) returns (acc out,y:int)
let
y = acc in+x;
acc out = y;
tel
fold<<cumul>>(0, [1,2,3]) (6, [1,3,6])
fold<<fold<<fold<<full adder; n>>; m>>; p>>
(false, x, y) (r,’’x+y’’)
24
![Page 44: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/44.jpg)
Lustre V6
The map iterator
map <<+; 3>>([1,0,2],[3,6,-1]) [4,6,1]
![Page 45: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/45.jpg)
Lustre V6
The map iterator
map <<+; 3>>([1,0,2],[3,6,-1]) [4,6,1]
25
![Page 46: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/46.jpg)
Lustre V6
About Lustre V6 array iterators
More general that usual iterators:
their are of variable arity
26
![Page 47: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/47.jpg)
Outline
Lustre
Lustre V6
The Lustre V6 compiler
The front-end
The back-end (J. Ballet)
The back-back-end (J. Ballet)
27
![Page 48: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/48.jpg)
The Lustre V6 compiler
The Front-end: lus2lic
Perform usual checks
→ Syntax, Types, Clocks
→ Unique definition of outputs
→ Combinational cycles detection
![Page 49: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/49.jpg)
The Lustre V6 compiler
The Front-end: lus2lic
Perform usual checks
→ Syntax, Types, Clocks
→ Unique definition of outputs
→ Combinational cycles detection
Perform some static evaluation
→ arrays size
→ parametric packages and nodes
→ recursive nodes
![Page 50: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/50.jpg)
The Lustre V6 compiler
The Front-end: lus2lic
Perform usual checks
→ Syntax, Types, Clocks
→ Unique definition of outputs
→ Combinational cycles detection
Perform some static evaluation
→ arrays size
→ parametric packages and nodes
→ recursive nodes
Generate intermediate code: LIC (Lustre internal code)
28
![Page 51: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/51.jpg)
Lustre Internal Code ( LIC)
was: expanded code (ec)
LIC ≡ core Lustre
No more packages
Parametric constructs are instanciated
→ constants
→ types
→ nodes
![Page 52: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/52.jpg)
Lustre Internal Code ( LIC)
was: expanded code (ec)
LIC ≡ core Lustre
No more packages
Parametric constructs are instanciated
→ constants
→ types
→ nodes
29
![Page 53: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/53.jpg)
Lustre Internal Code ( LIC)
was: expanded code (ec) cont.
LIC versus ec
→ Nodes are not (necessarily) expanded
→ Arrays are not (necessarily) expanded
![Page 54: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/54.jpg)
Lustre Internal Code ( LIC)
was: expanded code (ec) cont.
LIC versus ec
→ Nodes are not (necessarily) expanded
→ Arrays are not (necessarily) expanded
LIC versus Lustre v4
→ Structures and enums
→ array iterators
30
![Page 55: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/55.jpg)
Lustre potatoes
lustrecore
![Page 56: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/56.jpg)
Lustre potatoes
lustrecore V4ec
![Page 57: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/57.jpg)
Lustre potatoes
lustrecore V4ec
V6
![Page 58: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/58.jpg)
Lustre potatoes
lustrecore V4ec
V6
lic
![Page 59: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/59.jpg)
Lustre potatoes
lustrecore V4ec
V6
lic
struct, enums, packages, genericity, ...
![Page 60: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/60.jpg)
Lustre potatoes
lustrecore V4ec
V6
lic
struct, enums, packages, genericity, ...
arrays
![Page 61: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/61.jpg)
Lustre potatoes
lustrecore V4ec
V6
lic
struct, enums, packages, genericity, ...
arrays
homomorphic
extension
![Page 62: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/62.jpg)
Lustre potatoes
lustrecore V4ec
V6
lic
struct, enums, packages, genericity, ...
arrays
homomorphic
extension
array iterators
31
![Page 63: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/63.jpg)
The Lustre V6 compiler
The back-end
The role of the backend is to generate sequential code
We defined (yet) another intermediary format to repre-sent sequential code: SOC (Synchronous Object Code)
The idea is that translating this format into any se-quential language is easy, and done at the very end
32
![Page 64: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/64.jpg)
The back-end
maps each node to a Synchronous Object Component (SOC)
A SOC is made of:
a set of memories
a set of methods: typically, an init and a step method
![Page 65: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/65.jpg)
The back-end
maps each node to a Synchronous Object Component (SOC)
A SOC is made of:
a set of memories
a set of methods: typically, an init and a step method
each method is made of a sequence of guarded atomicoperations
![Page 66: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/66.jpg)
The back-end
maps each node to a Synchronous Object Component (SOC)
A SOC is made of:
a set of memories
a set of methods: typically, an init and a step method
each method is made of a sequence of guarded atomicoperations
atomic operation (named actions) can be
another SOC method call
an assignment (a wire)
33
![Page 67: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/67.jpg)
The back-end
From node to SOC
For each node, we:
Identify memories
Explicitely separate the control (clocks) from the computations
→ set of guarded equations
Split equations into more finer-grained steps: actions
→ a set of guarded actions (a wire or a call)
Find a correct ordering for actions (sheduling)
→ a sequence of guarded actions
34
![Page 68: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/68.jpg)
The back-back-end
From SOC to C
pretty-print the SOC into, let’s say, C
provide a C implementation of every predefined (non-temporal) operators
35
![Page 69: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/69.jpg)
Lustre V6 compiler
An alpha release is available
http://www-verimag.imag.fr/∼synchron/lustre-v6/
The front-end lus2lic seems ok
![Page 70: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/70.jpg)
Lustre V6 compiler
An alpha release is available
http://www-verimag.imag.fr/∼synchron/lustre-v6/
The front-end lus2lic seems ok
lus2lic --lustre-v4: added last friday; seems to work
![Page 71: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/71.jpg)
Lustre V6 compiler
An alpha release is available
http://www-verimag.imag.fr/∼synchron/lustre-v6/
The front-end lus2lic seems ok
lus2lic --lustre-v4: added last friday; seems to work
The back-back: generates C code... But its not fin-ished.
36
![Page 72: A Lustre V6 tutorial - imag.fr€¦ · node add(const n:int; t1,t2 :int ^ n) returns (res:int ^ n); let ... The Lustre V6 compiler The back-end The role of the backend is to generate](https://reader031.vdocument.in/reader031/viewer/2022021720/5bbc12ea09d3f292388b9259/html5/thumbnails/72.jpg)
Thanks for your attention
37