add math gates, fix 32-bit shifters
This commit is contained in:
parent
a571ac5f3c
commit
68562d4d66
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
savedata/*
|
savedata/*
|
||||||
*.so
|
*.so
|
||||||
sim/dump.txt
|
sim/dump.txt
|
||||||
|
UploadBackend.bat
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
//#include <assert.h>
|
||||||
|
|
||||||
struct Net;
|
struct Net;
|
||||||
struct Gate;
|
struct Gate;
|
||||||
@ -41,7 +41,7 @@ int* current_tick;
|
|||||||
//static const int queue_max = 65536;
|
//static const int queue_max = 65536;
|
||||||
extern GateFunc sim_logic_functions[];
|
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_nets();
|
||||||
DLL void sim_update_gates();
|
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) {
|
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];
|
return gate->data[addr];
|
||||||
}
|
}
|
||||||
FAST void sim_gate_set_data(const struct Gate* const gate, const int addr, const int val) {
|
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;
|
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;
|
int val = 0;
|
||||||
for(int i=0; i<size; i++) {
|
for(int i=0; i<size; i++) {
|
||||||
val += sim_gate_get_port(gate, idx+i) << i;
|
val += sim_gate_get_port(gate, idx+i) << i;
|
||||||
}
|
}
|
||||||
return val;
|
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++) {
|
for(int i=0; i<size; i++) {
|
||||||
sim_gate_set_port(gate, idx+i, (val>>i) & 1);
|
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 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 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 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"
|
#include "compiled_sim_gates.c"
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -80,12 +80,36 @@ enum GateFuncs {
|
|||||||
GateFunc_Demux6,
|
GateFunc_Demux6,
|
||||||
GateFunc_Demux7,
|
GateFunc_Demux7,
|
||||||
GateFunc_Demux8,
|
GateFunc_Demux8,
|
||||||
GateFunc_Adder1,
|
|
||||||
GateFunc_Adder2,
|
GateFunc_Adder2,
|
||||||
GateFunc_Adder4,
|
GateFunc_Adder4,
|
||||||
GateFunc_Adder8,
|
GateFunc_Adder8,
|
||||||
GateFunc_Adder16,
|
GateFunc_Adder16,
|
||||||
GateFunc_Adder32,
|
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_And2,
|
||||||
GateFunc_And3,
|
GateFunc_And3,
|
||||||
GateFunc_And4,
|
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(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(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(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) { unsigned int v = getword(2, 1) + (getword(2, 3)^(getport(9)*3)) + getport(7); setword(2, 5, v); setport(8, (v>>2) & 1); }
|
||||||
GATEFUNC(Adder2) { int v = getword(2, 1) + getword(2, 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(Adder4) { int v = getword(4, 1) + getword(4, 5) + 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(Adder8) { int v = getword(8, 1) + getword(8, 9) + 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(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 = (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(Adder32) { unsigned long long v = getword(32, 1) + getword(32, 33) + getport(97); setword(32, 65, v); setport(98, (v>>32) & 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(And2) { setport(3, (getport(1) && getport(2))); }
|
||||||
GATEFUNC(And3) { setport(4, (getport(1) && getport(2) && getport(3))); }
|
GATEFUNC(And3) { setport(4, (getport(1) && getport(2) && getport(3))); }
|
||||||
GATEFUNC(And4) { setport(5, (getport(1) && getport(2) && getport(3) && getport(4))); }
|
GATEFUNC(And4) { setport(5, (getport(1) && getport(2) && getport(3) && getport(4))); }
|
||||||
@ -419,12 +467,36 @@ GateFunc sim_logic_functions[] = {
|
|||||||
GATEFUNCID(Demux6),
|
GATEFUNCID(Demux6),
|
||||||
GATEFUNCID(Demux7),
|
GATEFUNCID(Demux7),
|
||||||
GATEFUNCID(Demux8),
|
GATEFUNCID(Demux8),
|
||||||
GATEFUNCID(Adder1),
|
|
||||||
GATEFUNCID(Adder2),
|
GATEFUNCID(Adder2),
|
||||||
GATEFUNCID(Adder4),
|
GATEFUNCID(Adder4),
|
||||||
GATEFUNCID(Adder8),
|
GATEFUNCID(Adder8),
|
||||||
GATEFUNCID(Adder16),
|
GATEFUNCID(Adder16),
|
||||||
GATEFUNCID(Adder32),
|
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(And2),
|
||||||
GATEFUNCID(And3),
|
GATEFUNCID(And3),
|
||||||
GATEFUNCID(And4),
|
GATEFUNCID(And4),
|
||||||
|
@ -219,95 +219,119 @@ cFuncsByName = {
|
|||||||
["demux 7 bit vertical"] = 77,
|
["demux 7 bit vertical"] = 77,
|
||||||
["demux 8 bit"] = 78,
|
["demux 8 bit"] = 78,
|
||||||
["demux 8 bit vertical"] = 78,
|
["demux 8 bit vertical"] = 78,
|
||||||
["adder 1 bit"] = 79,
|
["adder 2 bit"] = 79,
|
||||||
["adder 2 bit"] = 80,
|
["adder 4 bit"] = 80,
|
||||||
["adder 4 bit"] = 81,
|
["adder 8 bit"] = 81,
|
||||||
["adder 8 bit"] = 82,
|
["adder 16 bit"] = 82,
|
||||||
["adder 16 bit"] = 83,
|
["adder 32 bit"] = 83,
|
||||||
["adder 32 bit"] = 84,
|
["incrementer 2 bit"] = 84,
|
||||||
["and 2 bit"] = 85,
|
["incrementer 4 bit"] = 85,
|
||||||
["and 3 bit"] = 86,
|
["incrementer 8 bit"] = 86,
|
||||||
["and 4 bit"] = 87,
|
["incrementer 16 bit"] = 87,
|
||||||
["and 5 bit"] = 88,
|
["incrementer 32 bit"] = 88,
|
||||||
["and 6 bit"] = 89,
|
["multiplier 2 bit"] = 89,
|
||||||
["and 7 bit"] = 90,
|
["multiplier 4 bit"] = 90,
|
||||||
["and 8 bit"] = 91,
|
["multiplier 8 bit"] = 91,
|
||||||
["or 2 bit"] = 92,
|
["multiplier 16 bit"] = 92,
|
||||||
["or 3 bit"] = 93,
|
["multiplier 32 bit"] = 93,
|
||||||
["or 4 bit"] = 94,
|
["divider 2 bit"] = 94,
|
||||||
["or 5 bit"] = 95,
|
["divider 4 bit"] = 95,
|
||||||
["or 6 bit"] = 96,
|
["divider 8 bit"] = 96,
|
||||||
["or 7 bit"] = 97,
|
["divider 16 bit"] = 97,
|
||||||
["or 8 bit"] = 98,
|
["divider 32 bit"] = 98,
|
||||||
["xor 2 bit"] = 99,
|
["shifter left 2 bit"] = 99,
|
||||||
["xor 3 bit"] = 100,
|
["shifter left 4 bit"] = 100,
|
||||||
["xor 4 bit"] = 101,
|
["shifter left 8 bit"] = 101,
|
||||||
["xor 5 bit"] = 102,
|
["shifter left 16 bit"] = 102,
|
||||||
["xor 6 bit"] = 103,
|
["shifter left 32 bit"] = 103,
|
||||||
["xor 7 bit"] = 104,
|
["shifter right 2 bit"] = 104,
|
||||||
["xor 8 bit"] = 105,
|
["shifter right 4 bit"] = 105,
|
||||||
["nand 2 bit"] = 106,
|
["shifter right 8 bit"] = 106,
|
||||||
["nand 3 bit"] = 107,
|
["shifter right 16 bit"] = 107,
|
||||||
["nand 4 bit"] = 108,
|
["shifter right 32 bit"] = 108,
|
||||||
["nand 5 bit"] = 109,
|
["and 2 bit"] = 109,
|
||||||
["nand 6 bit"] = 110,
|
["and 3 bit"] = 110,
|
||||||
["nand 7 bit"] = 111,
|
["and 4 bit"] = 111,
|
||||||
["nand 8 bit"] = 112,
|
["and 5 bit"] = 112,
|
||||||
["nor 2 bit"] = 113,
|
["and 6 bit"] = 113,
|
||||||
["nor 3 bit"] = 114,
|
["and 7 bit"] = 114,
|
||||||
["nor 4 bit"] = 115,
|
["and 8 bit"] = 115,
|
||||||
["nor 5 bit"] = 116,
|
["or 2 bit"] = 116,
|
||||||
["nor 6 bit"] = 117,
|
["or 3 bit"] = 117,
|
||||||
["nor 7 bit"] = 118,
|
["or 4 bit"] = 118,
|
||||||
["nor 8 bit"] = 119,
|
["or 5 bit"] = 119,
|
||||||
["xnor 2 bit"] = 120,
|
["or 6 bit"] = 120,
|
||||||
["xnor 3 bit"] = 121,
|
["or 7 bit"] = 121,
|
||||||
["xnor 4 bit"] = 122,
|
["or 8 bit"] = 122,
|
||||||
["xnor 5 bit"] = 123,
|
["xor 2 bit"] = 123,
|
||||||
["xnor 6 bit"] = 124,
|
["xor 3 bit"] = 124,
|
||||||
["xnor 7 bit"] = 125,
|
["xor 4 bit"] = 125,
|
||||||
["xnor 8 bit"] = 126,
|
["xor 5 bit"] = 126,
|
||||||
["rom 4x4"] = 127,
|
["xor 6 bit"] = 127,
|
||||||
["rom 4x4x4"] = 128,
|
["xor 7 bit"] = 128,
|
||||||
["rom 8x2x8"] = 129,
|
["xor 8 bit"] = 129,
|
||||||
["rom 8x8"] = 130,
|
["nand 2 bit"] = 130,
|
||||||
["rom 8x8x4"] = 131,
|
["nand 3 bit"] = 131,
|
||||||
["rom 8x8x8"] = 132,
|
["nand 4 bit"] = 132,
|
||||||
["rom 16x4x16"] = 133,
|
["nand 5 bit"] = 133,
|
||||||
["rom 32x2x32"] = 134,
|
["nand 6 bit"] = 134,
|
||||||
["rom 64x1x48"] = 135,
|
["nand 7 bit"] = 135,
|
||||||
["rom 64x1x64"] = 136,
|
["nand 8 bit"] = 136,
|
||||||
["rom 16x16"] = 137,
|
["nor 2 bit"] = 137,
|
||||||
["rom 16x16x4"] = 138,
|
["nor 3 bit"] = 138,
|
||||||
["rom 16x16x8"] = 139,
|
["nor 4 bit"] = 139,
|
||||||
["rom 16x16x16"] = 140,
|
["nor 5 bit"] = 140,
|
||||||
["rom 32x8x32"] = 141,
|
["nor 6 bit"] = 141,
|
||||||
["rom 64x4x48"] = 142,
|
["nor 7 bit"] = 142,
|
||||||
["rom 64x4x64"] = 143,
|
["nor 8 bit"] = 143,
|
||||||
["rom 32x16"] = 144,
|
["xnor 2 bit"] = 144,
|
||||||
["rom 32x16x4"] = 145,
|
["xnor 3 bit"] = 145,
|
||||||
["rom 32x16x8"] = 146,
|
["xnor 4 bit"] = 146,
|
||||||
["rom 32x16x16"] = 147,
|
["xnor 5 bit"] = 147,
|
||||||
["rom 32x16x32"] = 148,
|
["xnor 6 bit"] = 148,
|
||||||
["rom 64x8x48"] = 149,
|
["xnor 7 bit"] = 149,
|
||||||
["rom 64x8x64"] = 150,
|
["xnor 8 bit"] = 150,
|
||||||
["rom 32x32x8"] = 151,
|
["rom 4x4"] = 151,
|
||||||
["rom 32x32x16"] = 152,
|
["rom 4x4x4"] = 152,
|
||||||
["rom 32x32x32"] = 153,
|
["rom 8x2x8"] = 153,
|
||||||
["rom 64x16x48"] = 154,
|
["rom 8x8"] = 154,
|
||||||
["rom 64x16x64"] = 155,
|
["rom 8x8x4"] = 155,
|
||||||
["rom 64x32x8"] = 156,
|
["rom 8x8x8"] = 156,
|
||||||
["rom 64x32x16"] = 157,
|
["rom 16x4x16"] = 157,
|
||||||
["rom 64x32x32"] = 158,
|
["rom 32x2x32"] = 158,
|
||||||
["rom 64x32x48"] = 159,
|
["rom 64x1x48"] = 159,
|
||||||
["rom 64x32x64"] = 160,
|
["rom 64x1x64"] = 160,
|
||||||
["rom 64x64x8"] = 161,
|
["rom 16x16"] = 161,
|
||||||
["rom 64x64x16"] = 162,
|
["rom 16x16x4"] = 162,
|
||||||
["rom 64x64x32"] = 163,
|
["rom 16x16x8"] = 163,
|
||||||
["rom 64x64x48"] = 164,
|
["rom 16x16x16"] = 164,
|
||||||
["rom 64x64x64"] = 165,
|
["rom 32x8x32"] = 165,
|
||||||
["ram 256 b"] = 166,
|
["rom 64x4x48"] = 166,
|
||||||
["ram 4 kb"] = 167,
|
["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 = {
|
cDataSizeByName = {
|
||||||
|
39942
sim/dump.txt
39942
sim/dump.txt
File diff suppressed because it is too large
Load Diff
@ -105,7 +105,11 @@ function Gate.getportisfalling(gate, index)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Gate.cb(gate, ...)
|
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
|
end
|
||||||
|
|
||||||
function Gate.queue(gate, delay)
|
function Gate.queue(gate, delay)
|
||||||
|
@ -66,10 +66,16 @@ local function exportGates(gates)
|
|||||||
))
|
))
|
||||||
end
|
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 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 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 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 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
|
||||||
@ -77,10 +83,43 @@ 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 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 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 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 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 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 = {
|
local binaries = {
|
||||||
{"And" , "&&", "" },
|
{"And" , "&&", "" },
|
||||||
{"Or" , "||", "" },
|
{"Or" , "||", "" },
|
||||||
@ -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),
|
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),
|
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),
|
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 _, 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
|
for i, size in ipairs(romsizes) do table.insert(gates, createRom(size[1], size[2], size[3] or 1)) end
|
||||||
|
@ -18,6 +18,7 @@ end
|
|||||||
Simulation = {}
|
Simulation = {}
|
||||||
|
|
||||||
local queue_max = 65536
|
local queue_max = 65536
|
||||||
|
local cb_queue_max = 256
|
||||||
|
|
||||||
function Simulation.new(sim)
|
function Simulation.new(sim)
|
||||||
local o = {
|
local o = {
|
||||||
@ -349,9 +350,37 @@ end
|
|||||||
-- sim.groupfxqueue[group] = group
|
-- sim.groupfxqueue[group] = group
|
||||||
--end
|
--end
|
||||||
|
|
||||||
function Simulation.queuecallback(sim, gate, ...)
|
-- Callbacks
|
||||||
|
|
||||||
|
function Simulation.setcallback(sim, gate, arg)
|
||||||
sim.callbacks = sim.callbacks or {}
|
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
|
end
|
||||||
|
|
||||||
-- Logic Critical
|
-- Logic Critical
|
||||||
@ -401,6 +430,8 @@ function Simulation.tickinput(sim)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- FX
|
||||||
|
|
||||||
function Simulation.sendfxupdate(sim)
|
function Simulation.sendfxupdate(sim)
|
||||||
--for k, group in pairs(sim.groupfxqueue) do
|
--for k, group in pairs(sim.groupfxqueue) do
|
||||||
for k, group in pairs(sim.nets) do
|
for k, group in pairs(sim.nets) do
|
||||||
@ -420,23 +451,6 @@ function Simulation.sendfxupdate(sim)
|
|||||||
--sim.groupfxqueue = {}
|
--sim.groupfxqueue = {}
|
||||||
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
|
|
||||||
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)
|
function Simulation.add_net(sim, net)
|
||||||
sim.nets[net.id] = net
|
sim.nets[net.id] = net
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user