From d151ab688c4ffa1690f66bad7661622c5dc59267 Mon Sep 17 00:00:00 2001 From: Redo0 Date: Tue, 25 May 2021 15:13:03 -0500 Subject: [PATCH] add net and wire struct; move net update into its file --- sim/compile.lua | 6 ------ sim/group.lua | 27 +++++++++++++++++++++++++++ sim/port.lua | 1 + sim/simulation.lua | 10 +--------- sim/wire.lua | 9 +++++++++ 5 files changed, 38 insertions(+), 15 deletions(-) diff --git a/sim/compile.lua b/sim/compile.lua index 3d08ce5..f77ac32 100644 --- a/sim/compile.lua +++ b/sim/compile.lua @@ -2,12 +2,6 @@ local ffi = FFI or require("ffi") Simulation = Simulation or {} -ffi.cdef([[ - struct Net { - - }; -]]) - function Simulation.compile(sim) -- assemble a list of all nets local all_nets = {} diff --git a/sim/group.lua b/sim/group.lua index 46d70af..43246ca 100644 --- a/sim/group.lua +++ b/sim/group.lua @@ -1,6 +1,19 @@ Group = {} +FFI.cdef[[ + struct Port; + struct Net { + bool state; + bool fxstate; + int updatetick; + int internal_ref; + int state_num; + int num_in_ports_update; + struct Port* in_ports_update[1]; + }; +]] + function Group.new(self, sim) local o = { state = false, @@ -9,6 +22,8 @@ function Group.new(self, sim) wires = {}, out_ports = {}, in_ports = {}, + + state_num = 0, nwires = 0, nout_ports = 0, @@ -154,3 +169,15 @@ end function Group.getsim(group) return group.sim end + +function Group.update(group) + local newstate = false + for j, port in pairs(group.out_ports) do + newstate = newstate or Port.getstate(port) + if newstate then + break + end + end + + Group.setstate(group, newstate) +end diff --git a/sim/port.lua b/sim/port.lua index c90f77e..a2767aa 100644 --- a/sim/port.lua +++ b/sim/port.lua @@ -17,6 +17,7 @@ Port = {} FFI.cdef[[ struct Gate; + struct Net; struct Port { bool state; char type; diff --git a/sim/simulation.lua b/sim/simulation.lua index c7764ac..0cd9487 100644 --- a/sim/simulation.lua +++ b/sim/simulation.lua @@ -266,15 +266,7 @@ end function Simulation.tick(self) for k, group in pairs(self.groupqueue) do - local newstate = false - for j, port in pairs(group.out_ports) do - newstate = newstate or Port.getstate(port) - if newstate then - break - end - end - - Group.setstate(group, newstate) + Group.update(group) end self.groupqueue = {} diff --git a/sim/wire.lua b/sim/wire.lua index 190dac4..eacaa43 100644 --- a/sim/wire.lua +++ b/sim/wire.lua @@ -1,6 +1,15 @@ Wire = {} +FFI.cdef[[ + struct Wire { + int objref; + int layer; + struct Net* group; + int bounds[6]; + }; +]] + function Wire.new(self, objref, layer, bounds, sim) local o = { objref = objref,