algorithm – 分析1-mutable-register指令集?

问题摘要

我需要能够为概念CPU指令集生成指令.我有一个几乎工作的算法.

CPU只有1个可变寄存器(名为mut),总是从1开始,还有一些不可变寄存器,其中包含值(名为input [0..n]).这个CPU的指令只是mut上的逻辑门,其中一个输入寄存器将结果存回mut.

我需要一个算法来生成指令,这些指令将允许该CPU为来自某个已定义的真值表的每个可能的输入集生成正确的答案.

作为一个例子,也许我希望这个CPU像AND门一样(其真值表为00 = 0,01 = 0,10 = 0,11 = 1).我应该能够为这个真值表提供算法并让它吐出指令“AND [0] AND [1]”.如果你跟着你的头,你可以看到如果INPUT [0]和INPUT [1]都是1,MUT将只保持1.

尝试

目前,我有一个简单的算法实现,它只是对所有可能的指令集进行广度优先搜索,在每个真值表输入/输出对上测试它们以查看它是否有效.对于我提供算法的许多期望,它只在几个级别的搜索中返回正确的指令集.但是,对于其他人来说,它会在找到结果之前消耗我整个CPU的内存,所以我只能假设它找不到结果.

问题

有没有a)任何有效的方法来设计这个算法,b)任何方式来证明,对于某个指令集,任何预期的真值表都可以实现,或者c)对这个问题的任何现有见解?

我知道卡诺图,但它们生成二维逻辑电路,而这本质上是一维逻辑电路.

如果您有任何疑问,请告诉我.这是一个难以解释的问题,但我真的需要帮助.

指令系统

作为参考,我的说明是:

AND[n]: MUT = MUT & INPUT[n]
OR[n]: MUT = MUT | INPUT[n]
NOT: MUT = ~MUT

我可能能够向CPU发出更多指令,但理想情况下,算法可以尝试用任何给定的指令集解决问题.

最佳答案 我同意Martin Rosenau,我怀疑你的CPU可以处理任何给定的真值表而无需额外的功能.正如你现在所知,我看不出如何实施,例如XOR.

因此,我冒昧地添加一个累加器寄存器ACC(将初始化为False)和另一个命令ACC,它执行:

ACC <- ACC or MUT
MUT <- True

鉴于此,以下例程采用参数规则,该参数规则是bool列表的列表,每行首先指示结果,然后是真值表的输入寄存器0..n.例如,二元XOR将是[[True,True,True],[False,False,True],[False,True,False],[True,False,False]].

这有希望产生正确的指示:

def generateCode (rules):
    rules = [rule for rule in rules if rule [0] ]
    if not rules: return []
    opcodes = []
    for rule in rules:
        rule = rule [1:]
        negs = [i for i, e in enumerate (rule) if not e]
        poss = [i for i, e in enumerate (rule) if e]
        if negs:
            opcodes.append ('NOT')
            for neg in negs: opcodes.append ('OR[{}]'.format (neg) )
            opcodes.append ('NOT')
        if poss:
            for pos in poss: opcodes.append ('AND[{}]'.format (pos) )
        opcodes.append ('ACC')
    return opcodes

例如,从上面取得样本输入,得到[‘AND [0]’,’AND [1]’,’ACC’,’NOT’,’OR [0]’,’或[1]’,’NOT ‘,’ACC’],这似乎是正确的.

这是我测试过的CPU.我添加了一个重置​​按钮,结果将在执行结束时在ACC中.

class CPU:
    def reset (self, inputs):
        self.MUT = True
        self.ACC = False
        self.INP = inputs [:]

    def __call__ (self, opcodes):
        for opcode in opcodes:
            if opcode == 'NOT':
                self.MUT = not self.MUT
                continue
            if opcode == 'ACC':
                self.ACC = self.ACC or self.MUT
                self.MUT = True
                continue
            if opcode [0] == 'O':
                inp = int (opcode [3:-1] )
                self.MUT = self.MUT or self.INP [inp]
                continue
            if opcode [0] == 'A':
                inp = int (opcode [4:-1] )
                self.MUT = self.MUT and self.INP [inp]
                continue
            raise Exception ('Need more dried frog pills.')
        return self.ACC

再一次,我很抱歉我无法用您指定的限制回答您的问题,但希望我的代码片段对您有用.

点赞