用户定义操作

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

user_op_decl ::=op_kind interface_status ID[[size_decl]]
params returns params{{where_decl}}[[spec_decl]]
op_kind ::function|node
size_decl ::=<<[[ID{{,ID}}]]>>
params ::=([[var_decls{{;var_decls}}]])
where_decl ::where TYPEVAR{{,TYPEVAR}}nemeric_kind
spec_decl ::=specialize path_id
opt_body ::=;|equation;[[singnal_block]][[local_block]]
let{{equation;}} tel[[;]]

信号是本地变量需要使用关键词sig;本地变量被介绍需要使用关键词var;
方程中的每个输入、大小、本地变量至少被使用一次。
信号至少被发射和获取一次。
一个函数不能引用通过方程操作的值,节点可以,它只能使用当前值。

例子
1.相同的变量名多次出现:

node ex1(x:int16;x:bool) returns(y:float64)...;

2.由于一个输入变量和一个变量大小冲突导致错误:

node ex2<<n>>(n:int32) returns(p:int32)...;

3. 输入变量的类型是输出变量导致冲突:

function ex3(x:'T) returns(p:int32);

4.给出的函数:

function ex4(clock h:bool;y,z:int16) returns (o1:int16;o2:bool)
let
o1=merge(h;y when h;z when not h);
o2=(y>z);
tel;

5.给出的节点:

node ex5(clock h:bool;y:int32 when h)
returns (o1:int32 when h last=0 when h)
let
activate if y>0 when h
then o1=y;
else
returns ..;
tel;

变量申明
变量可以在几处地方申明:作为输入和输出的参数在节点申明中;作为一定范围内的本地变量:

var_decls ::=var_id{{,var_id}}:type_expr[[when_decl]][[default_decl]][[last_decl]]
var_id ::=[[clock]][[probe]]ID
when_decl ::=when clock_expr
default_decl ::=default=expr
last_decl ::=last=expr

var_id的特别之处:
clock:这种类型的变量类型一般在简单的其他流中申明。它大部分在时钟和状态机中使用。
probe:工具相关的指令,确保该变量的名称将在编译过程中被保留
这些属性的顺序是相关的:clock属性在probe属性之前
申明组的识别码被作为一个表达式除了带有clock标志的识别码。这种类型的申明通常跟在一个时钟表达式when_decl之后。
例子:
1.无效变量作为时钟:

(x:bool;y:int32 when x) 修改后 (clock x:bool;y:int32 when y)

2. 无效的默认表达式:在第一次循环必须被定义:

(x:int32;y:int 32 default=pre(x))

3.时钟分析错误:

(clock h:bool;y:int default=1 when h last=0 when not h)

时钟表达式:
通过时钟表达式来定义频率。
clock_expr ::=id
|not id (id match patter)
PS:时钟表达式只能通过when操作符和第一个为activate命令操作。
例子:
1.有效的时钟表达式:

type t=enum{incr,stdby,ecr};
function Sample(clock h:bool;clock k:t;x:int32) returns(y,z:int32)
let
activate when k match
|incr :y=x+1;
|stdby :y=x;
|decr :y=x-1;
returns y;
z=merge(h;x when h;x when not h);
tel;

2.无效的时钟表达式:

clock h:bool;
var k:int32;
var x:bool when k;
var y:bool when h match Blue;
var z:bool when pre h;

申明范围:

data_def ::=equation;
|scopescope ::=[[signal_block]][[local_block]][[eqs]]
signal_block ::=sig ID{{,ID}};
local_block ::=var{{var_decls;}};eqs ::let {{equation;}}tel;

一个范围是一组通过let-tel关键词包围的方程,可能之前通过本地变量申明。
信号是本地变量它的申明通过特殊关键字sig。信号识别码不能被直接使用在方程内部。
它们只在申明中出现。没有信息类型被请求作为一个信号申明,一个信号通常作为一个boolen流使用。
一个信号总是能很好的定义在它第一次活动的瞬间。

本地变量通过var关键词被申明。在一些时钟申明的识别码专属于当前环境的这些时钟。

方程部分定义方程、时钟快、状态机、信号释放。每一个在范围内申明的本地变量必须准确的出现一次在方程的左边或者在时钟块或者状态机的返回状态中。
每个本地变量至少被使用一次在这些方程中。信号至少要发射和捕捉一次。

例子:
1.无效的信号识别码重载:

node ex1(x:int16) returns(y:float64)
sig x;
let
...
tel;

2.有效的信号识别码重载:

const c:int32=0;
function ex2(x:bool) returns (y:int32)
sig c;
let
...
tel;

3.无用的本地变量:

node ex3(x:int8) returns(y:int8)
var z:int8 last=0;
let
z=2*pre(x)+1;
y=x-pre(x);1
tel;

 函数体
 输出和本地变量在函数体必须有个精确的定义。这种定义可以是一个唯一的方程亦或者时钟控制器或机器状态的几个行为状态。
 在本地函数中的申明必须被发射一次或者几次。
 
 方程:
 方程允许定义联系一个输入或着本地识别码的数据流表达式。这种表达式在每个周期都会被评估,通过输入/输出和当前/之前的值去认定识别码分配给这个识别码。
 方程可以被申明为数据流或者控制流通过解决问题。

 方程  ::=simple_equation
|spec_equation
|emission
|control_block return
simple_equation ::=lhs=expr
lhs  ::()|lhs_id{{,lhs_id}}
spec_equation  ::=assume ID:expr
| guarantee ID:expr
control_block  ::=state_machine|clocked_blockemission ::=emit emission_body
emission_body  ::=NAME[if expr]|(NAME{{,NAME}}) [[if expr]]return ::=returns returns_var
return_var ::={{ID,}}((ID|..))

例子:
1.aussume识别码的重载阻止之前识别码的使用:

const c:int32 =0;
node ex(x:int32;b:bool) returns(y:int32)
letassume c:true;
y=if b then x else c->pre y;
tel;

2.因果分析错误:x 和 y定义互斥

emit 's if x;
x=if y>0 then false else true->pre(x);
activate if x
then y=1;
else y=if 's then 0 else 0->pre(y);
returns y;

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

  1. Scade——学习笔记

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

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

    条件模块: 在当前循环中,当控制流依赖一个可计算条件时,条件模块是一个方便的表达方法. clock_block ::=active [[id]]((if_block|match_block))if_b ...

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

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

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

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

  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. 设计模式16——Memento设计模式
  2. 按功能顺序列出的 HTML 4.01/XHTML 1.0
  3. Golang之envconfig的使用
  4. mySQL(关系型数据库管理系统)编辑
  5. 不同路径 IIPython解法
  6. c# 中实用包,实用dll。
  7. XP蓝屏代码集(转)
  8. 人工智能ai以算法为基础_为公司采用人工智能做准备
  9. 程序设计导引及在线实践之麦森数
  10. 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
  11. 【STM32】使用ST-LINK V2下载程序
  12. WSL2设置固定ip
  13. python两个表格相同数据筛选_python筛选出两个文件中重复行的方法
  14. 求一个数组的全排列(java)
  15. 《Java SE实战指南》09-01:访问级别修饰符概述
  16. linux系统修改时区
  17. mysql zlib_[MySQL 学习] zlib库相关结构和函数-阿里云开发者社区
  18. uniapp组件-uni-fav收藏按钮
  19. 编程php计算行李托运费_飞机行李箱怎么算托运费?
  20. UI-Bootstrap 模态对话框示例

热门文章

  1. linux更新依赖文件夹,更新了个依赖程序,结果悲剧了,连ls命令都不能用,大神帮帮忙!...
  2. 嵌入式开发-迅为IMX6开发板硬件详情介绍
  3. 招聘软件测试笔试题及答案,软件测试笔试题及答案 招聘笔试题(一般能力测试50道及答案).doc...
  4. 配置实验室服务器环境(记录一些坑)
  5. Trie 树——Golang实现
  6. C# 类型 占几个字节, 不同编码方式 比较
  7. 遗言网站帮逝者继续交友
  8. kotlin build.gradle.kts配置,支持占位符替换文件中变量
  9. 转自笔译小王子李锦森 JOHNSON的博客 真正好的英文网站
  10. Unicode 控制字符