这将有点长,可能比任何语言特定的计算机科学相关(尽管我需要使用Java)。你被警告了。
我正在尝试模拟并行线路上电信号的传播,以模拟基本的计算机硬件。每条路径上都有各种元素,导致我的原始信号的延迟,放大和其他这样的变换。
这是我刚刚制作的图片:
问题在于时机。我为每个电线和每个门分配一个时间延迟。例如,如果最左上方的线具有0.5的时间延迟,则第一个门接收输入需要0.5个单位的时间。我将每个门都绘制成多输入,因此可能会发生以下情况(考虑一个AND门):input1以1.1个单位的时间到达,并且为高;输出仍为零。但是输入2(也是高电平)有一个1.3单位延迟到达那里,所以0.2单位之后输出将重新计算变高。实际上每个门本身都会有一个延迟,所以说AND门需要0.5个单位来计算;最终的高输出将需要(1.3 + 0.5)= 1.8单位才能变高。
我目前的编程模型是:导线和门是可以相互连接并向前发送信号的对象。例如,wireA_input连接到实际输入,wireA_output连接到门。因此输入信号进入(从其先前值改变),该动作应调用send_signal(wireA,输入)。此函数将wireA上的值更改为wireA_delay之后的输入值。然后,wireA执行send_signal(gateA,wireA_value),这会导致门重新计算其值,然后在gateA_delay等之后将其发送到下一个对象。
但我需要并行传播信号 - 我不能只关注一条串行路径!所以我的想法是为每个输入创建多个线程。至多我认为我需要32个输入信号,所以32个线程。我希望以循环顺序安排它们以获得平等,我不确定我是否可以使用JVM执行此操作。无论哪种方式,他们都将获得相同的优先权。
现在,第i个输入线程完成了我上面描述的内容 - 它沿着信号向下传播。但是当路径分支到多条路径时会发生什么?
重要的是要注意门可以有多个“扇出”,即从其输出到其他地方的链接。该值通常最多为4。因此,在gateA设置之后,它知道它需要调用send_signal(wireB-> E,gateA_value)4次,每个扇出一次。
理想情况下,我不想分支到不同的线程,这对于更大的设计来说真的很糟糕,而且可能是不可能的,但是嘿,也许首先不需要线程的整个概念。我不需要以荒谬的速度进行模拟,只需足以显示对人类用户的响应。
回到我可能的实现 - 输入线程沿着串行路径传播直到BAM - 它分支到4个不同的路径。这是我的想法:现在让同一个线程有4条路径。每条路径都有自己的延迟(例如:1.4,2.2,3.6,1.1)。将每个延迟乘以100,并循环N次迭代,其中N对应于最大延迟(在这种情况下:360)。在对应于其他延迟(i = 110,140,220)的循环中的各个检查点处,向前一步传播那些各种路径(即,将信号发送到路径上的紧邻的下一个对象)。但是,我们需要将此对象添加到循环列表中,并在我们进一步向下传播该特定路径之前再次计算适当的迭代次数。
当1到4路径的所有4条路径分支到4条路径时(依此类推等等),那么我有点搞砸了;但也许这种方法足以让我开始?
我可能会从完全错误的方向来解决这个问题,我愿意退后一步重新思考它。因此,为什么我问你们。
非常感谢你的任何输入,甚至读这个该死的东西。欢呼声。
答案 0 :(得分:2)
如果您的所有延迟都是非负(安全假设)和确定性(合理安全的假设),那么每次您有事件时,您都会自动知道它触发的事件及其发生的时间。
为什么不在事件中使用优先级队列并在事件发生时处理它们?当发生某些事情时,计算所有结果事件的时间并将它们添加到队列中;然后从队列中获取下一个事件并处理它。