add gate/net pointer lists
This commit is contained in:
@@ -1,8 +1,19 @@
|
||||
|
||||
local ffi = FFI
|
||||
local ffi = FFI or require("ffi")
|
||||
|
||||
Group = {}
|
||||
|
||||
ffi.cdef [[
|
||||
struct Gate;
|
||||
struct Net {
|
||||
int* state;
|
||||
int* state_num;
|
||||
int* in_queue;
|
||||
int* update_tick;
|
||||
struct Gate** gates_update_c;
|
||||
};
|
||||
]]
|
||||
|
||||
function Group.new()
|
||||
local net = {
|
||||
-- Logic Critical
|
||||
@@ -11,7 +22,8 @@ function Group.new()
|
||||
in_queue = ffi.new("int[1]"),
|
||||
update_tick = ffi.new("int[1]"),
|
||||
gates_update = {},
|
||||
num_gates_update = 0,
|
||||
num_gates_update = ffi.new("int[1]"),
|
||||
gates_update_c = nil,
|
||||
|
||||
fxstate = 0,
|
||||
|
||||
@@ -26,6 +38,14 @@ function Group.new()
|
||||
net.state_num[0] = 0
|
||||
net.in_queue[0] = 0
|
||||
net.update_tick[0] = 0
|
||||
|
||||
net.c = ffi.new("struct Net")
|
||||
net.c.state = net.state
|
||||
net.c.state_num = net.state_num
|
||||
net.c.in_queue = net.in_queue
|
||||
net.c.update_tick = net.update_tick
|
||||
net.c.gates_update_c = ffi.cast("struct Gate**", 0)
|
||||
|
||||
return net
|
||||
end
|
||||
|
||||
@@ -186,7 +206,7 @@ function Group.setstate(group, state)
|
||||
group.state[0] = state
|
||||
group.update_tick[0] = sim.current_tick
|
||||
|
||||
local len = group.num_gates_update
|
||||
local len = group.num_gates_update[0]
|
||||
for i = 1, len do
|
||||
local gate = group.gates_update[i]
|
||||
if gate and gate.in_queue[0]==0 then
|
||||
@@ -203,13 +223,22 @@ function Group.update(group)
|
||||
Group.setstate(group, group.state_num[0]>0 and 1 or 0)
|
||||
end
|
||||
|
||||
function Group.rebuild_ports(group)
|
||||
group.gates_update = {}
|
||||
group.num_gates_update = 0
|
||||
for k, port in pairs(group.in_ports) do
|
||||
function Group.rebuild_ports(net)
|
||||
net.gates_update = {}
|
||||
net.num_gates_update[0] = 0
|
||||
local gates_seen = {}
|
||||
for k, port in pairs(net.in_ports) do
|
||||
if port.causeupdate then
|
||||
array_add(group.gates_update, Port.getgate(port))
|
||||
group.num_gates_update = group.num_gates_update + 1
|
||||
local gate = Port.getgate(port)
|
||||
if not gates_seen[gate] then
|
||||
gates_seen[gate] = true
|
||||
net.gates_update[net.num_gates_update[0]+1] = gate
|
||||
net.num_gates_update[0] = net.num_gates_update[0] + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
net.gates_update_c = ffi.new("struct Gate*["..(net.num_gates_update[0]).."]")
|
||||
for i = 0, net.num_gates_update[0]-1 do
|
||||
net.gates_update_c[i] = net.gates_update[i+1].c
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user