add bus bricks to c logic

This commit is contained in:
Redo
2022-11-14 12:48:05 -06:00
parent 1787444b72
commit d3ecd34b26
6 changed files with 10704 additions and 2148 deletions

View File

@@ -35,29 +35,48 @@ local function writeFile(fn, data)
end
local function exportGates(gates)
local gateList = {}
local gateNameList = {}
local gateFuncList = {}
local gateSizeList = {}
local gateAliasList = {}
local numGates = 0
for k, gate in pairs(gates) do
table.insert(gateList, gate.name or error("gate "..k.." has no name"))
table.insert(gateNameList, gate.name or error("gate "..k.." has no name"))
table.insert(gateFuncList, gate.func or error("gate "..gate.name.." has no c function"))
table.insert(gateSizeList, gate.size or 0)
numGates = numGates + 1; gate.idx = numGates;
for _, name in ipairs(gate.names) do
table.insert(gateAliasList, { name = name, idx = gate.idx } )
end
end
local function map(t, f) local u = {}; for i, v in ipairs(t) do table.insert(u, f(v, i)) end; return u; end
writeFile("compiled_sim_gates.c", string.format(c_code,
table.concat(map(gateList, function(v, i) return string.format("\tGateFunc_%s,", v) end), "\n"),
table.concat(map(gateList, function(v, i) return string.format("GATEFUNC(%s) {\n\t%s\n}", v, gateFuncList[i]:gsub("\n", "\n\t"):gsub("\n+$", ""):gsub("^\n+", "")) end), "\n"),
table.concat(map(gateList, function(v, i) return string.format("\tGATEFUNCID(%s),", v) end), "\n")
table.concat(map(gateNameList, function(v, i) return string.format("\tGateFunc_%s,", v) end), "\n"),
table.concat(map(gateNameList, function(v, i)
local func = gateFuncList[i]
local nl = func:find("\n") and "\n" or ""
local nt = func:find("\n") and "\t" or ""
local ns = func:find("\n") and "" or " "
return string.format("GATEFUNC(%s) {"..nl..nt..ns.."%s"..nl..ns.."}", v, gateFuncList[i]:gsub("\n", "\n\t"):gsub("\n+$", ""):gsub("^\n+", ""))
end), "\n"),
table.concat(map(gateNameList, function(v, i) return string.format("\tGATEFUNCID(%s),", v) end), "\n")
))
writeFile("compiled_sim_gates.lua", string.format(lua_code,
table.concat(map(gateList, function(v, i) return string.format("\t[\"%s\"] = %i,", v:lower(), i) end), "\n"),
table.concat(map(gateList, function(v, i) return string.format("\t[\"%s\"] = %i,", v:lower(), gateSizeList[i]) end), "\n")
table.concat(map(gateAliasList, function(v, i) return string.format("\t[\"%s\"] = %i,", v.name:lower(), v.idx) end), "\n"),
table.concat(map(gateAliasList, function(v, i) if gateSizeList[v.idx]>0 then return string.format("\t[\"%s\"] = %i,", v.name:lower(), gateSizeList[v.idx]) else return nil end end), "\n")
))
end
local function createEnabler(n) return { name = "Enabler"..n, names = {"Enabler " ..n.." Bit", "Enabler " ..n.." Bit Up", "Enabler " ..n.." Bit Down"}, func = "if(getport("..(n*2+1)..")) { copyword("..n..", 1, "..(n+1).."); } else { clearword("..n..", "..(n+1).."); }" } end
local function createBuffer (n) return { name = "Buffer" ..n, names = {"Buffer " ..n.." Bit", "Buffer " ..n.." Bit Up", "Buffer " ..n.." Bit Down"}, func = "if(getport("..(n*2+1)..")) { copyword("..n..", 1, "..(n+1).."); } else { clearword("..n..", "..(n+1).."); }" } end
local function createDFF (n) return { name = "DFF" ..n, names = {"D FlipFlop " ..n.." Bit", "D FlipFlop " ..n.." Bit Up", "D FlipFlop " ..n.." Bit Down"}, func = "if(getport("..(n*2+1)..")) { copyword("..n..", 1, "..(n+1).."); }" } end
local gates = {
{ name = "Diode", func = "setport(2, getport(1));" },
{ name = "Not" , func = "setport(2, !getport(1));" },
{ name = "Diode", names = {"Diode", "Diode Up", "Diode Down"}, func = "setport(2, getport(1));" },
{ name = "Not" , names = {"Not" , "Not Up" , "Not Down" }, func = "setport(2, !getport(1));" },
createEnabler(1), createEnabler(2), createEnabler(3), createEnabler(4), createEnabler(5), createEnabler(6), createEnabler(7), createEnabler(8), createEnabler(9), createEnabler(10), createEnabler(11), createEnabler(12), createEnabler(13), createEnabler(14), createEnabler(15), createEnabler(16), createEnabler(24), createEnabler(32), createEnabler(48), createEnabler(64),
createBuffer (1), createBuffer (2), createBuffer (3), createBuffer (4), createBuffer (5), createBuffer (6), createBuffer (7), createBuffer (8), createBuffer (9), createBuffer (10), createBuffer (11), createBuffer (12), createBuffer (13), createBuffer (14), createBuffer (15), createBuffer (16), createBuffer (24), createBuffer (32), createBuffer (48), createBuffer (64),
createDFF (1), createDFF (2), createDFF (3), createDFF (4), createDFF (5), createDFF (6), createDFF (7), createDFF (8), createDFF (9), createDFF (10), createDFF (11), createDFF (12), createDFF (13), createDFF (14), createDFF (15), createDFF (16), createDFF (24), createDFF (32), createDFF (48), createDFF (64),
}
exportGates(gates)