make nets keep list of updated gates instead of ports
This commit is contained in:
parent
e92cc50186
commit
c62d7340b0
@ -2,36 +2,68 @@
|
||||
local ffi = FFI or require("ffi")
|
||||
Simulation = Simulation or {}
|
||||
|
||||
ffi.cdef[[
|
||||
struct Wire {
|
||||
int objref;
|
||||
int layer;
|
||||
struct Net* group;
|
||||
int bounds[6];
|
||||
};
|
||||
|
||||
struct Port {
|
||||
bool state;
|
||||
char type;
|
||||
struct Gate* gate;
|
||||
struct Net* group;
|
||||
};
|
||||
|
||||
struct Gate {
|
||||
int logic_ref;
|
||||
bool in_queue;
|
||||
struct Port ports[?];
|
||||
};
|
||||
|
||||
struct Net {
|
||||
bool state;
|
||||
bool in_queue;
|
||||
int updatetick;
|
||||
int state_num;
|
||||
int num_gates_update;
|
||||
struct Gate* gates_update[?];
|
||||
};
|
||||
]]
|
||||
|
||||
function Simulation.compile(sim)
|
||||
-- assemble a list of all nets
|
||||
local all_nets = {}
|
||||
for wire_idx, wire in pairs(sim.wires) do
|
||||
local all_nets_t = {}
|
||||
for k, wire in pairs(sim.wires) do
|
||||
local net = Wire.getgroup(wire)
|
||||
all_nets[net] = net
|
||||
all_nets_t[net] = net
|
||||
end
|
||||
local num_nets = 0
|
||||
for net_id, net in pairs(all_nets) do
|
||||
num_nets = num_nets+1
|
||||
for net_id, net in pairs(all_nets_t) do
|
||||
table.insert(all_nets, net)
|
||||
end
|
||||
|
||||
-- assemble a list of all gates
|
||||
local all_gates = {}
|
||||
for k, gate in pairs(sim.gates) do
|
||||
table.insert(all_gates, gate)
|
||||
end
|
||||
|
||||
-- construct each gate into an array
|
||||
|
||||
-- construct each group into an array
|
||||
local group_idx = 0
|
||||
local array_nets = ffi.new("struct Net["..num_groups.."]")
|
||||
for group_id, group in pairs(groups) do
|
||||
local c_net = ffi.new("struct Net")
|
||||
-- construct array of all nets
|
||||
local c_nets = ffi.new("struct Net["..(#all_nets).."]")
|
||||
for net_idx, net in ipairs(all_nets) do
|
||||
local c_net = ffi.new("struct Net", #net.gates_update)
|
||||
|
||||
local ports_update = {}
|
||||
for port_id, port in pairs(group.in_ports) do
|
||||
if port.causeupdate then
|
||||
num_ports_update = num
|
||||
end
|
||||
end
|
||||
--c_net.ports_update = ffi.new("struct Port["..
|
||||
for gate_idx, gate in ipairs(net.gates_update) do
|
||||
|
||||
array_nets[group_idx] = c_net
|
||||
group_idx = group_idx + 1
|
||||
end
|
||||
|
||||
c_nets[net_idx] = c_net
|
||||
end
|
||||
end
|
||||
|
||||
@ -39,6 +71,6 @@ function Simulation.decompile(sim)
|
||||
|
||||
end
|
||||
|
||||
function Simulation.tickcompiled(sim)
|
||||
function Simulation.tick_compiled(sim)
|
||||
|
||||
end
|
||||
|
@ -1,15 +1,6 @@
|
||||
|
||||
Gate = {}
|
||||
|
||||
FFI.cdef[[
|
||||
struct Gate {
|
||||
int objref;
|
||||
int definition_objref;
|
||||
bool in_queue;
|
||||
struct Port ports[1];
|
||||
};
|
||||
]]
|
||||
|
||||
function Gate.new(objref, definition)
|
||||
local o = {
|
||||
objref = objref,
|
||||
|
@ -1,20 +1,6 @@
|
||||
|
||||
Group = {}
|
||||
|
||||
FFI.cdef[[
|
||||
struct Port;
|
||||
struct Net {
|
||||
bool state;
|
||||
bool fxstate;
|
||||
bool in_queue;
|
||||
int updatetick;
|
||||
int internal_ref;
|
||||
int state_num;
|
||||
int num_in_ports_update;
|
||||
struct Port* in_ports_update[1];
|
||||
};
|
||||
]]
|
||||
|
||||
function Group.new()
|
||||
local o = {
|
||||
state = false,
|
||||
@ -23,7 +9,7 @@ function Group.new()
|
||||
wires = {},
|
||||
out_ports = {},
|
||||
in_ports = {},
|
||||
in_ports_update = {},
|
||||
gates_update = {},
|
||||
|
||||
state_num = 0,
|
||||
in_queue = false,
|
||||
@ -49,6 +35,7 @@ function Group.addwire(group, wire)
|
||||
|
||||
Wire.setgroup(wire, group)
|
||||
Wire.update(wire)
|
||||
|
||||
Simulation.queuegroup(GSim, group)
|
||||
end
|
||||
end
|
||||
@ -115,13 +102,12 @@ function Group.addport(group, port)
|
||||
|
||||
group.in_ports[port] = port
|
||||
group.nin_ports = group.nin_ports + 1
|
||||
if port.causeupdate then
|
||||
table.insert(group.in_ports_update, port)
|
||||
end
|
||||
|
||||
Simulation.queuegate(GSim, Port.getgate(port))
|
||||
|
||||
end
|
||||
|
||||
Group.rebuild_ports(group)
|
||||
end
|
||||
|
||||
function Group.removeport(group, port)
|
||||
@ -144,12 +130,11 @@ function Group.removeport(group, port)
|
||||
|
||||
group.in_ports[port] = nil
|
||||
group.nin_ports = group.nin_ports - 1
|
||||
if port.causeupdate then
|
||||
array_remove(group.in_ports_update, port)
|
||||
end
|
||||
|
||||
Simulation.queuegate(GSim, Port.getgate(port))
|
||||
end
|
||||
|
||||
Group.rebuild_ports(group)
|
||||
end
|
||||
|
||||
function Group.mergewith(group, group2)
|
||||
@ -196,8 +181,8 @@ function Group.setstate(group, state)
|
||||
group.state = state
|
||||
group.updatetick = sim.currenttick
|
||||
|
||||
for k, port in ipairs(group.in_ports_update) do
|
||||
Simulation.queuegate(sim, Port.getgate(port))
|
||||
for k, gate in ipairs(group.gates_update) do
|
||||
Simulation.queuegate(sim, gate)
|
||||
end
|
||||
|
||||
Simulation.queuegroupfx(sim, group)
|
||||
@ -207,3 +192,12 @@ end
|
||||
function Group.update(group)
|
||||
Group.setstate(group, group.state_num>0)
|
||||
end
|
||||
|
||||
function Group.rebuild_ports(group)
|
||||
group.gates_update = {}
|
||||
for k, port in pairs(group.in_ports) do
|
||||
if port.causeupdate then
|
||||
array_add(group.gates_update, Port.getgate(port))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -262,7 +262,7 @@ while 1 do
|
||||
local group = Wire.getgroup(wire)
|
||||
local numwires = 0; for k, wire2 in pairs(group.wires ) do numwires = numwires +1 end
|
||||
local numportsi = 0; for k, port in pairs(group.in_ports ) do numportsi = numportsi+1 end
|
||||
local numportsu = #group.in_ports_update
|
||||
local numgatesu = #group.gates_update
|
||||
local numportso = 0; local numportson=0;
|
||||
for k, port in pairs(group.out_ports) do
|
||||
numportso = numportso+1
|
||||
@ -273,7 +273,7 @@ while 1 do
|
||||
"Wires: "..numwires.."\n"..
|
||||
"In Ports: " ..numportsi.."\n"..
|
||||
"Out Ports: "..numportso.."\n"..
|
||||
"In Ports Update: "..numportsu.."\n"..
|
||||
"Gates Update: "..numgatesu.."\n"..
|
||||
"Out Ports On: "..(group.state_num)
|
||||
;
|
||||
end
|
||||
|
24
sim/port.lua
24
sim/port.lua
@ -15,20 +15,6 @@ PortDirections = {
|
||||
|
||||
Port = {}
|
||||
|
||||
FFI.cdef[[
|
||||
struct Gate;
|
||||
struct Net;
|
||||
struct Port {
|
||||
bool state;
|
||||
char type;
|
||||
char direction;
|
||||
bool causeupdate;
|
||||
int position[3];
|
||||
struct Gate* gate;
|
||||
struct Net* group;
|
||||
};
|
||||
]]
|
||||
|
||||
function Port.new(type, direction, position, causeupdate)
|
||||
local o = {
|
||||
type = type,
|
||||
@ -44,13 +30,13 @@ end
|
||||
|
||||
function Port.setstate(port, state) -- output state
|
||||
if state ~= port.state then
|
||||
local group = port.group
|
||||
group.state_num = group.state_num - (port.state and 1 or 0) + (state and 1 or 0)
|
||||
port.state = state
|
||||
if state then
|
||||
Port.getgroup(port).state_num = Port.getgroup(port).state_num + 1
|
||||
else
|
||||
Port.getgroup(port).state_num = Port.getgroup(port).state_num - 1
|
||||
|
||||
if (group.state_num>0) ~= group.state then
|
||||
Simulation.queuegroup(GSim, group)
|
||||
end
|
||||
Simulation.queuegroup(GSim, Port.getgroup(port))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -77,3 +77,11 @@ function array_remove(array, value)
|
||||
end
|
||||
error("element not in array")
|
||||
end
|
||||
|
||||
function array_add(array, value)
|
||||
for i = 1, #array do
|
||||
local v = array[i]
|
||||
if v==value then return end
|
||||
end
|
||||
table.insert(array, value)
|
||||
end
|
||||
|
@ -1,15 +1,6 @@
|
||||
|
||||
Wire = {}
|
||||
|
||||
FFI.cdef[[
|
||||
struct Wire {
|
||||
int objref;
|
||||
int layer;
|
||||
struct Net* group;
|
||||
int bounds[6];
|
||||
};
|
||||
]]
|
||||
|
||||
function Wire.new(objref, layer, bounds)
|
||||
local o = {
|
||||
objref = objref,
|
||||
|
Loading…
x
Reference in New Issue
Block a user