PortTypes = { output = 0, input = 1, } PortDirections = { [0] = {-1, 0, 0}, [1] = {0, 1, 0}, [2] = {1, 0, 0}, [3] = {0, -1, 0}, [4] = {0, 0, 1}, [5] = {0, 0, -1} } Port = {} FFI.cdef[[ struct Gate; struct Port { bool state; char type; char direction; bool causeupdate; int position[3]; struct Gate* gate; struct Net* group; }; ]] function Port.new(self, type, direction, position, causeupdate, sim) local o = { type = type, direction = direction, position = position, causeupdate = causeupdate, state = false, gate = nil, group = nil, sim = sim, } setmetatable(o, self) self.__index = self return o end function Port.setstate(port, state) if state ~= port.state then port.state = state Simulation.queuegroup(Port.getsim(port), port.group) end end function Port.setinputstate(port, state) if state ~= port.state then port.state = state if port.causeupdate then Simulation.queuegate(Port.getsim(port), port.gate) end end end function Port.getconnectionposition(port) local offset = PortDirections[port.direction] return {port.position[1]+offset[1], port.position[2]+offset[2], port.position[3]+offset[3]} end function Port.isrising(port) if port.group == nil then return false end return port.group.state and (port.group.updatetick == Port.getsim(port).currenttick) end function Port.isfalling(port) if port.group == nil then return false end return port.group.state == false and (port.updatetick == Port.getsim(port).currenttick) end function Port.setgate(port, gate) port.gate = gate end function Port.setgroup(port, group) port.group = group end function Port.getgroup(port) return port.group end function Port.gettype(port) return port.type end function Port.getstate(port) return port.state end function Port.getsim(port) return port.sim end