abc9: suppress warnings when no compatible + used flop boxes formed
[yosys.git] / tests / opt_share / generate.py
1 #!/usr/bin/env python3
2
3 import argparse
4 import sys
5 import random
6 from contextlib import contextmanager
7
8
9 @contextmanager
10 def redirect_stdout(new_target):
11 old_target, sys.stdout = sys.stdout, new_target
12 try:
13 yield new_target
14 finally:
15 sys.stdout = old_target
16
17
18 def random_plus_x():
19 return "%s x" % random.choice(['+', '+', '+', '-', '-', '|', '&', '^'])
20
21
22 def maybe_plus_x(expr):
23 if random.randint(0, 4) == 0:
24 return "(%s %s)" % (expr, random_plus_x())
25 else:
26 return expr
27
28
29 parser = argparse.ArgumentParser(
30 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
31 parser.add_argument('-S', '--seed', type=int, help='seed for PRNG')
32 parser.add_argument('-c',
33 '--count',
34 type=int,
35 default=100,
36 help='number of test cases to generate')
37 args = parser.parse_args()
38
39 if args.seed is not None:
40 print("PRNG seed: %d" % args.seed)
41 random.seed(args.seed)
42
43 for idx in range(args.count):
44 with open('temp/uut_%05d.v' % idx, 'w') as f:
45 with redirect_stdout(f):
46 print('module uut_%05d(a, b, c, s, y);' % (idx))
47 op = random.choice([
48 random.choice(['+', '-', '*', '/', '%']),
49 random.choice(['<', '<=', '==', '!=', '===', '!==', '>=',
50 '>']),
51 random.choice(['<<', '>>', '<<<', '>>>']),
52 random.choice(['|', '&', '^', '~^', '||', '&&']),
53 ])
54 print(' input%s [%d:0] a;' % (random.choice(['', ' signed']), 8))
55 print(' input%s [%d:0] b;' % (random.choice(['', ' signed']), 8))
56 print(' input%s [%d:0] c;' % (random.choice(['', ' signed']), 8))
57 print(' input s;')
58 print(' output [%d:0] y;' % 8)
59 ops1 = ['a', 'b']
60 ops2 = ['a', 'c']
61 random.shuffle(ops1)
62 random.shuffle(ops2)
63 cast1 = random.choice(['', '$signed', '$unsigned'])
64 cast2 = random.choice(['', '$signed', '$unsigned'])
65 print(' assign y = (s ? %s(%s %s %s) : %s(%s %s %s));' %
66 (cast1, ops1[0], op, ops1[1],
67 cast2, ops2[0], op, ops2[1]))
68 print('endmodule')
69
70 with open('temp/uut_%05d.ys' % idx, 'w') as f:
71 with redirect_stdout(f):
72 print('read_verilog temp/uut_%05d.v' % idx)
73 print('proc;;')
74 print('copy uut_%05d gold' % idx)
75 print('rename uut_%05d gate' % idx)
76 print('tee -a temp/all_share_log.txt log')
77 print('tee -a temp/all_share_log.txt log #job# uut_%05d' % idx)
78 print('tee -a temp/all_share_log.txt opt gate')
79 print('tee -a temp/all_share_log.txt opt_share gate')
80 print('tee -a temp/all_share_log.txt opt_clean gate')
81 print(
82 'miter -equiv -flatten -ignore_gold_x -make_outputs -make_outcmp gold gate miter'
83 )
84 print(
85 'sat -set-def-inputs -verify -prove trigger 0 -show-inputs -show-outputs miter'
86 )