add basic gates c func
This commit is contained in:
parent
ef99073b23
commit
5ae87d926c
Binary file not shown.
@ -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),
|
||||
|
@ -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
39867
sim/dump.txt
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user