条件模块:
在当前循环中,当控制流依赖一个可计算条件时,条件模块是一个方便的表达方法。

clock_block ::=active [[id]]((if_block|match_block))if_block ::=if expr then ((data_def|if_block))else ((data_def|if_block))
match_block ::=when expr match{{|patterm:data_def}}+

if_block分支能包含另一个if_block或者a sope 申明;match_block分支只能包含一个scope申明。
一个结果模块的任何分支可以为空。
例子:
1.
条件必须是布尔型或者枚举类型。下面节点有个错误:

node ex1(x:int16) returns(y:int16)
let
activate when x match
| 0:y=0;
|_:y=1;
returns ..;
tel;

2.定义变量必须在一个分支中有个定义。在下面的例子中,o2没有定义:

node ex2(i:bool) returns(o1,o2:int64)
let
activate Act if i
then o1=1;
else o1=2;
returns o1,o2;
tel;

3.条件块是可以嵌套的。注意:最后分支的else是空的:

type Tenum=enum{red,blue,pink,purple};
node ex3(eI1:Tenum;iI2:int32) returns(i01:int32 last=0)
let
activate when eI1 match
|red:var iV1:int32;
let
iV1=10+last 'i01;
i01=iV1+iI2;
tel;
|blue:
let
activate if iI2>0
then i01=iI2*iI2;
else i01=-iI2+last'i01;
returns i01;
tel;
|pink:i01=100->pre i01 -1;
|purple:
returns i01;
tel;

4.下面的例子通过变量y说明一个错误的因果:

type T=enum{a,b,c};
node ex(x:T) returns (y:T last=b)
let
activate when y match
|a:y=a->pre(y);
|b:y=x;
|c;
returns ..;
tel

5.一个结果分支可以为空。定义的流必须有个last或者一个好的初始化default申明:

node ex(i:int32) returns(o:int32 last=0)
letactivate if i>0then o=i;elsereturns o;
tel

数据:

i:-2 1 1 -2 2 1 -1 2 ...
o:0  1 1 1  2 1  1 2 ...

6.一个结果分支可以为空。定义的流必须有个last或者一个好的初始化default申明:

function ex(i:int32) returns(o:int32 default=4)
letactivate if i>0then o=i;elsereturns o;
tel

数据:

i:-2 1 1 -2 2 1 -1 2 ...
o: 4  1 1 4 2 1  4 2 ...

PS:SCADE中如果出现多个语句不用{}用let..tel把语句括起来。

状态机
状态机提供关于联合控制和数据流信息在一个model更好的阐述。

state_machine  ::=automaton[[ID]]{{state_decl}}state_decl  ::=[[initial]][[final]]state ID
[[unless{{transition;}}+]] data_def
[[until{{transition;}}[[synchro[[action]]fork;]]]]transition     ::=if expr arrowarrow     ::=[[actions]]fork
fork      ::=target |if expr arrow{{elsif_fork}}[[else_fork]] end
elsif_fork     ::=elsif expr arrowelse_fork     ::=else arrowtarget        ::=restart ID|resume IDactions    ::=do{[[emit]]emission_body
{{;[[emit]]emission_body}}}
|do data_def

任何状态都被打上initial标签,不必是第一个状态。但只有一个和唯一状态必须有此标签。任何状态都能被标记final标签,甚至最初的一个。
然而,当没有synchro马上转型存在当前automaton中,这个标签是没有用的时候:
按关键字unless引入强转变的可能是空列表;
一个可能空的scope申明
按关键字until引入弱转换可能是空列表;

强和弱的转换能导致相同的状态在它们出现时候。一个状态任然可能是空的。一个synchro转换可能出现在弱转换列表中。
弱转换在函数体中的scope中的本地变量和信号申明中提及,而强转换不允许。
当一个synchro转换在当前状态发生时,出现这种状态的所有状态机必须至少有一个final属性的标签。
如果这些状态机中的一个没有一个final状态,synchro转换将不被执行。相反,如果没有状态机出现这种状态,这个synchro转换同样不被执行。

当一个无效的转换用restart指定一个目标状态时,这是这个状态被重启
  1.如果这个转换是强的,这时目标状态中弱部分和the body被重启在同一个循环,然它的强部分将在下一循环重启。
  2.如果这个转换是弱的,这个目标状态的所有状态将被重启在当前循环
相反,当目标状态用resume指定时,内部如果有的话,状态被保持。

例子:
1.
第一个例子显示在automaton中的所有语法:强和弱机制,restart和resume,在状态和本地过度中flows的定义:

