add gate/net pointer lists
This commit is contained in:
		
							
								
								
									
										105
									
								
								sim/compile.lua
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								sim/compile.lua
									
									
									
									
									
								
							| @@ -1,106 +1 @@ | |||||||
|  |  | ||||||
| local ffi = FFI or require("ffi") |  | ||||||
| Simulation = Simulation or {} |  | ||||||
|  |  | ||||||
| function Simulation.compile_code(sim, text) |  | ||||||
| 	-- todo: compile some kind of DSL into machine code |  | ||||||
| 	 |  | ||||||
| 	return code, size |  | ||||||
| end |  | ||||||
|  |  | ||||||
| --local net_program_code = Simulation.compile_code( [[ |  | ||||||
| --	 |  | ||||||
| --]] ) |  | ||||||
|  |  | ||||||
| function Simulation.compile(sim) |  | ||||||
| 	sim.compilation = { |  | ||||||
| 		gates = {}, |  | ||||||
| 		wires = {}, |  | ||||||
| 		cgates = {}, |  | ||||||
| 		cwires = {}, |  | ||||||
| 	} |  | ||||||
| 	local comp = sim.compilation |  | ||||||
| 	 |  | ||||||
| 	-- assemble a list of all nets |  | ||||||
| 	local all_nets_t = {} |  | ||||||
| 	for k, wire in pairs(sim.wires) do |  | ||||||
| 		local net = Wire.getgroup(wire) |  | ||||||
| 		all_nets_t[net] = net |  | ||||||
| 	end |  | ||||||
| 	local all_nets = {} |  | ||||||
| 	for net_id, net in pairs(all_nets_t) do |  | ||||||
| 		table.insert(comp.nets, net) |  | ||||||
| 		local cdata = ffi.new("char["..(ffi.sizeof("struct Net") + ffi.sizeof("struct Gate*")*net.num_gates_update).."]") |  | ||||||
| 		local cnet = ffi.cast(cdata, "struct Net") |  | ||||||
| 		comp.cnets[net] = cnet |  | ||||||
| 	end |  | ||||||
| 	 |  | ||||||
| 	-- assemble a list of all gates |  | ||||||
| 	local all_gates = {} |  | ||||||
| 	for k, gate in pairs(sim.gates) do |  | ||||||
| 		table.insert(comp.gates, gate) |  | ||||||
| 		local cdata = ffi.new("char["..(ffi.sizeof("struct Gate") + ffi.sizeof("struct OutPort")*gate.num_ports_out).."]") |  | ||||||
| 		local cgate = ffi.cast(cdata, "struct Gate") |  | ||||||
| 		comp.cgates[gate] = cgate |  | ||||||
| 	end |  | ||||||
| 	 |  | ||||||
| 	for netidx, net in ipairs(comp.nets) do |  | ||||||
| 		local cnet = comp.cnets[net] or error("no cnet") |  | ||||||
| 		cnet.in_queue = net.in_queue |  | ||||||
| 		cnet.num_out_ports_on = net.state_num |  | ||||||
| 		cnet.state = net.state |  | ||||||
| 		cnet.update_tick = net.update_tick |  | ||||||
| 		for i = 1, net.num_gates_update do |  | ||||||
| 			local gate = net.gates_update[i] |  | ||||||
| 			local cgate = comp.cgates[gate] or error("no cgate") |  | ||||||
| 			cnet.gates_update[i-1] = cgate |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| 	 |  | ||||||
| 	for gateidx, gate in ipairs(comp.gates) do |  | ||||||
| 		local cgate = comp.cgates[gate] or error("no cgate") |  | ||||||
| 		cgate.in_queue = gate.in_queue |  | ||||||
| 		local j = 0 |  | ||||||
| 		for i, port in ipairs(gate.ports) do |  | ||||||
| 			if port.type == PortTypes.output then |  | ||||||
| 				local net = port.group |  | ||||||
| 				if net then |  | ||||||
| 					local cnet = comp.cnets[net] or error("no cnet") |  | ||||||
| 					cgate.out_ports[j].net = cnet |  | ||||||
| 				else |  | ||||||
| 					cgate.out_ports[j].net = 0 |  | ||||||
| 				end |  | ||||||
| 				cgate.out_ports[j].state = gate.port_states[i] or error("no gate port_state") |  | ||||||
| 				j = j + 1 |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| function Simulation.decompile(sim) |  | ||||||
| 	local comp = sim.compilation |  | ||||||
| 	 |  | ||||||
| 	for netidx, net in ipairs(comp.nets) do |  | ||||||
| 		local cnet = comp.cnets[net] or error("no cnet") |  | ||||||
| 		net.in_queue = cnet.in_queue |  | ||||||
| 		net.state_num = cnet.num_out_ports_on |  | ||||||
| 		net.state = cnet.state |  | ||||||
| 		net.update_tick = cnet.update_tick |  | ||||||
| 	end |  | ||||||
| 	 |  | ||||||
| 	for gateidx, gate in ipairs(comp.gates) do |  | ||||||
| 		local cgate = comp.cgates[gate] or error("no cgate") |  | ||||||
| 		gate.in_queue = cgate.in_queue |  | ||||||
| 		local j = 0 |  | ||||||
| 		for i, port in ipairs(gate.ports) do |  | ||||||
| 			if port.type == PortTypes.output then |  | ||||||
| 				gate.port_states[i] = cgate.out_ports[j].state |  | ||||||
| 				j = j + 1 |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
| end |  | ||||||
|  |  | ||||||
| function Simulation.tick_compiled(sim, count) |  | ||||||
| 	 |  | ||||||
| end |  | ||||||
|   | |||||||
| @@ -1,75 +1 @@ | |||||||
|  |  | ||||||
| void sim_init(int num_gates, int num_nets); |  | ||||||
| void sim_add_gate(int gateid, int logic_func_id, char* logic_func_name, int num_out_ports, char* data); |  | ||||||
| void sim_add_net(int netid, int num_gates_update); |  | ||||||
| void sim_connect_out_port(int gateid, int index, int netid); |  | ||||||
| void sim_connect_in_port(int gateid, int index, int netid); |  | ||||||
| void sim_tick(int count); |  | ||||||
| void sim_get_net_state(int netid); |  | ||||||
| void sim_get_port_state(int gateid, int index); |  | ||||||
| void sim_set_net_state(int netid); |  | ||||||
| void sim_set_port_state(int gateid, int index); |  | ||||||
| void sim_delete_net(int netid); |  | ||||||
| void sim_delete_gate(int gateid); |  | ||||||
|  |  | ||||||
| //////// |  | ||||||
|  |  | ||||||
| void sim_create(unsigned int datalen, char* text); |  | ||||||
|  |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <assert.h> |  | ||||||
|  |  | ||||||
| typedef unsigned int uint; |  | ||||||
| typedef unsigned long long u64; |  | ||||||
|  |  | ||||||
| void sim_copy_logic_function( |  | ||||||
| 	char** prog, |  | ||||||
| 	char* in_queue, |  | ||||||
| 	char* out_port_states, |  | ||||||
| 	int logic_func, |  | ||||||
| 	char** port_in_net_states, |  | ||||||
| 	char** port_out_net_inqueue, |  | ||||||
| 	char** port_out_net_update_func, |  | ||||||
| 	int num_ports_in, |  | ||||||
| 	int num_ports_out |  | ||||||
| ) { |  | ||||||
| 	// todo: indata = inport net state pointers, outport net in queue pointers, outport net update function pointers |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void sim_compile_gate(char** prog, char** data, int** idat, u64* indata) { |  | ||||||
| 	int num_ports_in  = *(indata++); |  | ||||||
| 	int num_ports_out = *(indata++); |  | ||||||
| 	int in_queue      = *(indata++); |  | ||||||
| 	int logic_func    = *(indata++); |  | ||||||
| 	 |  | ||||||
| 	char* port_in_net_states[256]; |  | ||||||
| 	sim_copy_logic_function( // copy logic function into program |  | ||||||
| 		prog, |  | ||||||
| 		*data, |  | ||||||
| 		(*data)+1, |  | ||||||
| 		logic_func, |  | ||||||
| 		&indata, |  | ||||||
| 		num_ports_in, |  | ||||||
| 		num_ports_out |  | ||||||
| 	); |  | ||||||
| 	 |  | ||||||
| 	*(*data++) = in_queue; // alloc bool for in queue |  | ||||||
| 	for(int i=0; i<num_ports_out; i++) { // alloc bool for each output state |  | ||||||
| 		*((*data)++) = *(indata++); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void sim_compile_net_function(char** prog, char* in_queue, int* gates, u64** indata, int num_gates_update) { |  | ||||||
| 	 |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void sim_compile_net(char** prog, char** data, int** idat, u64* indata) { |  | ||||||
| 	int num_gates_update = *(indata++); |  | ||||||
| 	int num_ports_on     = *(indata++); |  | ||||||
| 	int in_queue         = *(indata++); |  | ||||||
| 	 |  | ||||||
| 	sim_compile_net_function(prog, *data, *idat, &indata, num_gates_update); |  | ||||||
| 	 |  | ||||||
| 	*((*data)++) = in_queue; |  | ||||||
| 	*((*idat)++) = num_ports_on; |  | ||||||
| } |  | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										23
									
								
								sim/gate.lua
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								sim/gate.lua
									
									
									
									
									
								
							| @@ -3,6 +3,18 @@ local ffi = FFI or require("ffi") | |||||||
|  |  | ||||||
| Gate = {} | Gate = {} | ||||||
|  |  | ||||||
|  | ffi.cdef [[ | ||||||
|  | 	struct Net; | ||||||
|  | 	struct Gate { | ||||||
|  | 		int* in_queue; | ||||||
|  | 		int* port_states; | ||||||
|  | 		int** port_net_state; | ||||||
|  | 		int** port_net_state_num; | ||||||
|  | 		int** port_net_in_queue; | ||||||
|  | 		struct Net** port_nets_c; | ||||||
|  | 	}; | ||||||
|  | ]] | ||||||
|  |  | ||||||
| function Gate.new(objref, definition) | function Gate.new(objref, definition) | ||||||
| 	local gate = { | 	local gate = { | ||||||
| 		-- Logic Critical | 		-- Logic Critical | ||||||
| @@ -14,10 +26,21 @@ function Gate.new(objref, definition) | |||||||
| 		port_net_state     = ffi.new("int*["..(#definition.ports+1).."]"), | 		port_net_state     = ffi.new("int*["..(#definition.ports+1).."]"), | ||||||
| 		port_net_state_num = ffi.new("int*["..(#definition.ports+1).."]"), | 		port_net_state_num = ffi.new("int*["..(#definition.ports+1).."]"), | ||||||
| 		port_net_in_queue  = ffi.new("int*["..(#definition.ports+1).."]"), | 		port_net_in_queue  = ffi.new("int*["..(#definition.ports+1).."]"), | ||||||
|  | 		port_nets_c        = ffi.new("struct Net*["..(#definition.ports+1).."]"), | ||||||
| 		 | 		 | ||||||
| 		objref = objref, | 		objref = objref, | ||||||
| 		definition = definition, | 		definition = definition, | ||||||
| 	} | 	} | ||||||
|  | 	gate.in_queue[0] = 0 | ||||||
|  | 	 | ||||||
|  | 	gate.c = ffi.new("struct Gate") | ||||||
|  | 	gate.c.in_queue = gate.in_queue | ||||||
|  | 	gate.c.port_states = gate.port_states | ||||||
|  | 	gate.c.port_net_state = gate.port_net_state | ||||||
|  | 	gate.c.port_net_state_num = gate.port_net_state_num | ||||||
|  | 	gate.c.port_net_in_queue = gate.port_net_in_queue | ||||||
|  | 	gate.c.port_nets_c = gate.port_nets_c | ||||||
|  | 	 | ||||||
| 	return gate | 	return gate | ||||||
| end | end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -75,7 +75,6 @@ end | |||||||
| function GateDefinition.constructgate(def, objref, position, rotation) | function GateDefinition.constructgate(def, objref, position, rotation) | ||||||
| 	local gate = Gate.new(objref, def) | 	local gate = Gate.new(objref, def) | ||||||
| 	 | 	 | ||||||
| 	gate.in_queue[0] = 0 |  | ||||||
| 	for i = 1, #def.ports do | 	for i = 1, #def.ports do | ||||||
| 		local portd = def.ports[i] | 		local portd = def.ports[i] | ||||||
| 		local type = portd.type | 		local type = portd.type | ||||||
|   | |||||||
| @@ -1,8 +1,19 @@ | |||||||
|  |  | ||||||
| local ffi = FFI | local ffi = FFI or require("ffi") | ||||||
|  |  | ||||||
| Group = {} | Group = {} | ||||||
|  |  | ||||||
|  | ffi.cdef [[ | ||||||
|  | 	struct Gate; | ||||||
|  | 	struct Net { | ||||||
|  | 		int* state; | ||||||
|  | 		int* state_num; | ||||||
|  | 		int* in_queue; | ||||||
|  | 		int* update_tick; | ||||||
|  | 		struct Gate** gates_update_c; | ||||||
|  | 	}; | ||||||
|  | ]] | ||||||
|  |  | ||||||
| function Group.new() | function Group.new() | ||||||
| 	local net = { | 	local net = { | ||||||
| 		-- Logic Critical | 		-- Logic Critical | ||||||
| @@ -11,7 +22,8 @@ function Group.new() | |||||||
| 		in_queue = ffi.new("int[1]"), | 		in_queue = ffi.new("int[1]"), | ||||||
| 		update_tick = ffi.new("int[1]"), | 		update_tick = ffi.new("int[1]"), | ||||||
| 		gates_update = {}, | 		gates_update = {}, | ||||||
| 		num_gates_update = 0, | 		num_gates_update = ffi.new("int[1]"), | ||||||
|  | 		gates_update_c = nil, | ||||||
| 		 | 		 | ||||||
| 		fxstate = 0, | 		fxstate = 0, | ||||||
| 		 | 		 | ||||||
| @@ -26,6 +38,14 @@ function Group.new() | |||||||
| 	net.state_num[0] = 0 | 	net.state_num[0] = 0 | ||||||
| 	net.in_queue[0] = 0 | 	net.in_queue[0] = 0 | ||||||
| 	net.update_tick[0] = 0 | 	net.update_tick[0] = 0 | ||||||
|  | 	 | ||||||
|  | 	net.c = ffi.new("struct Net") | ||||||
|  | 	net.c.state = net.state | ||||||
|  | 	net.c.state_num = net.state_num | ||||||
|  | 	net.c.in_queue = net.in_queue | ||||||
|  | 	net.c.update_tick = net.update_tick | ||||||
|  | 	net.c.gates_update_c = ffi.cast("struct Gate**", 0) | ||||||
|  | 	 | ||||||
| 	return net | 	return net | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -186,7 +206,7 @@ function Group.setstate(group, state) | |||||||
| 		group.state[0] = state | 		group.state[0] = state | ||||||
| 		group.update_tick[0] = sim.current_tick | 		group.update_tick[0] = sim.current_tick | ||||||
| 		 | 		 | ||||||
| 		local len = group.num_gates_update | 		local len = group.num_gates_update[0] | ||||||
| 		for i = 1, len do | 		for i = 1, len do | ||||||
| 			local gate = group.gates_update[i] | 			local gate = group.gates_update[i] | ||||||
| 			if gate and gate.in_queue[0]==0 then | 			if gate and gate.in_queue[0]==0 then | ||||||
| @@ -203,13 +223,22 @@ function Group.update(group) | |||||||
| 	Group.setstate(group, group.state_num[0]>0 and 1 or 0) | 	Group.setstate(group, group.state_num[0]>0 and 1 or 0) | ||||||
| end | end | ||||||
|  |  | ||||||
| function Group.rebuild_ports(group) | function Group.rebuild_ports(net) | ||||||
| 	group.gates_update = {} | 	net.gates_update = {} | ||||||
| 	group.num_gates_update = 0 | 	net.num_gates_update[0] = 0 | ||||||
| 	for k, port in pairs(group.in_ports) do | 	local gates_seen = {} | ||||||
|  | 	for k, port in pairs(net.in_ports) do | ||||||
| 		if port.causeupdate then | 		if port.causeupdate then | ||||||
| 			array_add(group.gates_update, Port.getgate(port)) | 			local gate = Port.getgate(port) | ||||||
| 			group.num_gates_update = group.num_gates_update + 1 | 			if not gates_seen[gate] then | ||||||
|  | 				gates_seen[gate] = true | ||||||
|  | 				net.gates_update[net.num_gates_update[0]+1] = gate | ||||||
|  | 				net.num_gates_update[0] = net.num_gates_update[0] + 1 | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  | 	net.gates_update_c = ffi.new("struct Gate*["..(net.num_gates_update[0]).."]") | ||||||
|  | 	for i = 0, net.num_gates_update[0]-1 do | ||||||
|  | 		net.gates_update_c[i] = net.gates_update[i+1].c | ||||||
|  | 	end | ||||||
|  | end | ||||||
|   | |||||||
| @@ -141,7 +141,7 @@ function network_update() | |||||||
| 					local group = Wire.getgroup(wire) | 					local group = Wire.getgroup(wire) | ||||||
| 					local numwires  = 0; for k, wire2 in pairs(group.wires          ) do numwires  = numwires +1 end | 					local numwires  = 0; for k, wire2 in pairs(group.wires          ) do numwires  = numwires +1 end | ||||||
| 					local numportsi = 0; for k, port  in pairs(group.in_ports       ) do numportsi = numportsi+1 end | 					local numportsi = 0; for k, port  in pairs(group.in_ports       ) do numportsi = numportsi+1 end | ||||||
| 					local numgatesu = group.num_gates_update | 					local numgatesu = group.num_gates_update[0] | ||||||
| 					local numportso = 0; local numportson=0; | 					local numportso = 0; local numportson=0; | ||||||
| 					for k, port  in pairs(group.out_ports) do | 					for k, port  in pairs(group.out_ports) do | ||||||
| 						numportso = numportso+1 | 						numportso = numportso+1 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Redo
					Redo