Lustre v6 语法中,与时序表达式有关的运算,包括 ->
(followed by), pre
(previous), fby
, current
, when
, merge
。其中,除 merge
运算是 Lustre v6 中新引入的外,其余在 Lustre Core 语法中已有定义。
与时序表达式有关的文法定义如下
Expression ::= pre Expression
| current Expression
| Expression when ClockExpr
| Expression fby Expression
| Expression -> Expression
| merge Lv6Id MergeCaseList
ClockExpr ::= Lv6IdRef ( Lv6Id )
| Lv6Id
| not Lv6Id
| not (Lv6Id)
MergeCaseList ::= [ MergeCase ] { MergeCase }
MergeCase ::= [( (Lv6IdRef | true | false) -> Expression )]
->
followed by 表达式->
表达式读作 followed by
。其文法形式如
Expression -> Expression
其含义为,对 A -> B
,在程序运行的首次瞬间,取流 A
中的值,在往后的时间中,取流 B
的值。
->
的例程如下。在以下例程中,对首周期,取流 i1
的值,对往后周期,取流 i2
的值。
node followedBy(i1,i2: int) returns (o: int)
let
o = i1 -> i2;
tel
pre
previous 表达式pre
表达式读作 previous
。其文法形式如下
pre Expression
其含义为在周期 n
时刻,取 Expression
周期在 n-1
时刻的值。
pre
的例程如下。在以下例程中,假设流 i1
, i2
的值序列分别为
i1_(1), i1_(2), ... i1_(n)
i2_(1), i2_(2), ... i2_(n)
o
的流为 i1_(1),i2_(1), i2_(2), ... i2_(n)
。node preExpr(i1,i2: int) returns (o: int)
let
o = i1 -> pre i2;
tel
fby
表达式fby
的行为相当于 ->
与 pre
的组合。fby
的文法定义如下
Expression fby Expression
对 i1 -> pre i2;
, 等价于 i1 fby i2;
。
fby
例程如下。对o
的流为 0,i_(1),i_(2),... i_(n)
。
node fbyExpr(i: int) returns (o: int)
let
o = 0 fby i;
tel
在 Scade 6 中,也有fby 时序操作符,但需要注意语法语义与 Lustre v6 的不同。
current
表达式current
表达式的文法定义为
current Expression
当 Expression
在当前周期值不更新的情况下,采用最近一次周期更新的值。
current
使用样例如下。当时钟 ck
为 not ck
时,流 o
在对应周期的值为流 i
在最近一次周期更新后的值。
node currentExpr(i: int) returns (o: int)
var
ck: bool;
let
o = current(i when ck);
ck = true -> not pre ck;
tel
when
表达式when
表达式用于时钟采样。其文法形式如下
Expression ::= Expression when ClockExpr
ClockExpr ::= Lv6IdRef ( Lv6Id )
| Lv6Id
| not Lv6Id
| not (Lv6Id)
为了使输入时钟与输出时钟匹配,可用该表达式。
when
表达式的例程如下。输入流 i
的时钟(when ck) 与输出流 o
的时钟(when ck)匹配。
function whenExpr(ck: bool; i: int) returns (o: int when ck)
let
o = i when ck;
tel
merge
表达式merge
表达式从 Lustre v6 起引入。其作用为合并时钟流。其文法定义如下
Expression ::= merge Lv6Id MergeCaseList
MergeCaseList ::= [ MergeCase ] { MergeCase }
MergeCase ::= [( (Lv6IdRef | true | false) -> Expression )]
merge
表达式使用样例如下。在该样例中,将不同时钟流 i1
(时钟 when clk), i2
(时钟 when not clk) 合并为 base clock 后,赋值于输出流 o
。
node mergeExp(clk: bool; i1 : int when clk; i2: int when not clk) returns (o: int)
let
o = merge clk (true -> i1) (false -> i2);
tel