具有列表实现的逻辑模拟器 c++

Logic simulator c++ with list implementation

我正在使用 C++ 开发逻辑模拟器。这是一个计算机工程课程的项目。该模拟器接收两个输入文件,电路描述和输入模式。电路描述包括输入输出个数和门电路;例如: AND2 I1, I2, N1 // 是一个具有两个输入和一个节点 N1 作为输出的与门。 我想用结构或列表来实现它,但我不知道如何连接所有节点以及如何编写一个评估输出(或输出)的函数。

您可以将门建模为 类,它有输入并产生输出。例如:

class Gate
{
public:
    virtual ~Gate() {}
    virtual bool read() = 0;
};

class AndGate : public Gate
{
private:
    Gate *m_Input1;
    Gate *m_Input2;

public:
    AndGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2)
    {
    }

    bool read() override
    {
        return m_Input1->read() & m_Input2->read();
    }
};

class OrGate : public Gate
{
private:
    Gate *m_Input1;
    Gate *m_Input2;

public:
    OrGate(Gate *input1, Gate *input2) : m_Input1(input1), m_Input2(input2)
    {
    }

    bool read() override
    {
        return m_Input1->read() | m_Input2->read();
    }
};


class NotGate : public Gate
{
private:
    Gate *m_Input;

public:
    NotGate(Gate *input) : m_Input(input)
    {
    }

    bool read() override
    {
        return !m_Input->read();
    }
};

class ConstantLine : public Gate
{
private:
    bool m_State;

public:
    ConstantLine(bool state) : m_State(state)
    {
    }

    bool read() override
    {
        return m_State;
    }
};

这基本上为您提供了一个图形网络。您现在可以将门插在一起。例如计算 ((X | Y) & !Z) 你会做:

ConstantLine x(true);
ConstantLine y(false);
ConstantLine z(true);

NotGate notGate(&z);
OrGate orGate(&x, &y);
AndGate andGate(&orGate, &notGate);

bool result = andGate.read();

在您的解决方案中,您将动态创建门,因此您不应使用原始指针,而应使用智能指针,例如 std::shared_pointer<Gate> 来管理门的输入。