具有列表实现的逻辑模拟器 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, ¬Gate);
bool result = andGate.read();
在您的解决方案中,您将动态创建门,因此您不应使用原始指针,而应使用智能指针,例如 std::shared_pointer<Gate>
来管理门的输入。
我正在使用 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, ¬Gate);
bool result = andGate.read();
在您的解决方案中,您将动态创建门,因此您不应使用原始指针,而应使用智能指针,例如 std::shared_pointer<Gate>
来管理门的输入。