79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
|
|
#include <assert.h>
|
|
|
|
struct Net;
|
|
struct Gate;
|
|
|
|
struct Gate {
|
|
int* in_queue;
|
|
int* port_states;
|
|
int** port_net_state;
|
|
int** port_net_state_num;
|
|
int** port_net_in_queue;
|
|
struct Net** port_nets_c;
|
|
int objref;
|
|
};
|
|
struct Net {
|
|
int* state;
|
|
int* state_num;
|
|
int* in_queue;
|
|
int* update_tick;
|
|
int* num_gates_update;
|
|
struct Gate** gates_update_c;
|
|
int id;
|
|
};
|
|
|
|
|
|
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();
|
|
|
|
struct Net** net_queue;
|
|
int* num_net_queue;
|
|
struct Gate** gate_queue;
|
|
int* num_gate_queue;
|
|
int* current_tick;
|
|
int queue_max;
|
|
|
|
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;
|
|
num_gate_queue = num_gate_queue_in;
|
|
current_tick = current_tick_in;
|
|
queue_max = queue_max_in;
|
|
}
|
|
|
|
void sim_update_net(struct Net* net);
|
|
void sim_update_nets() {
|
|
for(int i=0; i<*num_net_queue; i++) {
|
|
struct Net* net = net_queue[i];
|
|
sim_update_net(net);
|
|
*(net->in_queue) = 0;
|
|
net_queue[i] = 0;
|
|
}
|
|
*num_net_queue = 0;
|
|
}
|
|
|
|
////
|
|
|
|
void sim_queue_gate(struct Gate* gate) {
|
|
assert(*num_gate_queue < queue_max);
|
|
gate_queue[*num_gate_queue++] = gate;
|
|
*(gate->in_queue) = 1;
|
|
}
|
|
|
|
void sim_update_net(struct Net* net) {
|
|
int state = *(net->state_num) > 0;
|
|
if(state != *(net->state)) {
|
|
*(net->state) = state;
|
|
*(net->update_tick) = *current_tick;
|
|
|
|
for(int i=0; i<*(net->num_gates_update); i++) {
|
|
struct Gate* gate = net->gates_update_c[i];
|
|
if(!*(gate->in_queue)) {
|
|
sim_queue_gate(gate);
|
|
}
|
|
}
|
|
}
|
|
}
|