NCHUD-数字电路模拟程序讲解
引言
数字电路是一种处理离散信号的电子电路。与处理连续变化信号(如声音、温度)的模拟电路不同,数字电路只识别和运算两种基本状态:高电平(通常表示为 “1”)和低电平(通常表示为 “0”)。这正好与二进制数制系统相对应,使得数字电路成为所有计算机和数字系统的物理实现基础。请编程实现基础版数字电路模拟程序,支持核心逻辑门的仿真计算。
一、电路元件
电路中包含与门、或门、非门、异或门、同或门五种基础逻辑元件,各元件核心特征如下:
- 与门(标识符:A)
结构:包含两个或多个输入引脚和一个输出引脚;
逻辑规则:所有输入引脚均为高电平(1)时,输出引脚为高电平(1);只要有一个输入引脚为低电平(0),输出引脚为低电平(0)。 - 或门(标识符:O)
结构:包含两个或多个输入引脚和一个输出引脚;
逻辑规则:所有输入引脚均为低电平(0)时,输出引脚为低电平(0);只要有一个输入引脚为高电平(1),输出引脚为高电平(1)。 - 非门(标识符:N)
结构:包含一个输入引脚和一个输出引脚;
逻辑规则:输出引脚电平与输入引脚电平相反(输入 0 输出 1,输入 1 输出 0)。 - 异或门(标识符:X)
结构:包含两个输入引脚和一个输出引脚;
逻辑规则:两个输入引脚电平不一致时(一个 0、一个 1),输出高电平(1);电平一致时(均为 0 或均为 1),输出低电平(0)。 - 同或门(标识符:Y)
结构:包含两个输入引脚和一个输出引脚;
逻辑规则:两个输入引脚电平一致时(均为 0 或均为 1),输出高电平(1);电平不一致时(一个 0、一个 1),输出低电平(0)。
二、程序输入
- 元件命名规则
与门、或门:采用 “标识符 (输入引脚数)+ 编号” 格式命名,例如:A (8) 1(8 输入引脚的与门,编号 1)、O (4) 2(4 输入引脚的或门,编号 2);
非门、异或门、同或门:采用 “标识符 + 编号” 格式命名,例如:N1(非门,编号 1)、X8(异或门,编号 8)、Y4(同或门,编号 4)。
约束条件:
不同类型元件的编号可重复(如 X4 和 Y4 可同时存在);
同一类型元件的编号不可重复,允许不连续(如 N1、N3 可存在,无需 N2)。 - 引脚信息格式
引脚信息由 “元件名 - 引脚号” 构成,例如:A (8) 1-2(与门 A (8) 1 的 2 号输入引脚)、X5-2(异或门 X5 的 2 号输入引脚)。
约束条件:
输入引脚编号连续,若元件有 n 个输入引脚,则编号范围为 [1, n],无重复编号;
所有元件仅一个输出引脚,默认编号为 0(如 A (8) 1-0 代表与门 A (8) 1 的输出引脚)。
3. 电路输入信息格式
原始输入格式:以 “INPUT:” 开头,后跟多个 “输入名 - 信号值” 组合(信号值为 0 或 1),各组合之间用英文空格分隔。例如:INPUT: A-0 B-1 C-0 表示输入 A 为 0、输入 B 为 1、输入 C 为 0;
连接信息格式:以方括号 “[]” 包裹,第一个元素为输出引脚(原始输入名或元件输出引脚),后续元素为接收该信号的输入引脚,各元素之间用英文空格分隔。例如:
[A A(8)1-1 A(8)1-3 X5-2] 表示原始输入 A 的信号传递给与门 A (8) 1 的 1 号、3 号输入引脚,以及异或门 X5 的 2 号输入引脚;
[Y8-0 N1-1 O(4)2-3 Y2-1] 表示同或门 Y8 的 0 号输出引脚信号传递给非门 N1 的 1 号输入引脚、或门 O (4) 2 的 3 号输入引脚、同或门 Y2 的 1 号输入引脚。
连接约束:
一个输出引脚可连接多个输入引脚;
一个输入引脚不能连接多个输出引脚(否则视为无效输入);
输出引脚之间不能直接短接。
4. 输入结束标志
所有输入信息以 “end” 为结束标志,“end” 之后的内容忽略不计。
三、程序输出
输出顺序:按 “与门→或门→非门→异或门→同或门” 的顺序输出;同类元件按编号从小到大排序;
输出格式:每个有效元件输出一行,格式为 “元件名 - 0: 输出值”(输出值为 0 或 1)。例如:A(2)1-0:1、X3-0:0;
无效元件处理:若元件存在输入未连接、输入引脚冲突等情况,输出无法计算,程序忽略该元件,不输出其信息。
设计与分析
一、设计目标
本数字电路模拟器(第二版)旨在实现对 9 种数字电路元件的精准仿真,涵盖基础逻辑门、三态门、译码器、数据选择器和数据分配器,支持复杂组合逻辑电路的输入解析、拓扑构建、仿真计算与规范输出。核心目标包括:
兼容多类型元件:适配不同引脚结构(控制引脚 / 输入引脚 / 输出引脚)和逻辑规则的元件;
鲁棒处理输入:正确解析原始输入和元件连接关系,检测输入冲突;
精准仿真计算:按元件逻辑规则迭代计算输出,处理依赖关系和无效状态;
规范结果输出:按指定顺序和格式输出有效元件的结果,过滤无效元件。
二、总体设计架构
模拟器采用面向对象设计思想,整体分为数据模型层、输入解析层、仿真计算层和输出层四大模块,各模块职责清晰、低耦合,架构如下:
2.1 数据模型层:封装核心实体
核心作用是抽象电路中的关键元素,为后续处理提供数据支撑。
枚举类:ComponentState定义元件状态(等待输入 / 已计算 / 无效),SourceType定义引脚数据源类型(原始输入 / 其他元件输出),确保状态和类型的标准化;
PinSource 类:封装输入引脚的数据源信息,包括类型、名称和输出引脚索引,清晰追踪每个输入的源头;
CircuitComponent 类:抽象所有电路元件的通用结构,包含类型、ID、引脚数、输入数据源列表、输出值、状态等核心属性,提供构造方法(动态初始化输入引脚列表)和display()方法(格式化输出),是元件的核心模型;
DigitalCircuitSimulator 类:模拟器核心控制类,维护原始输入值映射和元件映射,整合输入解析、仿真计算、输出等所有核心功能。
2.2 输入解析层:构建电路拓扑
核心作用是将用户输入的文本信息转化为程序可识别的电路结构,包含 3 个关键方法:
readInput():读取输入文本,分别调用原始输入解析和连接关系解析方法;
parseInputValues():使用正则表达式提取原始输入(如 “INPUT: A-1 B-0”),存储到inputValues映射;
parseConnection():解析元件连接关系(如 “[A A (2) 1-1]”),去除方括号、拆分引脚信息,通过getOrCreateComponent()方法创建或获取元件,构建PinSource并绑定到目标元件的输入引脚,同时检测输入冲突(一个输入引脚连接多个输出引脚)并标记元件为无效。
2.3 仿真计算层:核心逻辑执行
核心作用是按元件逻辑规则计算输出,处理依赖关系和无效状态,是模拟器的核心模块:
simulate():迭代仿真循环,直到所有元件输出稳定(无变化),遍历所有元件,仅处理处于 “等待输入” 状态的元件;
元件输入处理方法:HandleCommonComponent()(处理与 / 或 / 非 / 异或 / 同或 / 数据分配器)、HandleSComponent()(三态门)、HandleMComponent()(译码器)、HandleZComponent()(数据选择器),分别校验输入有效性、收集输入值,控制无效则标记元件为无效;
GetSourcePinValue():根据引脚数据源类型,获取原始输入值或其他元件的输出值,适配译码器、数据分配器等特殊元件的输出映射;
calculateOutput():根据元件类型调用对应的逻辑计算方法(如andGate()、MGate()),返回计算结果;
逻辑计算方法:实现 9 种元件的核心逻辑,如与门的 “全 1 出 1”、译码器的 “控制有效时单输出 0” 等。
2.4 输出层:规范结果展示
核心作用是按题目要求排序元件并格式化输出:
printOutput():先将元件按 “与门→或门→非门→异或门→同或门→三态门→译码器→数据选择器→数据分配器” 排序,同类按 ID 升序;
仅输出处于 “已计算” 状态的元件,调用CircuitComponent的display()方法,按元件类型输出对应格式(如译码器输出有效引脚号,数据分配器输出 “-” 和数据的组合)。
三、关键模块详细设计
3.1 元件模型设计(CircuitComponent 类)
根据元件类型动态初始化输入引脚列表,适配不同元件的引脚结构:
基础逻辑门(A/O/N/X/Y):直接使用指定的输入引脚数;
三态门(S):固定 2 个输入引脚(控制端 + 输入端);
译码器(M):2 输入→3 控制 + 2 输入 = 5 个引脚,3 输入→3 控制 + 3 输入 = 6 个引脚;
数据选择器(Z):n 个控制端→n + 2ⁿ个引脚(控制端 + 数据输入端);
数据分配器(F):n 个控制端→n + 1 个引脚(控制端 + 数据输入端)。
3.2 输入冲突检测设计
在parseConnection()方法中,绑定PinSource到目标元件的输入引脚前,先检查该引脚是否已绑定数据源:
若已绑定,则标记目标元件状态为INVALID,仿真时跳过该元件;
若未绑定,则正常绑定数据源,确保一个输入引脚仅连接一个输出引脚,符合题目约束。
3.3 迭代仿真设计
采用 “迭代遍历” 策略处理元件依赖关系,无需显式构建依赖图:
每次迭代中,仅计算输入全部就绪的元件,将计算结果存入currentValues映射,供其他元件引用;
若本次迭代有元件输出变化,则继续迭代;若无变化,则说明所有元件输出稳定,仿真结束;
该设计能自动处理 “元件 A 的输出作为元件 B 的输入” 这类依赖关系,确保计算顺序正确。
3.4 特殊元件逻辑设计
3.4.1 三态门(S)
引脚规则:0 号为控制端、1 号为输入端;
处理逻辑:控制端为 0 时,标记元件无效;控制端为 1 时,收集输入端值,输出 = 输入端值;
核心代码:SGate()方法中,控制端为 1 返回输入值,否则返回 - 1(无效)。
3.4.2 译码器(M)
引脚规则:0=S1、1=S2、2=S3(控制端),3 + 为输入编码端;
控制条件:S1=1 且 S2+S3=0 时有效,否则标记元件无效;
计算逻辑:输入编码转换为输出引脚编号(如 3 输入编码 001 对应输出引脚 1),输出该编号。
3.4.3 数据选择器(Z)
引脚规则:前 n 个为控制端,后 2ⁿ个为数据输入端;
处理逻辑:先根据控制端编码计算选中的数据输入端索引,仅收集该索引对应的输入值;
计算逻辑:输出选中的数据输入端值。
3.4.4 数据分配器(F)
引脚规则:前 n 个为控制端,最后 1 个为数据输入端;
计算逻辑:控制端编码转换为输出引脚索引,输出时仅该索引位置显示数据,其余位置显示 “-”。
四、算法分析
4.1 仿真算法复杂度
时间复杂度:设元件总数为 k,每个元件的输入引脚数为 m,迭代次数为 t。每次迭代需遍历 k 个元件,每个元件需遍历 m 个输入引脚,故时间复杂度为 O (t×k×m)。实际中,迭代次数 t 通常较小(电路输出很快稳定),因此算法效率较高,能满足常规电路的仿真需求;
空间复杂度:主要占用空间为components映射(存储 k 个元件)、inputValues映射(存储原始输入)和currentValues映射(存储元件输出),空间复杂度为 O (k + n)(n 为原始输入个数),占用空间较小。
4.2 输入解析算法
原始输入解析使用正则表达式,时间复杂度为 O (s)(s 为原始输入行长度),匹配效率高;
连接关系解析需拆分每行连接信息,处理每个引脚并创建元件,时间复杂度为 O (l×p)(l 为连接关系行数,p 为每行引脚数),能高效处理常规输入规模。
五、功能测试与验证
5.1 测试用例设计原则
覆盖所有元件类型、输入冲突场景、控制无效场景、依赖关系场景,确保功能完整性。
5.2 典型测试用例验证
测试用例 1:基础与门仿真
输入:
plaintext
INPUT: A-1 B-1
[A A(2)1-1]
[B A(2)1-2]
end
预期输出:A(2)1-0:1
验证结果:与门 A (2) 1 的两个输入均为 1,输出 1,符合预期。
测试用例 2:三态门控制无效场景
输入:
plaintext
INPUT: C-0 D-1
[C S1-0]
[D S1-1]
end
预期输出:无(三态门控制端为 0,标记无效)
验证结果:模拟器未输出该三态门,符合预期。
测试用例 3:译码器控制有效场景
输入:
plaintext
INPUT: S1-1 S2-0 S3-0 A0-0 A1-1
[S1 M(2)1-0]
[S2 M(2)1-1]
[S3 M(2)1-2]
[A0 M(2)1-3]
[A1 M(2)1-4]
end
预期输出:M(2)1:2
验证结果:译码器控制有效,输入编码为 10(A1=1、A0=0),对应输出引脚 2,符合预期。
测试用例 4:数据分配器仿真
输入:
plaintext
INPUT: A-0 B-1 D-0
[A F(2)1-0]
[B F(2)1-1]
[D F(2)1-2]
end
预期输出:F(2)1:--0-
验证结果:控制端编码为 10(B=1、A=0),对应输出引脚 2,显示数据 0,其余引脚显示 “-”,符合预期。
5.3 边界场景测试
输入冲突场景:一个输入引脚连接两个输出引脚,元件被标记为无效,不输出;
元件输入不全场景:部分输入引脚未连接,元件标记为无效,不输出;
多依赖场景:元件 A 的输出作为元件 B 的输入,元件 B 的输出作为元件 C 的输入,仿真迭代 3 次后稳定,输出正确。
踩坑心得
一、输入解析:格式适配与冲突检测的坑
- 引脚字符串解析的 “边界陷阱”
坑点:不同元件的引脚字符串格式差异大(如A(2)1-1、Z(2)2-3、M(3)1-5),最初直接按 “-” 分割提取元件名时,误将M(3)1-5拆分为M(3)1和5,但对于F(2)1-3这类分配器引脚,却因未考虑元件类型差异导致解析错误。更严重的是,原始代码中getComponentNameFromPin方法注释了正则校验逻辑,直接使用substring(0, pinStr.lastIndexOf('-'))提取元件名,看似通用,实则在遇到非标准引脚字符串(如无 “-” 的输入)时会报索引异常。
解决方案:
保留并完善正则校验逻辑,针对不同元件类型(带括号 / 不带括号)编写匹配规则,确保元件名提取准确;
增加异常捕获,对不符合格式的引脚字符串直接标记对应元件为INVALID,避免程序崩溃;
解析引脚索引时,严格遵循题目约定(普通门引脚 1 对应列表索引 0,带控制引脚的元件按 “控制 - 输入 - 输出” 顺序编号),避免索引越界。 - 输入冲突检测的 “遗漏场景”
坑点:最初仅在parseConnection方法中检查 “输入引脚是否已绑定数据源”,但忽略了 “同一输出引脚短接多个输入引脚” 的隐性冲突(题目约束输出引脚不能短接)。此外,当数据源为其他元件的输出时,未检测该输出引脚是否已被其他输入引脚引用,导致潜在逻辑冲突。
解决方案:
维护一个outputPinUsed映射,记录输出引脚(原始输入或元件输出)已连接的输入引脚数量,若超过 1 则标记所有关联输入引脚的元件为INVALID;
在绑定PinSource前,先校验输出引脚是否已被短接,若已短接则直接标记目标元件为无效;
对于元件输出作为数据源的情况,额外检查该元件输出是否已被其他输入引脚引用,确保符合 “输出引脚不能短接” 的约束。
二、元件模型:动态引脚初始化与状态管理的坑
- 特殊元件引脚数量计算错误
坑点:译码器、数据选择器、数据分配器的引脚数量需动态计算,最初开发时误将 “控制引脚数” 与 “输入引脚数” 混淆:
译码器(M):题目要求 2-4 译码器有 3 个控制引脚 + 2 个输入引脚,共 5 个输入数据源,但最初按pinSize + 2初始化,导致引脚数量不足;
数据选择器(Z):n 位控制端需n + 2ⁿ个引脚,最初误算为2ⁿ个,遗漏了控制引脚,导致输入数据源列表长度错误;
三态门(S):题目明确有 1 个控制引脚 + 1 个输入引脚,但最初按普通元件默认 2 个引脚初始化,未区分控制端和输入端,导致后续逻辑计算错误。
解决方案:
严格对照题目要求,为每种特殊元件编写明确的引脚数量计算逻辑,例如:
译码器(M):pinSize为输入引脚数,控制引脚固定 3 个,故输入数据源列表长度为pinSize + 3;
数据选择器(Z):pinSize为控制引脚数,数据引脚为2^pinSize个,故列表长度为pinSize + (int)Math.pow(2, pinSize);
三态门(S):固定 2 个输入引脚(控制端 + 输入端),直接初始化列表长度为 2;
在CircuitComponent构造方法中添加断言或日志输出,验证引脚列表长度是否符合预期,便于开发阶段调试。 - 元件状态管理的 “逻辑漏洞”
坑点:最初仅在输入冲突或输入不全时标记元件为INVALID,但忽略了 “控制引脚输入无效” 的场景:
三态门控制端为 0 时,输出应为高阻态(无效),但最初未标记元件为INVALID,导致仿真时仍会计算输出;
译码器控制端不满足S1=1、S2+S3=0时,应标记为无效,但最初仅在计算输出时返回无效值,未更新元件状态,导致输出时误判为有效元件。
解决方案:
在元件输入处理方法(如HandleSComponent、HandleMComponent)中,一旦检测到控制引脚无效,立即将元件状态设为INVALID,并终止后续输入收集;
仿真循环中,仅处理状态为PENDING的元件,跳过INVALID和COMPUTED状态,避免无效计算;
在calculateOutput方法中,增加元件状态校验,若为INVALID直接返回 - 1,确保输出值与状态一致。
三、仿真计算:依赖关系与特殊逻辑的坑
- 迭代仿真的 “死循环风险”
坑点:最初设计仿真循环时,仅判断 “是否有元件输出变化” 作为循环条件,但未考虑 “元件输出变化后,之前已计算的元件因依赖变化需重新计算” 的场景,导致部分元件输出始终无法稳定,陷入死循环。例如:元件 A 的输出作为元件 B 的输入,元件 B 的输出作为元件 C 的输入,元件 C 的输出又反馈给元件 A,若未正确处理依赖关系,会导致循环迭代无休无止。
解决方案:
优化仿真循环逻辑,每次迭代仅计算 “输入全部就绪且状态为PENDING” 的元件,避免重复计算已稳定的元件;
限制最大迭代次数(如 100 次),若超过次数仍有变化,判定为电路存在循环依赖,标记相关元件为INVALID;
在currentValues中存储元件输出时,仅更新状态为COMPUTED的元件输出,确保依赖数据的准确性。 - 特殊元件逻辑计算错误
坑点:三态门、译码器、数据选择器的核心逻辑容易与题目要求偏离:
三态门(S):最初误将 “控制端为 1 时输出输入值,控制端为 0 时输出 0”,违背题目 “控制端为 0 时输出高阻态(无效)” 的要求;
译码器(M):题目要求控制有效时 “仅一个输出引脚为 0,其余为 1”,最初误将输出值计算为 “有效输出引脚的绝对编号”,而非相对编号,导致输出格式错误;
数据分配器(F):最初未正确获取数据输入引脚的值,误将控制端编码作为输出值,导致输出序列中 “-” 与数据的位置颠倒。
解决方案:
逐字对照题目描述,编写每种特殊元件的逻辑计算方法,确保完全符合题目要求:
三态门:控制端为 1 时返回输入值,为 0 时返回 - 1(无效),并标记元件为INVALID;
译码器:控制有效时,根据输入编码计算相对输出引脚编号(如输入 00 对应编号 0),输出该编号,而非绝对引脚号;
数据分配器:先获取最后一个输入引脚(数据端)的值,再根据控制端编码计算输出索引,输出时仅该索引位置显示数据,其余为 “-”;
为每种特殊元件编写单独的单元测试用例,验证逻辑计算结果是否符合预期,例如:给译码器输入控制端1、0、0和输入编码0、1,验证输出是否为 1。
四、输出格式:排序与格式化的坑
- 元件排序逻辑错误
坑点:题目要求输出顺序为 “与门→或门→非门→异或门→同或门→三态门→译码器→数据选择器→数据分配器”,同类按编号升序。最初开发时,误将S(三态门)的排序优先级放在M(译码器)之后,且同类元件排序时未区分 “带括号的元件名”(如A(2)1)和 “不带括号的元件名”(如X8),导致排序混乱。
解决方案:
构建明确的类型优先级映射(Map<Character, Integer>),严格按照题目要求的顺序赋值,例如'A'→0、'O'→1、'S'→5、'M'→6;
同类元件排序时,先提取编号(带括号的元件从)后提取,不带括号的从标识符后提取),转换为短整数后比较,确保按编号升序排列;
排序后遍历元件时,仅输出状态为COMPUTED的元件,过滤无效元件,避免输出冗余信息。 - 特殊元件输出格式不符
坑点:译码器和数据分配器的输出格式有特殊要求,最初开发时未完全遵循:
译码器:题目要求输出 “M (输入引脚数) 编号:有效输出引脚号”,最初误输出为 “M (输入引脚数) 编号 - 0: 有效输出引脚号”,多了 “-0”;
数据分配器:题目要求按引脚编号从小到大输出,无效引脚为 “-”,最初误将数据端值输出为编号,而非对应位置显示数据;
三态门:题目要求输出 “SD-2: 输出值”(D 为编号),最初误输出为 “S-2: 输出值”,遗漏了编号。
解决方案:
在CircuitComponent的display()方法中,为每种特殊元件编写精准的格式化输出逻辑,严格对照题目示例:
译码器(M):System.out.printf("M(%d)%d:%d\n", InputPinSize, id, output);
数据分配器(F):遍历2^InputPinSize个输出引脚,按索引是否等于输出值决定显示数据或 “-”;
三态门(S):System.out.printf("S%d-2:%d\n", id, output);
输出前先打印测试用例的预期输出,与实际输出对比,逐行校验格式是否一致,尤其是特殊字符(如冒号、短横线)的位置。
五、核心反思与避坑总结
精读题目是前提:数字电路模拟器类题目对细节要求极高,尤其是元件逻辑、输入输出格式、约束条件,必须逐字逐句精读,避免因理解偏差导致的逻辑错误。建议将关键要求(如元件引脚顺序、输出格式)整理成表格或注释,开发时随时对照。
模块化设计是基础:最初因未严格划分模块,导致输入解析、仿真计算、输出格式化的逻辑混杂,排查错误时难以定位。后来通过拆分 “输入解析层、仿真计算层、输出层”,每个模块专注单一职责,大幅降低了调试难度。
单元测试是关键:特殊元件的逻辑计算和输入输出格式容易出错,建议为每种元件、每个核心方法编写单元测试用例,例如:单独测试译码器控制有效 / 无效场景、数据选择器不同控制端编码的选择逻辑,提前发现问题。
日志与断言是辅助:开发阶段在关键节点(如引脚初始化、元件状态变更、逻辑计算)添加日志输出,或使用断言验证关键参数(如引脚列表长度、输出值范围),便于快速定位错误位置。
边界场景不可忽视:输入不全、控制无效、输出短接、循环依赖等边界场景,容易被忽略但往往是测试用例的重点。建议在开发初期就梳理所有边界场景,针对性编写处理逻辑,避免因遗漏导致程序不鲁棒。
此次开发踩坑的过程,本质上是对 “细节把控” 和 “逻辑严谨性” 的考验。数字电路模拟器的核心是 “精准仿真”,任何一个微小的错误(如引脚索引偏移 1、逻辑判断条件颠倒)都会导致输出结果错误。通过此次实践,不仅掌握了复杂组合逻辑电路的仿真实现方法,更养成了 “精读需求、模块化设计、重视测试” 的开发习惯,这些经验将为后续时序电路、子电路等更复杂功能的扩展奠定基础。
总结
1.开发经验与收获
需求理解是核心:数字电路仿真对细节要求极高,元件的引脚规则、控制逻辑、输出格式等需逐字对照题目确认,避免因理解偏差导致功能错误;
模块化与单元测试不可或缺:将复杂流程拆分为输入解析、仿真计算、输出等模块,每个模块专注单一职责,同时为特殊元件编写单独测试用例,能快速定位并解决问题;
边界场景需重点关注:输入冲突、控制无效、输入不全等边界场景是测试重点,提前梳理并编写针对性处理逻辑,能大幅提升程序鲁棒性。
可优化方向
扩展时序元件支持:当前仅覆盖组合逻辑元件,后续可新增 D 触发器、JK 触发器等时序元件,支持时钟信号与反馈电路仿真;
增强异常处理:增加无效引脚编号、循环依赖、元件重复定义等异常场景的检测与提示,提升程序容错性;
可视化界面开发:通过 GUI 展示电路拓扑、仿真过程与输出结果,支持拖拽式搭建电路,提升用户体验;
性能优化:针对大规模复杂电路,引入拓扑排序替代迭代仿真,减少计算次数,提升仿真效率。
浙公网安备 33010602011771号