Lustre v6 语法 - 时序表达式

概述

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 使用样例如下。当时钟 cknot 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

你可能感兴趣的:(Lustre,v6,语言教程,Lustre,Scade,MBSE)