add math gates, fix 32-bit shifters

This commit is contained in:
Redo
2025-02-19 10:15:56 -07:00
parent a571ac5f3c
commit 68562d4d66
11 changed files with 20291 additions and 20082 deletions

View File

@@ -66,10 +66,16 @@ local function exportGates(gates)
))
end
local function log2(n) return math.log(n)/math.log(2) end
local function log2(n) return math.max(math.ceil(math.log(n)/math.log(2)-0.00000001), 1) end
local function sizestrFromAddrwS(w) return ({"2 ", "4 ", "8 ", "16 ", "32 ", "64 ", "128 ", "256 ", "512 ", "1 K", "2 K", "4 K", "8 K", "16 K", "32 K", "64 K"})[w] end
local function sizestrFromAddrw(w) sizeFromAddrWS(w):gsub(" ", "") end
local function bwFromN(n) return ({"B", "W", nil, "DW"})[n/8] or error("invalid size "..n) end
local function sizecast(n) return n>=32 and "(unsigned long long)" or "" end
local function sizetype(n) return n>=32 and "unsigned long long" or "unsigned int" end
local function sizeword(n) return n>=32 and "64" or "" end
local function sizeint(n) return n>=32 and "ull" or "" end
local function sizemax(n) return math.pow(2, n)-1 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
@@ -77,17 +83,50 @@ local function createDFF (n) return { name = "DFF" ..n, names = {"D FlipFl
local function createMux(n) return { name = "Mux"..n, names = {"Mux "..n.." Bit", "Mux "..n.." Bit Vertical"}, func = "if(getport("..(n+math.pow(2,n)+1)..")) { setport("..(n+math.pow(2,n)+2)..", getport(getword("..n..", 1)+"..(n+1)..")); } else { setport("..(n+math.pow(2,n)+2)..", 0); }" } end
local function createDemux(n) return { name = "Demux"..n, names = {"Demux "..n.." Bit", "Demux "..n.." Bit Vertical"}, size = 1, func = "int pa = getdata(0); if(getport("..(n+math.pow(2,n)+1)..")) { int a = getword("..n..", 1) + "..(n+1).."; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } }" } end
local function createRom(x, y, z) local w = log2(x*y); return { name = "Rom"..w.."x"..z, names = {"ROM "..x.."x"..y..(z>1 and ("x"..z) or "")}, size = x*y*z, func="if(getport("..(w+z+1)..")) { int a = getword("..w..", 1); for(int i=0; i<"..z.."; i++) { setport("..(w+1).."+i, getdata(a + i*"..(x*y)..")); } } else { clearword("..z..", "..(w+1).."); }" } end
local function createAdder(n) return { name = "Adder"..n, names = {"Adder "..n.." Bit"}, func = (n>=32 and "unsigned long long" or "int").." v = getword("..n..", 1) + getword("..n..", "..(n+1)..") + getport("..(n*3+1).."); setword("..n..", "..(n*2+1)..", v); setport("..(n*3+2)..", (v>>"..n..") & 1);" } end
local function createAdder(n) return { name = "Adder"..n, names = {"Adder "..n.." Bit"}, func =
sizetype(n).." v = "..
sizecast(n).."getword("..n..", 1) + "..
sizecast(n).."(getword("..n..", "..(n+1)..")^(getport("..(n*3+3)..")*"..sizemax(n)..")) + "..
sizecast(n).."getport("..(n*3+1).."); "..
"setword("..n..", "..(n*2+1)..", v); "..
"setport("..(n*3+2)..", (v>>"..n..sizeint(n)..") & 1);"
} end
local function createIncrementer(n) return { name = "Incrementer"..n, names = {"Incrementer "..n.." Bit"}, func =
sizetype(n).." a = "..
sizecast(n).."(getword("..n..", 1)^(getport("..(n*2+4)..")*"..sizemax(n)..")) + "..
sizecast(n).."getport("..(n*2+1)..") + "..
sizecast(n).."(getport("..(n*2+2)..")*"..sizemax(n).."); "..
"setword("..n..", "..(n+1)..", a); "..
"setport("..(n*2+3)..", (a>>"..n..sizeint(n)..") & 1);"
} end
local function createShifterLeft (n) return { name = "ShifterLeft" ..n, names = {"Shifter Left " ..n.." Bit"}, func =
"int dist = getword("..log2(n)..", "..(n*3+1).."); "..
"setword"..sizeword(n).."("..(n*2)..", "..(n+1)..", "..
" (("..sizecast(n).."getword("..n..", 1))<<dist"..") | "..
"(getport("..(n*3+log2(n)+1)..") ? ("..sizemax(n)..sizeint(n)..">>("..n .."-dist)) : 0"..sizeint(n).."));" } end
local function createShifterRight(n) return { name = "ShifterRight"..n, names = {"Shifter Right "..n.." Bit"}, func =
"int dist = getword("..log2(n)..", "..(n*3+1).."); "..
"setword"..sizeword(n).."("..(n*2)..", "..(n+1)..", "..
"(("..sizecast(n).."getword("..n..", 1))<<("..n.."-dist)) | "..
"("..(n>=16 and "dist!=0 && " or "").."getport("..(n*3+log2(n)+1)..") ? "..
"("..sizemax(n)..sizeint(n).."<<("..(n*2).."-dist)) : "..
"0"..sizeint(n)..
")"..
");"
} end
local function createMultiplier(n) return { name = "Multiplier"..n, names = {"Multiplier "..n.." Bit"}, func = "setword"..sizeword(n).."("..(n*2)..", "..(n*2+1)..", "..sizecast(n).."getword("..n..", 1) * "..sizecast(n).."getword("..n..", "..(n+1).."));" } end
local function createDivider(n) return { name = "Divider"..n, names = {"Divider "..n.." Bit"}, func = "unsigned int a = getword("..n..", 1); unsigned int b = getword("..n..", "..(n+1).."); setword("..n..", "..(n*2+1)..", b!=0 ? a/b : 0); setword("..n..", "..(n*3+1)..", b!=0 ? a%b : 0);" } end
local function createBinary(name, f, inv, n) local ilist = {}; for i = 1, n do table.insert(ilist, "getport("..i..")") end; return { name = name..n, names = {name:upper().." "..n.." Bit"}, func = "setport("..(n+1)..", "..inv.."("..table.concat(ilist, " "..f.." ").."));" } end
local function createRam(n, w) return { name = "Ram"..n.."x"..w, names = {"RAM "..sizestrFromAddrwS(w)..bwFromN(n)}, size = math.pow(2, w), func = "if(getport("..(n*2+w+1)..")) { setword("..n..", "..(n+1)..", getdata(getword("..w..", "..(n*2+1).."))); } else { clearword("..n..", "..(n+1).."); } if(getport("..(n*2+w+2)..")) { setdata(getword("..w..", "..(n*2+1).."), getword("..n..", 1)); }" } end -- in*n out*n addr*w readclk writeclk
local binaries = {
{"And", "&&", ""},
{"Or", "||", ""},
{"Xor", "^", ""},
{"And" , "&&", "" },
{"Or" , "||", "" },
{"Xor" , "^" , "" },
{"Nand", "&&", "!"},
{"Nor", "||", "!"},
{"Xnor", "^", "!"},
{"Nor" , "||", "!"},
{"Xnor", "^" , "!"},
}
local romsizes = { -- copied from brick gen
-- 1 bit data 4 bit data 8 bit data 16 bit data 32 bit data 48 bit data 64 bit data
@@ -100,7 +139,7 @@ local romsizes = { -- copied from brick gen
{64, 64, 8}, {64, 64, 16}, {64, 64, 32}, {64, 64, 48}, {64, 64, 64}, -- 12 bit addr
}
local ramsizes = {
{8, 8},
{8, 8},
{8, 12},
}
local gates = {
@@ -111,7 +150,12 @@ local gates = {
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),
createMux (1), createMux (2), createMux (3), createMux (4), createMux (5), createMux (6), createMux (7), createMux (8),
createDemux(1), createDemux(2), createDemux(3), createDemux(4), createDemux(5), createDemux(6), createDemux(7), createDemux(8),
createAdder(1), createAdder(2), createAdder(4), createAdder(8), createAdder(16), createAdder(32),
createAdder (2), createAdder (4), createAdder (8), createAdder (16), createAdder (32),
createIncrementer (2), createIncrementer (4), createIncrementer (8), createIncrementer (16), createIncrementer (32),
createMultiplier (2), createMultiplier (4), createMultiplier (8), createMultiplier (16), createMultiplier (32),
createDivider (2), createDivider (4), createDivider (8), createDivider (16), createDivider (32),
createShifterLeft (2), createShifterLeft (4), createShifterLeft (8), createShifterLeft (16), createShifterLeft (32),
createShifterRight(2), createShifterRight(4), createShifterRight(8), createShifterRight(16), createShifterRight(32),
}
for _, v in ipairs(binaries) do for i = 2, 8 do table.insert(gates, createBinary(v[1], v[2], v[3], i)) end end
for i, size in ipairs(romsizes) do table.insert(gates, createRom(size[1], size[2], size[3] or 1)) end