#include 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); } } } }