// MASH Simulation // http://www.holmea.demon.co.uk/Frac2/Mash.htm #include #include #include #include #include #include #include #undef NDEBUG #include const double PI = 3.14159265358979323846; #define MODULO (1<<24) #define HANNING #ifdef HANNING #define SEQLEN (1<<20) // Hanning Window #define SEQTYP double #else #define SEQLEN (4*MODULO) // 2* when F even; 4* if odd #define SEQTYP char #endif // 2L = Sequence length (in ref cycles) const double L = SEQLEN/2; // Parameters const int F=1; class MASH { int q[4]; // Latch outputs int c[4][4]; // Carry flip flops public: MASH() // Constructor { // Initial values memset(c, 0, sizeof c); q[0] = 1; q[1] = 0; q[2] = 0; q[3] = 0; // Fill flip-flops for (int i=0; i<4; i++) Clock(); } int Clock() { int d[4]; // Adder output / latch data input // Carry flip-flops c[3][3] = c[3][2]; c[3][2] = c[3][1]; c[3][1] = c[3][0]; c[2][2] = c[2][1]; c[2][1] = c[2][0]; c[1][1] = c[1][0]; // Adders d[0] = (q[0]+ F) % MODULO; d[1] = (q[1]+d[0]) % MODULO; d[2] = (q[2]+d[1]) % MODULO; d[3] = (q[3]+d[2]) % MODULO; // Carries c[0][0] = (q[0]+ F) / MODULO; c[1][0] = (q[1]+d[0]) / MODULO; c[2][0] = (q[2]+d[1]) / MODULO; c[3][0] = (q[3]+d[2]) / MODULO; // Latch for (int i=0; i<4; i++) q[i] = d[i]; return c[0][0] + c[1][0] - c[1][1] + c[2][0] - 2*c[2][1] + c[2][2] + c[3][0] - 3*c[3][1] + 3*c[3][2] - c[3][3] ; } bool operator == (MASH& m) // Debug { return !memcmp(this, &m, sizeof(MASH)); } }; void main(int argc, char *argv[]) { _control87(_PC_64, MCW_PC); double n, r, start, stop, span; int i, steps; if (argc!=4) return; start = atof(argv[1]); stop = atof(argv[2]); steps = int(atof(argv[3])); span = log10(stop/start); r = pow(10, span/steps); for (i=0, n=start; i