''********************************************* ''* Pick 16 random 32-tap sets from 63 bits * ''********************************************* CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 OBJ fds : "FullDuplexSerial" rr : "RealRandom" VAR byte poolsize byte pool[63] byte uses[63] byte taps[16*32] PUB start | i, j, k 'start serial fds.start(31,30,0,112500) 'start RealRandom rr.start 'init pool poolsize := 63 repeat i from 0 to poolsize - 1 pool[i] := i 'pick random tap sets fds.str(string(13,13,"Picking taps...",13)) repeat j from 0 to 15 'scramble current pool fds.str(string(13,"Pool ")) fds.hex(j,1) scramble_pool optimize_pool show_pool 'fill a set of taps, track uses repeat i from 0 to 31 taps[j*32+i] := pool[i] uses[pool[i]]++ 'output tap sets fds.str(string(13,13,"16 tap sets in Verilog:",13,13)) repeat j from 0 to 15 fds.tx("{") repeat i from 0 to 31 if rr.random & 1 fds.tx("!") else fds.tx(" ") fds.str(string("x[")) k := taps[j*32+i] if k < 10 fds.tx("0") fds.dec(k) fds.tx("]") if i <> 31 fds.tx(",") else fds.str(string("},",13)) PRI scramble_pool | i, j repeat 100 repeat i from 0 to poolsize - 1 if rr.random & 3 'mainly rotate j := pool[i] if i == poolsize - 1 pool[i] := pool[0] pool[0] := j else pool[i] := pool[i+1] pool[i+1] := j PRI optimize_pool | i, j, k repeat 10 repeat i from 0 to 31 'look for a used pool member in 0..31 if uses[pool[i]] > 0 'see if it can be swapped out with a less-used member in 32+ repeat j from 32 to poolsize - 1 if uses[pool[j]] < uses[pool[i]] k := pool[i] pool[i] := pool[j] pool[j] := k quit PRI show_pool | i 'show pool as a bunch of characters with usage underneath, space at 32 fds.tx(13) repeat i from 0 to poolsize - 1 fds.tx($40 + pool[i]) if i == 31 fds.tx(" ") fds.tx(13) repeat i from 0 to poolsize - 1 fds.hex(uses[pool[i]],1) if i == 31 fds.tx(" ") fds.tx(13)