配置语法
配置文件构成
首选看一个示例,examples/example_logic_1.txt
不难发现,配置文件由语句(sentence)构成,语句的基本单位是记号(token),记号由字母、数字和下划线构成。所有的空格将被忽略。
配置中记号可以分为3类,标识符(identifier),字面值(literal)和运算符(operator)。在示例中,A2、C9、clock_5MHz、D0、S0 等都是标识符,100 、5、0是字面值,=、&、| 、(、)和/是运算符。
每一个语句都是赋值语句,即包含一个赋值运算符 = 和被其分开的左式和右式。左式包含且仅包含一个标识符,右式则是形式更自由的拓展的逻辑表达式。根据左式的不同,可以将语句分为输入输出语句、定义变量语句、定标器语句,其左式分别是输入输出端口标识符、变量标识符、定标器标识符。语句之间由换行符分隔,即没有行末标记同时每行最多有一个语句,允许有空行。
标识符
标识符分为以下几类
- 输入输出端口
- 时钟
- 定标器
- 变量
输入输出端口
输入输出端口又可以分为3类
- 前面板网口48路输入输出
- 背板输入输出
- 子板 lemo 口输入输出
硬件的前面板一共有 12 个用于逻辑输入输出的网口,每个网口有 4 路,总计 48 路。这 12 个网口又分为3组(A、B、C),每组 4 个网口 16 路。这 48 路从上到下分别命名为 A0-A15,B0-B15,C0-C15。
硬件的背板目前只有 2 路输入输出,分别是 Back 和 Extern。其中 Back 用于输入输出触发信号,Extern 用于输出时钟信号。
硬件的每个子板有 8 个 lemo 口输入输出,最多可以有 3 个子板,这些端口命名为 A16-A31,B15-B31,C16-C31,以表示与前面板网口的并行关系。
时钟
时钟标识符都有相同的前缀clock_和后缀Hz,前缀和后缀之外部分表示该时钟信号的频率。频率可以是单纯的数值,比如100,表示时钟信号的频率是 100Hz ;也可以是带有字母后缀 k 或者 M,比如 5k 和 5M,分别表示时钟信号的频率是5000Hz 和 5,000,000 Hz。
定标器
定标器用于计数选定信号的频率,最多有 32 个定标器,所以将定标器标识符命名为 S0-S31。
变量
变量标识符用于自定义中间变量,中间变量必须先定义再使用(先出现在左边,再出现在右边)。
字面值
字面值由数字组成,表示一个数。有两种使用情形
- 紧跟在运算符
/后面,其含义是对/前面的表达式分除字面值表示的倍数 - 0 或 1,表示逻辑假或真,可以跟在
&或者|后面
运算符
运算符分成3类
- 逻辑运算符
&、|、(和) - 分除运算符
/ - 赋值运算符
=
逻辑运算符顾名思义,表示信号之间的运算操作,&为与操作,|为或操作,操作顺序都是从左往右,且 & 和 | 优先级相同。( 和 ) 配对出现,用于提高内部表达式的优先级。
分除运算符即除号 /,除号左边是被分除的信号,右边是分除的倍数,为字面值。分除即降低一个信号的频率,比如分除100倍,则左边信号触发 100 次后,分除结果信号才产生一次触发;如果分除前是1kHz,则分除 100 倍后为10Hz。
赋值运算符即等于号 =,每一个语句都包含且仅包含一个=,但根据左式可以分为3种情况
- 左式是输入输出端口标识符,表示该端口输出右式输入信号的运算结果
- 左式是分除标识符,表示给中间变量赋值
- 左式是定标器标识符,表示该定标器监测右式输入信号运算结果
输入输出语句
输入输出语句的左式为输入输出端口标识符,表示该端口是输出端口,输出的信号是右式的运算结果。右式可能为
- 逻辑表达式,e.g. 示例第 1、2、5 、7 行
- 时钟表达式,仅有单个的时钟标识符,表示该端口输出一个时钟信号;e.g. 示例第 3、6 行
定义变量语句
定义变量语句的左式为变量名,右式是任意的逻辑表达式。自定义的变量用于方便阅读和记忆。e.g. 示例第 4 行
定标器语句
定标器语句的左式为定标器标识符,右式是逻辑表达式;e.g. 示例第 8-10 行。
上下文语法检查
配置文件中不同的语句需要满足以下上下文语法检查的条件
- 一个端口不能同时作为输入和输出,但是一个输出端口可以出现在定标器语句的右式作为监测对象
- 变量必须先定义再使用
- 不允许分除嵌套,比如说
(A0 / 5) / 20,因为这种情形完全可以用A0 / 100替代
简单示例
前面板组合逻辑
我们首先从最简单的例子开始,一个与门
该语句表示前面板第1个端口和第4个端口的输入做与符合,符合结果在第3个端口输出。前面的硬件介绍提到过,对于 pixie16 插件,网口的第1路和第4路用于输出,第2路和第3路用于输入;因此,MZTIO 的网口如果是使用网线和 pixie16 的网口连接的,那么 MZTIO 的该网口的第1路和第4路就只能作为输入,而第2路和第3路只能作为输出。因此不难理解这个语句为什么初看那么怪异。
子板组合逻辑
如果要从子板输出输出,可以利用子板输入输出标识符
该语句表示第三块的子板第1个 lemo 口和第2个 lemo 的输入做或符合,符合结果在第6个 lemo 口输出。如果对硬件不熟悉,可以查看前面硬件介绍,如此即可理解硬件中子板只有8个 lemo 口,而对于最下面的对应前面板 C 组端口的子板,lemo 口从上往下对应网口 C1、C2、C5、C6、C9、C10、C13、C14
背板组合逻辑
如果要从背板输出单路的信号,只需设置左式为 Back
该语句和前面板组合逻辑小节中的只有左式不同,表示前面板第1个端口和第4个端口的输入做与符合,符合结果在背板输出。
时钟输出
前面板端口和背板都可以输出时钟信号,但是前面板任意一个端口都可以输出时钟信号,而背板只有一路可以输出
该语句表示在第三块子板的第5个 lemo 口输出 5MHz 的时钟信号。
该语句表示在背板输出 5MHz 的时钟信号作为 pixie16 的外部时钟。
分除
所谓分除,就是降低信号的频率,比如分除100倍,就是原信号每来100个才输出1个,如果原信号是1kHz,分除后就只有10Hz。
分除可以直接和其他语句结合使用。
定标器计数
定标器的监测对象为右式的运算结果,右式可以是输出端口,也可以是输入端口的组合,甚至是自定义变量
这里展示了3个定标器对不同的对象进行监测
- 第1个语句表示监测前面板第4个端口的输入(输出)频率
- 第2个语句表示监测前面板第1个端口和第4个端口的输入信号的与符合结果的频率
- 第3个语句表示监测自定义变量
D0的频率(这里仅作为示例,实际中使用应该先定义D0这个变量)