diff --git a/sim/gate.lua b/sim/gate.lua index c3e0550..7fac0cc 100644 --- a/sim/gate.lua +++ b/sim/gate.lua @@ -6,7 +6,7 @@ Gate = {} function Gate.new(objref, definition) local gate = { -- Logic Critical - in_queue = ffi.new("int"), + in_queue = ffi.new("int[1]"), port_states = ffi.new("int["..(#definition.ports+1).."]"), logic = definition.logic, ports = {}, @@ -27,10 +27,11 @@ end function Gate.setportstate(gate, index, state) if state ~= gate.port_states[index] then local group = gate.port_nets[index] + local net_state_num = gate.port_net_state_nums[index] group.state_num = group.state_num - gate.port_states[index] + 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]==0) then Simulation.queuegroup(GSim, group) end end diff --git a/sim/gatedef.lua b/sim/gatedef.lua index b41b0db..4fdee29 100644 --- a/sim/gatedef.lua +++ b/sim/gatedef.lua @@ -75,7 +75,7 @@ end function GateDefinition.constructgate(def, objref, position, rotation) local gate = Gate.new(objref, def) - gate.in_queue = 0 + gate.in_queue[0] = 0 for i = 1, #def.ports do local portd = def.ports[i] local type = portd.type diff --git a/sim/group.lua b/sim/group.lua index dc148dc..1437efb 100644 --- a/sim/group.lua +++ b/sim/group.lua @@ -1,16 +1,6 @@ local ffi = FFI -ffi.cdef[[ - struct Net { - int in_queue; - int num_out_ports_on; - int state; - int update_tick; - struct Gate* gates_update[0]; - }; -]] - Group = {} function Group.new() @@ -18,7 +8,7 @@ function Group.new() -- Logic Critical state = 0, state_num = 0, - in_queue = 0, + in_queue = ffi.new("int[1]"), gates_update = {}, num_gates_update = 0, @@ -195,7 +185,7 @@ function Group.setstate(group, state) local len = group.num_gates_update for i = 1, len do local gate = group.gates_update[i] - if gate and gate.in_queue==0 then + if gate and gate.in_queue[0]==0 then Simulation.queuegate(sim, gate) end end diff --git a/sim/simulation.lua b/sim/simulation.lua index 010a8f6..fba1c63 100644 --- a/sim/simulation.lua +++ b/sim/simulation.lua @@ -244,11 +244,11 @@ end function Simulation.queuegate(sim, gate) sim.gatequeue[sim.num_gatequeue+1] = gate sim.num_gatequeue = sim.num_gatequeue + 1 - gate.in_queue = 1 + gate.in_queue[0] = 1 end function Simulation.queuegate_safe(sim, gate) - if gate.in_queue==0 then + if gate.in_queue[0]==0 then Simulation.queuegate(sim, gate) end end @@ -277,29 +277,29 @@ end function Simulation.queuegroup(sim, group) sim.groupqueue[sim.num_groupqueue+1] = group sim.num_groupqueue = sim.num_groupqueue + 1 - group.in_queue = 1 + group.in_queue[0] = 1 end function Simulation.queuegroup_safe(sim, group) - if group.in_queue==0 then + if group.in_queue[0]==0 then Simulation.queuegroup(sim, group) end end function Simulation.dequeuegroup(sim, group) - if group.in_queue~=0 then + if group.in_queue[0]~=0 then array_remove(sim.groupqueue, group, true) sim.num_groupqueue = sim.num_groupqueue - 1 - group.in_queue = 0 + group.in_queue[0] = 0 end sim.groupfxqueue[group] = nil end function Simulation.dequeuegate(sim, gate) - if gate.in_queue~=0 then + if gate.in_queue[0]~=0 then array_remove(sim.gatequeue, gate, true) sim.num_gatequeue = sim.num_gatequeue - 1 - gate.in_queue = 0 + gate.in_queue[0] = 0 end if sim.inputqueue~=nil then sim.inputqueue[gate] = nil end if sim.initqueue ~=nil then sim.initqueue [gate] = nil end @@ -322,7 +322,7 @@ function Simulation.ticklogic(sim) for i = 1, sim.num_groupqueue do local group = sim.groupqueue[i] Group.update(group) - group.in_queue = 0 + group.in_queue[0] = 0 sim.groupqueue[i] = nil end --sim.groupqueue = {} @@ -330,7 +330,7 @@ function Simulation.ticklogic(sim) if sim.tickqueue[sim.current_tick] ~= nil then for i, gate in pairs(sim.tickqueue[sim.current_tick]) do - if gate.in_queue==0 then + if gate.in_queue[0]==0 then Simulation.queuegate(sim, gate) end end @@ -340,7 +340,7 @@ function Simulation.ticklogic(sim) for i = 1, sim.num_gatequeue do local gate = sim.gatequeue[i] gate.logic(gate) - gate.in_queue = 0 + gate.in_queue[0] = 0 sim.gatequeue[i] = nil end --sim.gatequeue = {}