From 00dc81948d34d833f2314881ab369095ab857ab2 Mon Sep 17 00:00:00 2001 From: Redo0 Date: Sat, 5 Jun 2021 19:12:21 -0500 Subject: [PATCH] fix bugs with queue inlining; inline gate queue as well --- sim/gate.lua | 2 +- sim/group.lua | 17 +++++++++-------- sim/network.lua | 2 +- sim/simulation.lua | 25 +++++++++++++++++++------ 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/sim/gate.lua b/sim/gate.lua index 9aa64d8..5b11b8a 100644 --- a/sim/gate.lua +++ b/sim/gate.lua @@ -34,7 +34,7 @@ function Gate.setportstate(gate, index, state) --gate[index*2+1] = state gate.port_states[index] = state - if (group.state_num>0) ~= (group.state==1) and (group.in_queue==0) then + if ((group.state_num>0) ~= (group.state==1)) and (group.in_queue==0) then Simulation.queuegroup(GSim, group) end end diff --git a/sim/group.lua b/sim/group.lua index e1ef34e..e7c9c99 100644 --- a/sim/group.lua +++ b/sim/group.lua @@ -39,9 +39,7 @@ function Group.addwire(group, wire) Wire.setgroup(wire, group) Wire.update(wire) - if group.in_queue==0 then - Simulation.queuegroup(GSim, group) - end + Simulation.queuegroup_safe(GSim, group) end end end @@ -98,7 +96,7 @@ function Group.addport(group, port) group.nout_ports = group.nout_ports + 1 group.state_num = group.state_num + Port.getstate(port) - Simulation.queuegroup(GSim, group) + Simulation.queuegroup_safe(GSim, group) elseif port.type == PortTypes.input then if group.in_ports[port] then error("port already in group") end @@ -106,7 +104,7 @@ function Group.addport(group, port) group.in_ports[port] = port group.nin_ports = group.nin_ports + 1 - Simulation.queuegate(GSim, Port.getgate(port)) + Simulation.queuegate_safe(GSim, Port.getgate(port)) end @@ -124,7 +122,7 @@ function Group.removeport(group, port) group.state_num = group.state_num - Port.getstate(port) - Simulation.queuegroup(GSim, group) + Simulation.queuegroup_safe(GSim, group) elseif port.type == PortTypes.input then if not group.in_ports[port] then error("port not in group") end @@ -132,7 +130,7 @@ function Group.removeport(group, port) group.in_ports[port] = nil group.nin_ports = group.nin_ports - 1 - Simulation.queuegate(GSim, Port.getgate(port)) + Simulation.queuegate_safe(GSim, Port.getgate(port)) end Group.rebuild_ports(group) @@ -185,7 +183,10 @@ function Group.setstate(group, state) local len = group.num_gates_update for i = 1, len do - Simulation.queuegate(sim, group.gates_update[i]) + local gate = group.gates_update[i] + if gate.in_queue==0 then + Simulation.queuegate(sim, gate) + end end Simulation.queuegroupfx(sim, group) diff --git a/sim/network.lua b/sim/network.lua index 60ba011..c3b4301 100644 --- a/sim/network.lua +++ b/sim/network.lua @@ -182,7 +182,7 @@ function network_update() Simulation.tickinit(sim) Simulation.tickinput(sim) Simulation.ticklogic(sim) - ticks = ticks + 1 + --ticks = ticks + 1 elseif data[i] == "IN" then local gate = Simulation.getgatebyref(sim, tonumber(data[i+1])) local argc = tonumber(data[i+2]) diff --git a/sim/simulation.lua b/sim/simulation.lua index 5744153..5920325 100644 --- a/sim/simulation.lua +++ b/sim/simulation.lua @@ -118,7 +118,7 @@ function Simulation.addgate(sim, gate) Gate.preinit(gate) Simulation.queuegateinit(sim, gate) - Simulation.queuegate(sim, gate) + Simulation.queuegate_safe(sim, gate) end function Simulation.removewire(sim, objref) @@ -239,11 +239,14 @@ end -- Logic Critical function Simulation.queuegate(sim, gate) + sim.gatequeue[sim.num_gatequeue+1] = gate + sim.num_gatequeue = sim.num_gatequeue + 1 + gate.in_queue = 1 +end + +function Simulation.queuegate_safe(sim, gate) if gate.in_queue==0 then - --table.insert(sim.gatequeue, gate) - sim.gatequeue[sim.num_gatequeue+1] = gate - sim.num_gatequeue = sim.num_gatequeue + 1 - gate.in_queue = 1 + Simulation.queuegate(sim, gate) end end @@ -272,6 +275,12 @@ function Simulation.queuegroup(sim, group) group.in_queue = 1 end +function Simulation.queuegroup_safe(sim, group) + if group.in_queue==0 then + Simulation.queuegroup(sim, group) + end +end + function Simulation.dequeuegroup(sim, group) if group.in_queue~=0 then array_remove(sim.groupqueue, group, true) @@ -309,13 +318,16 @@ function Simulation.ticklogic(sim) local group = sim.groupqueue[i] Group.update(group) group.in_queue = 0 + sim.groupqueue[i] = nil end --sim.groupqueue = {} sim.num_groupqueue = 0 if sim.tickqueue[sim.current_tick] ~= nil then for i, gate in pairs(sim.tickqueue[sim.current_tick]) do - Simulation.queuegate(sim, gate) + if gate.in_queue==0 then + Simulation.queuegate(sim, gate) + end end sim.tickqueue[sim.current_tick] = nil end @@ -324,6 +336,7 @@ function Simulation.ticklogic(sim) local gate = sim.gatequeue[i] gate.logic(gate) gate.in_queue = 0 + sim.gatequeue[i] = nil end --sim.gatequeue = {} sim.num_gatequeue = 0