make groups only update update-causing ports
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user