📜  门| GATE-CS-2006 |问题 25(1)

📅  最后修改于: 2023-12-03 14:58:27.320000             🧑  作者: Mango

门 | GATE-CS-2006 | 问题 25

本题需要实现一个线性数据结构来存储门以及与之相连的门。在一个仿真器中,门可以是输入、输出、组合逻辑或时序电路的组成部分。

问题描述

在设计一个门的仿真器时,需要实现一个门的数据结构,该数据结构需要可以存储与门相连的输入和输出,以及计算门的输出。

门可以被组成电路的一个层次结构中。在该层次结构中,输出门可以被输入门链接。门和它们的数据连接可以被改变。

Gate 类应该支持以下接口:

输入接口
class Gate:
    def get_output(self):
        pass

    def set_input(self, idx, gate):
        pass

    def get_inputs(self):
        pass

get_output()

get_output() 函数应该计算并返回门的输出。

set_input(idx, gate)

set_input(idx, gate) 函数应该将给定输入门连接到门的 idx 个输入。

例如,如果有一个 2-输入的门,并且希望与这个门相连,则应该调用 set_input(0, in_gate)set_input(1, in_gate)

get_inputs()

get_inputs() 函数应该返回与门相连的输入门的列表。

输出格式

将上述接口实现完成的代码提交,以 markdown 格式返回。

class Gate:
    def get_output(self):
        pass

    def set_input(self, idx, gate):
        pass

    def get_inputs(self):
        pass
思路

本题需要实现门的嵌套数据结构。每个门的信息由以下属性组成:

  • inputs: 一个列表,存储所有与该门相连的输入门。
  • output: 门的输出。
  • name: 门的名称。

我们可以通过继承 Gate 类来实现具体的门类型。例如,BinaryGate 可以实现两个输入端口的二进制门,UnaryGate 实现一个输入端口的二进制门。

当我们需要计算某个门的输出时,我们可以递归调用所有与之相连的输入门的 get_output() 函数,并在计算完毕后使用该门的逻辑计算公式计算门的输出。

代码实现

我们先实现一个 Gate 类,并继承 Gate 类实现具体的门类型。

class Gate:
    def __init__(self, name):
        self.output = None
        self.name = name
        self.inputs = []

    def get_output(self):
        pass

    def set_input(self, idx, gate):
        self.inputs[idx] = gate

    def get_inputs(self):
        return self.inputs

class BinaryGate(Gate):
    def __init__(self, name):
        super().__init__(name)
        self.inputs = [None, None]

class AndGate(BinaryGate):
    def get_output(self):
        if self.output is not None:
            return self.output

        in0, in1 = self.get_inputs()

        if in0.get_output() == 1 and in1.get_output() == 1:
            self.output = 1
        else:
            self.output = 0

        return self.output

class OrGate(BinaryGate):
    def get_output(self):
        if self.output is not None:
            return self.output

        in0, in1 = self.get_inputs()

        if in0.get_output() == 1 or in1.get_output() == 1:
            self.output = 1
        else:
            self.output = 0

        return self.output

class UnaryGate(Gate):
    def __init__(self, name):
        super().__init__(name)
        self.inputs = [None]

class NotGate(UnaryGate):
    def get_output(self):
        if self.output is not None:
            return self.output

        in0 = self.get_inputs()[0]

        if in0.get_output() == 0:
            self.output = 1
        else:
            self.output = 0

        return self.output

以上代码实现了 Gate 类和四种门类型:And、Or、Not 和它们的基类二进制门 BinaryGate 以及其基类 UnaryGate

在计算门的输出时,我们递归调用了所有与之相连的输入门的 get_output() 函数,以便获取它们的输出。我们还使用了一个 output 变量来存储门的输出,以避免多次计算门的输出。

总结

本题要求实现一个门的数据结构,每种门对应一个嵌套的数据结构。当我们需要计算某个门的输出时,我们递归调用所有与之相连的输入门的 get_output() 函数,并在计算完毕后使用该门的逻辑计算公式计算门的输出。

该代码实现了 Gate 类和四种门类型:And、Or、Not 和它们的基类二进制门 BinaryGate 以及其基类 UnaryGate