blob: 97673001aa49d4a3200d1660aa1e556b89fdbc66 [file] [log] [blame]
Brian Silverman3fec6482020-01-19 17:56:20 -08001from __future__ import print_function
2
3import json
4import sys
5import subprocess
6import os
7import threading
8
9from bazel_tools.tools.python.runfiles import runfiles
10
Ravago Jones5127ccc2022-07-31 16:32:45 -070011
Brian Silverman3fec6482020-01-19 17:56:20 -080012def main(params):
Ravago Jones5127ccc2022-07-31 16:32:45 -070013 r = runfiles.Create()
14 generator = r.Rlocation(
15 'org_frc971/y2020/vision/sift/fast_gaussian_generator')
Brian Silverman3fec6482020-01-19 17:56:20 -080016
Ravago Jones5127ccc2022-07-31 16:32:45 -070017 ruledir = sys.argv[2]
18 target_cpu = sys.argv[3]
Brian Silverman3fec6482020-01-19 17:56:20 -080019
Ravago Jones5127ccc2022-07-31 16:32:45 -070020 target = {
21 'aarch64': 'arm-64-linux-no_asserts',
22 'armv7': 'arm-32-linux-no_asserts',
23 'k8': 'x86-64-linux-no_asserts',
24 }[target_cpu]
Brian Silverman3fec6482020-01-19 17:56:20 -080025
Ravago Jones5127ccc2022-07-31 16:32:45 -070026 commands = []
Brian Silverman3fec6482020-01-19 17:56:20 -080027
Ravago Jones5127ccc2022-07-31 16:32:45 -070028 amd64_debian_sysroot = r.Rlocation(
29 'amd64_debian_sysroot/usr/lib/x86_64-linux-gnu/libc.so.6').rsplit(
30 '/', 4)[0]
31 env = os.environ.copy()
32 env['LD_LIBRARY_PATH'] = ':'.join([
33 # TODO(brian): Figure this out again. It is a bit aggressive.
34 #amd64_debian_sysroot + '/lib/x86_64-linux-gnu',
35 #amd64_debian_sysroot + '/lib',
36 #amd64_debian_sysroot + '/usr/lib/x86_64-linux-gnu',
37 #amd64_debian_sysroot + '/usr/lib',
38 ])
Brian Silverman3fec6482020-01-19 17:56:20 -080039
Ravago Jones5127ccc2022-07-31 16:32:45 -070040 all_header = [
41 '#ifndef Y2020_VISION_SIFT_FAST_GAUSSIAN_ALL_H_',
42 '#define Y2020_VISION_SIFT_FAST_GAUSSIAN_ALL_H_',
43 '#include "HalideBuffer.h"',
44 ]
Brian Silverman3fec6482020-01-19 17:56:20 -080045
Ravago Jones5127ccc2022-07-31 16:32:45 -070046 for cols, rows in params['sizes']:
47 for sigma, sigma_name, filter_width in params['sigmas']:
48 name = "fast_gaussian_%dx%d_%s" % (cols, rows, sigma_name)
Brian Silverman3fec6482020-01-19 17:56:20 -080049
Ravago Jones5127ccc2022-07-31 16:32:45 -070050 commands.append([
51 generator,
52 '-g',
53 'gaussian_generator',
54 '-o',
55 ruledir,
56 '-f',
57 name,
58 '-e',
59 'o,h,html',
60 'target=%s-no_runtime' % target,
61 'cols=%s' % cols,
62 'rows=%s' % rows,
63 'sigma=%s' % sigma,
64 'filter_width=%s' % filter_width,
65 ])
66 all_header += [
67 '#include "y2020/vision/sift/%s.h"' % name,
68 ]
Brian Silverman3fec6482020-01-19 17:56:20 -080069
Ravago Jones5127ccc2022-07-31 16:32:45 -070070 name = "fast_gaussian_subtract_%dx%d_%s" % (cols, rows, sigma_name)
Brian Silverman3fec6482020-01-19 17:56:20 -080071
Ravago Jones5127ccc2022-07-31 16:32:45 -070072 commands.append([
73 generator,
74 '-g',
75 'gaussian_and_subtract_generator',
76 '-o',
77 ruledir,
78 '-f',
79 name,
80 '-e',
81 'o,h,html',
82 'target=%s-no_runtime' % target,
83 'cols=%s' % cols,
84 'rows=%s' % rows,
85 'sigma=%s' % sigma,
86 'filter_width=%s' % filter_width,
87 ])
88 all_header += [
89 '#include "y2020/vision/sift/%s.h"' % name,
90 ]
Brian Silverman3fec6482020-01-19 17:56:20 -080091
Ravago Jones5127ccc2022-07-31 16:32:45 -070092 name = 'fast_subtract_%dx%d' % (cols, rows)
93 commands.append([
94 generator,
95 '-g',
96 'subtract_generator',
97 '-o',
98 ruledir,
99 '-f',
100 name,
101 '-e',
102 'o,h,html',
103 'target=%s-no_runtime' % target,
104 'cols=%s' % cols,
105 'rows=%s' % rows,
106 ])
107 all_header += [
108 '#include "y2020/vision/sift/%s.h"' % name,
109 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800110 commands.append([
111 generator,
Ravago Jones5127ccc2022-07-31 16:32:45 -0700112 '-r',
113 'fast_gaussian_runtime',
114 '-o',
115 ruledir,
116 '-e',
117 'o',
118 'target=%s' % target,
Brian Silverman3fec6482020-01-19 17:56:20 -0800119 ])
Ravago Jones5127ccc2022-07-31 16:32:45 -0700120
Brian Silverman3fec6482020-01-19 17:56:20 -0800121 all_header += [
Ravago Jones5127ccc2022-07-31 16:32:45 -0700122 'namespace frc971 {',
123 'namespace vision {',
124 '// 0 is success. 1 is non-implemented size. Negative is a Halide error.',
125 'inline int DoGeneratedFastGaussian(',
126 ' Halide::Runtime::Buffer<const int16_t, 2> input,',
127 ' Halide::Runtime::Buffer<int16_t, 2> output,',
128 ' double sigma) {',
Brian Silverman3fec6482020-01-19 17:56:20 -0800129 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800130
Ravago Jones5127ccc2022-07-31 16:32:45 -0700131 for sigma, sigma_name, filter_width in params['sigmas']:
132 for cols, rows in params['sizes']:
133 name = "fast_gaussian_%dx%d_%s" % (cols, rows, sigma_name)
134 all_header += [
135 ' if (input.dim(0).extent() == %s' % cols,
136 ' && input.dim(1).extent() == %s' % rows,
137 ' && sigma == %s) {' % sigma,
138 ' return %s(input, output);' % name,
139 ' }',
140 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800141
Brian Silverman3fec6482020-01-19 17:56:20 -0800142 all_header += [
Ravago Jones5127ccc2022-07-31 16:32:45 -0700143 ' return 1;',
144 '}',
145 'inline int DoGeneratedFastGaussianAndSubtract(',
146 ' Halide::Runtime::Buffer<const int16_t, 2> input,',
147 ' Halide::Runtime::Buffer<int16_t, 2> blurred,',
148 ' Halide::Runtime::Buffer<int16_t, 2> difference,',
149 ' double sigma) {',
Brian Silverman3fec6482020-01-19 17:56:20 -0800150 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800151
Ravago Jones5127ccc2022-07-31 16:32:45 -0700152 for sigma, sigma_name, filter_width in params['sigmas']:
153 for cols, rows in params['sizes']:
154 name = "fast_gaussian_subtract_%dx%d_%s" % (cols, rows, sigma_name)
155 all_header += [
156 ' if (input.dim(0).extent() == %s' % cols,
157 ' && input.dim(1).extent() == %s' % rows,
158 ' && sigma == %s) {' % sigma,
159 ' return %s(input, blurred, difference);' % name,
160 ' }',
161 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800162
Ravago Jones5127ccc2022-07-31 16:32:45 -0700163 all_header += [
164 ' return 1;',
165 '}',
166 'inline int DoGeneratedFastSubtract('
167 ' Halide::Runtime::Buffer<const int16_t, 2> input_a,',
168 ' Halide::Runtime::Buffer<const int16_t, 2> input_b,',
169 ' Halide::Runtime::Buffer<int16_t, 2> output) {',
170 ]
171 for cols, rows in params['sizes']:
172 name = 'fast_subtract_%dx%d' % (cols, rows)
173 all_header += [
174 ' if (input_a.dim(0).extent() == %s' % cols,
175 ' && input_a.dim(1).extent() == %s) {' % rows,
176 ' return %s(input_a, input_b, output);' % name,
177 ' }',
178 ]
179 all_header += [
180 ' return 1;',
181 '}',
182 '} // namespace vision',
183 '} // namespace frc971',
184 '#endif // Y2020_VISION_SIFT_FAST_GAUSSIAN_ALL_H_',
185 ]
Brian Silverman3fec6482020-01-19 17:56:20 -0800186
Ravago Jones5127ccc2022-07-31 16:32:45 -0700187 with open(os.path.join(ruledir, 'fast_gaussian_all.h'), 'w') as f:
188 f.writelines([line + '\n' for line in all_header])
189
190 commands_lock = threading.Lock()
191 success = [True]
192
193 def run_commands():
194 while True:
195 with commands_lock:
196 if not commands:
197 return
198 if not success[0]:
199 return
200 command = commands.pop()
201 try:
202 subprocess.check_call(command, env=env)
203 except:
204 with commands_lock:
205 success[0] = False
206 raise
207
208 threads = [threading.Thread(target=run_commands) for _ in range(4)]
209 for thread in threads:
210 thread.start()
211 for thread in threads:
212 thread.join()
213 if not success[0]:
214 sys.exit(1)
215
Brian Silverman3fec6482020-01-19 17:56:20 -0800216
217if __name__ == '__main__':
Ravago Jones5127ccc2022-07-31 16:32:45 -0700218 main(json.loads(sys.argv[1]))