add basic gates c func

This commit is contained in:
Redo 2022-11-15 11:46:09 -06:00
parent ef99073b23
commit 5ae87d926c
5 changed files with 19630 additions and 20493 deletions

Binary file not shown.

View File

@ -86,6 +86,48 @@ enum GateFuncs {
GateFunc_Adder8,
GateFunc_Adder16,
GateFunc_Adder32,
GateFunc_And2,
GateFunc_And3,
GateFunc_And4,
GateFunc_And5,
GateFunc_And6,
GateFunc_And7,
GateFunc_And8,
GateFunc_Or2,
GateFunc_Or3,
GateFunc_Or4,
GateFunc_Or5,
GateFunc_Or6,
GateFunc_Or7,
GateFunc_Or8,
GateFunc_Xor2,
GateFunc_Xor3,
GateFunc_Xor4,
GateFunc_Xor5,
GateFunc_Xor6,
GateFunc_Xor7,
GateFunc_Xor8,
GateFunc_Nand2,
GateFunc_Nand3,
GateFunc_Nand4,
GateFunc_Nand5,
GateFunc_Nand6,
GateFunc_Nand7,
GateFunc_Nand8,
GateFunc_Nor2,
GateFunc_Nor3,
GateFunc_Nor4,
GateFunc_Nor5,
GateFunc_Nor6,
GateFunc_Nor7,
GateFunc_Nor8,
GateFunc_Xnor2,
GateFunc_Xnor3,
GateFunc_Xnor4,
GateFunc_Xnor5,
GateFunc_Xnor6,
GateFunc_Xnor7,
GateFunc_Xnor8,
GateFunc_Rom4x1,
GateFunc_Rom4x4,
GateFunc_Rom4x8,
@ -211,6 +253,48 @@ GATEFUNC(Adder4) { int v = getword(4, 1) + getword(4, 5) + getport(13); setword(
GATEFUNC(Adder8) { int v = getword(8, 1) + getword(8, 9) + getport(25); setword(8, 17, v); setport(26, (v>>8) & 1); }
GATEFUNC(Adder16) { int v = getword(16, 1) + getword(16, 17) + getport(49); setword(16, 33, v); setport(50, (v>>16) & 1); }
GATEFUNC(Adder32) { unsigned long long v = getword(32, 1) + getword(32, 33) + getport(97); setword(32, 65, v); setport(98, (v>>32) & 1); }
GATEFUNC(And2) { setport(3, (getport(1) && getport(2))); }
GATEFUNC(And3) { setport(4, (getport(1) && getport(2) && getport(3))); }
GATEFUNC(And4) { setport(5, (getport(1) && getport(2) && getport(3) && getport(4))); }
GATEFUNC(And5) { setport(6, (getport(1) && getport(2) && getport(3) && getport(4) && getport(5))); }
GATEFUNC(And6) { setport(7, (getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6))); }
GATEFUNC(And7) { setport(8, (getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6) && getport(7))); }
GATEFUNC(And8) { setport(9, (getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6) && getport(7) && getport(8))); }
GATEFUNC(Or2) { setport(3, (getport(1) || getport(2))); }
GATEFUNC(Or3) { setport(4, (getport(1) || getport(2) || getport(3))); }
GATEFUNC(Or4) { setport(5, (getport(1) || getport(2) || getport(3) || getport(4))); }
GATEFUNC(Or5) { setport(6, (getport(1) || getport(2) || getport(3) || getport(4) || getport(5))); }
GATEFUNC(Or6) { setport(7, (getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6))); }
GATEFUNC(Or7) { setport(8, (getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6) || getport(7))); }
GATEFUNC(Or8) { setport(9, (getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6) || getport(7) || getport(8))); }
GATEFUNC(Xor2) { setport(3, (getport(1) ^ getport(2))); }
GATEFUNC(Xor3) { setport(4, (getport(1) ^ getport(2) ^ getport(3))); }
GATEFUNC(Xor4) { setport(5, (getport(1) ^ getport(2) ^ getport(3) ^ getport(4))); }
GATEFUNC(Xor5) { setport(6, (getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5))); }
GATEFUNC(Xor6) { setport(7, (getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6))); }
GATEFUNC(Xor7) { setport(8, (getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6) ^ getport(7))); }
GATEFUNC(Xor8) { setport(9, (getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6) ^ getport(7) ^ getport(8))); }
GATEFUNC(Nand2) { setport(3, !(getport(1) && getport(2))); }
GATEFUNC(Nand3) { setport(4, !(getport(1) && getport(2) && getport(3))); }
GATEFUNC(Nand4) { setport(5, !(getport(1) && getport(2) && getport(3) && getport(4))); }
GATEFUNC(Nand5) { setport(6, !(getport(1) && getport(2) && getport(3) && getport(4) && getport(5))); }
GATEFUNC(Nand6) { setport(7, !(getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6))); }
GATEFUNC(Nand7) { setport(8, !(getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6) && getport(7))); }
GATEFUNC(Nand8) { setport(9, !(getport(1) && getport(2) && getport(3) && getport(4) && getport(5) && getport(6) && getport(7) && getport(8))); }
GATEFUNC(Nor2) { setport(3, !(getport(1) || getport(2))); }
GATEFUNC(Nor3) { setport(4, !(getport(1) || getport(2) || getport(3))); }
GATEFUNC(Nor4) { setport(5, !(getport(1) || getport(2) || getport(3) || getport(4))); }
GATEFUNC(Nor5) { setport(6, !(getport(1) || getport(2) || getport(3) || getport(4) || getport(5))); }
GATEFUNC(Nor6) { setport(7, !(getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6))); }
GATEFUNC(Nor7) { setport(8, !(getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6) || getport(7))); }
GATEFUNC(Nor8) { setport(9, !(getport(1) || getport(2) || getport(3) || getport(4) || getport(5) || getport(6) || getport(7) || getport(8))); }
GATEFUNC(Xnor2) { setport(3, !(getport(1) ^ getport(2))); }
GATEFUNC(Xnor3) { setport(4, !(getport(1) ^ getport(2) ^ getport(3))); }
GATEFUNC(Xnor4) { setport(5, !(getport(1) ^ getport(2) ^ getport(3) ^ getport(4))); }
GATEFUNC(Xnor5) { setport(6, !(getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5))); }
GATEFUNC(Xnor6) { setport(7, !(getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6))); }
GATEFUNC(Xnor7) { setport(8, !(getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6) ^ getport(7))); }
GATEFUNC(Xnor8) { setport(9, !(getport(1) ^ getport(2) ^ getport(3) ^ getport(4) ^ getport(5) ^ getport(6) ^ getport(7) ^ getport(8))); }
GATEFUNC(Rom4x1) { if(getport(6)) { int a = getword(4, 1); for(int i=0; i<1; i++) { setport(5+i, getdata(a + i*16)); } } else { clearword(1, 5); } }
GATEFUNC(Rom4x4) { if(getport(9)) { int a = getword(4, 1); for(int i=0; i<4; i++) { setport(5+i, getdata(a + i*16)); } } else { clearword(4, 5); } }
GATEFUNC(Rom4x8) { if(getport(13)) { int a = getword(4, 1); for(int i=0; i<8; i++) { setport(5+i, getdata(a + i*16)); } } else { clearword(8, 5); } }
@ -337,6 +421,48 @@ GateFunc sim_logic_functions[] = {
GATEFUNCID(Adder8),
GATEFUNCID(Adder16),
GATEFUNCID(Adder32),
GATEFUNCID(And2),
GATEFUNCID(And3),
GATEFUNCID(And4),
GATEFUNCID(And5),
GATEFUNCID(And6),
GATEFUNCID(And7),
GATEFUNCID(And8),
GATEFUNCID(Or2),
GATEFUNCID(Or3),
GATEFUNCID(Or4),
GATEFUNCID(Or5),
GATEFUNCID(Or6),
GATEFUNCID(Or7),
GATEFUNCID(Or8),
GATEFUNCID(Xor2),
GATEFUNCID(Xor3),
GATEFUNCID(Xor4),
GATEFUNCID(Xor5),
GATEFUNCID(Xor6),
GATEFUNCID(Xor7),
GATEFUNCID(Xor8),
GATEFUNCID(Nand2),
GATEFUNCID(Nand3),
GATEFUNCID(Nand4),
GATEFUNCID(Nand5),
GATEFUNCID(Nand6),
GATEFUNCID(Nand7),
GATEFUNCID(Nand8),
GATEFUNCID(Nor2),
GATEFUNCID(Nor3),
GATEFUNCID(Nor4),
GATEFUNCID(Nor5),
GATEFUNCID(Nor6),
GATEFUNCID(Nor7),
GATEFUNCID(Nor8),
GATEFUNCID(Xnor2),
GATEFUNCID(Xnor3),
GATEFUNCID(Xnor4),
GATEFUNCID(Xnor5),
GATEFUNCID(Xnor6),
GATEFUNCID(Xnor7),
GATEFUNCID(Xnor8),
GATEFUNCID(Rom4x1),
GATEFUNCID(Rom4x4),
GATEFUNCID(Rom4x8),

View File

@ -225,45 +225,87 @@ cFuncsByName = {
["adder 8 bit"] = 82,
["adder 16 bit"] = 83,
["adder 32 bit"] = 84,
["rom 4x4"] = 85,
["rom 4x4x4"] = 86,
["rom 8x2x8"] = 87,
["rom 8x8"] = 88,
["rom 8x8x4"] = 89,
["rom 8x8x8"] = 90,
["rom 16x4x16"] = 91,
["rom 32x2x32"] = 92,
["rom 64x1x48"] = 93,
["rom 64x1x64"] = 94,
["rom 16x16"] = 95,
["rom 16x16x4"] = 96,
["rom 16x16x8"] = 97,
["rom 16x16x16"] = 98,
["rom 32x8x32"] = 99,
["rom 64x4x48"] = 100,
["rom 64x4x64"] = 101,
["rom 32x16"] = 102,
["rom 32x16x4"] = 103,
["rom 32x16x8"] = 104,
["rom 32x16x16"] = 105,
["rom 32x16x32"] = 106,
["rom 64x8x48"] = 107,
["rom 64x8x64"] = 108,
["rom 32x32x8"] = 109,
["rom 32x32x16"] = 110,
["rom 32x32x32"] = 111,
["rom 64x16x48"] = 112,
["rom 64x16x64"] = 113,
["rom 64x32x8"] = 114,
["rom 64x32x16"] = 115,
["rom 64x32x32"] = 116,
["rom 64x32x48"] = 117,
["rom 64x32x64"] = 118,
["rom 64x64x8"] = 119,
["rom 64x64x16"] = 120,
["rom 64x64x32"] = 121,
["rom 64x64x48"] = 122,
["rom 64x64x64"] = 123,
["and 2 bit"] = 85,
["and 3 bit"] = 86,
["and 4 bit"] = 87,
["and 5 bit"] = 88,
["and 6 bit"] = 89,
["and 7 bit"] = 90,
["and 8 bit"] = 91,
["or 2 bit"] = 92,
["or 3 bit"] = 93,
["or 4 bit"] = 94,
["or 5 bit"] = 95,
["or 6 bit"] = 96,
["or 7 bit"] = 97,
["or 8 bit"] = 98,
["xor 2 bit"] = 99,
["xor 3 bit"] = 100,
["xor 4 bit"] = 101,
["xor 5 bit"] = 102,
["xor 6 bit"] = 103,
["xor 7 bit"] = 104,
["xor 8 bit"] = 105,
["nand 2 bit"] = 106,
["nand 3 bit"] = 107,
["nand 4 bit"] = 108,
["nand 5 bit"] = 109,
["nand 6 bit"] = 110,
["nand 7 bit"] = 111,
["nand 8 bit"] = 112,
["nor 2 bit"] = 113,
["nor 3 bit"] = 114,
["nor 4 bit"] = 115,
["nor 5 bit"] = 116,
["nor 6 bit"] = 117,
["nor 7 bit"] = 118,
["nor 8 bit"] = 119,
["xnor 2 bit"] = 120,
["xnor 3 bit"] = 121,
["xnor 4 bit"] = 122,
["xnor 5 bit"] = 123,
["xnor 6 bit"] = 124,
["xnor 7 bit"] = 125,
["xnor 8 bit"] = 126,
["rom 4x4"] = 127,
["rom 4x4x4"] = 128,
["rom 8x2x8"] = 129,
["rom 8x8"] = 130,
["rom 8x8x4"] = 131,
["rom 8x8x8"] = 132,
["rom 16x4x16"] = 133,
["rom 32x2x32"] = 134,
["rom 64x1x48"] = 135,
["rom 64x1x64"] = 136,
["rom 16x16"] = 137,
["rom 16x16x4"] = 138,
["rom 16x16x8"] = 139,
["rom 16x16x16"] = 140,
["rom 32x8x32"] = 141,
["rom 64x4x48"] = 142,
["rom 64x4x64"] = 143,
["rom 32x16"] = 144,
["rom 32x16x4"] = 145,
["rom 32x16x8"] = 146,
["rom 32x16x16"] = 147,
["rom 32x16x32"] = 148,
["rom 64x8x48"] = 149,
["rom 64x8x64"] = 150,
["rom 32x32x8"] = 151,
["rom 32x32x16"] = 152,
["rom 32x32x32"] = 153,
["rom 64x16x48"] = 154,
["rom 64x16x64"] = 155,
["rom 64x32x8"] = 156,
["rom 64x32x16"] = 157,
["rom 64x32x32"] = 158,
["rom 64x32x48"] = 159,
["rom 64x32x64"] = 160,
["rom 64x64x8"] = 161,
["rom 64x64x16"] = 162,
["rom 64x64x32"] = 163,
["rom 64x64x48"] = 164,
["rom 64x64x64"] = 165,
}
cDataSizeByName = {

39867
sim/dump.txt

File diff suppressed because it is too large Load Diff

View File

@ -74,6 +74,7 @@ local function createMux(n) return { name = "Mux"..n, names = {"Mux "..n.." Bit"
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 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 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
@ -85,6 +86,14 @@ local romsizes = { -- copied from brick gen
{64, 32, 8}, {64, 32, 16}, {64, 32, 32}, {64, 32, 48}, {64, 32, 64}, -- 11 bit addr
{64, 64, 8}, {64, 64, 16}, {64, 64, 32}, {64, 64, 48}, {64, 64, 64}, -- 12 bit addr
}
local binaries = {
{"And", "&&", ""},
{"Or", "||", ""},
{"Xor", "^", ""},
{"Nand", "&&", "!"},
{"Nor", "||", "!"},
{"Xnor", "^", "!"},
}
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));" },
@ -95,6 +104,7 @@ local gates = {
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),
}
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
exportGates(gates)