◈Meth.py
Meth.py 是一个用于描述和仿真基础数字电路的领域特定语言(DSL)。由 Alexz 于 2024 年创建。
介绍
Indigo 是一种受早期继电器计算机启发而设计的编程语言,其核心在于聚焦于布尔代数和有限状态机的核心概念。用于表达和模拟基于二进制逻辑的计算。
Meth.py 最初是为了 EleSystem 机电系统的逻辑验证语言。而后延续了 Indigo 的理念进行了完全重写。
快速开始
Meth.py 程序(后续称 Meth 代码页)以 .meth 为扩展名。你可以使用任何代码编辑器便携 Meth 代码页。这些程序既可以单次运行,也可以动态运行。
最初的 Meth 使用 C 编写,出于方便爱好者进行方言或拓展编写的考虑。它现在完全迁移到了 Python。
模块头
Meth 代码页以模块头声明开始。模块头定义了模块的名称,以及它有哪些输入端口。
MODULE <代码页名> IN: <输入 1> IN: <输入 2> ...
信号
信号是逻辑的血脉。每个信号代表电路中的一个节点,状态为高电平或低电平(T/F)。
使用 F 表示如果该信号没有连接到任何逻辑,默认是关闭的。
使用 T 表示如果该信号没有连接到任何逻辑,默认是连通的。
SIG <信号名> @ BOOL [<默认值>]
示例:
!!! 定义一个名为 VCC 的信号,默认高电平
SIG VCC @ BOOL [T]
逻辑表达式
通过逻辑运算符,可以决定一个信号的状态如何随输入而改变。
not - 逻辑非。
and - 逻辑与。
or - 逻辑或。
这行代码定义了 GateOutput 的逻辑:只有当 A 开启且 B 关闭时,此节点才会点亮。
SIG GateOutput @ BOOL [A and (not B)]
指示灯
LIGHT 用于将信号指示到标准输出中。
同时在紫水晶分析器中被 LIGHT 标记的信号会排在显眼的位置,方便观察逻辑。
LIGHT <信号名>
RET 用于将信号指示到标准错误输出中。
RET 也是唯一一个可以使用在代码页任何位置(即使是模块头之前)使用的特殊语法。
RET <信号名>
注释
Meth 中的注释以 !!! 开头,单行且必须独占一行。
!!! 你好 Meth
类型系统
Meth.py 只支持 bool 类型。
Meth(C)支持 bool、int 和 char* 类型。
同时支持多比特信号:
MUTL <信号名> @ <类型> [<位 2> <位 1> <位 0>]
穿孔纸带
穿孔纸带文件 .tape 严格按行排列。每一列都与 Meth 模块头定义中的 IN: 变量一一对应。
从第一组输入开始,逐行向下读取,每一行对应一个特定的时刻,无法跳跃执行。
在一行纸带被读取的瞬间,所有的输入信号会同时跳变。这使得用户设计复杂的测试场景。
LIGHT <信号名>
如何运行 Meth 代码
methc [file.meth]
主要用于语法验证。不支持动态交互。
编译器会对源代码进行词法、语法解析并生成抽象语法树(AST)。
meth-ui [file.meth]
通过紫水晶分析器动态验证。可在 TUI 中通过方向键和空格切换输入。
meth-ui [file.meth] [tape_file]
通过紫水晶分析器喂入预设的二进制序列。