You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.1 KiB
Python

# Utilities
import random
# printing
me = ' pys--. '
quiet = False
getSimTime = None
def msg(text='', lvl=0, name=None, init=None):
global me, quiet, getSimTime
if init is not None:
getSimTime = init
return
if quiet and lvl != 0:
return
if name is None:
name = me
if getSimTime is not None:
t,c = getSimTime()
else:
t,c = (0,0)
s = f'{t:08d}[{c:08d}] {name:>8}: '
pad = ' ' * len(s)
text = text + '\n'
lines = text.splitlines()
s = s + lines[0] + '\n'
for i in range(1, len(lines)):
s = s + pad
s = s + lines[i] + '\n'
print(s[0:-1])
# randoms
def intrandom(n):
return random.randint(0, n-1)
def hexrandom(w=16):
n = random.getrandbits(w*4)
return '{0:0{l}X}'.format(n, l=w)
def binrandom(w=32):
n = random.getrandbits(w)
return '{0:0>{l}b}'.format(n, l=w)
def randOK(freq):
v = random.randint(1,100) # 1 <= v <= 100
if freq == 0:
return False
else:
return v <= freq
# weights is either
# a simple list: return weighted index
# a list of tuple(val, weight): return weighted val
def randweighted(weights):
if len(weights) == 0:
return 0
if type(weights[0]) is tuple:
vals = []
tWeights = []
for i in range (0, len(weights)):
vals.append(weights[i][0])
tWeights.append(weights[i][1])
weights = tWeights
else:
vals = range(0, len(weights))
sum = 0
for i in range(0, len(weights)):
sum = sum + weights[i]
v = random.randint(0,sum-1)
weight = 0
for i in range(0, len(weights)):
weight = weight + weights[i]
if v < weight:
break
return vals[i]
# converters
def b2x(b, w=None):
if w is None:
rem = len(b) % 4
w = len(b)/4
if rem != 0:
w = w + 1
return '{0:0{l}X}'.format(int(b,2), l=w)
def x2b(x, w=None):
i = int(str(x),16)
if w is None:
return bin(i)[2:]
else:
return '{0:0>{l}s}'.format(bin(i)[2:], l=w)
def d2x(x, w=None):
#return hex(int(x)).split('x')[-1].upper()
if w is None:
return '{0:X}'.format(x)
else:
return '{0:0{l}X}'.format(x, l=w)
def x2d(i):
return int(i, 16)