Gate = {}

function Gate.new(self, objref, definition)
	local o = {
		objref = objref,
		definition = definition,
		ports = {}
	}
	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(index)
	return Port.isfalling(self.ports[index])
end

-- function Gate:cb(...)
-- 	local args = {...}
-- 	local str = tostring(#args)

-- 	for i, v in ipairs(args) do
-- 		v = bool_to_int[v] or tostring(v)
-- 		str = str .. "\t" .. tostring(v)
-- 	end

-- 	sim:queuecallback(self, str)
-- end

function Gate.cb(self, ...)
	Simulation.queuecallback(sim, self, ...)
end

function Gate.queue(self, delay)
	Simulation.queuegatelater(sim, self, delay)
end

function Gate.testlogic(self, n)
	--local time = os.clock()
	--for i = 1, n do
	--	self.definition.logic(self)
	--end
	--client:send("TEST\t" .. (os.clock()-time) .. "\n")
end

function Gate.gettick(self)
	return sim.currenttick
end