From 02bfb84cb553b046212e6d912a808ef21535f7b1 Mon Sep 17 00:00:00 2001 From: Redo Date: Sat, 5 Nov 2022 02:11:48 -0600 Subject: [PATCH] add c gate sim --- sim/compiled_sim.c | 89 +++++++++++++++++++++++++++++++++++---- sim/compiled_sim.dll | Bin 54191 -> 56563 bytes sim/compiled_sim_gates.c | 21 +++++++++ sim/gate.lua | 10 +++++ sim/gatedef.lua | 7 +-- sim/network.lua | 1 - sim/simulation.lua | 10 +---- 7 files changed, 116 insertions(+), 22 deletions(-) create mode 100644 sim/compiled_sim_gates.c diff --git a/sim/compiled_sim.c b/sim/compiled_sim.c index 3a2eb51..09b28bd 100644 --- a/sim/compiled_sim.c +++ b/sim/compiled_sim.c @@ -12,6 +12,9 @@ struct Gate { int** port_net_in_queue; struct Net** port_nets_c; int objref; + int logic_function; + int data_size; + int* data; }; struct Net { int* state; @@ -23,16 +26,35 @@ struct Net { int id; }; - -void sim_set_data(struct Net** net_queue, int* num_net_queue, struct Gate** gate_queue, int* num_gate_queue, int* current_tick, int queue_max); -void sim_update_nets(); - struct Net** net_queue; int* num_net_queue; struct Gate** gate_queue; int* num_gate_queue; int* current_tick; -int queue_max; +static const int queue_max = 65536; + +typedef void(*GateFunc)(struct Gate*); +int sim_gate_get_port(struct Gate* gate, int port); +void sim_gate_set_port(struct Gate* gate, int port, int val); +int sim_gate_get_data(struct Gate* gate, int addr); +void sim_gate_set_data(struct Gate* gate, int addr, int val); +#define GATEFUNCID(name) GateFunc_##name##_F +#define GATEFUNC(name) void GATEFUNCID(name)(struct Gate* gate) +#define setport(i, v) sim_gate_set_port(gate, i, v) +#define getport(i) sim_gate_get_port(gate, i) +#define setdata(i, v) sim_gate_set_data(gate, i, v) +#define getdata(i) sim_gate_get_data(gate, i) + +#include "compiled_sim_gates.c" + +#undef setport +#undef getport + +void sim_set_data(struct Net** net_queue, int* num_net_queue, struct Gate** gate_queue, int* num_gate_queue, int* current_tick, int queue_max); +void sim_update_nets(); +void sim_update_gates(); + +//// void sim_set_data(struct Net** net_queue_in, int* num_net_queue_in, struct Gate** gate_queue_in, int* num_gate_queue_in, int* current_tick_in, int queue_max_in) { net_queue = net_queue_in; @@ -40,7 +62,7 @@ void sim_set_data(struct Net** net_queue_in, int* num_net_queue_in, struct Gate* gate_queue = gate_queue_in; num_gate_queue = num_gate_queue_in; current_tick = current_tick_in; - queue_max = queue_max_in; + //queue_max = queue_max_in; } void sim_update_net(struct Net* net); @@ -54,14 +76,39 @@ void sim_update_nets() { *num_net_queue = 0; } +void sim_update_gate(struct Gate* gate); +void sim_dequeue_gate(int i) { + gate_queue[i] = gate_queue[*num_gate_queue-1]; + gate_queue[*num_gate_queue-1] = 0; + (*num_gate_queue)--; +} +void sim_update_gates() { + for(int i=0; i<*num_gate_queue; i++) { + struct Gate* gate = gate_queue[i]; + if(gate->logic_function != 0) { + sim_dequeue_gate(i); + sim_logic_functions[gate->logic_function](gate); + i--; + } + } +} + //// void sim_queue_gate(struct Gate* gate) { - assert(*num_gate_queue < queue_max); - gate_queue[*num_gate_queue++] = gate; + assert(*num_gate_queue < queue_max - 1); + gate_queue[(*num_gate_queue)++] = gate; *(gate->in_queue) = 1; } +void sim_queue_net(struct Net* net) { + assert(*num_net_queue < queue_max - 1); + net_queue[(*num_net_queue)++] = net; + *(net->in_queue) = 1; +} + +//// + void sim_update_net(struct Net* net) { int state = *(net->state_num) > 0; if(state != *(net->state)) { @@ -76,3 +123,29 @@ void sim_update_net(struct Net* net) { } } } + +//// + +int sim_gate_get_port(struct Gate* gate, int port) { + return *(gate->port_net_state[port]); +} +void sim_gate_set_port(struct Gate* gate, int port, int state) { + if(state != gate->port_states[port]) { + *(gate->port_net_state_num[port]) += state - gate->port_states[port]; + gate->port_states[port] = state; + + if( + ( (*(gate->port_net_state_num[port]) > 0) != *(gate->port_net_state[port]) ) && + ( !*(gate->port_net_in_queue[port]) ) + ) { + sim_queue_net(gate->port_nets_c[port]); + } + } +} + +int sim_gate_get_data(struct Gate* gate, int addr) { + return gate->data[addr]; +} +void sim_gate_set_data(struct Gate* gate, int addr, int val) { + gate->data[addr] = val; +} diff --git a/sim/compiled_sim.dll b/sim/compiled_sim.dll index 1df7ad124033965e64cc225760f8381e6b82c31b..0f5eb7f725c04f6024b3eded9af7553dc29e0ef7 100644 GIT binary patch delta 14714 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 0 then + gate.data_c = ffi.new("int["..(definition.data_size_c).."]") + end + gate.c = ffi.new("struct Gate") gate.c.in_queue = gate.in_queue gate.c.port_states = gate.port_states @@ -42,6 +49,9 @@ function Gate.new(objref, definition) gate.c.port_net_in_queue = gate.port_net_in_queue gate.c.port_nets_c = gate.port_nets_c gate.c.objref = gate.objref + gate.c.logic_function = definition.logic_function_c + gate.c.data_size = definition.data_size_c + gate.c.data = gate.data_c return gate end diff --git a/sim/gatedef.lua b/sim/gatedef.lua index 9c4cf21..d654ce2 100644 --- a/sim/gatedef.lua +++ b/sim/gatedef.lua @@ -13,9 +13,6 @@ function GateDefinition.new(objref, name, description, init, logic, input, globa input = collapseescape(input) global = collapseescape(global) description = collapseescape(description) - --code = collapseescape(code) - - --local compiled_size, compiled_code = Simulation.compile_code(nil, code) local def = { objref = objref, @@ -24,8 +21,8 @@ function GateDefinition.new(objref, name, description, init, logic, input, globa ports = ports or {}, num_in_ports = 0, num_out_ports = 0, - --compiled_program_code = compiled_code, - --compiled_program_size = compiled_size, + data_size_c = 0, -- todo + logic_function_c = 0, -- todo } local initfunc = loadstring(tostring(init)) diff --git a/sim/network.lua b/sim/network.lua index 2732921..ecfad58 100644 --- a/sim/network.lua +++ b/sim/network.lua @@ -73,7 +73,6 @@ function network_update() local logic = data[i+5] local input = data[i+6] local global = data[i+7] - --local code = data[i+8] local numports = tonumber(data[i+8]) local ports = {} diff --git a/sim/simulation.lua b/sim/simulation.lua index 466003a..57f9b06 100644 --- a/sim/simulation.lua +++ b/sim/simulation.lua @@ -6,6 +6,7 @@ ffi.cdef [[ struct Net; void sim_set_data(struct Net** net_queue, int* num_net_queue, struct Gate** gate_queue, int* num_gate_queue, int* current_tick, int queue_max); void sim_update_nets(); + void sim_update_gates(); ]] local csim = ffi.load("compiled_sim.dll") @@ -350,14 +351,6 @@ end -- Logic Critical function Simulation.ticklogic(sim) - -- Now implemented in C - --for i = 0, sim.num_groupqueue[0]-1 do - -- local cnet = sim.groupqueue[i] - -- Group.update_c(cnet, sim.current_tick[0]) - -- cnet.in_queue[0] = 0 - -- sim.groupqueue[i] = nil - --end - --sim.num_groupqueue[0] = 0 csim.sim_update_nets() if sim.tickqueue[sim.current_tick[0]] ~= nil then @@ -369,6 +362,7 @@ function Simulation.ticklogic(sim) sim.tickqueue[sim.current_tick[0]] = nil end + csim.sim_update_gates() -- handle any leftover gates, those without c logic functions for i = 0, sim.num_gatequeue[0]-1 do local cgate = sim.gatequeue[i] local gate = Simulation.gate_from_cgate(sim, cgate)