make groups only update update-causing ports

This commit is contained in:
Redo0
2021-05-25 16:08:58 -05:00
parent 8fe789eade
commit 53e9423ab1
5 changed files with 89 additions and 38 deletions

View File

@@ -22,6 +22,7 @@ function Group.new(self, sim)
wires = {},
out_ports = {},
in_ports = {},
in_ports_update = {},
state_num = 0,
@@ -92,32 +93,65 @@ function Group.removewire(self, wire)
self.nwires = 0
self.nout_ports = 0
self.nin_ports = 0
Simulation.dequeuegroup(Group.getsim(self), self)
end
function Group.addport(self, port)
if port.group~=nil then error("port already has group") end
port.group = self
if port.type == PortTypes.output then
if self.out_ports[port] then error("port already in group") end
self.out_ports[port] = port
self.nout_ports = self.nout_ports + 1
if Port.getstate(port) then
self.state_num = self.state_num + 1
end
Simulation.queuegroup(Group.getsim(self), self)
elseif port.type == PortTypes.input then
if self.in_ports[port] then error("port already in group") end
self.in_ports[port] = port
self.nin_ports = self.nin_ports + 1
Port.setinputstate(port, self.state)
if port.causeupdate then
self.in_ports_update[port] = port
end
Simulation.queuegate(Port.getsim(port), Port.getgate(port))
end
end
function Group.removeport(self, port)
if port.group~=self then error("port does not have group") end
port.group = nil
if port.type == PortTypes.output then
if not self.out_ports[port] then error("port not in group") end
self.out_ports[port] = nil
self.nout_ports = self.nout_ports - 1
if Port.getstate(port) then
self.state_num = self.state_num - 1
end
Simulation.queuegroup(Group.getsim(self), self)
elseif port.type == PortTypes.input then
if not self.in_ports[port] then error("port not in group") end
self.in_ports[port] = nil
self.nin_ports = self.nin_ports - 1
if port.causeupdate then
self.in_ports_update[port] = nil
end
Simulation.queuegate(Port.getsim(port), Port.getgate(port))
end
Simulation.queuegroup(Group.getsim(self), self)
end
function Group.mergewith(self, group)
@@ -137,13 +171,15 @@ function Group.mergeinto(self, group)
end
for k, port in pairs(self.out_ports) do
Port.setgroup(port, nil)
Group.addport(group, port)
end
for k, port in pairs(self.in_ports) do
Port.setgroup(port, nil)
Group.addport(group, port)
end
self.wires = {}
self.out_ports = {}
self.in_ports = {}
@@ -151,6 +187,8 @@ function Group.mergeinto(self, group)
self.nwires = 0
self.nout_ports = 0
self.nin_ports = 0
Simulation.dequeuegroup(Group.getsim(self), self)
end
function Group.setstate(self, state)
@@ -158,8 +196,8 @@ function Group.setstate(self, state)
self.state = state
self.updatetick = Group.getsim(self).currenttick
for k, port in pairs(self.in_ports) do
Port.setinputstate(port, state)
for k, port in pairs(self.in_ports_update) do
Simulation.queuegate(Port.getsim(port), Port.getgate(port))
end
Simulation.queuegroupfx(Group.getsim(self), self)
@@ -171,13 +209,5 @@ function Group.getsim(group)
end
function Group.update(group)
local newstate = false
for j, port in pairs(group.out_ports) do
newstate = newstate or Port.getstate(port)
if newstate then
break
end
end
Group.setstate(group, newstate)
Group.setstate(group, group.state_num>0)
end