add bus bricks to c logic
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user