【发布时间】:2014-01-12 21:00:46
【问题描述】:
问题总结
我需要能够为概念 CPU + 指令集生成指令。我有一个几乎可以工作的算法。
CPU 只有 1 个始终以 1 开头的可变寄存器(名为 mut),以及一些包含值的不可变寄存器(名为 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) 对这个问题的任何现有见解?
我知道卡诺图,但它们会生成 2D 逻辑电路,而这本质上是 1D 逻辑电路。
如果您有任何问题,请告诉我。这是一个很难解释的问题,但我真的需要帮助。
指令集
作为参考,我的说明是:
AND[n]: MUT = MUT & INPUT[n]
OR[n]: MUT = MUT | INPUT[n]
NOT: MUT = ~MUT
我也许可以向 CPU 发送更多指令,但理想情况下,算法可以尝试使用任何给定指令集解决问题。
【问题讨论】:
-
您有哪些可用的说明?比如你有条件分支指令吗?
-
我们需要更多地了解 CPU 指令集。它可以原生执行哪些操作? “只是逻辑门”是不够的信息。我看到指令的形式是 mut reg[i] 但是可用的
集合是什么? -
这些指令是严格线性的——一旦启动,它就会在指令中运行,没有可用的分支。我将使用“指令集”编辑主题。
-
MUT 有多大? 1位?大小无限?
-
在不移位的情况下无法使用按位运算进行加法。要检查是否所有可能的逻辑表都是可能的,您必须检查 16 种可能性。如果你有一个 NOT 指令,你只需要检查 8 种可能性。我检查了 NOT、AND、OR 和 XOR 的组合是否可以在不读取输入两次的情况下工作。如果没有第二个 MUT 寄存器,就无法摆脱 XOR 指令。
标签: algorithm assembly boolean logic