Add a ros file for testing with dieharder
author |
Steve Losh <steve@stevelosh.com> |
date |
Sun, 12 Feb 2017 01:14:43 +0000 |
parents |
c6a3ab353556
|
children |
d8537fcd89e5
|
branches/tags |
(none) |
files |
.hgignore Makefile README.markdown build/pcg.ros src/pcg.lisp |
Changes
--- a/.hgignore Fri Feb 10 23:31:25 2017 +0000
+++ b/.hgignore Sun Feb 12 01:14:43 2017 +0000
@@ -2,3 +2,4 @@
scratch.lisp
docs/build
+build/pcg
--- a/Makefile Fri Feb 10 23:31:25 2017 +0000
+++ b/Makefile Sun Feb 12 01:14:43 2017 +0000
@@ -25,3 +25,9 @@
rsync --delete -a ./docs/build/ ~/src/sjl.bitbucket.org/cl-pcg
hg -R ~/src/sjl.bitbucket.org commit -Am 'cl-pcg: Update site.'
hg -R ~/src/sjl.bitbucket.org push
+
+# Build -----------------------------------------------------------------------
+lisps := $(shell ffind '\.(asd|lisp|ros)$$')
+
+build/pcg: $(lisps)
+ ros build build/pcg.ros
--- a/README.markdown Fri Feb 10 23:31:25 2017 +0000
+++ b/README.markdown Sun Feb 12 01:14:43 2017 +0000
@@ -7,3 +7,18 @@
* **Documentation:** <https://sjl.bitbucket.io/cl-pcg/>
* **Mercurial:** <https://bitbucket.org/sjl/cl-pcg/>
* **Git:** <https://github.com/sjl/cl-pcg/>
+
+
+Testing with Dieharder
+----------------------
+
+There's a Roswell script you can use to make a little executable that will spew
+random bytes to stdout, suitable for piping into `dieharder`:
+
+```
+make build/pcg
+./build/pcg | dieharder -a -g 200
+```
+
+`build/pcg` will dump out infinite random bytes until stdout breaks, so maybe
+don't run it in a bare terminal unless you want to just totally hose it.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/build/pcg.ros Sun Feb 12 01:14:43 2017 +0000
@@ -0,0 +1,61 @@
+#!/bin/sh
+#|-*- mode:lisp -*-|#
+#|
+exec ros -Q -- $0 "$@"
+|#
+
+
+(unless (find-package :pcg)
+ (ql:quickload '(:cl-pcg) :silent t))
+
+(require 'sb-rotate-byte)
+
+(declaim (optimize (debug 0) (safety 0) (speed 3)))
+
+(let ((*standard-output* (make-broadcast-stream)) ; shut
+ (*error-output* (make-broadcast-stream))) ; up
+ (asdf:load-system 'cl-pcg :force t))
+
+
+(deftype u32 () '(unsigned-byte 32))
+(defconstant +buffer-size+ (* 1 1024))
+
+(defun pcg-dump-data ()
+ (with-open-file (out "/dev/stdout"
+ :direction :output
+ :if-exists :append
+ :element-type 'u32)
+ (loop
+ :with pcg = (pcg::make-pcg :seed (random (expt 2 32)) :stream-id 0)
+ :with buffer = (make-array +buffer-size+
+ :element-type t
+ :initial-element 0)
+ :do (loop :for i :from 0 :below +buffer-size+
+ :for n = (pcg::pcg-random% pcg)
+ :do (setf (aref buffer i) n))
+ (write-sequence buffer out))))
+
+(defun random-dump-data ()
+ (with-open-file (out "/dev/stdout"
+ :direction :output
+ :if-exists :append
+ :element-type 'u32)
+ (loop
+ :with rs = (make-random-state t)
+ :with buffer = (make-array +buffer-size+
+ :element-type 'u32
+ :initial-element 0)
+ :do (loop :for i :from 0 :below +buffer-size+
+ :for n = (random (expt 2 32) rs)
+ :do (setf (aref buffer i) n))
+ (write-sequence buffer out))))
+
+(defun main (&optional generator &rest argv)
+ (declare (ignore argv))
+ (setf *random-state* (make-random-state t))
+ (handler-case
+ (if (string= generator "random")
+ (random-dump-data)
+ (pcg-dump-data))
+ (stream-error () t))
+ t)
--- a/src/pcg.lisp Fri Feb 10 23:31:25 2017 +0000
+++ b/src/pcg.lisp Sun Feb 12 01:14:43 2017 +0000
@@ -20,10 +20,7 @@
:collect `(check-type ,place ,type))))
-;; Embedded from cl-utilities, with the bugfix of putting the inline declamation
-;; FIRST so it'll actually work.
-(declaim (inline rotate-byte))
-(defun rotate-byte% (count bytespec integer)
+(defun rotate-byte (count bytespec integer)
"Rotates a field of bits within INTEGER; specifically, returns an
integer that contains the bits of INTEGER rotated COUNT times
leftwards within the byte specified by BYTESPEC, and elsewhere
@@ -31,7 +28,7 @@
(declare (optimize (speed 3) (safety 0) (space 0) (debug 1)))
(let ((size (byte-size bytespec)))
(when (= size 0)
- (return-from rotate-byte% integer))
+ (return-from rotate-byte integer))
(let ((count (mod count size)))
(flet ((rotate-byte-from-0 (count size integer)
(let ((bytespec (byte size 0)))
@@ -44,12 +41,6 @@
bytespec
integer)))))
-(defun-inline rotate-byte (count bytespec integer)
- #+sbcl
- (sb-rotate-byte:rotate-byte count bytespec integer)
- #-sbcl
- (rotate-byte% count bytespec integer))
-
(defun-inline % (n)
(mod n +modulus+))
@@ -114,7 +105,8 @@
(declare (optimize speed)
(type (unsigned-byte 32) data)
(type (unsigned-byte 5) selector))
- (rotate-byte selector (byte 32 0) data))
+ #+sbcl (sb-rotate-byte:rotate-byte selector (byte 32 0) data)
+ #-sbcl (rotate-byte selector (byte 32 0) data))
;;;; State Advancement --------------------------------------------------------