use const where appropriate

This commit is contained in:
Redo
2022-11-09 13:22:06 -06:00
parent 75299209b8
commit 2389252698
7 changed files with 2544 additions and 47 deletions

View File

@@ -16,6 +16,7 @@ struct Gate {
int data_size;
int* data;
};
struct Net {
int* state;
int* state_num;
@@ -26,37 +27,27 @@ struct Net {
int id;
};
#define FAST static inline
#define DLL __declspec(dllexport)
#define GATEFUNCTYPE
typedef void(*GateFunc)(const struct Gate* const);
struct Net** net_queue;
int* num_net_queue;
struct Gate** gate_queue;
int* num_gate_queue;
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*);
int sim_gate_get_port(struct Gate* gate, int port);
void sim_gate_set_port(struct Gate* gate, int port, int val);
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();
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_update_nets();
DLL 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;
num_net_queue = num_net_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;
}
void sim_update_net(struct Net* net);
void sim_update_nets() {
FAST void sim_update_net(const struct Net* const net);
DLL void sim_update_nets() {
for(int i=0; i<*num_net_queue; i++) {
struct Net* net = net_queue[i];
sim_update_net(net);
@@ -76,13 +67,12 @@ void sim_update_nets() {
*num_net_queue = 0;
}
void sim_update_gate(struct Gate* gate);
void sim_dequeue_gate(int i) {
FAST void sim_dequeue_gate(const int i) {
gate_queue[i] = gate_queue[*num_gate_queue-1];
gate_queue[*num_gate_queue-1] = 0;
(*num_gate_queue)--;
}
void sim_update_gates() {
DLL void sim_update_gates() {
for(int i=0; i<*num_gate_queue; i++) {
struct Gate* gate = gate_queue[i];
if(gate->logic_function != 0) {
@@ -95,21 +85,21 @@ void sim_update_gates() {
////
void sim_queue_gate(struct Gate* gate) {
assert(*num_gate_queue < queue_max - 1);
gate_queue[(*num_gate_queue)++] = gate;
FAST void sim_queue_gate(const struct Gate* const gate) {
//assert(*num_gate_queue < queue_max - 1);
*(gate->in_queue) = 1;
gate_queue[(*num_gate_queue)++] = (struct Gate*)gate;
}
void sim_queue_net(struct Net* net) {
assert(*num_net_queue < queue_max - 1);
net_queue[(*num_net_queue)++] = net;
FAST void sim_queue_net(const struct Net* const net) {
//assert(*num_net_queue < queue_max - 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;
if(state != *(net->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]);
}
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]) {
*(gate->port_net_state_num[port]) += state - gate->port_states[port];
gate->port_states[port] = state;
@@ -142,12 +138,24 @@ void sim_gate_set_port(struct Gate* gate, int port, int state) {
}
}
}
int sim_gate_get_data(struct Gate* gate, int addr) {
FAST int sim_gate_get_data(const struct Gate* const gate, const int addr) {
assert(addr>=0 && addr<gate->data_size);
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);
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"