Gate = {} function Gate.new(objref, definition) local o = { objref = objref, definition = definition, ports = {}, port_nets = {}, in_queue = false, logic = definition.logic, } return o end function Gate.addport(gate, port) gate.ports[#gate.ports+1] = port Port.setgate(port, gate) end function Gate.getportstate(gate, index) return gate.port_nets[index].state end function Gate.setportstate(gate, index, state) local port = gate.ports[index] if state ~= port.state then local group = port.group group.state_num = group.state_num - (port.state and 1 or 0) + (state and 1 or 0) port.state = state if (group.state_num>0) ~= group.state then Simulation.queuegroup(GSim, group) end end end function Gate.initdata(gate) gate.data = {} end function Gate.getdata(gate) return gate.data end function Gate.getportisrising(gate, index) return Port.isrising(gate.ports[index]) end function Gate.getportisfalling(gate, index) return Port.isfalling(gate.ports[index]) end function Gate.cb(gate, ...) Simulation.queuecallback(GSim, gate, ...) end function Gate.queue(gate, delay) Simulation.queuegatelater(GSim, gate, delay) end function Gate.gettick(gate) return GSim.current_tick 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.logic(gate) end function Gate.input(gate, argv) Gate.getdefinition(gate).input(gate, argv) end