mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-22 13:57:18 +02:00
Remove the #ident and $Log$ strings from all the header files and almost all of the C/C++ source files. I think it is better to get this done all at once, then to wait for each of the files to be touched and edited in unrelated patches.
124 lines
4.5 KiB
C
124 lines
4.5 KiB
C
|
|
/*
|
|
* NOTE: This code as been slightly modified to interface with the
|
|
* PLI implementations of $random. The copyright and license
|
|
* information are given in the comment block below.
|
|
*
|
|
* The Modifications include:
|
|
*
|
|
* Remove the "main" function, as this is being used for its functions.
|
|
*
|
|
* Change the function prototypes to use ANSI/ISO C syntax.
|
|
*/
|
|
|
|
/* A C-program for MT19937: Integer version (1998/4/6) */
|
|
/* genrand() generates one pseudorandom unsigned integer (32bit) */
|
|
/* which is uniformly distributed among 0 to 2^32-1 for each */
|
|
/* call. sgenrand(seed) set initial values to the working area */
|
|
/* of 624 words. Before genrand(), sgenrand(seed) must be */
|
|
/* called once. (seed is any 32-bit integer except for 0). */
|
|
/* Coded by Takuji Nishimura, considering the suggestions by */
|
|
/* Topher Cooper and Marc Rieffel in July-Aug. 1997. */
|
|
|
|
/* This library is free software; you can redistribute it and/or */
|
|
/* modify it under the terms of the GNU Library General Public */
|
|
/* License as published by the Free Software Foundation; either */
|
|
/* version 2 of the License, or (at your option) any later */
|
|
/* version. */
|
|
/* This library is distributed in the hope that it will be useful, */
|
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */
|
|
/* See the GNU Library General Public License for more details. */
|
|
/* You should have received a copy of the GNU Library General */
|
|
/* Public License along with this library; if not, write to the */
|
|
/* Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA */
|
|
/* 02111-1307 USA */
|
|
|
|
/* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. */
|
|
/* When you use this, send an email to: [email protected] */
|
|
/* with an appropriate reference to your work. */
|
|
|
|
/* REFERENCE */
|
|
/* M. Matsumoto and T. Nishimura, */
|
|
/* "Mersenne Twister: A 623-Dimensionally Equidistributed Uniform */
|
|
/* Pseudo-Random Number Generator", */
|
|
/* ACM Transactions on Modeling and Computer Simulation, */
|
|
/* Vol. 8, No. 1, January 1998, pp 3--30. */
|
|
|
|
#include "sys_priv.h"
|
|
|
|
/* Period parameters */
|
|
#define N 624
|
|
#define M 397
|
|
#define MATRIX_A 0x9908b0df /* constant vector a */
|
|
#define UPPER_MASK 0x80000000 /* most significant w-r bits */
|
|
#define LOWER_MASK 0x7fffffff /* least significant r bits */
|
|
|
|
/* Tempering parameters */
|
|
#define TEMPERING_MASK_B 0x9d2c5680
|
|
#define TEMPERING_MASK_C 0xefc60000
|
|
#define TEMPERING_SHIFT_U(y) (y >> 11)
|
|
#define TEMPERING_SHIFT_S(y) (y << 7)
|
|
#define TEMPERING_SHIFT_T(y) (y << 15)
|
|
#define TEMPERING_SHIFT_L(y) (y >> 18)
|
|
|
|
/* initializing the array with a NONZERO seed */
|
|
void
|
|
sgenrand(struct context_s *context, unsigned long seed)
|
|
{
|
|
unsigned long *mt = context->mt;
|
|
int mti;
|
|
|
|
/* setting initial seeds to mt[N] using */
|
|
/* the generator Line 25 of Table 1 in */
|
|
/* [KNUTH 1981, The Art of Computer Programming */
|
|
/* Vol. 2 (2nd Ed.), pp102] */
|
|
mt[0]= seed & 0xffffffff;
|
|
for (mti=1; mti<N; mti++)
|
|
mt[mti] = (69069 * mt[mti-1]) & 0xffffffff;
|
|
|
|
context->mti = mti;
|
|
}
|
|
|
|
unsigned long
|
|
genrand(struct context_s *context)
|
|
{
|
|
unsigned long y;
|
|
static unsigned long mag01[2]={0x0, MATRIX_A};
|
|
/* mag01[x] = x * MATRIX_A for x=0,1 */
|
|
|
|
unsigned long *mt = context->mt;
|
|
int mti = context->mti;
|
|
|
|
if (mti >= N) { /* generate N words at one time */
|
|
int kk;
|
|
|
|
if (mti == N+1) /* if sgenrand() has not been called, */
|
|
sgenrand(context, 4357); /* a default initial seed is used */
|
|
|
|
for (kk=0;kk<N-M;kk++) {
|
|
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
|
|
mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
|
|
}
|
|
for (;kk<N-1;kk++) {
|
|
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
|
|
mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
|
|
}
|
|
y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
|
|
mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
|
|
|
|
mti = 0;
|
|
}
|
|
|
|
y = mt[mti++];
|
|
y ^= TEMPERING_SHIFT_U(y);
|
|
y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B;
|
|
y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C;
|
|
y ^= TEMPERING_SHIFT_L(y);
|
|
|
|
context->mti = mti;
|
|
|
|
return y;
|
|
}
|
|
|