add mux, demux, rom

This commit is contained in:
Redo 2022-11-14 13:43:24 -06:00
parent 8ccf6db9b8
commit ff20fdb2d6
6 changed files with 17578 additions and 8367 deletions

Binary file not shown.

View File

@ -64,6 +64,61 @@ enum GateFuncs {
GateFunc_DFF32, GateFunc_DFF32,
GateFunc_DFF48, GateFunc_DFF48,
GateFunc_DFF64, GateFunc_DFF64,
GateFunc_Mux1,
GateFunc_Mux2,
GateFunc_Mux3,
GateFunc_Mux4,
GateFunc_Mux5,
GateFunc_Mux6,
GateFunc_Mux7,
GateFunc_Mux8,
GateFunc_Demux1,
GateFunc_Demux2,
GateFunc_Demux3,
GateFunc_Demux4,
GateFunc_Demux5,
GateFunc_Demux6,
GateFunc_Demux7,
GateFunc_Demux8,
GateFunc_Rom4x1,
GateFunc_Rom4x4,
GateFunc_Rom4x8,
GateFunc_Rom6x1,
GateFunc_Rom6x4,
GateFunc_Rom6x8,
GateFunc_Rom6x16,
GateFunc_Rom6x32,
GateFunc_Rom6x48,
GateFunc_Rom6x64,
GateFunc_Rom8x1,
GateFunc_Rom8x4,
GateFunc_Rom8x8,
GateFunc_Rom8x16,
GateFunc_Rom8x32,
GateFunc_Rom8x48,
GateFunc_Rom8x64,
GateFunc_Rom9x1,
GateFunc_Rom9x4,
GateFunc_Rom9x8,
GateFunc_Rom9x16,
GateFunc_Rom9x32,
GateFunc_Rom9x48,
GateFunc_Rom9x64,
GateFunc_Rom10x8,
GateFunc_Rom10x16,
GateFunc_Rom10x32,
GateFunc_Rom10x48,
GateFunc_Rom10x64,
GateFunc_Rom11x8,
GateFunc_Rom11x16,
GateFunc_Rom11x32,
GateFunc_Rom11x48,
GateFunc_Rom11x64,
GateFunc_Rom12x8,
GateFunc_Rom12x16,
GateFunc_Rom12x32,
GateFunc_Rom12x48,
GateFunc_Rom12x64,
}; };
GATEFUNC(Diode) { setport(2, getport(1)); } GATEFUNC(Diode) { setport(2, getport(1)); }
@ -128,6 +183,61 @@ GATEFUNC(DFF24) { if(getport(49)) { copyword(24, 1, 25); } }
GATEFUNC(DFF32) { if(getport(65)) { copyword(32, 1, 33); } } GATEFUNC(DFF32) { if(getport(65)) { copyword(32, 1, 33); } }
GATEFUNC(DFF48) { if(getport(97)) { copyword(48, 1, 49); } } GATEFUNC(DFF48) { if(getport(97)) { copyword(48, 1, 49); } }
GATEFUNC(DFF64) { if(getport(129)) { copyword(64, 1, 65); } } GATEFUNC(DFF64) { if(getport(129)) { copyword(64, 1, 65); } }
GATEFUNC(Mux1) { if(getport(4)) { setport(5, getport(getword(1, 1)+2)); } else { setport(5, 0); } }
GATEFUNC(Mux2) { if(getport(7)) { setport(8, getport(getword(2, 1)+3)); } else { setport(8, 0); } }
GATEFUNC(Mux3) { if(getport(12)) { setport(13, getport(getword(3, 1)+4)); } else { setport(13, 0); } }
GATEFUNC(Mux4) { if(getport(21)) { setport(22, getport(getword(4, 1)+5)); } else { setport(22, 0); } }
GATEFUNC(Mux5) { if(getport(38)) { setport(39, getport(getword(5, 1)+6)); } else { setport(39, 0); } }
GATEFUNC(Mux6) { if(getport(71)) { setport(72, getport(getword(6, 1)+7)); } else { setport(72, 0); } }
GATEFUNC(Mux7) { if(getport(136)) { setport(137, getport(getword(7, 1)+8)); } else { setport(137, 0); } }
GATEFUNC(Mux8) { if(getport(265)) { setport(266, getport(getword(8, 1)+9)); } else { setport(266, 0); } }
GATEFUNC(Demux1) { int pa = getdata(0); if(getport(4)) { int a = getword(1, 1) + 2; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux2) { int pa = getdata(0); if(getport(7)) { int a = getword(2, 1) + 3; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux3) { int pa = getdata(0); if(getport(12)) { int a = getword(3, 1) + 4; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux4) { int pa = getdata(0); if(getport(21)) { int a = getword(4, 1) + 5; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux5) { int pa = getdata(0); if(getport(38)) { int a = getword(5, 1) + 6; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux6) { int pa = getdata(0); if(getport(71)) { int a = getword(6, 1) + 7; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux7) { int pa = getdata(0); if(getport(136)) { int a = getword(7, 1) + 8; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
GATEFUNC(Demux8) { int pa = getdata(0); if(getport(265)) { int a = getword(8, 1) + 9; if(pa != a) { if(pa) { setport(pa, 0); } setport(a, 1); setdata(0, a); } } else { if(pa) { setport(pa, 0); setdata(0, 0); } } }
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); } }
GATEFUNC(Rom6x1) { if(getport(8)) { int a = getword(6, 1); for(int i=0; i<1; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(1, 7); } }
GATEFUNC(Rom6x4) { if(getport(11)) { int a = getword(6, 1); for(int i=0; i<4; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(4, 7); } }
GATEFUNC(Rom6x8) { if(getport(15)) { int a = getword(6, 1); for(int i=0; i<8; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(8, 7); } }
GATEFUNC(Rom6x16) { if(getport(23)) { int a = getword(6, 1); for(int i=0; i<16; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(16, 7); } }
GATEFUNC(Rom6x32) { if(getport(39)) { int a = getword(6, 1); for(int i=0; i<32; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(32, 7); } }
GATEFUNC(Rom6x48) { if(getport(55)) { int a = getword(6, 1); for(int i=0; i<48; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(48, 7); } }
GATEFUNC(Rom6x64) { if(getport(71)) { int a = getword(6, 1); for(int i=0; i<64; i++) { setport(7+i, getdata(a + i*64)); } } else { clearword(64, 7); } }
GATEFUNC(Rom8x1) { if(getport(10)) { int a = getword(8, 1); for(int i=0; i<1; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(1, 9); } }
GATEFUNC(Rom8x4) { if(getport(13)) { int a = getword(8, 1); for(int i=0; i<4; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(4, 9); } }
GATEFUNC(Rom8x8) { if(getport(17)) { int a = getword(8, 1); for(int i=0; i<8; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(8, 9); } }
GATEFUNC(Rom8x16) { if(getport(25)) { int a = getword(8, 1); for(int i=0; i<16; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(16, 9); } }
GATEFUNC(Rom8x32) { if(getport(41)) { int a = getword(8, 1); for(int i=0; i<32; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(32, 9); } }
GATEFUNC(Rom8x48) { if(getport(57)) { int a = getword(8, 1); for(int i=0; i<48; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(48, 9); } }
GATEFUNC(Rom8x64) { if(getport(73)) { int a = getword(8, 1); for(int i=0; i<64; i++) { setport(9+i, getdata(a + i*256)); } } else { clearword(64, 9); } }
GATEFUNC(Rom9x1) { if(getport(11)) { int a = getword(9, 1); for(int i=0; i<1; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(1, 10); } }
GATEFUNC(Rom9x4) { if(getport(14)) { int a = getword(9, 1); for(int i=0; i<4; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(4, 10); } }
GATEFUNC(Rom9x8) { if(getport(18)) { int a = getword(9, 1); for(int i=0; i<8; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(8, 10); } }
GATEFUNC(Rom9x16) { if(getport(26)) { int a = getword(9, 1); for(int i=0; i<16; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(16, 10); } }
GATEFUNC(Rom9x32) { if(getport(42)) { int a = getword(9, 1); for(int i=0; i<32; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(32, 10); } }
GATEFUNC(Rom9x48) { if(getport(58)) { int a = getword(9, 1); for(int i=0; i<48; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(48, 10); } }
GATEFUNC(Rom9x64) { if(getport(74)) { int a = getword(9, 1); for(int i=0; i<64; i++) { setport(10+i, getdata(a + i*512)); } } else { clearword(64, 10); } }
GATEFUNC(Rom10x8) { if(getport(19)) { int a = getword(10, 1); for(int i=0; i<8; i++) { setport(11+i, getdata(a + i*1024)); } } else { clearword(8, 11); } }
GATEFUNC(Rom10x16) { if(getport(27)) { int a = getword(10, 1); for(int i=0; i<16; i++) { setport(11+i, getdata(a + i*1024)); } } else { clearword(16, 11); } }
GATEFUNC(Rom10x32) { if(getport(43)) { int a = getword(10, 1); for(int i=0; i<32; i++) { setport(11+i, getdata(a + i*1024)); } } else { clearword(32, 11); } }
GATEFUNC(Rom10x48) { if(getport(59)) { int a = getword(10, 1); for(int i=0; i<48; i++) { setport(11+i, getdata(a + i*1024)); } } else { clearword(48, 11); } }
GATEFUNC(Rom10x64) { if(getport(75)) { int a = getword(10, 1); for(int i=0; i<64; i++) { setport(11+i, getdata(a + i*1024)); } } else { clearword(64, 11); } }
GATEFUNC(Rom11x8) { if(getport(20)) { int a = getword(11, 1); for(int i=0; i<8; i++) { setport(12+i, getdata(a + i*2048)); } } else { clearword(8, 12); } }
GATEFUNC(Rom11x16) { if(getport(28)) { int a = getword(11, 1); for(int i=0; i<16; i++) { setport(12+i, getdata(a + i*2048)); } } else { clearword(16, 12); } }
GATEFUNC(Rom11x32) { if(getport(44)) { int a = getword(11, 1); for(int i=0; i<32; i++) { setport(12+i, getdata(a + i*2048)); } } else { clearword(32, 12); } }
GATEFUNC(Rom11x48) { if(getport(60)) { int a = getword(11, 1); for(int i=0; i<48; i++) { setport(12+i, getdata(a + i*2048)); } } else { clearword(48, 12); } }
GATEFUNC(Rom11x64) { if(getport(76)) { int a = getword(11, 1); for(int i=0; i<64; i++) { setport(12+i, getdata(a + i*2048)); } } else { clearword(64, 12); } }
GATEFUNC(Rom12x8) { if(getport(21)) { int a = getword(12, 1); for(int i=0; i<8; i++) { setport(13+i, getdata(a + i*4096)); } } else { clearword(8, 13); } }
GATEFUNC(Rom12x16) { if(getport(29)) { int a = getword(12, 1); for(int i=0; i<16; i++) { setport(13+i, getdata(a + i*4096)); } } else { clearword(16, 13); } }
GATEFUNC(Rom12x32) { if(getport(45)) { int a = getword(12, 1); for(int i=0; i<32; i++) { setport(13+i, getdata(a + i*4096)); } } else { clearword(32, 13); } }
GATEFUNC(Rom12x48) { if(getport(61)) { int a = getword(12, 1); for(int i=0; i<48; i++) { setport(13+i, getdata(a + i*4096)); } } else { clearword(48, 13); } }
GATEFUNC(Rom12x64) { if(getport(77)) { int a = getword(12, 1); for(int i=0; i<64; i++) { setport(13+i, getdata(a + i*4096)); } } else { clearword(64, 13); } }
GateFunc sim_logic_functions[] = { GateFunc sim_logic_functions[] = {
0, 0,
@ -193,5 +303,60 @@ GateFunc sim_logic_functions[] = {
GATEFUNCID(DFF32), GATEFUNCID(DFF32),
GATEFUNCID(DFF48), GATEFUNCID(DFF48),
GATEFUNCID(DFF64), GATEFUNCID(DFF64),
GATEFUNCID(Mux1),
GATEFUNCID(Mux2),
GATEFUNCID(Mux3),
GATEFUNCID(Mux4),
GATEFUNCID(Mux5),
GATEFUNCID(Mux6),
GATEFUNCID(Mux7),
GATEFUNCID(Mux8),
GATEFUNCID(Demux1),
GATEFUNCID(Demux2),
GATEFUNCID(Demux3),
GATEFUNCID(Demux4),
GATEFUNCID(Demux5),
GATEFUNCID(Demux6),
GATEFUNCID(Demux7),
GATEFUNCID(Demux8),
GATEFUNCID(Rom4x1),
GATEFUNCID(Rom4x4),
GATEFUNCID(Rom4x8),
GATEFUNCID(Rom6x1),
GATEFUNCID(Rom6x4),
GATEFUNCID(Rom6x8),
GATEFUNCID(Rom6x16),
GATEFUNCID(Rom6x32),
GATEFUNCID(Rom6x48),
GATEFUNCID(Rom6x64),
GATEFUNCID(Rom8x1),
GATEFUNCID(Rom8x4),
GATEFUNCID(Rom8x8),
GATEFUNCID(Rom8x16),
GATEFUNCID(Rom8x32),
GATEFUNCID(Rom8x48),
GATEFUNCID(Rom8x64),
GATEFUNCID(Rom9x1),
GATEFUNCID(Rom9x4),
GATEFUNCID(Rom9x8),
GATEFUNCID(Rom9x16),
GATEFUNCID(Rom9x32),
GATEFUNCID(Rom9x48),
GATEFUNCID(Rom9x64),
GATEFUNCID(Rom10x8),
GATEFUNCID(Rom10x16),
GATEFUNCID(Rom10x32),
GATEFUNCID(Rom10x48),
GATEFUNCID(Rom10x64),
GATEFUNCID(Rom11x8),
GATEFUNCID(Rom11x16),
GATEFUNCID(Rom11x32),
GATEFUNCID(Rom11x48),
GATEFUNCID(Rom11x64),
GATEFUNCID(Rom12x8),
GATEFUNCID(Rom12x16),
GATEFUNCID(Rom12x32),
GATEFUNCID(Rom12x48),
GATEFUNCID(Rom12x64),
}; };

View File

@ -187,8 +187,133 @@ cFuncsByName = {
["d flipflop 64 bit"] = 62, ["d flipflop 64 bit"] = 62,
["d flipflop 64 bit up"] = 62, ["d flipflop 64 bit up"] = 62,
["d flipflop 64 bit down"] = 62, ["d flipflop 64 bit down"] = 62,
["mux 1 bit"] = 63,
["mux 1 bit vertical"] = 63,
["mux 2 bit"] = 64,
["mux 2 bit vertical"] = 64,
["mux 3 bit"] = 65,
["mux 3 bit vertical"] = 65,
["mux 4 bit"] = 66,
["mux 4 bit vertical"] = 66,
["mux 5 bit"] = 67,
["mux 5 bit vertical"] = 67,
["mux 6 bit"] = 68,
["mux 6 bit vertical"] = 68,
["mux 7 bit"] = 69,
["mux 7 bit vertical"] = 69,
["mux 8 bit"] = 70,
["mux 8 bit vertical"] = 70,
["demux 1 bit"] = 71,
["demux 1 bit vertical"] = 71,
["demux 2 bit"] = 72,
["demux 2 bit vertical"] = 72,
["demux 3 bit"] = 73,
["demux 3 bit vertical"] = 73,
["demux 4 bit"] = 74,
["demux 4 bit vertical"] = 74,
["demux 5 bit"] = 75,
["demux 5 bit vertical"] = 75,
["demux 6 bit"] = 76,
["demux 6 bit vertical"] = 76,
["demux 7 bit"] = 77,
["demux 7 bit vertical"] = 77,
["demux 8 bit"] = 78,
["demux 8 bit vertical"] = 78,
["rom 4x4x1"] = 79,
["rom 4x4x4"] = 80,
["rom 8x2x8"] = 81,
["rom 8x8x1"] = 82,
["rom 8x8x4"] = 83,
["rom 8x8x8"] = 84,
["rom 16x4x16"] = 85,
["rom 32x2x32"] = 86,
["rom 64x1x48"] = 87,
["rom 64x1x64"] = 88,
["rom 16x16x1"] = 89,
["rom 16x16x4"] = 90,
["rom 16x16x8"] = 91,
["rom 16x16x16"] = 92,
["rom 32x8x32"] = 93,
["rom 64x4x48"] = 94,
["rom 64x4x64"] = 95,
["rom 32x16x1"] = 96,
["rom 32x16x4"] = 97,
["rom 32x16x8"] = 98,
["rom 32x16x16"] = 99,
["rom 32x16x32"] = 100,
["rom 64x8x48"] = 101,
["rom 64x8x64"] = 102,
["rom 32x32x8"] = 103,
["rom 32x32x16"] = 104,
["rom 32x32x32"] = 105,
["rom 64x16x48"] = 106,
["rom 64x16x64"] = 107,
["rom 64x32x8"] = 108,
["rom 64x32x16"] = 109,
["rom 64x32x32"] = 110,
["rom 64x32x48"] = 111,
["rom 64x32x64"] = 112,
["rom 64x64x8"] = 113,
["rom 64x64x16"] = 114,
["rom 64x64x32"] = 115,
["rom 64x64x48"] = 116,
["rom 64x64x64"] = 117,
} }
cDataSizeByName = { cDataSizeByName = {
["demux 1 bit"] = 1,
["demux 1 bit vertical"] = 1,
["demux 2 bit"] = 1,
["demux 2 bit vertical"] = 1,
["demux 3 bit"] = 1,
["demux 3 bit vertical"] = 1,
["demux 4 bit"] = 1,
["demux 4 bit vertical"] = 1,
["demux 5 bit"] = 1,
["demux 5 bit vertical"] = 1,
["demux 6 bit"] = 1,
["demux 6 bit vertical"] = 1,
["demux 7 bit"] = 1,
["demux 7 bit vertical"] = 1,
["demux 8 bit"] = 1,
["demux 8 bit vertical"] = 1,
["rom 4x4x1"] = 16,
["rom 4x4x4"] = 64,
["rom 8x2x8"] = 128,
["rom 8x8x1"] = 64,
["rom 8x8x4"] = 256,
["rom 8x8x8"] = 512,
["rom 16x4x16"] = 1024,
["rom 32x2x32"] = 2048,
["rom 64x1x48"] = 3072,
["rom 64x1x64"] = 4096,
["rom 16x16x1"] = 256,
["rom 16x16x4"] = 1024,
["rom 16x16x8"] = 2048,
["rom 16x16x16"] = 4096,
["rom 32x8x32"] = 8192,
["rom 64x4x48"] = 12288,
["rom 64x4x64"] = 16384,
["rom 32x16x1"] = 512,
["rom 32x16x4"] = 2048,
["rom 32x16x8"] = 4096,
["rom 32x16x16"] = 8192,
["rom 32x16x32"] = 16384,
["rom 64x8x48"] = 24576,
["rom 64x8x64"] = 32768,
["rom 32x32x8"] = 8192,
["rom 32x32x16"] = 16384,
["rom 32x32x32"] = 32768,
["rom 64x16x48"] = 49152,
["rom 64x16x64"] = 65536,
["rom 64x32x8"] = 16384,
["rom 64x32x16"] = 32768,
["rom 64x32x32"] = 65536,
["rom 64x32x48"] = 98304,
["rom 64x32x64"] = 131072,
["rom 64x64x8"] = 32768,
["rom 64x64x16"] = 65536,
["rom 64x64x32"] = 131072,
["rom 64x64x48"] = 196608,
["rom 64x64x64"] = 262144,
} }

25625
sim/dump.txt

File diff suppressed because it is too large Load Diff

View File

@ -86,6 +86,16 @@ function Gate.getdata(gate)
return gate.data return gate.data
end end
function Gate.getcdata(gate, i)
assert(i>=0 and i<gate.c.data_size)
return gate.c.data[i]
end
function Gate.setcdata(gate, i, v)
assert(i>=0 and i<gate.c.data_size)
gate.c.data[i] = v
end
function Gate.getportisrising(gate, index) function Gate.getportisrising(gate, index)
return Port.isrising(gate.ports[index]) return Port.isrising(gate.ports[index])
end end

View File

@ -66,15 +66,33 @@ local function exportGates(gates)
)) ))
end end
local function log2(n) return math.log(n)/math.log(2) 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 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 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 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 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.."x"..z}, 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 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
{ 4, 4 }, { 4, 4, 4}, { 8, 2, 8}, -- 4 bit addr
{ 8, 8 }, { 8, 8, 4}, { 8, 8, 8}, {16, 4, 16}, {32, 2, 32}, {64, 1, 48}, {64, 1, 64}, -- 6 bit addr
{16, 16 }, {16, 16, 4}, {16, 16, 8}, {16, 16, 16}, {32, 8, 32}, {64, 4, 48}, {64, 4, 64}, -- 8 bit addr
{32, 16 }, {32, 16, 4}, {32, 16, 8}, {32, 16, 16}, {32, 16, 32}, {64, 8, 48}, {64, 8, 64}, -- 9 bit addr
{32, 32, 8}, {32, 32, 16}, {32, 32, 32}, {64, 16, 48}, {64, 16, 64}, -- 10 bit addr
{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 gates = { local gates = {
{ name = "Diode", names = {"Diode", "Diode Up", "Diode Down"}, 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));" }, { 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), 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), 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), 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),
} }
for i, size in ipairs(romsizes) do table.insert(gates, createRom(size[1], size[2], size[3] or 1)) end
exportGates(gates) exportGates(gates)