add gate/net pointer lists

This commit is contained in:
Redo
2022-11-04 16:29:11 -06:00
parent 5aa11f9e43
commit 658bcc6ad8
7 changed files with 62 additions and 190 deletions

View File

@@ -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