use const where appropriate
This commit is contained in:
parent
75299209b8
commit
2389252698
@ -1,2 +1,2 @@
|
|||||||
gcc compiled_sim.c -o compiled_sim.dll -shared -Wall -Werror -Ofast
|
gcc compiled_sim.c -o compiled_sim.dll -shared -Wall -Werror -Ofast && objdump -d compiled_sim.dll > dump.txt
|
||||||
pause
|
pause
|
||||||
|
@ -16,6 +16,7 @@ struct Gate {
|
|||||||
int data_size;
|
int data_size;
|
||||||
int* data;
|
int* data;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Net {
|
struct Net {
|
||||||
int* state;
|
int* state;
|
||||||
int* state_num;
|
int* state_num;
|
||||||
@ -26,37 +27,27 @@ struct Net {
|
|||||||
int id;
|
int id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FAST static inline
|
||||||
|
#define DLL __declspec(dllexport)
|
||||||
|
#define GATEFUNCTYPE
|
||||||
|
|
||||||
|
typedef void(*GateFunc)(const struct Gate* const);
|
||||||
|
|
||||||
struct Net** net_queue;
|
struct Net** net_queue;
|
||||||
int* num_net_queue;
|
int* num_net_queue;
|
||||||
struct Gate** gate_queue;
|
struct Gate** gate_queue;
|
||||||
int* num_gate_queue;
|
int* num_gate_queue;
|
||||||
int* current_tick;
|
int* current_tick;
|
||||||
static const int queue_max = 65536;
|
//static const int queue_max = 65536;
|
||||||
|
extern GateFunc sim_logic_functions[];
|
||||||
|
|
||||||
typedef void(*GateFunc)(struct Gate*);
|
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);
|
||||||
int sim_gate_get_port(struct Gate* gate, int port);
|
DLL void sim_update_nets();
|
||||||
void sim_gate_set_port(struct Gate* gate, int port, int val);
|
DLL void sim_update_gates();
|
||||||
int sim_gate_get_data(struct Gate* gate, int addr);
|
|
||||||
void sim_gate_set_data(struct Gate* gate, int addr, int val);
|
|
||||||
#define GATEFUNCID(name) GateFunc_##name##_F
|
|
||||||
#define GATEFUNC(name) void GATEFUNCID(name)(struct Gate* gate)
|
|
||||||
#define setport(i, v) sim_gate_set_port(gate, i, v)
|
|
||||||
#define getport(i) sim_gate_get_port(gate, i)
|
|
||||||
#define setdata(i, v) sim_gate_set_data(gate, i, v)
|
|
||||||
#define getdata(i) sim_gate_get_data(gate, i)
|
|
||||||
|
|
||||||
#include "compiled_sim_gates.c"
|
|
||||||
|
|
||||||
#undef setport
|
|
||||||
#undef getport
|
|
||||||
|
|
||||||
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);
|
|
||||||
void sim_update_nets();
|
|
||||||
void sim_update_gates();
|
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
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_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) {
|
||||||
net_queue = net_queue_in;
|
net_queue = net_queue_in;
|
||||||
num_net_queue = num_net_queue_in;
|
num_net_queue = num_net_queue_in;
|
||||||
gate_queue = gate_queue_in;
|
gate_queue = gate_queue_in;
|
||||||
@ -65,8 +56,8 @@ void sim_set_data(struct Net** net_queue_in, int* num_net_queue_in, struct Gate*
|
|||||||
//queue_max = queue_max_in;
|
//queue_max = queue_max_in;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_update_net(struct Net* net);
|
FAST void sim_update_net(const struct Net* const net);
|
||||||
void sim_update_nets() {
|
DLL void sim_update_nets() {
|
||||||
for(int i=0; i<*num_net_queue; i++) {
|
for(int i=0; i<*num_net_queue; i++) {
|
||||||
struct Net* net = net_queue[i];
|
struct Net* net = net_queue[i];
|
||||||
sim_update_net(net);
|
sim_update_net(net);
|
||||||
@ -76,13 +67,12 @@ void sim_update_nets() {
|
|||||||
*num_net_queue = 0;
|
*num_net_queue = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_update_gate(struct Gate* gate);
|
FAST void sim_dequeue_gate(const int i) {
|
||||||
void sim_dequeue_gate(int i) {
|
|
||||||
gate_queue[i] = gate_queue[*num_gate_queue-1];
|
gate_queue[i] = gate_queue[*num_gate_queue-1];
|
||||||
gate_queue[*num_gate_queue-1] = 0;
|
gate_queue[*num_gate_queue-1] = 0;
|
||||||
(*num_gate_queue)--;
|
(*num_gate_queue)--;
|
||||||
}
|
}
|
||||||
void sim_update_gates() {
|
DLL void sim_update_gates() {
|
||||||
for(int i=0; i<*num_gate_queue; i++) {
|
for(int i=0; i<*num_gate_queue; i++) {
|
||||||
struct Gate* gate = gate_queue[i];
|
struct Gate* gate = gate_queue[i];
|
||||||
if(gate->logic_function != 0) {
|
if(gate->logic_function != 0) {
|
||||||
@ -95,21 +85,21 @@ void sim_update_gates() {
|
|||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
void sim_queue_gate(struct Gate* gate) {
|
FAST void sim_queue_gate(const struct Gate* const gate) {
|
||||||
assert(*num_gate_queue < queue_max - 1);
|
//assert(*num_gate_queue < queue_max - 1);
|
||||||
gate_queue[(*num_gate_queue)++] = gate;
|
|
||||||
*(gate->in_queue) = 1;
|
*(gate->in_queue) = 1;
|
||||||
|
gate_queue[(*num_gate_queue)++] = (struct Gate*)gate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_queue_net(struct Net* net) {
|
FAST void sim_queue_net(const struct Net* const net) {
|
||||||
assert(*num_net_queue < queue_max - 1);
|
//assert(*num_net_queue < queue_max - 1);
|
||||||
net_queue[(*num_net_queue)++] = net;
|
|
||||||
*(net->in_queue) = 1;
|
*(net->in_queue) = 1;
|
||||||
|
net_queue[(*num_net_queue)++] = (struct Net*)net;
|
||||||
}
|
}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
void sim_update_net(struct Net* net) {
|
FAST void sim_update_net(const struct Net* const net) {
|
||||||
int state = *(net->state_num) > 0;
|
int state = *(net->state_num) > 0;
|
||||||
if(state != *(net->state)) {
|
if(state != *(net->state)) {
|
||||||
*(net->state) = state;
|
*(net->state) = state;
|
||||||
@ -126,10 +116,16 @@ void sim_update_net(struct Net* net) {
|
|||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
int sim_gate_get_port(struct Gate* gate, int port) {
|
FAST int sim_gate_get_port(const struct Gate* const gate, const int port) {
|
||||||
return *(gate->port_net_state[port]);
|
return *(gate->port_net_state[port]);
|
||||||
}
|
}
|
||||||
void sim_gate_set_port(struct Gate* gate, int port, int state) {
|
FAST int sim_gate_get_port_rising(const struct Gate* const gate, const int port) {
|
||||||
|
return ( *(gate->port_net_state[port])) && ((*(gate->port_nets_c[port]->update_tick) == *current_tick));
|
||||||
|
}
|
||||||
|
FAST int sim_gate_get_port_falling(const struct Gate* const gate, const int port) {
|
||||||
|
return (!*(gate->port_net_state[port])) && ((*(gate->port_nets_c[port]->update_tick) == *current_tick));
|
||||||
|
}
|
||||||
|
FAST void sim_gate_set_port(const struct Gate* const gate, const int port, const int state) {
|
||||||
if(state != gate->port_states[port]) {
|
if(state != gate->port_states[port]) {
|
||||||
*(gate->port_net_state_num[port]) += state - gate->port_states[port];
|
*(gate->port_net_state_num[port]) += state - gate->port_states[port];
|
||||||
gate->port_states[port] = state;
|
gate->port_states[port] = state;
|
||||||
@ -142,12 +138,24 @@ void sim_gate_set_port(struct Gate* gate, int port, int state) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
FAST int sim_gate_get_data(const struct Gate* const gate, const int addr) {
|
||||||
int sim_gate_get_data(struct Gate* gate, int addr) {
|
|
||||||
assert(addr>=0 && addr<gate->data_size);
|
assert(addr>=0 && addr<gate->data_size);
|
||||||
return gate->data[addr];
|
return gate->data[addr];
|
||||||
}
|
}
|
||||||
void sim_gate_set_data(struct Gate* gate, int addr, 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////
|
||||||
|
|
||||||
|
#define GATEFUNCID(name) GateFunc_##name##_F
|
||||||
|
#define GATEFUNC(name) static GATEFUNCTYPE void GATEFUNCID(name)(const struct Gate* const gate)
|
||||||
|
#define setport(i, v) sim_gate_set_port(gate, i, v)
|
||||||
|
#define getport(i) sim_gate_get_port(gate, i)
|
||||||
|
#define setdata(i, v) sim_gate_set_data(gate, i, v)
|
||||||
|
#define getdata(i) sim_gate_get_data(gate, i)
|
||||||
|
#define getportrising(i) sim_gate_get_port_rising(gate, i)
|
||||||
|
#define getportfalling(i) sim_gate_get_port_falling(gate, i)
|
||||||
|
|
||||||
|
#include "compiled_sim_gates.c"
|
||||||
|
Binary file not shown.
@ -1,10 +1,6 @@
|
|||||||
|
|
||||||
GATEFUNC(Diode) {
|
GATEFUNC(Diode) { setport(2, getport(1)); }
|
||||||
setport(2, getport(1));
|
GATEFUNC(Not) { setport(2, !getport(1)); }
|
||||||
}
|
|
||||||
GATEFUNC(Not) {
|
|
||||||
setport(2, !getport(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
|
2469
sim/dump.txt
Normal file
2469
sim/dump.txt
Normal file
File diff suppressed because it is too large
Load Diff
24
sim/gencfuncs.lua
Normal file
24
sim/gencfuncs.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
local luatoc_subs = {
|
||||||
|
{"Gate%.setportstate%(gate, *", "setport%("},
|
||||||
|
{"Gate%.getportstate%(gate, *", "getport%("},
|
||||||
|
{"~=", "!="},
|
||||||
|
{"!= *0", ""},
|
||||||
|
{"elseif", "els2 if"},
|
||||||
|
{"if", "if("},
|
||||||
|
{"else", "} else {"},
|
||||||
|
{"els2", "else"},
|
||||||
|
{"end", "}"},
|
||||||
|
{"then", ") {"},
|
||||||
|
{"return function(gate)", "GATEFUNC"},
|
||||||
|
}
|
||||||
|
local function luatoc(f)
|
||||||
|
for i, sub in ipairs(luatoc_subs) do
|
||||||
|
f = f:gsub(sub[1], sub[2])
|
||||||
|
end
|
||||||
|
return f
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tstogatedata(ts)
|
||||||
|
|
||||||
|
end
|
@ -117,7 +117,7 @@ function network_update()
|
|||||||
if value < 0 or value > 999999 then
|
if value < 0 or value > 999999 then
|
||||||
value = 0
|
value = 0
|
||||||
end
|
end
|
||||||
if value<=0.001 then value = 0.0001 end
|
if value<=0.001 then value = 0.001 end
|
||||||
OPT_TICK_TIME = value
|
OPT_TICK_TIME = value
|
||||||
elseif option == "FX_UPDATES" then
|
elseif option == "FX_UPDATES" then
|
||||||
OPT_FX_UPDATES = toboolean(value)
|
OPT_FX_UPDATES = toboolean(value)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user