#include "circsim.h" #include static const int gateL[9] = { 0, 2, 1, 1, 0, 2, 2, 1, 0 }; static const int gateR[9] = { 2, 2, 2, 2, 0, 1, 2, 1, 0 }; void circsim(int gates, int *gatepins, int *states, int streamlen, int *stream) { for (; streamlen-- > 0; stream++) { int i; states[0] = *stream; for (i = 0; i < gates; i++) { int k = 3*states[gatepins[2*i+1]] + states[gatepins[2*i+2]]; states[2*i+1] = gateL[k]; states[2*i+2] = gateR[k]; } *stream = states[gatepins[0]]; } } int findcirc(int gates, int *gatepins, int streamlen, int *stream, int *output) { int states[2*gates+1]; memset(states, 0, sizeof(int) * (2*gates+1)); for (; streamlen-- > 0; stream++) { int i; states[0] = *stream; for (i = 0; i < gates; i++) { int k = 3*states[gatepins[2*i+1]] + states[gatepins[2*i+2]]; states[2*i+1] = gateL[k]; states[2*i+2] = gateR[k]; } if (*output++ != states[gatepins[0]]) return 0; } return 1; }