37 lines
957 B
C
37 lines
957 B
C
|
|
||
|
#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;
|
||
|
}
|