From 5aa11f9e43e16d61bd5a802d488b25a25fdb7a85 Mon Sep 17 00:00:00 2001 From: Redo Date: Fri, 4 Nov 2022 15:50:45 -0600 Subject: [PATCH] make gates use net state pointers --- sim/gate.lua | 11 +++++++---- sim/gatedef.lua | 4 ++++ sim/port.lua | 9 +++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sim/gate.lua b/sim/gate.lua index 0f66e9e..5ebbc55 100644 --- a/sim/gate.lua +++ b/sim/gate.lua @@ -11,6 +11,9 @@ function Gate.new(objref, definition) logic = definition.logic, ports = {}, port_nets = {}, + port_net_state = 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).."]"), objref = objref, definition = definition, @@ -20,17 +23,17 @@ end -- Logic Critical function Gate.getportstate(gate, index) - return gate.port_nets[index].state[0] + return gate.port_net_state[index][0] end -- Logic Critical function Gate.setportstate(gate, index, state) if state ~= gate.port_states[index] then - local group = gate.port_nets[index] - group.state_num[0] = group.state_num[0] - gate.port_states[index] + state + gate.port_net_state_num[index][0] = gate.port_net_state_num[index][0] - gate.port_states[index] + state gate.port_states[index] = state - if ((group.state_num[0]>0) ~= (group.state[0]==1)) and (group.in_queue[0]==0) then + if ((gate.port_net_state_num[index][0]>0) ~= (gate.port_net_state[index][0]==1)) and (gate.port_net_in_queue[index][0]==0) then + local group = gate.port_nets[index] Simulation.queuegroup(GSim, group) end end diff --git a/sim/gatedef.lua b/sim/gatedef.lua index 4fdee29..b219efb 100644 --- a/sim/gatedef.lua +++ b/sim/gatedef.lua @@ -104,6 +104,10 @@ function GateDefinition.constructgate(def, objref, position, rotation) gate.ports[port.idx] = port gate.port_nets[port.idx] = nil gate.port_states[port.idx] = 0 + + gate.port_net_state [port.idx] = ffi.cast("int*", 0) + gate.port_net_state_num[port.idx] = ffi.cast("int*", 0) + gate.port_net_in_queue [port.idx] = ffi.cast("int*", 0) end return gate diff --git a/sim/port.lua b/sim/port.lua index d38df55..39e911f 100644 --- a/sim/port.lua +++ b/sim/port.lua @@ -50,6 +50,15 @@ end function Port.setgroup(port, group) port.group = group Port.getgate(port).port_nets[port.idx] = group + if group then + Port.getgate(port).port_net_state [port.idx] = group.state + Port.getgate(port).port_net_state_num[port.idx] = group.state_num + Port.getgate(port).port_net_in_queue [port.idx] = group.in_queue + else + Port.getgate(port).port_net_state [port.idx] = ffi.cast("int*", 0) + Port.getgate(port).port_net_state_num[port.idx] = ffi.cast("int*", 0) + Port.getgate(port).port_net_in_queue [port.idx] = ffi.cast("int*", 0) + end end function Port.getgroup(port)