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

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
savedata/*
*.so
sim/dump.txt
UploadBackend.bat

View File

@ -1,5 +1,5 @@
#include <assert.h>
//#include <assert.h>
struct Net;
struct Gate;
@ -41,7 +41,7 @@ int* current_tick;
//static const int queue_max = 65536;
extern GateFunc sim_logic_functions[];
DLL void sim_set_data(struct Net** net_queue, int* num_net_queue, struct Gate** gate_queue, int* num_gate_queue, int* current_tick, int queue_max);
DLL void sim_set_data(struct Net** net_queue_in, int* num_net_queue_in, struct Gate** gate_queue_in, int* num_gate_queue_in, int* current_tick_in, int queue_max_in);
DLL void sim_update_nets();
DLL void sim_update_gates();
@ -140,25 +140,30 @@ FAST void sim_gate_set_port(const struct Gate* const gate, const int port, const
}
}
FAST int sim_gate_get_data(const struct Gate* const gate, const int addr) {
assert(addr>=0 && addr<gate->data_size);
//assert(addr>=0 && addr<gate->data_size);
return gate->data[addr];
}
FAST void sim_gate_set_data(const struct Gate* const gate, const int addr, const int val) {
assert(addr>=0 && addr<gate->data_size);
//assert(addr>=0 && addr<gate->data_size);
gate->data[addr] = val;
}
FAST int sim_gate_get_word(const struct Gate* const gate, const int size, const int idx) {
FAST unsigned int sim_gate_get_word(const struct Gate* const gate, const int size, const int idx) {
int val = 0;
for(int i=0; i<size; i++) {
val += sim_gate_get_port(gate, idx+i) << i;
}
return val;
}
FAST void sim_gate_set_word(const struct Gate* const gate, const int size, const int idx, const int val) {
FAST void sim_gate_set_word(const struct Gate* const gate, const int size, const int idx, const unsigned int val) {
for(int i=0; i<size; i++) {
sim_gate_set_port(gate, idx+i, (val>>i) & 1);
}
}
FAST void sim_gate_set_word_64(const struct Gate* const gate, const int size, const int idx, const unsigned long long val) {
for(int i=0; i<size; i++) {
sim_gate_set_port(gate, idx+i, (val>>(unsigned long long)i) & 1ull);
}
}
////
@ -174,5 +179,6 @@ FAST void sim_gate_set_word(const struct Gate* const gate, const int size, const
#define getword(size, idx) sim_gate_get_word(gate, size, idx)
#define clearword(size, idx) for(int i=0;i<size;i++) { setport(idx+i, 0); }
#define setword(size, idx, val) sim_gate_set_word(gate, size, idx, val)
#define setword64(size, idx, val) sim_gate_set_word_64(gate, size, idx, val)
#include "compiled_sim_gates.c"

Binary file not shown.

Binary file not shown.

View File

@ -80,12 +80,36 @@ enum GateFuncs {
GateFunc_Demux6,
GateFunc_Demux7,
GateFunc_Demux8,
GateFunc_Adder1,
GateFunc_Adder2,
GateFunc_Adder4,
GateFunc_Adder8,
GateFunc_Adder16,
GateFunc_Adder32,
GateFunc_Incrementer2,
GateFunc_Incrementer4,
GateFunc_Incrementer8,
GateFunc_Incrementer16,
GateFunc_Incrementer32,
GateFunc_Multiplier2,
GateFunc_Multiplier4,
GateFunc_Multiplier8,
GateFunc_Multiplier16,
GateFunc_Multiplier32,
GateFunc_Divider2,
GateFunc_Divider4,
GateFunc_Divider8,
GateFunc_Divider16,
GateFunc_Divider32,
GateFunc_ShifterLeft2,
GateFunc_ShifterLeft4,
GateFunc_ShifterLeft8,
GateFunc_ShifterLeft16,
GateFunc_ShifterLeft32,
GateFunc_ShifterRight2,
GateFunc_ShifterRight4,
GateFunc_ShifterRight8,
GateFunc_ShifterRight16,
GateFunc_ShifterRight32,
GateFunc_And2,
GateFunc_And3,
GateFunc_And4,
@ -249,12 +273,36 @@ GATEFUNC(Demux5) { int pa = getdata(0); if(getport(38)) { int a = getword(5, 1)
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(Adder1) { int v = getword(1, 1) + getword(1, 2) + getport(4); setword(1, 3, v); setport(5, (v>>1) & 1); }
GATEFUNC(Adder2) { int v = getword(2, 1) + getword(2, 3) + getport(7); setword(2, 5, v); setport(8, (v>>2) & 1); }
GATEFUNC(Adder4) { int v = getword(4, 1) + getword(4, 5) + getport(13); setword(4, 9, v); setport(14, (v>>4) & 1); }
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(Adder2) { unsigned int v = getword(2, 1) + (getword(2, 3)^(getport(9)*3)) + getport(7); setword(2, 5, v); setport(8, (v>>2) & 1); }
GATEFUNC(Adder4) { unsigned int v = getword(4, 1) + (getword(4, 5)^(getport(15)*15)) + getport(13); setword(4, 9, v); setport(14, (v>>4) & 1); }
GATEFUNC(Adder8) { unsigned int v = getword(8, 1) + (getword(8, 9)^(getport(27)*255)) + getport(25); setword(8, 17, v); setport(26, (v>>8) & 1); }
GATEFUNC(Adder16) { unsigned int v = getword(16, 1) + (getword(16, 17)^(getport(51)*65535)) + getport(49); setword(16, 33, v); setport(50, (v>>16) & 1); }
GATEFUNC(Adder32) { unsigned long long v = (unsigned long long)getword(32, 1) + (unsigned long long)(getword(32, 33)^(getport(99)*4294967295)) + (unsigned long long)getport(97); setword(32, 65, v); setport(98, (v>>32ull) & 1); }
GATEFUNC(Incrementer2) { unsigned int a = (getword(2, 1)^(getport(8)*3)) + getport(5) + (getport(6)*3); setword(2, 3, a); setport(7, (a>>2) & 1); }
GATEFUNC(Incrementer4) { unsigned int a = (getword(4, 1)^(getport(12)*15)) + getport(9) + (getport(10)*15); setword(4, 5, a); setport(11, (a>>4) & 1); }
GATEFUNC(Incrementer8) { unsigned int a = (getword(8, 1)^(getport(20)*255)) + getport(17) + (getport(18)*255); setword(8, 9, a); setport(19, (a>>8) & 1); }
GATEFUNC(Incrementer16) { unsigned int a = (getword(16, 1)^(getport(36)*65535)) + getport(33) + (getport(34)*65535); setword(16, 17, a); setport(35, (a>>16) & 1); }
GATEFUNC(Incrementer32) { unsigned long long a = (unsigned long long)(getword(32, 1)^(getport(68)*4294967295)) + (unsigned long long)getport(65) + (unsigned long long)(getport(66)*4294967295); setword(32, 33, a); setport(67, (a>>32ull) & 1); }
GATEFUNC(Multiplier2) { setword(4, 5, getword(2, 1) * getword(2, 3)); }
GATEFUNC(Multiplier4) { setword(8, 9, getword(4, 1) * getword(4, 5)); }
GATEFUNC(Multiplier8) { setword(16, 17, getword(8, 1) * getword(8, 9)); }
GATEFUNC(Multiplier16) { setword(32, 33, getword(16, 1) * getword(16, 17)); }
GATEFUNC(Multiplier32) { setword64(64, 65, (unsigned long long)getword(32, 1) * (unsigned long long)getword(32, 33)); }
GATEFUNC(Divider2) { unsigned int a = getword(2, 1); unsigned int b = getword(2, 3); setword(2, 5, b!=0 ? a/b : 0); setword(2, 7, b!=0 ? a%b : 0); }
GATEFUNC(Divider4) { unsigned int a = getword(4, 1); unsigned int b = getword(4, 5); setword(4, 9, b!=0 ? a/b : 0); setword(4, 13, b!=0 ? a%b : 0); }
GATEFUNC(Divider8) { unsigned int a = getword(8, 1); unsigned int b = getword(8, 9); setword(8, 17, b!=0 ? a/b : 0); setword(8, 25, b!=0 ? a%b : 0); }
GATEFUNC(Divider16) { unsigned int a = getword(16, 1); unsigned int b = getword(16, 17); setword(16, 33, b!=0 ? a/b : 0); setword(16, 49, b!=0 ? a%b : 0); }
GATEFUNC(Divider32) { unsigned int a = getword(32, 1); unsigned int b = getword(32, 33); setword(32, 65, b!=0 ? a/b : 0); setword(32, 97, b!=0 ? a%b : 0); }
GATEFUNC(ShifterLeft2) { int dist = getword(1, 7); setword(4, 3, ((getword(2, 1))<<dist) | (getport(8) ? (3>>(2-dist)) : 0)); }
GATEFUNC(ShifterLeft4) { int dist = getword(2, 13); setword(8, 5, ((getword(4, 1))<<dist) | (getport(15) ? (15>>(4-dist)) : 0)); }
GATEFUNC(ShifterLeft8) { int dist = getword(3, 25); setword(16, 9, ((getword(8, 1))<<dist) | (getport(28) ? (255>>(8-dist)) : 0)); }
GATEFUNC(ShifterLeft16) { int dist = getword(4, 49); setword(32, 17, ((getword(16, 1))<<dist) | (getport(53) ? (65535>>(16-dist)) : 0)); }
GATEFUNC(ShifterLeft32) { int dist = getword(5, 97); setword64(64, 33, (((unsigned long long)getword(32, 1))<<dist) | (getport(102) ? (4294967295ull>>(32-dist)) : 0ull)); }
GATEFUNC(ShifterRight2) { int dist = getword(1, 7); setword(4, 3, ((getword(2, 1))<<(2-dist)) | (getport(8) ? (3<<(4-dist)) : 0)); }
GATEFUNC(ShifterRight4) { int dist = getword(2, 13); setword(8, 5, ((getword(4, 1))<<(4-dist)) | (getport(15) ? (15<<(8-dist)) : 0)); }
GATEFUNC(ShifterRight8) { int dist = getword(3, 25); setword(16, 9, ((getword(8, 1))<<(8-dist)) | (getport(28) ? (255<<(16-dist)) : 0)); }
GATEFUNC(ShifterRight16) { int dist = getword(4, 49); setword(32, 17, ((getword(16, 1))<<(16-dist)) | (dist!=0 && getport(53) ? (65535<<(32-dist)) : 0)); }
GATEFUNC(ShifterRight32) { int dist = getword(5, 97); setword64(64, 33, (((unsigned long long)getword(32, 1))<<(32-dist)) | (dist!=0 && getport(102) ? (4294967295ull<<(64-dist)) : 0ull)); }
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))); }
@ -419,12 +467,36 @@ GateFunc sim_logic_functions[] = {
GATEFUNCID(Demux6),
GATEFUNCID(Demux7),
GATEFUNCID(Demux8),
GATEFUNCID(Adder1),
GATEFUNCID(Adder2),
GATEFUNCID(Adder4),
GATEFUNCID(Adder8),
GATEFUNCID(Adder16),
GATEFUNCID(Adder32),
GATEFUNCID(Incrementer2),
GATEFUNCID(Incrementer4),
GATEFUNCID(Incrementer8),
GATEFUNCID(Incrementer16),
GATEFUNCID(Incrementer32),
GATEFUNCID(Multiplier2),
GATEFUNCID(Multiplier4),
GATEFUNCID(Multiplier8),
GATEFUNCID(Multiplier16),
GATEFUNCID(Multiplier32),
GATEFUNCID(Divider2),
GATEFUNCID(Divider4),
GATEFUNCID(Divider8),
GATEFUNCID(Divider16),
GATEFUNCID(Divider32),
GATEFUNCID(ShifterLeft2),
GATEFUNCID(ShifterLeft4),
GATEFUNCID(ShifterLeft8),
GATEFUNCID(ShifterLeft16),
GATEFUNCID(ShifterLeft32),
GATEFUNCID(ShifterRight2),
GATEFUNCID(ShifterRight4),
GATEFUNCID(ShifterRight8),
GATEFUNCID(ShifterRight16),
GATEFUNCID(ShifterRight32),
GATEFUNCID(And2),
GATEFUNCID(And3),
GATEFUNCID(And4),

View File

@ -219,95 +219,119 @@ cFuncsByName = {
["demux 7 bit vertical"] = 77,
["demux 8 bit"] = 78,
["demux 8 bit vertical"] = 78,
["adder 1 bit"] = 79,
["adder 2 bit"] = 80,
["adder 4 bit"] = 81,
["adder 8 bit"] = 82,
["adder 16 bit"] = 83,
["adder 32 bit"] = 84,
["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,
["ram 256 b"] = 166,
["ram 4 kb"] = 167,
["adder 2 bit"] = 79,
["adder 4 bit"] = 80,
["adder 8 bit"] = 81,
["adder 16 bit"] = 82,
["adder 32 bit"] = 83,
["incrementer 2 bit"] = 84,
["incrementer 4 bit"] = 85,
["incrementer 8 bit"] = 86,
["incrementer 16 bit"] = 87,
["incrementer 32 bit"] = 88,
["multiplier 2 bit"] = 89,
["multiplier 4 bit"] = 90,
["multiplier 8 bit"] = 91,
["multiplier 16 bit"] = 92,
["multiplier 32 bit"] = 93,
["divider 2 bit"] = 94,
["divider 4 bit"] = 95,
["divider 8 bit"] = 96,
["divider 16 bit"] = 97,
["divider 32 bit"] = 98,
["shifter left 2 bit"] = 99,
["shifter left 4 bit"] = 100,
["shifter left 8 bit"] = 101,
["shifter left 16 bit"] = 102,
["shifter left 32 bit"] = 103,
["shifter right 2 bit"] = 104,
["shifter right 4 bit"] = 105,
["shifter right 8 bit"] = 106,
["shifter right 16 bit"] = 107,
["shifter right 32 bit"] = 108,
["and 2 bit"] = 109,
["and 3 bit"] = 110,
["and 4 bit"] = 111,
["and 5 bit"] = 112,
["and 6 bit"] = 113,
["and 7 bit"] = 114,
["and 8 bit"] = 115,
["or 2 bit"] = 116,
["or 3 bit"] = 117,
["or 4 bit"] = 118,
["or 5 bit"] = 119,
["or 6 bit"] = 120,
["or 7 bit"] = 121,
["or 8 bit"] = 122,
["xor 2 bit"] = 123,
["xor 3 bit"] = 124,
["xor 4 bit"] = 125,
["xor 5 bit"] = 126,
["xor 6 bit"] = 127,
["xor 7 bit"] = 128,
["xor 8 bit"] = 129,
["nand 2 bit"] = 130,
["nand 3 bit"] = 131,
["nand 4 bit"] = 132,
["nand 5 bit"] = 133,
["nand 6 bit"] = 134,
["nand 7 bit"] = 135,
["nand 8 bit"] = 136,
["nor 2 bit"] = 137,
["nor 3 bit"] = 138,
["nor 4 bit"] = 139,
["nor 5 bit"] = 140,
["nor 6 bit"] = 141,
["nor 7 bit"] = 142,
["nor 8 bit"] = 143,
["xnor 2 bit"] = 144,
["xnor 3 bit"] = 145,
["xnor 4 bit"] = 146,
["xnor 5 bit"] = 147,
["xnor 6 bit"] = 148,
["xnor 7 bit"] = 149,
["xnor 8 bit"] = 150,
["rom 4x4"] = 151,
["rom 4x4x4"] = 152,
["rom 8x2x8"] = 153,
["rom 8x8"] = 154,
["rom 8x8x4"] = 155,
["rom 8x8x8"] = 156,
["rom 16x4x16"] = 157,
["rom 32x2x32"] = 158,
["rom 64x1x48"] = 159,
["rom 64x1x64"] = 160,
["rom 16x16"] = 161,
["rom 16x16x4"] = 162,
["rom 16x16x8"] = 163,
["rom 16x16x16"] = 164,
["rom 32x8x32"] = 165,
["rom 64x4x48"] = 166,
["rom 64x4x64"] = 167,
["rom 32x16"] = 168,
["rom 32x16x4"] = 169,
["rom 32x16x8"] = 170,
["rom 32x16x16"] = 171,
["rom 32x16x32"] = 172,
["rom 64x8x48"] = 173,
["rom 64x8x64"] = 174,
["rom 32x32x8"] = 175,
["rom 32x32x16"] = 176,
["rom 32x32x32"] = 177,
["rom 64x16x48"] = 178,
["rom 64x16x64"] = 179,
["rom 64x32x8"] = 180,
["rom 64x32x16"] = 181,
["rom 64x32x32"] = 182,
["rom 64x32x48"] = 183,
["rom 64x32x64"] = 184,
["rom 64x64x8"] = 185,
["rom 64x64x16"] = 186,
["rom 64x64x32"] = 187,
["rom 64x64x48"] = 188,
["rom 64x64x64"] = 189,
["ram 256 b"] = 190,
["ram 4 kb"] = 191,
}
cDataSizeByName = {

39942
sim/dump.txt

File diff suppressed because it is too large Load Diff

View File

@ -105,7 +105,11 @@ function Gate.getportisfalling(gate, index)
end
function Gate.cb(gate, ...)
Simulation.queuecallback(GSim, gate, ...)
Simulation.setcallback(GSim, gate, ...)
end
function Gate.cbQueue(gate, arg, limit)
Simulation.queuecallback(GSim, gate, arg, limit)
end
function Gate.queue(gate, delay)

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

View File

@ -18,6 +18,7 @@ end
Simulation = {}
local queue_max = 65536
local cb_queue_max = 256
function Simulation.new(sim)
local o = {
@ -349,9 +350,37 @@ end
-- sim.groupfxqueue[group] = group
--end
function Simulation.queuecallback(sim, gate, ...)
-- Callbacks
function Simulation.setcallback(sim, gate, arg)
sim.callbacks = sim.callbacks or {}
sim.callbacks[gate.objref] = {...}
sim.callbacks[gate.objref] = { arg }
end
function Simulation.queuecallback(sim, gate, arg, limit)
sim.callbacks = sim.callbacks or {}
sim.callbacks[gate.objref] = sim.callbacks[gate.objref] or {}
if #sim.callbacks[gate.objref] < limit then
table.insert(sim.callbacks[gate.objref], arg)
end
end
function Simulation.sendcallbacks(sim)
if sim.callbacks ~= nil then
local data = "CB"
for objref, args in pairs(sim.callbacks) do
local escargs = {}
for argidx, argv in ipairs(args) do
table.insert(escargs, expandescape(tostring(argv)))
end
local argstr = table.concat(escargs, "\t")
data = data .. "\t" .. objref .. "\t" .. #escargs .. (#escargs>0 and ("\t"..argstr) or "")
end
network_send(data .. "\n")
sim.callbacks = nil
end
end
-- Logic Critical
@ -401,6 +430,8 @@ function Simulation.tickinput(sim)
end
end
-- FX
function Simulation.sendfxupdate(sim)
--for k, group in pairs(sim.groupfxqueue) do
for k, group in pairs(sim.nets) do
@ -420,23 +451,6 @@ function Simulation.sendfxupdate(sim)
--sim.groupfxqueue = {}
end
function Simulation.sendcallbacks(sim)
if sim.callbacks ~= nil then
local data = "CB"
for objref, args in pairs(sim.callbacks) do
local escargs = {}
for argidx, argv in ipairs(args) do
table.insert(escargs, expandescape(tostring(argv)))
end
data = data .. "\t" .. objref .. "\t"..(#escargs)..(#escargs>0 and ("\t"..table.concat(escargs, "\t")) or "")
end
network_send(data .. "\n")
sim.callbacks = nil
end
end
function Simulation.add_net(sim, net)
sim.nets[net.id] = net
end