add math gates, fix 32-bit shifters
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user