1import os 2import random 3 4Import("env") 5 6def eratosthenes(): 7 '''Yields the sequence of prime numbers via the Sieve of Eratosthenes.''' 8 D = {} # map composite integers to primes witnessing their compositeness 9 q = 2 # first integer to test for primality 10 while 1: 11 if q not in D: 12 yield q # not marked composite, must be prime 13 D[q*q] = [q] # first multiple of q not already marked 14 else: 15 for p in D[q]: # move each witness to its next multiple 16 D.setdefault(p+q,[]).append(p) 17 del D[q] # no longer need D[q], free memory 18 q += 1 19 20def before_build(): 21 def get_denoms(count): 22 # 14 signed, 15 unsigned 23 range_end_bits = 14 24 # Small numbers 25 denoms = set([i for i in range(2, 32)]) 26 # Powers of 2 27 denoms = denoms.union([2**j for j in range(2, range_end_bits-1)]) 28 # Prime numbers 29 denoms = denoms.union([p for i, p in zip(range(1, 100), eratosthenes())]) 30 # End of the range 31 denoms.add((2**range_end_bits)-2) 32 # Fill in the rest of the denominators with random 33 while (len(denoms)<count): 34 denoms.add(random.randint(33, 2**range_end_bits)) 35 return sorted(denoms) 36 37 # Build the denominators 38 denoms = get_denoms(290) # The number of denominators was chosen so that all tests fit on an AtMega2560 39 40 genfile = os.path.join(env['PROJECT_SRC_DIR'], 'invariant_div_test', 'test_declares.g.hpp') 41 print(f'Generating {genfile}') 42 with open(genfile, 'w') as f: 43 for index in denoms: 44 print(f'DEFINE_BOTH({index});', file=f) 45 46 genfile = os.path.join(env['PROJECT_SRC_DIR'], 'invariant_div_test', 'test.g.hpp') 47 print(f'Generating {genfile}') 48 with open(genfile, 'w') as f: 49 for index in denoms: 50 print(f'RUN_TEST_BOTH({index});', file=f) 51 52before_build()