lua-logic/sim/gencfuncs.lua
2022-11-14 12:49:07 -06:00

81 lines
4.2 KiB
Lua

local c_code = [[
// Auto-generated by gencfuncs.lua
enum GateFuncs {
GateFunc_None,
%s
};
%s
GateFunc sim_logic_functions[] = {
0,
%s
};
]]
local lua_code = [[
-- Auto-generated by gencfuncs.lua
cFuncsByName = {
%s
}
cDataSizeByName = {
%s
}
]]
local function writeFile(fn, data)
local f = io.open(fn, "wb") or error("Could not open file for writing: "..fn)
f:write(data)
f:close()
end
local function exportGates(gates)
local gateNameList = {}
local gateFuncList = {}
local gateSizeList = {}
local gateAliasList = {}
local numGates = 0
for k, gate in pairs(gates) do
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(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(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", 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)