实现简单的逻辑和延迟模拟器

Implementing simple logic and delay simulator

本文关键字:延迟 模拟器 逻辑和 简单 实现      更新时间:2023-10-16

我正在实现一个简单的逻辑和延迟模拟器。为此,我必须创建 2 个类,即节点和导线,它们分别对网表的节点(门、输入和输出)和节点之间的导线进行建模。节点对象拥有其输出线路 – 如果节点对象被删除,它也会删除其所有输出线路。导线连接两个节点,因此分别存储驱动节点和从动节点的指针。Wire 对象不拥有它们连接的节点 - 它们不需要在销毁时删除节点。为了测试所有这些,我需要实现完整的加法器。

下面是我写的程序。

using namespace std;
class node
{
public:
    bool a;
    //node();
    class wire
    {
         //Don't know what to declare here  
    }
};
bool evaluate (bool x, bool y, char o)
{
 bool z;
if (o == '&')
    z = x & y;
else if (o == '^')
    z = x ^ y;
else if (o == '|')
    z = x | y;
else
    cout << "Error" << endl;
return z;
}
bool evaluate (bool x) //Function overloading
{
 bool inv;
 inv = !x;
 return inv;
}
int main()
{
 vector<node> input(3);
 vector<node> output(2);
 vector<node> intermediate(4);
 cout << "Enter a, b and C_in n";
 cin >> input[0].a;
 cin >> input[1].a;
 cin >> input[2].a;
 intermediate[0].a = evaluate(input[0].a, input[1].a, '^');
 intermediate[1].a = evaluate (input[2].a, intermediate[0].a, '^');
 output[0].a = intermediate[1].a;
 intermediate[2].a = evaluate(intermediate[0].a, input[2].a, '&');
 intermediate[3].a = evaluate(input[0].a, input[1].a, '&');
 output[1].a = evaluate(intermediate[2].a, intermediate[3].a, '|');
 cout << "Sum is "<< output[0].a<<endl;
 cout << "Carry out is "<< output[1].a << endl;
 return 0;
}

目前,我能够实现完整的加法器功能,但不使用其他类线。我还需要在我的解决方案中包含其他类。我该怎么做?

如果我理解正确,您的节点表示存储电力(由布尔值表示)并通过电线连接到其他节点的东西,当两个节点之间的评估完成时,结果应该发送到所有连接的节点。你已经实现了节点,但没有实现电线。

您可以向修改其状态(布尔值)的 node 类添加一个方法(我们称之为 set_a),以及另一个告诉每个连线在其连接的节点上调用set_a的方法。


更新:此外,您希望修改evaluate以使用节点,而不是布尔值。这样你就有一个更加面向对象的问题解决方案。

根据您的规范,结构如下所示:

class Node
{
private:
    std::vector<std::unique_ptr<Wire>> output;
    std::vector<Wire*> inputs;
};
class Wire
{
private:
    Node* from;
    Node* to;
};

其中所有指针都是弱引用,但保留附加Wire实例所有权的Node的输出除外。

由于结构是紧密耦合的,尽管您需要自己管理某些方面,例如:

  • 删除Wire应清除from->outputto->input
  • 删除Node应该循环其输入并取消绑定它们(以便Wire是半附加的,或者如果你的要求不允许,它们应该被完全删除)
  • 删除Node将对其所有输出调用Wire::~Wire(),这应清除对绑定节点输入的所有引用。