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()