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]

通过紫水晶分析器喂入预设的二进制序列。