From c73fea8cca00154b08de9d10a9a421531e953eeb Mon Sep 17 00:00:00 2001 From: Redo Date: Fri, 4 Nov 2022 23:23:44 -0600 Subject: [PATCH] make net updates c --- sim/compile.lua | 1 - sim/compiled_sim.c | 77 +++++++++++++++++++++++++++++++++++++++++++ sim/compiled_sim.dll | Bin 38492 -> 52015 bytes sim/group.lua | 34 +++++++++---------- sim/main.lua | 1 - sim/simulation.lua | 19 +++++++---- 6 files changed, 106 insertions(+), 26 deletions(-) delete mode 100644 sim/compile.lua diff --git a/sim/compile.lua b/sim/compile.lua deleted file mode 100644 index 8b13789..0000000 --- a/sim/compile.lua +++ /dev/null @@ -1 +0,0 @@ - diff --git a/sim/compiled_sim.c b/sim/compiled_sim.c index 8b13789..3a2eb51 100644 --- a/sim/compiled_sim.c +++ b/sim/compiled_sim.c @@ -1 +1,78 @@ +#include + +struct Net; +struct Gate; + +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; + int objref; +}; +struct Net { + int* state; + int* state_num; + int* in_queue; + int* update_tick; + int* num_gates_update; + struct Gate** gates_update_c; + 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; + +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; + num_net_queue = num_net_queue_in; + gate_queue = gate_queue_in; + num_gate_queue = num_gate_queue_in; + current_tick = current_tick_in; + queue_max = queue_max_in; +} + +void sim_update_net(struct Net* net); +void sim_update_nets() { + for(int i=0; i<*num_net_queue; i++) { + struct Net* net = net_queue[i]; + sim_update_net(net); + *(net->in_queue) = 0; + net_queue[i] = 0; + } + *num_net_queue = 0; +} + +//// + +void sim_queue_gate(struct Gate* gate) { + assert(*num_gate_queue < queue_max); + gate_queue[*num_gate_queue++] = gate; + *(gate->in_queue) = 1; +} + +void sim_update_net(struct Net* net) { + int state = *(net->state_num) > 0; + if(state != *(net->state)) { + *(net->state) = state; + *(net->update_tick) = *current_tick; + + for(int i=0; i<*(net->num_gates_update); i++) { + struct Gate* gate = net->gates_update_c[i]; + if(!*(gate->in_queue)) { + sim_queue_gate(gate); + } + } + } +} diff --git a/sim/compiled_sim.dll b/sim/compiled_sim.dll index 603cc44511abbe2fadc297c9d04a0674beaeb287..311e7f13e1b8885c93517ab2a4ebdc7032f99129 100644 GIT binary patch literal 52015 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%0A_ki#LsU z9x#n>wD|DMF<6*fJfnu@c#J_Sb9jV{Nub{xz!)&Fw};N!%~&8(#WM#do6$-Gm~IkC zv(jLD@T+Z&7T)%$4GGL@@S_G{!$+H^6S-I&H$Czoh6>S#Uv7*I`1%M?@O*~RB=fCVt^ zU5V~P{Q>jXPRt%;)0yJo9SGWKQZqBY9X0jrQRsfE@pbyaEpygjR$0x%GT742mKtE< L#;7@|C$awvF8p8! literal 38492 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 and 1 or 0 - if state ~= cnet.state[0] then - cnet.state[0] = state - cnet.update_tick[0] = tick - - local len = cnet.num_gates_update[0]-1 - for i = 0, len do - local cgate = cnet.gates_update_c[i] - if cgate.in_queue[0]==0 then - Simulation.queuegate_c(GSim, cgate) - end - end - - --Simulation.queuegroupfx(GSim, net) - end -end +--function Group.update_c(cnet, tick) +-- local state = cnet.state_num[0]>0 and 1 or 0 +-- if state ~= cnet.state[0] then +-- cnet.state[0] = state +-- cnet.update_tick[0] = tick +-- +-- local len = cnet.num_gates_update[0]-1 +-- for i = 0, len do +-- local cgate = cnet.gates_update_c[i] +-- if cgate.in_queue[0]==0 then +-- Simulation.queuegate_c(GSim, cgate) +-- end +-- end +-- +-- --Simulation.queuegroupfx(GSim, net) +-- end +--end function Group.rebuild_ports(net) net.gates_update = {} diff --git a/sim/main.lua b/sim/main.lua index ae0f027..2581794 100644 --- a/sim/main.lua +++ b/sim/main.lua @@ -26,7 +26,6 @@ dofile("gatedef.lua") dofile("port.lua") dofile("gate.lua") dofile("save.lua") -dofile("compile.lua") dofile("network.lua") FFI = nil diff --git a/sim/simulation.lua b/sim/simulation.lua index 0c5f989..a2d2d4a 100644 --- a/sim/simulation.lua +++ b/sim/simulation.lua @@ -4,7 +4,10 @@ local ffi = FFI or require("ffi") ffi.cdef [[ struct Gate; 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(); ]] +local csim = ffi.load("compiled_sim.dll") Simulation = {} @@ -39,6 +42,7 @@ function Simulation.new(sim) o.num_groupqueue[0] = 0 o.num_gatequeue[0] = 0 o.current_tick[0] = 0 + sim_set_data(o.groupqueue, o.num_groupqueue, o.gatequeue, o.num_gatequeue, o.current_tick, queue_max) return o end @@ -346,13 +350,14 @@ end -- Logic Critical function Simulation.ticklogic(sim) - 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 + --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 for i, gate in pairs(sim.tickqueue[sim.current_tick[0]]) do