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

时间:2019-01-31 16:49:10

标签: c++

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

下面是我编写的程序。

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;
}

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

2 个答案:

答案 0 :(得分:0)

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

您可以向set_a类添加一个方法(以下称其为node)来修改其状态(布尔值),并向另一条线通知另一条线以调用set_a它的连接节点。


更新:另外,您想修改evaluate以使用节点而不是布尔值。这样,您就可以为问题提供更多面向对象的解决方案。

答案 1 :(得分:0)

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

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

class Wire
{
private:
    Node* from;
    Node* to;
};

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

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

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