You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
957 B
36 lines
957 B
|
|
#include "circsim.h" |
|
|
|
#include <string.h> |
|
|
|
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; |
|
}
|
|
|