node StateMachine1(bI1:bool) returns (b01:bool default=true;i02:int16 default=0;b03:bool   default=false)
let
automaton SM1
initial state ST1
unless if bI1 resume ST2;#强转换
sig
sig1;
var
iV1:int16;
let
iV1=10;
emit ’sig1;
b01=’sig1;
i02=iV1->pre i02 +2
tel
state ST2
sig
sig1;
var
bV1:bool;
until if true do let emit ’sig1;#弱转换bV1=’sig1;--弱转换不能再内部进行定义
b03=bV1;
restart ST1;
returns ..;
tel

2.这个例子说明:命名规则中的一些规则允许去重载一个ID:

type
SM1=uint16;node StateMachine2(iI1:int32) returns(i01:int32)
let
automaton SM1
initial state ST1
sigSM1;
var ST1:int32;
let
ST1=iI1;
emit 'SM1;
i01=ST1+(if 'SM1 then 1 else 0);
tel
returns ..;tel

3.在下面例子里有个逻辑错误在automaton的左侧:在状态ST1中声明的变量bV2可以被用在若转换的条件中,但不能被用在它不识别的状态ST2中。
相反,在状态机ST2中的强转换能提及bV1。bV1是在状态之间共享的变量。bV1可以定义在ST1中也可以定义在ST2中。

node StateMachine31(iI1:int32) returns(i01:int32)
var bV1:bool;
let
automaton SM1
initial state ST1
var bV2:bool;
let
bV2=false->not pre bV2;
bV1=iI1<>0;
i01=iI1*2;
tel
until if bV1 and bV2 restart ST2;state ST2
unless if bV1 resume ST1;
return ..;
telnode StateMachine32(iI1:int32) returns(i01:int32)
var bV1:bool;
let
automaton SM1
initial state ST1
var bV2:bool;
let
bV2=false->not pre bV2;
bV1=iI1<>0;
i01=iI1*2;
tel
until if bV1 and bV2 restart ST2;state ST2
unless if last 'bV1 resume ST1;
return ..;
tel

4.这个例子说明default申明的作用:当控制器是没有定义变量的状态机,default表达式被执行。

node StateMaChine(iI1:int16;bI2:b00l)
returns (i01:int16 default =10;i02:int16 default=5*i01)
let
automaton SM1
initial state ST1
unless if bI2 resume ST2;
let
i01=iI1;
tel
until if true restart ST2;state ST2
let
i02=0->pre i01+iI1;
tel
until if true restart ST1;
returns ..;
tel

数据:

iI1:  1     1     1      2     0   ...bI2:false false  ture  false  tureActive:  S1    S2     S2     S1    S2
i01:   1    10     10     2     10i02:   5     0     11     10    10

5.变量i01不能在ST1转换和ST2的body中被定义。在状态机中变量的定义和在转换中变量的定义必须是独有的:

node StateMachine(iI1:int32;bI2:bool)
returns (i01,i02:int32)
let
automaton
initial state ST1
unless if bI2 do i01=iI1+1; restart ST2;
until if true do i01=10; restart ST2;state ST2
unless if bI2 do i02=0;restart ST1;
i01=0;
until if true do i02=-10;restart ST1;
returns ..;
tel

6.当进入一个automaton的状态时禁止用变量获取外部的clock,这里是iI1和i01,这时过滤操作才被执行。甚至,bI2的时钟状态丢失,本地变量iV1被锁在一个无效的时钟识别码:

node StateMachine(iI1:int32 when bI2;clock bI2:bool)
returns(i01:int32 when bI2)
let
automaton
initial state ST1
var iV1:int32 when bI2;
let
iV1=(0 when bI2)->pre iV1+1 when bI2;
i01=iI1->pre iV1;
tel
until if bI2 restart ST1;
returns i01;
tel

7.在一个状态机或者转换的scope中的变量不能再这个scope外使用。如下:在弱状态几种申明的变量bV1,变量bV1不能作为转换的条件。注意:一旦不能跳出它,state ST2将进入死循环:

node StateMachine(iI1:int16)
returns(i01:int16)
let
automaton SM1
initial state ST1
let
i01=iI1*2;
tel
until if bV1 do
var bV1:bool;
let
bV1=iI1>10;
tel
restart ST2;
state ST2;
returns ..;
tel

8.如下面的例子:由于缺乏定义和default申明,当状态ST2是激活状态,变量i02被保持。
PS:通过弱restart转换输入状态,但同时初始化即使没有做last申明这个变量。的确,一个restart转换不要求为变量做last申明通过last操作符。
它评估调用的最后一个值如常,restart转换只有->和fby操作来初始化值。
初始化可能有个错在一个强转换从ST1到ST2的案例中。的确,全局初始化被要求在初始化状态

node StateMachine(iI1:int32;bI2:bool)
returns(i01:int32;i02:int32)
let
automation
initial state ST1
let
i01=iI1;i02=iI1*2;
tel
until if bI2 restart ST2;state ST2
let
i01=1-> -iI1;
tel
until if true restart ST1;
returns ..;
tel

9.restart转换是异步的。当从ST1的restart转换进入ST2,这条流中的状态都要重启。当进入这个状态时,在状态ST2_2中变量z的值被编译。这个例子相反
ST2状态机中的本地变量,在restart转换后,ST2重启。这个缺乏last申明变量将导致一个初始化错误。甚至,automaton A2也被重启,所以它选中的状态是
它的初始化状态ST2_1和y的计算结果是它的最后的值,因为在该状态y没有明确定义。下一循环ST2_2被激活,y在是0,因为这将是第一次被自重新激活。

node N() returns(x,y:int32 last=0)
let
automaton A
initial state ST1
let tel
until if true restart ST2;state ST2
var z:int32 last=2;
let
automaton A2
initial state ST2_1
let
z=3+last'z;
x=last'x+1;
tel
until if x mod 2=0 returns ST2_2;state ST2_2
let
x=last'z-1;
y=0->pre z -1;
tel
until if true resume ST2_2;
returns ..;
tel
until if true resume ST1;
returns ..;
tel

数据:

Active:ST1 ST2_2ST1ST2_1ST1ST2_2ST1ST2_1...
x: 0 112 2        1           1        2
y: 0        0          0           0        0        4           4        4        ...
z:          2                      5                 5                    5        ...     

Scade——学习笔记(4)相关推荐

  1. Scade——学习笔记

    词汇元素也叫词位被用于描述语言结构的句法 正则表达式符号: 符号                         含义 ID=re 在正则表达式中ID被定义为re | 替代 re? 出现re的次数为0 ...

  2. Scade——学习笔记(2)

    属性 一些申明可能会给可见和可用的属性目标, visiblity ::=private|public#可视化 external ::=imported;#外部 interface_status ::= ...

  3. Scade——学习笔记(5)

    表达式:  表达式是Cade语言的基本块.表达式允许流的联合仅仅通过申明在一个周期内应该做什么: expr ::= id_expr | atom | list_expr | tempo_expr | ...

  4. Scade——学习笔记(3)

    用户定义操作 用户定义是面向过程语言提供最基本的句法.它们允许重用之前在Model中定义的操作. 用户定义操作: user_op_decl ::=op_kind interface_status ID ...

  5. 系统工程(SE)学习笔记(番外篇之一)——Capella使用体会兼谈SE工具

    系统工程(SE)学习笔记(番外篇之一)--Capella使用体会兼谈SE工具 零.Capella简介 壹. Capella的优势 贰.Capella的缺点 叁. 生态环境 肆. 总结 说到SE,就不能 ...

  6. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  7. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

最新文章

  1. golang 判断字符串是不是数字
  2. 小程序返回上一页_智能小程序档案馆手把手教你成为小程序流量头号玩家(上)...
  3. ns-3文件编译出错总结
  4. MySql5.7.12设置log-bin
  5. apache 禁止trace或track防止xss***
  6. 【JVM】第三章 垃圾收集机制
  7. [Java] 蓝桥杯BASIC-23 基础练习 芯片测试
  8. 匹配追踪分解 时频 matlab,基于匹配追踪(MP)算法的信号自适应分解研究及其应用...
  9. 2014年5月第二个周末总结--保守自己的心
  10. Zuul使用Ribbon配置自动重试
  11. c语言贪吃蛇毕业论文,毕业论文c语言贪吃蛇
  12. stm32晶振匹配电容_晶振的匹配电容选择
  13. 【历史上的今天】12 月 26 日:现代计算机鼻祖诞生;手机之父出生;美国史上最大信息盗窃案
  14. tp5 微信新版本商家转到到零钱,v3秘钥,平台证书和平台证书序列号
  15. 百度快速排名 24小时进前五 刷网站排名
  16. Mysql(多级分销)无限极数据库表设计方法
  17. 不借助第三方插件,用js画日历
  18. C语言关于变量定义未使用编译警告warring
  19. 国密SM4算法(简介与C源码)
  20. CodeForces - 14E Camels【DP】

热门文章

  1. java工厂实例1_盖浇饭案例
  2. 一招教你如何选工业机器人视觉!
  3. 【推荐收藏】11种比较常用的时间序列预测模型
  4. Creo5.0关闭默认内置浏览器
  5. 实验7-继承下的构造函数与析构函数
  6. 图像处理基础学习笔记——OpenCV已学API汇总
  7. scrapyd部署爬虫项目
  8. 华为OD机试 - 获得完美走位(C 语言解题)【独家】
  9. 【回归模型中两变量相乘】交互作用,调节作用
  10. 【论文阅读|深读】DANE:Deep Attributed Network Embedding