/* Simulate bonding delay calculation algorithm. */ #include <stdio.h> #include <stdlib.h> char frame[16384]; int delay[8] = { 0, 1, 2, 3, 8188, 8189, 8190, 8191, }; main() { int i, n, d1, d2, d3, fc1, fc2, fc3, t1, t2, t3, x1, x2, x3; long k = 0L; randomize(); /* initialize frame */ for (i = 0; i < 16384; i++) frame[i] = -1; /* frame count */ for (i = 0; i < 64; i++) frame[256 * i + 191] = i; for (;;) { if (kbhit()) exit(0); if (k % 1000L == 0) printf("%ld laps\n", k); k++; /* random delay */ d1 = random(8192); d2 = random(8192); d3 = random(8192); /* d1 = delay[random(8)]; d2 = delay[random(8)]; d3 = delay[random(8)]; */ /* random starting point */ x1 = t1 = random(16384); x2 = t2 = random(16384); x3 = t3 = random(16384); /* find sync */ for (;;) if (frame[(d1 + t1 - 1) & 0x3fff] > -1) break; else t1 = (t1 + 1) & 0x3fff; for (;;) if (frame[(d2 + t2 - 2) & 0x3fff] > -1) break; else t2 = (t2 + 1) & 0x3fff; for (;;) if (frame[(d3 + t3 - 3) & 0x3fff] > -1) break; else t3 = (t3 + 1) & 0x3fff; /* frame count */ fc1 = frame[(d1 + t1 - 1) & 0x3fff]; fc2 = frame[(d2 + t2 - 2) & 0x3fff]; fc3 = frame[(d3 + t3 - 3) & 0x3fff]; /* delay calculation */ t1 = (t1 - 256 * fc1 - 1) & 0x3fff; t2 = (t2 - 256 * fc2 - 2) & 0x3fff; t3 = (t3 - 256 * fc3 - 3) & 0x3fff; /* normalize */ n = t1; if (t2 < n) n = t2; if (t3 < n) n = t3; t1 -= n; t2 -= n; t3 -= n; /* extend sign */ if (t1 & 0x2000) t1 |= 0xc000; if (t2 & 0x2000) t2 |= 0xc000; if (t3 & 0x2000) t3 |= 0xc000; /* normalize */ n = t1; if (t2 > n) n = t2; if (t3 > n) n = t3; t1 -= n; t2 -= n; t3 -= n; /* check */ if (d1 - d2 == t2 - t1 && d2 - d3 == t3 - t2 && d3 - d1 == t1 - t3) ; else { printf("fail\n\n"); printf("d1=%d\n", d1); printf("d2=%d\n", d2); printf("d3=%d\n\n", d3); printf("d1-d2=%d\n", d1 - d2); printf("d2-d3=%d\n", d2 - d3); printf("d3-d1=%d\n\n", d3 - d1); printf("x1=%d\n", x1); printf("x2=%d\n", x2); printf("x3=%d\n\n", x3); printf("t1=%d\n", t1); printf("t2=%d\n", t2); printf("t3=%d\n\n", t3); printf("t2-t1=%d\n", t2 - t1); printf("t3-t2=%d\n", t3 - t2); printf("t1-t3=%d\n\n", t1 - t3); printf("n=%d\n", n); exit(0); } } }