我需要能够为概念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的内存,因此我只能假设它无法找到结果。
是否有)设计此算法的任何有效方法,b)任何方式证明,对于某个指令集,可以实现任何预期的真值表,或者c)对此问题的任何现有见解?
我知道卡诺的地图,但它们会产生二维逻辑电路,而这本质上就是一维逻辑电路。
如果您有任何疑问,请告诉我。这是一个难以解释的问题,但我真的需要帮助。
作为参考,我的指示是:</ p>
AND[n]: MUT = MUT & INPUT[n]
OR[n]: MUT = MUT | INPUT[n]
NOT: MUT = ~MUT
我可能能够向CPU发出更多指令,但理想情况下,算法可以尝试用任何给定的指令集来解决问题。
答案 0 :(得分:2)
我同意Martin Rosenau,我怀疑你的CPU可以处理任何给定的真值表而无需额外的功能。正如你现在所知,我看不出如何实施,例如XOR。
因此,我冒昧地添加了一个累加器注册器ACC(将初始化为False)和另一个命令ACC
,其中包含:{/ p>
ACC <- ACC or MUT
MUT <- True
鉴于此,以下例程采用参数rules
,该参数是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]', 'OR[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
同样,我很抱歉我无法用您指定的限制回答您的问题,但希望我的代码片段对您有用。