Ligral

术语定义

本节介绍了 ligral 的一些术语及其定义,避免文档中出现含义不清的表述,让用户能更好地阅读文档,在遇到问题时能清楚地、规范地表达和搜索信息。

Ligral

Ligral 是一种语言,用文本的形式描述一个仿真模型,等效于一个仿真框图。同时,ligral 也指代 ligral 语言的官方解释器/编译器,是一个程序,可以在终端中调用 ligral 程序,解析 ligral 语言。

用 ligral 语言编写仿真模型,得到的文件称之为 lig 文件,其后缀名为 lig。

框图 Block diagram

框图是表示一个系统各部分之间关系的图示。在 ligral 语言中,各部分指的是是具有特定功能的计算单元,接收一定量的输入,计算一定量的输出或者产生某些外部性影响。各部分之间的关系,指的是输入输出之间的对应关系。很显然,每一个输入对应一个输出,而每一个输出对应零个或多个输入,输入和输入、输出和输出之间不存在对应关系。每一对对应关系总是从输出到输入,是有向的,因此可以用箭头表示。

模块 Model

在 ligral 语言中,模块代表着最小的计算单元。模块要么是 ligral 程序提供的,要么是扩展包提供的,但不是由 ligral 语言编写的。

端口 Port

模块的每个输入或输出都称之为端口,分别为输入端口和输出端口。

模块链 Chain

如果有大于一个模块按照某种特定的顺序排列,使之恰好前后的输出、输入端口互相匹配且连接,并将第一个模块的输入端口和最后一个模块的输出端口暴露出来,所形成的结构称之为模块链。单个模块也可视作一种特殊的模块链。

模块组 Group

大于等于一个模块链并联而成的结构称之为模块组。所有模块链的全部输入端口为模块组的输入端口,所有模块链的全部输出端口为模块组的输出端口。

路由 Route

一种特殊的模块组,规定输入端口仅能为一种特殊的模块 Input 的输入端口,输出端口仅能为另一种特殊的模块 Output 的输出端口。每个路由都是一个类型,其规定了输入输出端口的数量和名字、内部模块的连接方式,提供了一个内部的符号表,拥有一个可配置的参数列表。

每个路由都可以声明任意个不同的实例,这些实例的输入输出端口的数量和名字、内部模块的连接方式都是一致的,但是根据初始化时的参数配置不同可能拥有不同的逻辑。在初始化的时候会生成闭包,内部符号表不可从外部访问,但是可以从内部向外部访问。每个实例都是不同的,因为每个实例都有自己的闭包。

模块链、模块组和路由都是计算单元,它们都是由 ligral 语言编写的。路由最大的特点就在于它是可复用的,声明一个路由类型后,可以进行多次实例化而不会互相干扰。模块链和模块组都是临时声明临时使用的。

节点 Node

模块和路由在形式上具有相似性,都可以声明实例、传入参数等。路由能实现和模块同样的功能(路由内部包含这个模块就能实现这个模块的功能),也可以把路由用模块改写,实现更高效地计算。在用户角度,很难感受到两者的细微差别,就好像一个编译器内置的函数和由模块提供的函数一样。因此,这两者可以统称为节点,这里的结点是相对于整个框图结构而言的。

但是需要注意的是,在 ligral 中有一个模块是空节点,其名称也是 Node ,此节点不包含任何计算逻辑,纯粹只是实现了数据暂存和转发的功能。

在有了节点这个概念后,模块链这一概念可以扩展成“节点链”,模块组可以扩展成“节点组”,对应的逻辑及英文名称没有变。甚至模块链和模块组的元素还可以是一个子模块链或者子模块组,具体请参见 节点连接

接口 Interface

在 ligral 中,接口这一概念和端口有类似之处,即不同模块之间通信的通道。从底层实现的层面看,所有的端口发送或接收的数据都是标量或者矩阵(日后可能会统一成矩阵,即视标量为 1 × 1 1 \times 1 的矩阵),没有区别。但是从上层应用的角度看,每一个节点的不同端口都有其特定的含义,这些端口被其所属的节点、在节点钟的顺序或标识符所区分。比如在一个控制工程中,被控对象输出的状态 x 端口,应当连接到控制器的状态输入端口 x ,如果连接到控制器的参考值输入端口,就没有意义了。

因此,接口是被其所属的节点以及在节点钟的顺序或标识符赋予了特定含义的端口。

签名 Signature

签名是一组接口的集合,它规定了一个声明了这个签名的节点所有的接口以及它们的顺序。换言之,签名是一组具有特定顺序的接口,声明了改签名的节点必须具备和签名完全一致的接口。