模板文件需为拓展名是 .template
的 UTF-8 编码的文本文件。
在模板文件中,空行没有任何特殊含义,仅用于分隔。每条语句独占一行,由空格指示缩进层次,每层缩进严格为 4 个空格,不能越级缩进。
相同缩进层级的语句(包括内部有更多缩进的语句)会被视为同一语句块,和 Python 的缩进思路类似。
对于每条语句,应遵循如下格式:
<indent-spaces><ClassName> [<key1>=<value1>[ <key2>=<value2>[ ...]]]
<ClassName>
在 blocks
中定义,后续有若干可选的,用键值对标注的,空格隔开的参数。可选项及其含义与参数列表如下:
ClassName |
语句含义 | 参数 | 参数含义 |
---|---|---|---|
Init |
将全部寄存器初始化为随机值 | ||
Endless |
生成一个死循环的跳转块 | label |
指定使用的标签,默认为 "_e" |
Calc |
随机生成基本的与计算相关语句 | pick |
指定选取的指令,由| 隔开多项 |
reg |
指定可供选用的寄存器*(默认选用 "vats") | ||
repeat |
指定生成指令的条数(默认为 1) | ||
Beq # |
随机生成一个跳转块,保证不生成死循环 | end |
指定循环终量使用的寄存器**(默认选用 $s*) |
var |
指定循环变量使用的寄存器**(默认选用 $t*) | ||
Procedure # |
生成一个过程调用块,保证不会出现死循环 | ||
SwLw # |
生成一组配套的字存取指令,地址由随机生成的立即数与寄存器值计算得到 | reg_s |
需要保存的寄存器*(默认随机生成) |
reg_l |
需要写入的寄存器*(默认随机生成) | ||
low |
读写的最低地址(以字为单位,默认为 0) | ||
high |
读写的最高地址(以字为单位,默认为 3071) | ||
repeat |
重复生成的次数 | ||
DataRW |
产生连续地址的读写代码 | AddrStart |
起始地址(以字节为单位,默认为 0) |
AddrEnd |
结束地址(以字节为单位,默认为 12284) | ||
AddrStep |
地址遍历步长(以字节为单位,默认为 4) | ||
SL |
指定方向(默认为 load ,另一个可选项为 store ) |
#:该指令接受块的嵌套,可通过增加一个缩进层次进行代码块的嵌套
*:此处通过字符串指定选取的寄存器范围,如字母 'v' 表示允许选用 $v0 和 $v1 这两个寄存器,全部可选的范围是 "vats0"
**:此处需要指定完整的寄存器的名字,包括 '$'
在 blocks
包中新建一个 .py
文件,创建一个类,继承 blocks.BlockBase.BlockBase
类,实现其 spawn
方法即可。
在新增模块中,需要提供全局方法 instance
,然后新增类的一个实例即可。