Gate = {} FFI.cdef[[ struct Gate { int objref; int definition_objref; struct Port ports[1]; }; ]] function Gate.new(self, objref, definition, sim) local o = { objref = objref, definition = definition, ports = {}, sim = sim, } setmetatable(o, self) self.__index = self return o end function Gate.addport(self, port) self.ports[#self.ports+1] = port Port.setgate(port, self) end function Gate.getportstate(self, index) return self.ports[index].state end function Gate.setportstate(self, index, state) Port.setstate(self.ports[index], state) end function Gate.initdata(self) self.data = {} end function Gate.getdata(self) return self.data end function Gate.getportisrising(self, index) return Port.isrising(self.ports[index]) end function Gate.getportisfalling(self, index) return Port.isfalling(self.ports[index]) end function Gate.cb(gate, ...) Simulation.queuecallback(Gate.getsim(gate), gate, ...) end function Gate.queue(gate, delay) Simulation.queuegatelater(Gate.getsim(gate), gate, delay) end function Gate.gettick(gate) return Gate.getsim(gate).currenttick end function Gate.getsim(gate) return gate.sim end function Gate.getdefinition(gate) return gate.definition end -- Logic functions function Gate.init(gate) Gate.getdefinition(gate).init(gate) end function Gate.logic(gate) Gate.getdefinition(gate).logic(gate) end function Gate.input(gate, argv) Gate.getdefinition(gate).input(gate, argv) end