local ffi = FFI 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 = {} function Port.new(type, direction, position, causeupdate, idx, gate) local o = { group = nil, type = type, direction = direction, position = position, causeupdate = causeupdate, gate = gate, idx = idx, } return o 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) return port.group.state[0]==1 and (port.group.update_tick[0] == GSim.current_tick) end function Port.isfalling(port) return port.group.state[0]==0 and (port.group.update_tick[0] == GSim.current_tick) end function Port.getgate(port) return port.gate end function Port.setgroup(port, group) port.group = group Port.getgate(port).port_nets[port.idx] = group if group then Port.getgate(port).port_net_state [port.idx] = group.state Port.getgate(port).port_net_state_num[port.idx] = group.state_num Port.getgate(port).port_net_in_queue [port.idx] = group.in_queue else Port.getgate(port).port_net_state [port.idx] = ffi.cast("int*", 0) Port.getgate(port).port_net_state_num[port.idx] = ffi.cast("int*", 0) Port.getgate(port).port_net_in_queue [port.idx] = ffi.cast("int*", 0) end end function Port.getgroup(port) return port.group end function Port.gettype(port) return port.type end function Port.getstate(port) return Port.getgate(port).port_states[port.idx] end