检测逻辑电路模拟器中的环路

Detecting a loop in logic circuit simulator

本文关键字:环路 模拟器 逻辑电路 检测      更新时间:2023-10-16

我正在尝试编写一个逻辑门电路模拟器,到目前为止一切都在工作,除了一件事。我的结构如下所示:

struct node
{
    int number;
    bool has_value;
    bool is_input;
    bool value;
    Gate operation;
    node* input1;
    node* input2;
};

该程序使用递归计算输出值,因此结构内的任何类型的循环都会弄乱一切。我的问题是:我如何检测这样的东西(见图),因为我想不出任何有效的方法。

电路

处理该问题的明显方法是在每个节点中包含bool,表示该节点是否已在当前模拟步骤中被访问过。

您希望最初将其设置为false,例如在构造函数中。

然后,模拟步骤将包括遍历图形一次以清除标志。当且仅当当前设置了标志时,您才会从给定节点执行递归。

然后运行模拟步骤。这将以大致相同的方式进行,但逻辑颠倒过来。访问每个节点时,请检查其visited标志。如果已设置,您可以立即返回(并且您刚刚在图表中检测到一个周期)。否则,您可以设置标志,处理该节点的输入(等等 - 您通常的模拟"东西"),然后执行递归调用以在其子节点上进行模拟。如果它们中的任何一个循环回此调用,该调用将立即返回(因为您已经设置了标志),结束递归调用的"腿"。