Commit cc85d13d by ZhiangWang033

add c++ implementation for FD

parent 4be3b790
{
"files.associations": {
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"typeinfo": "cpp"
}
}
\ No newline at end of file
cmake_minimum_required(VERSION 3.8)
project(fd_placer)
include_directories(./src)
file(GLOB SOURCES "./src/*.cpp")
add_executable(${PROJECT_NAME} ${SOURCES})
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
This source diff could not be displayed because it is too large. You can view the blob instead.
# Placement file for Circuit Training
# Source input file(s) : ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/netlist.pb.txt
# This file : ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/initial.plc
# Date : 2022-09-20 11:30:06
# Columns : 23 Rows : 28
# Width : 1347.100 Height : 1346.800
# Area : 1506097.566312155
# Wirelength : 3610985.229
# Wirelength cost : 0.0526
# Congestion cost : 0.7721
# Density cost : 0.7209
# Project : circuit_training
# Block : unset_block
# Routes per micron, hor : 11.285 ver : 12.605
# Routes used by macros, hor : 7.143 ver : 8.339
# Smoothing factor : 2
# Overlap threshold : 0.004
#
#
#
# Counts of node types:
# HARD_MACROs : 133
# HARD_MACRO_PINs : 7847
# MACROs : 943
# MACRO_PINs : 19658
# PORTs : 495
# SOFT_MACROs : 810
# SOFT_MACRO_PINs : 11811
# STDCELLs : 0
#
# User comments:
# Original source netlist with standard cells: /home/zf4_projects/DREAMPlace/sakundu/ABK_MP/08162022_flow_scripts/MacroPlacement/Flows/NanGate45/ariane133/run-20220816-035413/flow2_1.3/ariane.pb.txt
# Groups file: ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/groups.final
# worst 10 spread
# grp: 744 - spread: 278916.7518893204
# grp: 50 - spread: 268009.6376835485
# grp: 336 - spread: 223800.4868365636
# grp: 535 - spread: 207184.36226282385
# grp: 505 - spread: 197871.97286953646
# grp: 586 - spread: 190713.73374938426
# grp: 756 - spread: 184033.9279079139
# grp: 532 - spread: 173094.29808680012
# grp: 773 - spread: 170707.79035165644
# grp: 347 - spread: 168578.0558490756
#
#
# node_index x y orientation fixed
0 0.035 232.470 _ 0
1 0.035 235.130 _ 0
2 0.035 237.790 _ 0
3 0.035 240.450 _ 0
4 0.035 243.110 _ 0
5 0.035 245.770 _ 0
6 0.035 248.430 _ 0
7 0.035 251.230 _ 0
8 0.035 253.890 _ 0
9 0.035 256.550 _ 0
10 0.035 259.210 _ 0
11 0.035 261.870 _ 0
12 0.035 264.530 _ 0
13 0.035 267.190 _ 0
14 0.035 269.990 _ 0
15 0.035 272.650 _ 0
16 0.035 275.310 _ 0
17 0.035 277.970 _ 0
18 0.035 280.630 _ 0
19 0.035 283.290 _ 0
20 0.035 285.950 _ 0
21 0.035 288.750 _ 0
22 0.035 291.410 _ 0
23 0.035 294.070 _ 0
24 0.035 296.730 _ 0
25 0.035 299.390 _ 0
26 0.035 302.050 _ 0
27 0.035 304.710 _ 0
28 0.035 307.510 _ 0
29 0.035 310.170 _ 0
30 0.035 312.830 _ 0
31 0.035 315.490 _ 0
32 0.035 318.150 _ 0
33 0.035 320.810 _ 0
34 0.035 323.470 _ 0
35 0.035 326.270 _ 0
36 0.035 328.930 _ 0
37 0.035 331.590 _ 0
38 0.035 334.250 _ 0
39 0.035 336.910 _ 0
40 0.035 339.570 _ 0
41 0.035 342.230 _ 0
42 0.035 345.030 _ 0
43 0.035 347.690 _ 0
44 0.035 350.350 _ 0
45 0.035 353.010 _ 0
46 0.035 355.670 _ 0
47 0.035 358.330 _ 0
48 0.035 361.130 _ 0
49 0.035 363.790 _ 0
50 0.035 366.450 _ 0
51 0.035 369.110 _ 0
52 0.035 371.770 _ 0
53 0.035 374.430 _ 0
54 0.035 377.090 _ 0
55 0.035 379.890 _ 0
56 0.035 382.550 _ 0
57 0.035 385.210 _ 0
58 0.035 387.870 _ 0
59 0.035 390.530 _ 0
60 0.035 393.190 _ 0
61 0.035 395.850 _ 0
62 0.035 398.650 _ 0
63 0.035 401.310 _ 0
64 0.035 403.970 _ 0
65 0.035 406.630 _ 0
66 0.035 409.290 _ 0
67 0.035 411.950 _ 0
68 0.035 414.610 _ 0
69 0.035 417.410 _ 0
70 0.035 420.070 _ 0
71 0.035 422.730 _ 0
72 0.035 425.390 _ 0
73 0.035 428.050 _ 0
74 0.035 430.710 _ 0
75 0.035 433.370 _ 0
76 0.035 436.170 _ 0
77 0.035 438.830 _ 0
78 0.035 441.490 _ 0
79 0.035 444.150 _ 0
80 0.035 446.810 _ 0
81 0.035 449.470 _ 0
82 0.035 452.130 _ 0
83 0.035 454.930 _ 0
84 0.035 457.590 _ 0
85 0.035 460.250 _ 0
86 0.035 462.910 _ 0
87 0.035 465.570 _ 0
88 0.035 468.230 _ 0
89 0.035 470.890 _ 0
90 0.035 473.690 _ 0
91 0.035 476.350 _ 0
92 0.035 479.010 _ 0
93 0.035 481.670 _ 0
94 0.035 484.330 _ 0
95 0.035 486.990 _ 0
96 0.035 489.790 _ 0
97 0.035 492.450 _ 0
98 0.035 495.110 _ 0
99 0.035 497.770 _ 0
100 0.035 500.430 _ 0
101 0.035 503.090 _ 0
102 0.035 505.750 _ 0
103 0.035 508.550 _ 0
104 0.035 511.210 _ 0
105 0.035 513.870 _ 0
106 0.035 516.530 _ 0
107 0.035 519.190 _ 0
108 0.035 521.850 _ 0
109 0.035 524.510 _ 0
110 0.035 527.310 _ 0
111 0.035 529.970 _ 0
112 0.035 532.630 _ 0
113 0.035 535.290 _ 0
114 0.035 537.950 _ 0
115 0.035 540.610 _ 0
116 0.035 543.270 _ 0
117 0.035 546.070 _ 0
118 0.035 548.730 _ 0
119 0.035 551.390 _ 0
120 0.035 554.050 _ 0
121 0.035 556.710 _ 0
122 0.035 559.370 _ 0
123 0.035 562.030 _ 0
124 0.035 564.830 _ 0
125 0.035 567.490 _ 0
126 0.035 570.150 _ 0
127 0.035 572.810 _ 0
128 0.035 575.470 _ 0
129 0.035 578.130 _ 0
130 0.035 580.790 _ 0
131 0.035 583.590 _ 0
132 0.035 586.250 _ 0
133 0.035 588.910 _ 0
134 0.035 591.570 _ 0
135 0.035 594.230 _ 0
136 0.035 596.890 _ 0
137 0.035 599.550 _ 0
138 0.035 602.350 _ 0
139 0.035 605.010 _ 0
140 0.035 607.670 _ 0
141 0.035 610.330 _ 0
142 0.035 612.990 _ 0
143 0.035 615.650 _ 0
144 0.035 618.450 _ 0
145 0.035 621.110 _ 0
146 0.035 623.770 _ 0
147 0.035 626.430 _ 0
148 0.035 629.090 _ 0
149 0.035 631.750 _ 0
150 0.035 634.410 _ 0
151 0.035 637.210 _ 0
152 0.035 639.870 _ 0
153 0.035 642.530 _ 0
154 0.035 645.190 _ 0
155 0.035 647.850 _ 0
156 0.035 650.510 _ 0
157 0.035 653.170 _ 0
158 0.035 655.970 _ 0
159 0.035 658.630 _ 0
160 0.035 661.290 _ 0
161 0.035 663.950 _ 0
162 0.035 666.610 _ 0
163 0.035 669.270 _ 0
164 0.035 671.930 _ 0
165 0.035 674.730 _ 0
166 0.035 677.390 _ 0
167 0.035 680.050 _ 0
168 0.035 682.710 _ 0
169 0.035 685.370 _ 0
170 0.035 688.030 _ 0
171 0.035 690.690 _ 0
172 0.035 693.490 _ 0
173 0.035 696.150 _ 0
174 0.035 698.810 _ 0
175 0.035 701.470 _ 0
176 0.035 704.130 _ 0
177 0.035 706.790 _ 0
178 0.035 709.450 _ 0
179 0.035 712.250 _ 0
180 0.035 714.910 _ 0
181 0.035 717.570 _ 0
182 0.035 720.230 _ 0
183 0.035 722.890 _ 0
184 0.035 725.550 _ 0
185 0.035 728.210 _ 0
186 0.035 731.010 _ 0
187 0.035 733.670 _ 0
188 0.035 736.330 _ 0
189 0.035 738.990 _ 0
190 0.035 741.650 _ 0
191 0.035 744.310 _ 0
192 0.035 747.110 _ 0
193 0.035 749.770 _ 0
194 0.035 752.430 _ 0
195 0.035 755.090 _ 0
196 0.035 757.750 _ 0
197 0.035 760.410 _ 0
198 0.035 763.070 _ 0
199 0.035 765.870 _ 0
200 0.035 768.530 _ 0
201 0.035 771.190 _ 0
202 0.035 773.850 _ 0
203 0.035 776.510 _ 0
204 0.035 779.170 _ 0
205 0.035 781.830 _ 0
206 0.035 784.630 _ 0
207 0.035 787.290 _ 0
208 0.035 789.950 _ 0
209 0.035 792.610 _ 0
210 0.035 795.270 _ 0
211 0.035 797.930 _ 0
212 0.035 800.590 _ 0
213 0.035 803.390 _ 0
214 0.035 806.050 _ 0
215 0.035 808.710 _ 0
216 0.035 811.370 _ 0
217 0.035 814.030 _ 0
218 0.035 816.690 _ 0
219 0.035 819.350 _ 0
220 0.035 822.150 _ 0
221 0.035 824.810 _ 0
222 0.035 827.470 _ 0
223 0.035 830.130 _ 0
224 0.035 832.790 _ 0
225 0.035 835.450 _ 0
226 0.035 838.110 _ 0
227 0.035 840.910 _ 0
228 0.035 843.570 _ 0
229 0.035 846.230 _ 0
230 0.035 848.890 _ 0
231 0.035 851.550 _ 0
232 0.035 854.210 _ 0
233 0.035 856.870 _ 0
234 0.035 859.670 _ 0
235 0.035 862.330 _ 0
236 0.035 864.990 _ 0
237 0.035 867.650 _ 0
238 0.035 870.310 _ 0
239 0.035 872.970 _ 0
240 0.035 875.770 _ 0
241 0.035 878.430 _ 0
242 0.035 881.090 _ 0
243 0.035 883.750 _ 0
244 0.035 886.410 _ 0
245 0.035 889.070 _ 0
246 0.035 891.730 _ 0
247 0.035 894.530 _ 0
248 0.035 897.190 _ 0
249 0.035 899.850 _ 0
250 0.035 902.510 _ 0
251 0.035 905.170 _ 0
252 0.035 907.830 _ 0
253 0.035 910.490 _ 0
254 0.035 913.290 _ 0
255 0.035 915.950 _ 0
256 0.035 918.610 _ 0
257 0.035 921.270 _ 0
258 0.035 923.930 _ 0
259 0.035 926.590 _ 0
260 0.035 929.250 _ 0
261 0.035 932.050 _ 0
262 0.035 934.710 _ 0
263 0.035 937.370 _ 0
264 0.035 940.030 _ 0
265 0.035 942.690 _ 0
266 0.035 945.350 _ 0
267 0.035 948.010 _ 0
268 0.035 950.810 _ 0
269 0.035 953.470 _ 0
270 0.035 956.130 _ 0
271 0.035 958.790 _ 0
272 0.035 961.450 _ 0
273 0.035 964.110 _ 0
274 0.035 966.770 _ 0
275 0.035 969.570 _ 0
276 0.035 972.230 _ 0
277 0.035 974.890 _ 0
278 0.035 977.550 _ 0
279 0.035 980.210 _ 0
280 0.035 982.870 _ 0
281 0.035 985.530 _ 0
282 0.035 988.330 _ 0
283 0.035 990.990 _ 0
284 0.035 993.650 _ 0
285 0.035 996.310 _ 0
286 0.035 998.970 _ 0
287 0.035 1001.630 _ 0
288 0.035 1004.430 _ 0
289 0.035 1007.090 _ 0
290 0.035 1009.750 _ 0
291 0.035 1012.410 _ 0
292 0.035 1015.070 _ 0
293 0.035 1017.730 _ 0
294 0.035 1020.390 _ 0
295 0.035 1023.190 _ 0
296 0.035 1025.850 _ 0
297 0.035 1028.510 _ 0
298 0.035 1031.170 _ 0
299 0.035 1033.830 _ 0
300 0.035 1036.490 _ 0
301 0.035 1039.150 _ 0
302 0.035 1041.950 _ 0
303 0.035 1044.610 _ 0
304 0.035 1047.270 _ 0
305 0.035 1049.930 _ 0
306 0.035 1052.590 _ 0
307 0.035 1055.250 _ 0
308 0.035 1057.910 _ 0
309 0.035 1060.710 _ 0
310 0.035 1063.370 _ 0
311 0.035 1066.030 _ 0
312 0.035 1068.690 _ 0
313 0.035 1071.350 _ 0
314 0.035 1074.010 _ 0
315 0.035 1076.670 _ 0
316 0.035 1079.470 _ 0
317 0.035 1082.130 _ 0
318 0.035 1084.790 _ 0
319 0.035 1087.450 _ 0
320 0.035 1090.110 _ 0
321 0.035 1092.770 _ 0
322 0.035 1095.430 _ 0
323 0.035 1098.230 _ 0
324 0.035 1100.890 _ 0
325 0.035 1103.550 _ 0
326 0.035 1106.210 _ 0
327 0.035 1108.870 _ 0
328 0.035 1111.530 _ 0
329 0.035 1114.330 _ 0
330 0.070 232.470 _ 0
331 0.070 237.790 _ 0
332 0.070 243.110 _ 0
333 0.070 248.430 _ 0
334 0.070 253.750 _ 0
335 0.070 259.350 _ 0
336 0.070 264.670 _ 0
337 0.070 269.990 _ 0
338 0.070 275.310 _ 0
339 0.070 280.630 _ 0
340 0.070 286.230 _ 0
341 0.070 291.550 _ 0
342 0.070 296.870 _ 0
343 0.070 302.190 _ 0
344 0.070 307.510 _ 0
345 0.070 313.110 _ 0
346 0.070 318.430 _ 0
347 0.070 323.750 _ 0
348 0.070 329.070 _ 0
349 0.070 334.390 _ 0
350 0.070 339.990 _ 0
351 0.070 345.310 _ 0
352 0.070 350.630 _ 0
353 0.070 355.950 _ 0
354 0.070 361.270 _ 0
355 0.070 366.870 _ 0
356 0.070 372.190 _ 0
357 0.070 377.510 _ 0
358 0.070 382.830 _ 0
359 0.070 388.150 _ 0
360 0.070 393.750 _ 0
361 0.070 399.070 _ 0
362 0.070 404.390 _ 0
363 0.070 409.710 _ 0
364 0.070 415.030 _ 0
365 0.070 420.630 _ 0
366 0.070 425.950 _ 0
367 0.070 431.270 _ 0
368 0.070 436.590 _ 0
369 0.070 441.910 _ 0
370 0.070 447.510 _ 0
371 0.070 452.830 _ 0
372 0.070 458.150 _ 0
373 0.070 463.470 _ 0
374 0.070 468.790 _ 0
375 0.070 474.390 _ 0
376 0.070 479.710 _ 0
377 0.070 485.030 _ 0
378 0.070 490.350 _ 0
379 0.070 495.670 _ 0
380 0.070 501.270 _ 0
381 0.070 506.590 _ 0
382 0.070 511.910 _ 0
383 0.070 517.230 _ 0
384 0.070 522.550 _ 0
385 0.070 528.150 _ 0
386 0.070 533.470 _ 0
387 0.070 538.790 _ 0
388 0.070 544.110 _ 0
389 0.070 549.430 _ 0
390 0.070 555.030 _ 0
391 0.070 560.350 _ 0
392 0.070 565.670 _ 0
393 0.070 570.990 _ 0
394 0.070 576.310 _ 0
395 0.070 581.910 _ 0
396 0.070 587.230 _ 0
397 0.070 592.550 _ 0
398 0.070 597.870 _ 0
399 0.070 603.190 _ 0
400 0.070 608.790 _ 0
401 0.070 614.110 _ 0
402 0.070 619.430 _ 0
403 0.070 624.750 _ 0
404 0.070 630.070 _ 0
405 0.070 635.670 _ 0
406 0.070 640.990 _ 0
407 0.070 646.310 _ 0
408 0.070 651.630 _ 0
409 0.070 656.950 _ 0
410 0.070 662.550 _ 0
411 0.070 667.870 _ 0
412 0.070 673.190 _ 0
413 0.070 678.510 _ 0
414 0.070 683.830 _ 0
415 0.070 689.430 _ 0
416 0.070 694.750 _ 0
417 0.070 700.070 _ 0
418 0.070 705.390 _ 0
419 0.070 710.710 _ 0
420 0.070 716.310 _ 0
421 0.070 721.630 _ 0
422 0.070 726.950 _ 0
423 0.070 732.270 _ 0
424 0.070 737.590 _ 0
425 0.070 743.190 _ 0
426 0.070 748.510 _ 0
427 0.070 753.830 _ 0
428 0.070 759.150 _ 0
429 0.070 764.470 _ 0
430 0.070 770.070 _ 0
431 0.070 775.390 _ 0
432 0.070 780.710 _ 0
433 0.070 786.030 _ 0
434 0.070 791.350 _ 0
435 0.070 796.950 _ 0
436 0.070 802.270 _ 0
437 0.070 807.590 _ 0
438 0.070 812.910 _ 0
439 0.070 818.230 _ 0
440 0.070 823.830 _ 0
441 0.070 829.150 _ 0
442 0.070 834.470 _ 0
443 0.070 839.790 _ 0
444 0.070 845.110 _ 0
445 0.070 850.710 _ 0
446 0.070 856.030 _ 0
447 0.070 861.350 _ 0
448 0.070 866.670 _ 0
449 0.070 871.990 _ 0
450 0.070 877.590 _ 0
451 0.070 882.910 _ 0
452 0.070 888.230 _ 0
453 0.070 893.550 _ 0
454 0.070 898.870 _ 0
455 0.070 904.470 _ 0
456 0.070 909.790 _ 0
457 0.070 915.110 _ 0
458 0.070 920.430 _ 0
459 0.070 925.750 _ 0
460 0.070 931.350 _ 0
461 0.070 936.670 _ 0
462 0.070 941.990 _ 0
463 0.070 947.310 _ 0
464 0.070 952.630 _ 0
465 0.070 958.230 _ 0
466 0.070 963.550 _ 0
467 0.070 968.870 _ 0
468 0.070 974.190 _ 0
469 0.070 979.510 _ 0
470 0.070 985.110 _ 0
471 0.070 990.430 _ 0
472 0.070 995.750 _ 0
473 0.070 1001.070 _ 0
474 0.070 1006.390 _ 0
475 0.070 1011.990 _ 0
476 0.070 1017.310 _ 0
477 0.070 1022.630 _ 0
478 0.070 1027.950 _ 0
479 0.070 1033.270 _ 0
480 0.070 1038.870 _ 0
481 0.070 1044.190 _ 0
482 0.070 1049.510 _ 0
483 0.070 1054.830 _ 0
484 0.070 1060.150 _ 0
485 0.070 1065.750 _ 0
486 0.070 1071.070 _ 0
487 0.070 1076.390 _ 0
488 0.070 1081.710 _ 0
489 0.070 1087.030 _ 0
490 0.070 1092.630 _ 0
491 0.070 1097.950 _ 0
492 0.070 1103.270 _ 0
493 0.070 1108.590 _ 0
494 0.070 1114.190 _ 0
495 1110.400 841.500 N 0
555 1177.960 595.100 N 0
615 1177.960 761.500 N 0
675 1110.400 554.500 N 0
735 1245.600 1262.700 N 0
795 1245.600 83.900 N 0
855 1313.240 831.700 N 0
915 1177.960 83.900 N 0
975 704.485 527.900 N 0
1035 907.405 389.300 N 0
1095 1042.760 554.500 N 0
1155 1178.040 932.500 N 0
1215 1313.240 544.700 N 0
1275 1313.240 688.700 N 0
1335 1245.600 582.500 N 0
1395 1313.240 1262.700 N 0
1455 1313.240 83.900 N 0
1515 1313.240 975.700 N 0
1575 1110.400 83.900 S 0
1635 907.405 533.500 N 0
1695 839.835 397.700 N 0
1755 975.045 534.900 N 0
1815 1245.600 921.300 N 0
1875 1313.240 400.500 N 0
1935 1245.600 751.700 N 0
1995 1245.600 414.500 N 0
2055 1178.040 1262.700 S 0
2115 1313.240 256.100 N 0
2175 1251.310 1118.700 N 0
2235 1110.400 253.300 S 0
2295 772.125 541.900 N 0
2355 772.125 385.100 N 0
2415 839.835 541.900 N 0
2475 1042.760 841.500 N 0
2535 1177.960 424.300 N 0
2595 1110.400 698.500 S 0
2655 1110.400 410.300 N 0
2715 1183.670 1097.700 N 0
2775 1245.600 247.700 N 0
2835 1116.090 1097.700 N 0
2895 1177.960 247.700 N 0
2955 636.915 518.100 N 0
3015 975.045 390.700 N 0
3075 1042.690 390.700 N 0
3135 163.435 970.100 S 0
3195 772.195 978.500 S 0
3255 632.355 830.300 N 0
3315 501.565 971.500 N 0
3375 231.075 940.700 S 0
3435 839.765 973.100 N 0
3495 565.475 681.700 S 0
3555 574.905 1125.700 N 0
3615 501.635 366.900 N 0
3675 636.915 366.900 N 0
3735 636.915 75.500 S 0
3795 366.285 979.900 N 0
3855 1048.390 985.500 N 0
3915 1042.760 698.500 N 0
3975 433.995 979.900 S 0
4035 169.135 1122.900 N 0
4095 777.895 1269.900 N 0
4155 700.685 671.900 N 0
4215 507.265 1269.900 N 0
4275 501.635 75.500 S 0
4335 907.405 79.900 N 0
4395 1042.690 79.900 N 0
4455 298.645 970.100 N 0
4515 980.745 985.500 N 0
4575 903.605 820.500 N 0
4635 439.695 1125.700 N 0
4695 101.495 1117.300 N 0
4755 710.185 1269.900 N 0
4815 768.325 685.900 N 0
4875 574.905 1269.900 N 0
4935 569.205 75.500 N 0
4995 704.485 223.900 N 0
5055 975.045 79.900 N 0
5115 169.135 1269.900 N 0
5175 1110.320 1262.700 N 0
5235 975.045 698.500 N 0
5295 304.345 1269.900 N 0
5355 101.495 1269.900 S 0
5415 913.105 1261.500 N 0
5475 633.115 662.100 S 0
5535 710.185 1125.700 N 0
5595 366.355 75.500 S 0
5655 772.125 231.100 N 0
5715 839.835 79.900 N 0
5775 236.775 1269.900 N 0
5835 913.105 1117.300 N 0
5895 907.405 677.500 N 0
5955 372.055 1125.700 N 0
6015 33.855 1122.900 N 0
6075 845.465 1269.900 N 0
6135 497.075 803.700 N 0
6195 642.545 1269.900 N 0
6255 433.995 75.500 S 0
6315 636.915 223.900 N 0
6375 1042.690 238.100 N 0
6435 33.855 1269.900 N 0
6495 980.745 1128.500 N 0
6555 835.205 828.900 N 0
6615 439.695 1269.900 N 0
6675 33.855 979.900 S 0
6735 777.895 1125.700 N 0
6795 767.565 830.300 N 0
6855 642.545 1125.700 N 0
6915 501.635 218.500 N 0
6975 839.835 242.300 N 0
7035 975.045 246.500 N 0
7095 236.775 1122.900 N 0
7155 1042.690 1272.700 N 0
7215 835.965 685.900 N 0
7275 372.055 1269.900 N 0
7335 33.855 835.700 S 0
7395 975.045 841.500 N 0
7455 564.715 827.500 N 0
7515 636.845 978.500 N 0
7575 569.205 223.900 N 0
7635 907.405 230.900 N 0
7695 704.485 75.500 N 0
7755 304.345 1122.900 N 0
7815 845.465 1117.300 N 0
7875 704.485 978.500 N 0
7935 507.265 1125.700 N 0
7995 101.875 825.900 S 0
8055 907.405 964.500 N 0
8115 699.925 830.300 N 0
8175 569.205 978.500 N 0
8235 433.995 361.300 N 0
8295 704.485 373.900 N 0
8355 772.125 75.500 N 0
8415 569.205 366.900 S 0
8475 673.599 673.542 N 0
8510 673.479 673.526 N 0
8530 673.404 673.378 N 0
8550 673.390 673.402 N 0
8564 673.494 673.549 N 0
8586 673.401 673.372 N 0
8618 673.758 673.541 N 0
8662 673.704 673.365 N 0
8703 673.392 673.439 N 0
8733 673.530 673.323 N 0
8739 673.527 673.340 N 0
8746 673.523 673.361 N 0
8749 673.521 673.385 N 0
8753 673.462 673.370 N 0
8756 673.576 673.475 N 0
8762 673.449 673.458 N 0
8770 673.460 673.479 N 0
8775 673.415 673.423 N 0
8786 673.467 673.352 N 0
8792 673.565 673.506 N 0
8801 673.528 673.359 N 0
8805 673.520 673.387 N 0
8808 673.454 673.469 N 0
8825 673.527 673.342 N 0
8837 673.459 673.410 N 0
8845 673.508 673.514 N 0
8865 673.458 673.489 N 0
8869 673.501 673.462 N 0
8878 673.480 673.325 N 0
8883 673.474 673.484 N 0
8890 673.523 673.387 N 0
8894 673.525 673.387 N 0
8897 673.506 673.318 N 0
8901 673.580 673.325 N 0
8906 673.584 673.389 N 0
8915 673.430 673.419 N 0
8922 673.429 673.356 N 0
8928 673.464 673.546 N 0
8966 673.406 673.364 N 0
8985 673.718 673.445 N 0
9030 673.518 673.592 N 0
9066 673.419 673.338 N 0
9098 673.439 673.538 N 0
9149 673.511 673.563 N 0
9236 673.566 673.623 N 0
9283 673.568 673.193 N 0
9328 673.597 673.229 N 0
9357 673.613 673.543 N 0
9392 673.640 673.312 N 0
9404 673.468 673.520 N 0
9425 673.708 673.431 N 0
9445 673.663 673.463 N 0
9455 673.519 673.542 N 0
9473 673.474 673.548 N 0
9489 673.574 673.305 N 0
9530 673.677 673.481 N 0
9550 673.597 673.537 N 0
9568 673.452 673.440 N 0
9580 673.575 673.486 N 0
9587 673.406 673.419 N 0
9602 673.608 673.505 N 0
9608 673.602 673.290 N 0
9617 673.430 673.421 N 0
9624 673.574 673.306 N 0
9636 673.562 673.553 N 0
9657 673.640 673.490 N 0
9664 673.490 673.518 N 0
9670 673.490 673.520 N 0
9680 673.485 673.480 N 0
9686 673.568 673.505 N 0
9712 673.630 673.468 N 0
9720 673.578 673.462 N 0
9726 673.475 673.511 N 0
9732 673.446 673.408 N 0
9738 673.467 673.444 N 0
9745 673.438 673.422 N 0
9752 673.502 673.532 N 0
9771 673.487 673.314 N 0
9780 673.494 673.446 N 0
9794 673.641 673.514 N 0
9818 673.498 673.535 N 0
9828 673.425 673.417 N 0
9836 673.687 673.418 N 0
9856 673.513 673.277 N 0
9872 673.474 673.311 N 0
9880 673.484 673.364 N 0
9888 673.649 673.450 N 0
9902 673.585 673.514 N 0
9911 673.469 673.516 N 0
9925 673.609 673.322 N 0
9932 673.579 673.462 N 0
9955 673.546 673.267 N 0
9964 673.475 673.297 N 0
9969 673.438 673.423 N 0
9983 673.493 673.448 N 0
9995 673.615 673.520 N 0
10010 673.571 673.493 N 0
10021 673.637 673.297 N 0
10027 673.426 673.368 N 0
10033 673.491 673.488 N 0
10040 673.624 673.430 N 0
10045 673.527 673.361 N 0
10050 673.461 673.331 N 0
10059 673.483 673.386 N 0
10072 673.625 673.390 N 0
10079 673.579 673.522 N 0
10087 673.458 673.498 N 0
10107 673.563 673.517 N 0
10120 673.564 673.270 N 0
10127 673.588 673.508 N 0
10154 673.445 673.390 N 0
10175 673.459 673.388 N 0
10191 673.589 673.386 N 0
10215 673.583 673.433 N 0
10231 673.445 673.409 N 0
10247 673.448 673.373 N 0
10258 673.665 673.498 N 0
10295 673.684 673.396 N 0
10316 673.687 673.384 N 0
10340 673.494 673.284 N 0
10359 673.636 673.284 N 0
10383 673.545 673.282 N 0
10396 673.671 673.442 N 0
10416 673.546 673.286 N 0
10428 673.530 673.417 N 0
10434 673.576 673.526 N 0
10468 673.586 673.343 N 0
10474 673.605 673.279 N 0
10478 673.688 673.397 N 0
10492 673.707 673.385 N 0
10512 673.403 673.409 N 0
10542 673.526 673.388 N 0
10547 673.532 673.324 N 0
10577 673.510 673.484 N 0
10599 673.523 673.512 N 0
10616 673.578 673.315 N 0
10624 673.530 673.341 N 0
10637 673.698 673.366 N 0
10667 673.616 673.308 N 0
10670 673.651 673.450 N 0
10687 673.675 673.394 N 0
10690 673.588 673.413 N 0
10704 673.580 673.326 N 0
10716 673.530 673.342 N 0
10725 673.680 673.395 N 0
10749 673.582 673.327 N 0
10767 673.437 673.376 N 0
10778 673.548 673.278 N 0
10782 673.527 673.389 N 0
10789 673.596 673.530 N 0
10808 673.420 673.442 N 0
10821 673.441 673.313 N 0
10827 673.489 673.313 N 0
10838 673.537 673.452 N 0
10847 673.530 673.326 N 0
10853 673.463 673.429 N 0
10868 673.527 673.363 N 0
10885 673.532 673.343 N 0
10891 673.548 673.272 N 0
10904 673.641 673.441 N 0
10911 673.588 673.365 N 0
10920 673.413 673.324 N 0
10950 673.470 673.494 N 0
10974 673.626 673.390 N 0
11000 673.452 673.279 N 0
11021 673.585 673.515 N 0
11034 673.458 673.390 N 0
11047 673.460 673.410 N 0
11056 673.423 673.319 N 0
11078 673.581 673.463 N 0
11101 673.443 673.305 N 0
11121 673.646 673.301 N 0
11144 673.456 673.314 N 0
11160 673.646 673.427 N 0
11177 673.647 673.427 N 0
11185 673.624 673.317 N 0
11193 673.604 673.523 N 0
11201 673.427 673.454 N 0
11209 673.582 673.464 N 0
11225 673.661 673.390 N 0
11231 673.440 673.324 N 0
11236 673.490 673.431 N 0
11242 673.459 673.390 N 0
11246 673.472 673.267 N 0
11263 673.589 673.388 N 0
11270 673.584 673.463 N 0
11280 673.532 673.361 N 0
11285 673.650 673.485 N 0
11309 673.534 673.416 N 0
11323 673.535 673.434 N 0
11328 673.535 673.435 N 0
11342 673.494 673.496 N 0
11357 673.642 673.303 N 0
11361 673.539 673.451 N 0
11365 673.420 673.404 N 0
11373 673.584 673.327 N 0
11381 673.740 673.469 N 0
11413 673.664 673.446 N 0
11431 673.585 673.433 N 0
11435 673.532 673.362 N 0
11443 673.449 673.426 N 0
11472 673.430 673.379 N 0
11480 673.484 673.387 N 0
11505 673.530 673.366 N 0
11509 673.543 673.495 N 0
11525 673.501 673.464 N 0
11545 673.536 673.363 N 0
11553 673.636 673.481 N 0
11579 673.631 673.489 N 0
11608 673.441 673.324 N 0
11639 673.589 673.365 N 0
11644 673.609 673.472 N 0
11665 673.675 673.337 N 0
11677 673.590 673.413 N 0
11686 673.484 673.365 N 0
11691 673.528 673.389 N 0
11695 673.549 673.253 N 0
11719 673.592 673.364 N 0
11725 673.588 673.416 N 0
11729 673.604 673.547 N 0
11766 673.560 673.528 N 0
11780 673.659 673.457 N 0
11800 673.536 673.364 N 0
11814 673.646 673.463 N 0
11857 673.469 673.443 N 0
11870 673.624 673.366 N 0
11881 673.579 673.475 N 0
11888 673.626 673.412 N 0
11900 673.461 673.390 N 0
11913 673.424 673.381 N 0
11921 673.627 673.507 N 0
11934 673.535 673.415 N 0
11942 673.484 673.410 N 0
11947 673.440 673.362 N 0
11952 673.577 673.477 N 0
11983 673.635 673.315 N 0
11991 673.591 673.508 N 0
12013 673.529 673.389 N 0
12018 673.584 673.284 N 0
12021 673.610 673.472 N 0
12029 673.535 673.324 N 0
12037 673.439 673.422 N 0
12052 673.438 673.376 N 0
12068 673.457 673.453 N 0
12077 673.486 673.410 N 0
12082 673.628 673.306 N 0
12093 673.449 673.374 N 0
12104 673.469 673.320 N 0
12145 673.513 673.484 N 0
12158 673.526 673.517 N 0
12167 673.594 673.265 N 0
12171 673.436 673.353 N 0
12180 673.543 673.517 N 0
12185 673.585 673.450 N 0
12210 673.486 673.364 N 0
12232 673.529 673.276 N 0
12237 673.521 673.252 N 0
12266 673.624 673.368 N 0
12302 673.431 673.341 N 0
12309 673.431 673.324 N 0
12318 673.461 673.391 N 0
12325 673.589 673.514 N 0
12352 673.674 673.322 N 0
12366 673.699 673.355 N 0
12376 673.462 673.464 N 0
12398 673.496 673.496 N 0
12405 673.421 673.310 N 0
12416 673.487 673.480 N 0
12458 673.456 673.514 N 0
12472 673.523 673.250 N 0
12518 673.595 673.503 N 0
12543 673.604 673.290 N 0
12579 673.486 673.505 N 0
12586 673.514 673.484 N 0
12598 673.392 673.395 N 0
12604 673.507 673.285 N 0
12607 673.601 673.310 N 0
12614 673.469 673.445 N 0
12647 673.446 673.521 N 0
12658 673.442 673.437 N 0
12666 673.538 673.477 N 0
12675 673.591 673.509 N 0
12684 673.521 673.506 N 0
12705 673.506 673.290 N 0
12712 673.608 673.272 N 0
12722 673.557 673.543 N 0
12762 673.446 673.409 N 0
12803 673.412 673.422 N 0
12810 673.535 673.312 N 0
12817 673.535 673.437 N 0
12835 673.592 673.415 N 0
12844 673.535 673.325 N 0
12854 673.607 673.520 N 0
12876 673.543 673.476 N 0
12899 673.424 673.393 N 0
12903 673.650 673.534 N 0
12967 673.531 673.270 N 0
12986 673.679 673.381 N 0
13003 673.398 673.538 N 0
13085 673.628 673.390 N 0
13091 673.409 673.421 N 0
13125 673.565 673.273 N 0
13153 673.623 673.318 N 0
13165 673.514 673.263 N 0
13195 673.623 673.281 N 0
13205 673.628 673.365 N 0
13224 673.659 673.458 N 0
13235 673.418 673.334 N 0
13246 673.482 673.390 N 0
13253 673.462 673.410 N 0
13283 673.400 673.440 N 0
13288 673.543 673.477 N 0
13302 673.586 673.344 N 0
13316 673.493 673.432 N 0
13350 673.660 673.424 N 0
13360 673.531 673.390 N 0
13369 673.500 673.504 N 0
13393 673.482 673.325 N 0
13402 673.535 673.417 N 0
13406 673.519 673.500 N 0
13412 673.486 673.367 N 0
13418 673.616 673.335 N 0
13431 673.588 673.390 N 0
13440 673.587 673.432 N 0
13447 673.503 673.509 N 0
13471 673.638 673.508 N 0
13485 673.592 673.367 N 0
13518 673.674 673.357 N 0
13525 673.460 673.490 N 0
13539 673.628 673.413 N 0
13550 673.591 673.390 N 0
13555 673.626 673.370 N 0
13569 673.461 673.479 N 0
13589 673.650 673.390 N 0
13605 673.474 673.459 N 0
13610 673.631 673.467 N 0
13648 673.532 673.390 N 0
13663 673.537 673.313 N 0
13672 673.499 673.446 N 0
13679 673.541 673.479 N 0
13690 673.516 673.261 N 0
13710 673.548 673.282 N 0
13716 673.640 673.442 N 0
13735 673.517 673.259 N 0
13766 673.489 673.366 N 0
13792 673.611 673.275 N 0
13803 673.661 673.393 N 0
13814 673.456 673.344 N 0
13846 673.628 673.370 N 0
13860 673.530 673.253 N 0
13907 673.649 673.410 N 0
13918 673.509 673.268 N 0
13950 673.463 673.391 N 0
13961 673.593 673.390 N 0
13970 673.586 673.464 N 0
13976 673.549 673.282 N 0
13992 673.636 673.456 N 0
13998 673.573 673.493 N 0
14009 673.539 673.313 N 0
14036 673.541 673.488 N 0
14046 673.594 673.414 N 0
14056 673.602 673.489 N 0
14070 673.592 673.418 N 0
14082 673.623 673.350 N 0
14087 673.410 673.479 N 0
14120 673.497 673.448 N 0
14128 673.535 673.328 N 0
14144 673.645 673.335 N 0
14167 673.541 673.364 N 0
14178 673.586 673.436 N 0
14182 673.545 673.508 N 0
14204 673.617 673.335 N 0
14217 673.538 673.367 N 0
14222 673.482 673.499 N 0
14235 673.630 673.289 N 0
14251 673.629 673.367 N 0
14257 673.449 673.474 N 0
14270 673.596 673.416 N 0
14284 673.578 673.526 N 0
14304 673.540 673.313 N 0
14315 673.509 673.284 N 0
14336 673.541 673.326 N 0
14353 673.673 673.359 N 0
14362 673.615 673.255 N 0
14392 673.399 673.445 N 0
14397 673.574 673.307 N 0
14404 673.701 673.357 N 0
14430 673.549 673.244 N 0
14447 673.584 673.346 N 0
14456 673.460 673.547 N 0
14498 673.537 673.436 N 0
14503 673.474 673.459 N 0
14516 673.561 673.239 N 0
14543 673.568 673.506 N 0
14574 673.469 673.353 N 0
14613 673.522 673.506 N 0
14620 673.506 673.290 N 0
14638 673.434 673.328 N 0
14648 673.476 673.311 N 0
14663 673.485 673.389 N 0
14671 673.484 673.413 N 0
14678 673.545 673.531 N 0
14712 673.414 673.383 N 0
14730 673.464 673.410 N 0
14751 673.590 673.391 N 0
14757 673.511 673.519 N 0
14765 673.540 673.435 N 0
14771 673.625 673.430 N 0
14810 673.585 673.327 N 0
14816 673.584 673.450 N 0
14822 673.542 673.365 N 0
14829 673.574 673.494 N 0
14836 673.462 673.413 N 0
14850 673.591 673.368 N 0
14856 673.457 673.344 N 0
14866 673.591 673.344 N 0
14879 673.542 673.452 N 0
14892 673.468 673.475 N 0
14913 673.577 673.306 N 0
14919 673.494 673.524 N 0
14930 673.602 673.490 N 0
14964 673.504 673.463 N 0
14976 673.540 673.437 N 0
14984 673.587 673.451 N 0
14988 673.436 673.408 N 0
14998 673.517 673.493 N 0
15028 673.488 673.505 N 0
15034 673.505 673.319 N 0
15057 673.597 673.497 N 0
15061 673.649 673.391 N 0
15079 673.579 673.477 N 0
15090 673.533 673.535 N 0
15113 673.496 673.496 N 0
15134 673.529 673.525 N 0
15142 673.467 673.309 N 0
15161 673.488 673.294 N 0
15168 673.600 673.527 N 0
15207 673.476 673.459 N 0
15230 673.603 673.252 N 0
15265 673.624 673.432 N 0
15276 673.497 673.332 N 0
15297 673.563 673.520 N 0
15324 673.388 673.440 N 0
15343 673.503 673.464 N 0
15370 673.542 673.326 N 0
15379 673.653 673.495 N 0
15397 673.545 673.294 N 0
15433 673.487 673.412 N 0
15449 673.646 673.321 N 0
15465 673.544 673.452 N 0
15475 673.545 673.517 N 0
15479 673.595 673.391 N 0
15486 673.589 673.436 N 0
15493 673.544 673.313 N 0
15517 673.491 673.347 N 0
15524 673.592 673.434 N 0
15538 673.591 673.345 N 0
15547 673.543 673.315 N 0
15552 673.625 673.319 N 0
15584 673.537 673.342 N 0
15614 673.538 673.329 N 0
15620 673.476 673.287 N 0
15638 673.544 673.437 N 0
15657 673.630 673.390 N 0
15665 673.598 673.497 N 0
15672 673.600 673.496 N 0
15721 673.631 673.502 N 0
15737 673.534 673.537 N 0
15755 673.656 673.340 N 0
15766 673.500 673.295 N 0
15804 673.612 673.473 N 0
15811 673.503 673.466 N 0
15820 673.477 673.270 N 0
15842 673.510 673.285 N 0
15867 673.654 673.306 N 0
15883 673.617 673.308 N 0
15912 673.597 673.366 N 0
15918 673.539 673.418 N 0
15955 673.560 673.258 N 0
15966 673.483 673.326 N 0
15995 673.573 673.299 N 0
16012 673.648 673.371 N 0
16024 673.517 673.493 N 0
16033 673.679 673.340 N 0
16058 673.441 673.341 N 0
16070 673.543 673.299 N 0
16090 673.441 673.362 N 0
16105 673.558 673.536 N 0
16134 673.595 673.391 N 0
16148 673.667 673.339 N 0
16158 673.489 673.366 N 0
16163 673.536 673.344 N 0
16171 673.607 673.530 N 0
16183 673.582 673.545 N 0
16229 673.583 673.329 N 0
16248 673.583 673.263 N 0
16259 673.533 673.267 N 0
16289 673.513 673.486 N 0
16292 673.597 673.417 N 0
16298 673.544 673.327 N 0
16304 673.571 673.500 N 0
16322 673.536 673.345 N 0
16329 673.646 673.336 N 0
16338 673.698 673.398 N 0
16354 673.463 673.331 N 0
16362 673.685 673.397 N 0
16369 673.544 673.315 N 0
16379 673.567 673.276 N 0
16409 673.596 673.391 N 0
16414 673.693 673.416 N 0
16424 673.588 673.348 N 0
16431 673.545 673.528 N 0
16460 673.669 673.391 N 0
16476 673.586 673.466 N 0
16503 673.644 673.356 N 0
16513 673.629 673.391 N 0
16519 673.486 673.390 N 0
16524 673.539 673.465 N 0
16532 673.452 673.358 N 0
16556 673.544 673.487 N 0
16578 673.637 673.342 N 0
16621 673.481 673.470 N 0
16633 673.631 673.330 N 0
16690 673.471 673.276 N 0
16713 673.661 673.424 N 0
16728 673.497 673.450 N 0
16733 673.430 673.356 N 0
16738 673.446 673.349 N 0
16778 673.499 673.332 N 0
16783 673.544 673.502 N 0
16807 673.489 673.268 N 0
16830 673.669 673.393 N 0
16852 673.586 673.284 N 0
16865 673.489 673.315 N 0
16885 673.476 673.338 N 0
16908 673.559 673.533 N 0
16923 673.590 673.348 N 0
16933 673.605 673.291 N 0
16959 673.598 673.393 N 0
16964 673.598 673.394 N 0
16977 673.490 673.413 N 0
16996 673.625 673.545 N 0
17034 673.505 673.509 N 0
17044 673.593 673.347 N 0
17051 673.651 673.347 N 0
17066 673.492 673.347 N 0
17079 673.498 673.497 N 0
17098 673.615 673.459 N 0
17121 673.542 673.304 N 0
17132 673.523 673.506 N 0
17146 673.405 673.433 N 0
17175 673.543 673.365 N 0
17181 673.596 673.279 N 0
17199 673.544 673.437 N 0
17210 673.660 673.309 N 0
17237 673.679 673.381 N 0
17310 673.459 673.344 N 0
17340 673.619 673.335 N 0
17350 673.620 673.336 N 0
17360 673.399 673.486 N 0
17414 673.470 673.445 N 0
17434 673.542 673.345 N 0
17439 673.595 673.368 N 0
17451 673.464 673.331 N 0
17464 673.679 673.420 N 0
17482 673.500 673.332 N 0
17490 673.501 673.448 N 0
17507 673.491 673.366 N 0
17516 673.660 673.393 N 0
17539 673.587 673.329 N 0
17544 673.468 673.321 N 0
17565 673.506 673.466 N 0
17603 673.659 673.472 N 0
17614 673.544 673.367 N 0
17619 673.628 673.414 N 0
17640 673.558 673.538 N 0
17674 673.534 673.390 N 0
17710 673.606 673.541 N 0
17737 673.642 673.313 N 0
17751 673.491 673.315 N 0
17758 673.544 673.299 N 0
17786 673.588 673.451 N 0
17792 673.475 673.339 N 0
17811 673.487 673.415 N 0
17821 673.503 673.450 N 0
17839 673.544 673.328 N 0
17850 673.570 673.507 N 0
17870 673.603 673.260 N 0
17879 673.616 673.461 N 0
17916 673.576 673.266 N 0
17922 673.629 673.513 N 0
17944 673.653 673.449 N 0
17972 673.632 673.521 N 0
17989 673.603 673.393 N 0
18002 673.429 673.498 N 0
18042 673.617 673.275 N 0
18051 673.648 673.427 N 0
18065 673.557 673.547 N 0
18093 673.565 673.512 N 0
18126 673.540 673.388 N 0
18138 673.486 673.391 N 0
18151 673.589 673.260 N 0
18174 673.611 673.322 N 0
18178 673.691 673.361 N 0
18181 673.502 673.276 N 0
18188 673.488 673.370 N 0
18193 673.451 673.459 N 0
18201 673.456 673.470 N 0
18213 673.620 673.447 N 0
18222 673.525 673.287 N 0
18234 673.546 673.438 N 0
18241 673.530 673.528 N 0
18255 673.418 673.449 N 0
18289 673.593 673.349 N 0
18294 673.656 673.325 N 0
18305 673.710 673.375 N 0
18336 673.549 673.249 N 0
18357 673.509 673.286 N 0
18400 673.688 673.359 N 0
18424 673.630 673.393 N 0
18453 673.519 673.297 N 0
18473 673.571 673.295 N 0
18483 673.544 673.330 N 0
18505 673.543 673.440 N 0
18529 673.659 673.375 N 0
18561 673.653 673.469 N 0
18567 673.633 673.391 N 0
18606 673.509 673.529 N 0
18614 673.424 673.340 N 0
18630 673.449 673.309 N 0
18659 673.539 673.346 N 0
18669 673.692 673.485 N 0
18732 673.503 673.265 N 0
18792 673.602 673.310 N 0
18800 673.405 673.394 N 0
18810 673.542 673.454 N 0
18821 673.651 673.452 N 0
18830 673.541 673.466 N 0
18835 673.470 673.320 N 0
18844 673.549 673.267 N 0
18881 673.606 673.481 N 0
18899 673.440 673.425 N 0
18913 673.500 673.296 N 0
18938 673.549 673.264 N 0
18961 673.596 673.370 N 0
18973 673.561 673.258 N 0
19012 673.650 673.486 N 0
19033 673.562 673.263 N 0
19041 673.587 673.331 N 0
19056 673.404 673.341 N 0
19070 673.688 673.440 N 0
19100 673.632 673.394 N 0
19112 673.543 673.346 N 0
19126 673.596 673.419 N 0
19138 673.649 673.412 N 0
19166 673.641 673.473 N 0
19181 673.706 673.411 N 0
19207 673.664 673.446 N 0
19216 673.661 673.352 N 0
19231 673.492 673.433 N 0
19237 673.651 673.411 N 0
19246 673.583 673.535 N 0
19253 673.592 673.351 N 0
19259 673.507 673.466 N 0
19266 673.604 673.312 N 0
19283 673.661 673.334 N 0
19298 673.546 673.290 N 0
19312 673.648 673.371 N 0
19322 673.544 673.495 N 0
19327 673.435 673.451 N 0
19361 673.570 673.290 N 0
19366 673.588 673.329 N 0
19370 673.443 673.481 N 0
19409 673.542 673.479 N 0
19430 673.468 673.290 N 0
19444 673.600 673.395 N 0
19456 673.492 673.413 N 0
19461 673.443 673.313 N 0
19481 673.563 673.521 N 0
19485 673.624 673.433 N 0
19492 673.464 673.371 N 0
19499 673.681 673.314 N 0
19522 673.568 673.283 N 0
19551 673.545 673.454 N 0
19562 673.442 673.362 N 0
19579 673.672 673.498 N 0
19586 673.545 673.518 N 0
19623 673.631 673.412 N 0
19636 673.424 673.479 N 0
19641 673.636 673.305 N 0
19646 673.536 673.391 N 0
19661 673.667 673.434 N 0
19680 673.618 673.308 N 0
19695 673.659 673.322 N 0
19730 673.590 673.331 N 0
19749 673.488 673.391 N 0
19756 673.428 673.455 N 0
19767 673.646 673.464 N 0
19778 673.544 673.368 N 0
19811 673.525 673.512 N 0
19815 673.549 673.260 N 0
19839 673.578 673.486 N 0
19880 673.567 673.279 N 0
19888 673.421 673.370 N 0
19905 673.494 673.347 N 0
19919 673.590 673.435 N 0
19926 673.565 673.270 N 0
19941 673.648 673.373 N 0
19948 673.626 673.319 N 0
19961 673.466 673.429 N 0
19986 673.427 673.313 N 0
20020 673.625 673.350 N 0
20056 673.469 673.353 N 0
20109 673.629 673.369 N 0
20121 673.664 673.363 N 0
20137 673.582 673.477 N 0
20147 673.632 673.395 N 0
20169 673.437 673.478 N 0
20183 673.542 673.305 N 0
20194 673.606 673.482 N 0
20209 673.416 673.440 N 0
20250 673.620 673.447 N 0
20270 673.636 673.496 N 0
20282 673.653 673.451 N 0
20310 673.449 673.474 N 0
20326 673.487 673.480 N 0
20345 673.682 673.372 N 0
20362 673.672 673.443 N 0
20372 673.583 673.478 N 0
20393 673.619 673.505 N 0
20423 673.630 673.371 N 0
20430 673.594 673.523 N 0
20466 673.642 673.443 N 0
20482 673.491 673.414 N 0
20491 673.573 673.533 N 0
20509 673.544 673.466 N 0
20531 673.494 673.306 N 0
20543 673.503 673.296 N 0
20578 673.622 673.485 N 0
20590 673.500 673.451 N 0
20595 673.490 673.391 N 0
20606 673.419 673.449 N 0
20633 673.663 673.464 N 0
20636 673.402 673.417 N 0
20640 673.545 673.344 N 0
20644 673.621 673.448 N 0
20647 673.632 673.371 N 0
20651 673.495 673.433 N 0
20658 673.425 673.460 N 0
20661 673.507 673.475 N 0
20664 673.547 673.367 N 0
20667 673.446 673.391 N 0
20672 673.549 673.369 N 0
20675 673.593 673.436 N 0
20678 673.535 673.394 N 0
20681 673.544 673.488 N 0
20685 673.543 673.391 N 0
20688 673.587 673.465 N 0
20692 673.491 673.417 N 0
20696 673.629 673.415 N 0
20702 673.672 673.326 N 0
20725 673.602 673.395 N 0
20728 673.689 673.397 N 0
20739 673.494 673.417 N 0
20744 673.675 673.409 N 0
20752 673.650 673.393 N 0
20767 673.669 673.394 N 0
20787 673.662 673.393 N 0
20807 673.627 673.432 N 0
20827 673.542 673.417 N 0
20831 673.545 673.455 N 0
20837 673.580 673.316 N 0
20852 673.545 673.478 N 0
20860 673.542 673.418 N 0
20863 673.597 673.349 N 0
20866 673.577 673.307 N 0
20875 673.542 673.467 N 0
20880 673.538 673.395 N 0
20883 673.540 673.395 N 0
20886 673.606 673.292 N 0
20900 673.544 673.393 N 0
20903 673.543 673.397 N 0
20906 673.617 673.461 N 0
20914 673.544 673.397 N 0
20917 673.618 673.506 N 0
20943 673.544 673.347 N 0
20952 673.548 673.394 N 0
20959 673.537 673.421 N 0
20962 673.435 673.391 N 0
20970 673.544 673.419 N 0
20973 673.593 673.437 N 0
20977 673.687 673.366 N 0
20992 673.550 673.394 N 0
20995 673.545 673.399 N 0
20998 673.552 673.395 N 0
21001 673.398 673.416 N 0
21005 673.682 673.364 N 0
21028 673.405 673.385 N 0
21032 673.651 673.348 N 0
21053 673.701 673.390 N 0
21062 673.552 673.397 N 0
21065 673.544 673.420 N 0
21068 673.550 673.400 N 0
21071 673.675 673.410 N 0
21077 673.495 673.416 N 0
21080 673.491 673.391 N 0
21083 673.492 673.368 N 0
21086 673.500 673.452 N 0
21090 673.496 673.434 N 0
21093 673.595 673.438 N 0
# Placement file for Circuit Training
# Source input file(s) : ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/netlist.pb.txt
# This file : ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/initial.plc
# Date : 2022-09-20 11:30:06
# Columns : 23 Rows : 28
# Width : 1347.100 Height : 1346.800
# Area : 1506097.566312155
# Wirelength : 3610985.229
# Wirelength cost : 0.0526
# Congestion cost : 0.7721
# Density cost : 0.7209
# Project : circuit_training
# Block : unset_block
# Routes per micron, hor : 11.285 ver : 12.605
# Routes used by macros, hor : 7.143 ver : 8.339
# Smoothing factor : 2
# Overlap threshold : 0.004
#
#
#
# Counts of node types:
# HARD_MACROs : 133
# HARD_MACRO_PINs : 7847
# MACROs : 943
# MACRO_PINs : 19658
# PORTs : 495
# SOFT_MACROs : 810
# SOFT_MACRO_PINs : 11811
# STDCELLs : 0
#
# User comments:
# Original source netlist with standard cells: /home/zf4_projects/DREAMPlace/sakundu/ABK_MP/08162022_flow_scripts/MacroPlacement/Flows/NanGate45/ariane133/run-20220816-035413/flow2_1.3/ariane.pb.txt
# Groups file: ./output_ariane_NanGate45/23cols_28rows/g500_ub5_nruns10_c5_r3_v3_rc1/groups.final
# worst 10 spread
# grp: 744 - spread: 278916.7518893204
# grp: 50 - spread: 268009.6376835485
# grp: 336 - spread: 223800.4868365636
# grp: 535 - spread: 207184.36226282385
# grp: 505 - spread: 197871.97286953646
# grp: 586 - spread: 190713.73374938426
# grp: 756 - spread: 184033.9279079139
# grp: 532 - spread: 173094.29808680012
# grp: 773 - spread: 170707.79035165644
# grp: 347 - spread: 168578.0558490756
#
#
# node_index x y orientation fixed
0 0.035 232.470 _ 0
1 0.035 235.130 _ 0
2 0.035 237.790 _ 0
3 0.035 240.450 _ 0
4 0.035 243.110 _ 0
5 0.035 245.770 _ 0
6 0.035 248.430 _ 0
7 0.035 251.230 _ 0
8 0.035 253.890 _ 0
9 0.035 256.550 _ 0
10 0.035 259.210 _ 0
11 0.035 261.870 _ 0
12 0.035 264.530 _ 0
13 0.035 267.190 _ 0
14 0.035 269.990 _ 0
15 0.035 272.650 _ 0
16 0.035 275.310 _ 0
17 0.035 277.970 _ 0
18 0.035 280.630 _ 0
19 0.035 283.290 _ 0
20 0.035 285.950 _ 0
21 0.035 288.750 _ 0
22 0.035 291.410 _ 0
23 0.035 294.070 _ 0
24 0.035 296.730 _ 0
25 0.035 299.390 _ 0
26 0.035 302.050 _ 0
27 0.035 304.710 _ 0
28 0.035 307.510 _ 0
29 0.035 310.170 _ 0
30 0.035 312.830 _ 0
31 0.035 315.490 _ 0
32 0.035 318.150 _ 0
33 0.035 320.810 _ 0
34 0.035 323.470 _ 0
35 0.035 326.270 _ 0
36 0.035 328.930 _ 0
37 0.035 331.590 _ 0
38 0.035 334.250 _ 0
39 0.035 336.910 _ 0
40 0.035 339.570 _ 0
41 0.035 342.230 _ 0
42 0.035 345.030 _ 0
43 0.035 347.690 _ 0
44 0.035 350.350 _ 0
45 0.035 353.010 _ 0
46 0.035 355.670 _ 0
47 0.035 358.330 _ 0
48 0.035 361.130 _ 0
49 0.035 363.790 _ 0
50 0.035 366.450 _ 0
51 0.035 369.110 _ 0
52 0.035 371.770 _ 0
53 0.035 374.430 _ 0
54 0.035 377.090 _ 0
55 0.035 379.890 _ 0
56 0.035 382.550 _ 0
57 0.035 385.210 _ 0
58 0.035 387.870 _ 0
59 0.035 390.530 _ 0
60 0.035 393.190 _ 0
61 0.035 395.850 _ 0
62 0.035 398.650 _ 0
63 0.035 401.310 _ 0
64 0.035 403.970 _ 0
65 0.035 406.630 _ 0
66 0.035 409.290 _ 0
67 0.035 411.950 _ 0
68 0.035 414.610 _ 0
69 0.035 417.410 _ 0
70 0.035 420.070 _ 0
71 0.035 422.730 _ 0
72 0.035 425.390 _ 0
73 0.035 428.050 _ 0
74 0.035 430.710 _ 0
75 0.035 433.370 _ 0
76 0.035 436.170 _ 0
77 0.035 438.830 _ 0
78 0.035 441.490 _ 0
79 0.035 444.150 _ 0
80 0.035 446.810 _ 0
81 0.035 449.470 _ 0
82 0.035 452.130 _ 0
83 0.035 454.930 _ 0
84 0.035 457.590 _ 0
85 0.035 460.250 _ 0
86 0.035 462.910 _ 0
87 0.035 465.570 _ 0
88 0.035 468.230 _ 0
89 0.035 470.890 _ 0
90 0.035 473.690 _ 0
91 0.035 476.350 _ 0
92 0.035 479.010 _ 0
93 0.035 481.670 _ 0
94 0.035 484.330 _ 0
95 0.035 486.990 _ 0
96 0.035 489.790 _ 0
97 0.035 492.450 _ 0
98 0.035 495.110 _ 0
99 0.035 497.770 _ 0
100 0.035 500.430 _ 0
101 0.035 503.090 _ 0
102 0.035 505.750 _ 0
103 0.035 508.550 _ 0
104 0.035 511.210 _ 0
105 0.035 513.870 _ 0
106 0.035 516.530 _ 0
107 0.035 519.190 _ 0
108 0.035 521.850 _ 0
109 0.035 524.510 _ 0
110 0.035 527.310 _ 0
111 0.035 529.970 _ 0
112 0.035 532.630 _ 0
113 0.035 535.290 _ 0
114 0.035 537.950 _ 0
115 0.035 540.610 _ 0
116 0.035 543.270 _ 0
117 0.035 546.070 _ 0
118 0.035 548.730 _ 0
119 0.035 551.390 _ 0
120 0.035 554.050 _ 0
121 0.035 556.710 _ 0
122 0.035 559.370 _ 0
123 0.035 562.030 _ 0
124 0.035 564.830 _ 0
125 0.035 567.490 _ 0
126 0.035 570.150 _ 0
127 0.035 572.810 _ 0
128 0.035 575.470 _ 0
129 0.035 578.130 _ 0
130 0.035 580.790 _ 0
131 0.035 583.590 _ 0
132 0.035 586.250 _ 0
133 0.035 588.910 _ 0
134 0.035 591.570 _ 0
135 0.035 594.230 _ 0
136 0.035 596.890 _ 0
137 0.035 599.550 _ 0
138 0.035 602.350 _ 0
139 0.035 605.010 _ 0
140 0.035 607.670 _ 0
141 0.035 610.330 _ 0
142 0.035 612.990 _ 0
143 0.035 615.650 _ 0
144 0.035 618.450 _ 0
145 0.035 621.110 _ 0
146 0.035 623.770 _ 0
147 0.035 626.430 _ 0
148 0.035 629.090 _ 0
149 0.035 631.750 _ 0
150 0.035 634.410 _ 0
151 0.035 637.210 _ 0
152 0.035 639.870 _ 0
153 0.035 642.530 _ 0
154 0.035 645.190 _ 0
155 0.035 647.850 _ 0
156 0.035 650.510 _ 0
157 0.035 653.170 _ 0
158 0.035 655.970 _ 0
159 0.035 658.630 _ 0
160 0.035 661.290 _ 0
161 0.035 663.950 _ 0
162 0.035 666.610 _ 0
163 0.035 669.270 _ 0
164 0.035 671.930 _ 0
165 0.035 674.730 _ 0
166 0.035 677.390 _ 0
167 0.035 680.050 _ 0
168 0.035 682.710 _ 0
169 0.035 685.370 _ 0
170 0.035 688.030 _ 0
171 0.035 690.690 _ 0
172 0.035 693.490 _ 0
173 0.035 696.150 _ 0
174 0.035 698.810 _ 0
175 0.035 701.470 _ 0
176 0.035 704.130 _ 0
177 0.035 706.790 _ 0
178 0.035 709.450 _ 0
179 0.035 712.250 _ 0
180 0.035 714.910 _ 0
181 0.035 717.570 _ 0
182 0.035 720.230 _ 0
183 0.035 722.890 _ 0
184 0.035 725.550 _ 0
185 0.035 728.210 _ 0
186 0.035 731.010 _ 0
187 0.035 733.670 _ 0
188 0.035 736.330 _ 0
189 0.035 738.990 _ 0
190 0.035 741.650 _ 0
191 0.035 744.310 _ 0
192 0.035 747.110 _ 0
193 0.035 749.770 _ 0
194 0.035 752.430 _ 0
195 0.035 755.090 _ 0
196 0.035 757.750 _ 0
197 0.035 760.410 _ 0
198 0.035 763.070 _ 0
199 0.035 765.870 _ 0
200 0.035 768.530 _ 0
201 0.035 771.190 _ 0
202 0.035 773.850 _ 0
203 0.035 776.510 _ 0
204 0.035 779.170 _ 0
205 0.035 781.830 _ 0
206 0.035 784.630 _ 0
207 0.035 787.290 _ 0
208 0.035 789.950 _ 0
209 0.035 792.610 _ 0
210 0.035 795.270 _ 0
211 0.035 797.930 _ 0
212 0.035 800.590 _ 0
213 0.035 803.390 _ 0
214 0.035 806.050 _ 0
215 0.035 808.710 _ 0
216 0.035 811.370 _ 0
217 0.035 814.030 _ 0
218 0.035 816.690 _ 0
219 0.035 819.350 _ 0
220 0.035 822.150 _ 0
221 0.035 824.810 _ 0
222 0.035 827.470 _ 0
223 0.035 830.130 _ 0
224 0.035 832.790 _ 0
225 0.035 835.450 _ 0
226 0.035 838.110 _ 0
227 0.035 840.910 _ 0
228 0.035 843.570 _ 0
229 0.035 846.230 _ 0
230 0.035 848.890 _ 0
231 0.035 851.550 _ 0
232 0.035 854.210 _ 0
233 0.035 856.870 _ 0
234 0.035 859.670 _ 0
235 0.035 862.330 _ 0
236 0.035 864.990 _ 0
237 0.035 867.650 _ 0
238 0.035 870.310 _ 0
239 0.035 872.970 _ 0
240 0.035 875.770 _ 0
241 0.035 878.430 _ 0
242 0.035 881.090 _ 0
243 0.035 883.750 _ 0
244 0.035 886.410 _ 0
245 0.035 889.070 _ 0
246 0.035 891.730 _ 0
247 0.035 894.530 _ 0
248 0.035 897.190 _ 0
249 0.035 899.850 _ 0
250 0.035 902.510 _ 0
251 0.035 905.170 _ 0
252 0.035 907.830 _ 0
253 0.035 910.490 _ 0
254 0.035 913.290 _ 0
255 0.035 915.950 _ 0
256 0.035 918.610 _ 0
257 0.035 921.270 _ 0
258 0.035 923.930 _ 0
259 0.035 926.590 _ 0
260 0.035 929.250 _ 0
261 0.035 932.050 _ 0
262 0.035 934.710 _ 0
263 0.035 937.370 _ 0
264 0.035 940.030 _ 0
265 0.035 942.690 _ 0
266 0.035 945.350 _ 0
267 0.035 948.010 _ 0
268 0.035 950.810 _ 0
269 0.035 953.470 _ 0
270 0.035 956.130 _ 0
271 0.035 958.790 _ 0
272 0.035 961.450 _ 0
273 0.035 964.110 _ 0
274 0.035 966.770 _ 0
275 0.035 969.570 _ 0
276 0.035 972.230 _ 0
277 0.035 974.890 _ 0
278 0.035 977.550 _ 0
279 0.035 980.210 _ 0
280 0.035 982.870 _ 0
281 0.035 985.530 _ 0
282 0.035 988.330 _ 0
283 0.035 990.990 _ 0
284 0.035 993.650 _ 0
285 0.035 996.310 _ 0
286 0.035 998.970 _ 0
287 0.035 1001.630 _ 0
288 0.035 1004.430 _ 0
289 0.035 1007.090 _ 0
290 0.035 1009.750 _ 0
291 0.035 1012.410 _ 0
292 0.035 1015.070 _ 0
293 0.035 1017.730 _ 0
294 0.035 1020.390 _ 0
295 0.035 1023.190 _ 0
296 0.035 1025.850 _ 0
297 0.035 1028.510 _ 0
298 0.035 1031.170 _ 0
299 0.035 1033.830 _ 0
300 0.035 1036.490 _ 0
301 0.035 1039.150 _ 0
302 0.035 1041.950 _ 0
303 0.035 1044.610 _ 0
304 0.035 1047.270 _ 0
305 0.035 1049.930 _ 0
306 0.035 1052.590 _ 0
307 0.035 1055.250 _ 0
308 0.035 1057.910 _ 0
309 0.035 1060.710 _ 0
310 0.035 1063.370 _ 0
311 0.035 1066.030 _ 0
312 0.035 1068.690 _ 0
313 0.035 1071.350 _ 0
314 0.035 1074.010 _ 0
315 0.035 1076.670 _ 0
316 0.035 1079.470 _ 0
317 0.035 1082.130 _ 0
318 0.035 1084.790 _ 0
319 0.035 1087.450 _ 0
320 0.035 1090.110 _ 0
321 0.035 1092.770 _ 0
322 0.035 1095.430 _ 0
323 0.035 1098.230 _ 0
324 0.035 1100.890 _ 0
325 0.035 1103.550 _ 0
326 0.035 1106.210 _ 0
327 0.035 1108.870 _ 0
328 0.035 1111.530 _ 0
329 0.035 1114.330 _ 0
330 0.070 232.470 _ 0
331 0.070 237.790 _ 0
332 0.070 243.110 _ 0
333 0.070 248.430 _ 0
334 0.070 253.750 _ 0
335 0.070 259.350 _ 0
336 0.070 264.670 _ 0
337 0.070 269.990 _ 0
338 0.070 275.310 _ 0
339 0.070 280.630 _ 0
340 0.070 286.230 _ 0
341 0.070 291.550 _ 0
342 0.070 296.870 _ 0
343 0.070 302.190 _ 0
344 0.070 307.510 _ 0
345 0.070 313.110 _ 0
346 0.070 318.430 _ 0
347 0.070 323.750 _ 0
348 0.070 329.070 _ 0
349 0.070 334.390 _ 0
350 0.070 339.990 _ 0
351 0.070 345.310 _ 0
352 0.070 350.630 _ 0
353 0.070 355.950 _ 0
354 0.070 361.270 _ 0
355 0.070 366.870 _ 0
356 0.070 372.190 _ 0
357 0.070 377.510 _ 0
358 0.070 382.830 _ 0
359 0.070 388.150 _ 0
360 0.070 393.750 _ 0
361 0.070 399.070 _ 0
362 0.070 404.390 _ 0
363 0.070 409.710 _ 0
364 0.070 415.030 _ 0
365 0.070 420.630 _ 0
366 0.070 425.950 _ 0
367 0.070 431.270 _ 0
368 0.070 436.590 _ 0
369 0.070 441.910 _ 0
370 0.070 447.510 _ 0
371 0.070 452.830 _ 0
372 0.070 458.150 _ 0
373 0.070 463.470 _ 0
374 0.070 468.790 _ 0
375 0.070 474.390 _ 0
376 0.070 479.710 _ 0
377 0.070 485.030 _ 0
378 0.070 490.350 _ 0
379 0.070 495.670 _ 0
380 0.070 501.270 _ 0
381 0.070 506.590 _ 0
382 0.070 511.910 _ 0
383 0.070 517.230 _ 0
384 0.070 522.550 _ 0
385 0.070 528.150 _ 0
386 0.070 533.470 _ 0
387 0.070 538.790 _ 0
388 0.070 544.110 _ 0
389 0.070 549.430 _ 0
390 0.070 555.030 _ 0
391 0.070 560.350 _ 0
392 0.070 565.670 _ 0
393 0.070 570.990 _ 0
394 0.070 576.310 _ 0
395 0.070 581.910 _ 0
396 0.070 587.230 _ 0
397 0.070 592.550 _ 0
398 0.070 597.870 _ 0
399 0.070 603.190 _ 0
400 0.070 608.790 _ 0
401 0.070 614.110 _ 0
402 0.070 619.430 _ 0
403 0.070 624.750 _ 0
404 0.070 630.070 _ 0
405 0.070 635.670 _ 0
406 0.070 640.990 _ 0
407 0.070 646.310 _ 0
408 0.070 651.630 _ 0
409 0.070 656.950 _ 0
410 0.070 662.550 _ 0
411 0.070 667.870 _ 0
412 0.070 673.190 _ 0
413 0.070 678.510 _ 0
414 0.070 683.830 _ 0
415 0.070 689.430 _ 0
416 0.070 694.750 _ 0
417 0.070 700.070 _ 0
418 0.070 705.390 _ 0
419 0.070 710.710 _ 0
420 0.070 716.310 _ 0
421 0.070 721.630 _ 0
422 0.070 726.950 _ 0
423 0.070 732.270 _ 0
424 0.070 737.590 _ 0
425 0.070 743.190 _ 0
426 0.070 748.510 _ 0
427 0.070 753.830 _ 0
428 0.070 759.150 _ 0
429 0.070 764.470 _ 0
430 0.070 770.070 _ 0
431 0.070 775.390 _ 0
432 0.070 780.710 _ 0
433 0.070 786.030 _ 0
434 0.070 791.350 _ 0
435 0.070 796.950 _ 0
436 0.070 802.270 _ 0
437 0.070 807.590 _ 0
438 0.070 812.910 _ 0
439 0.070 818.230 _ 0
440 0.070 823.830 _ 0
441 0.070 829.150 _ 0
442 0.070 834.470 _ 0
443 0.070 839.790 _ 0
444 0.070 845.110 _ 0
445 0.070 850.710 _ 0
446 0.070 856.030 _ 0
447 0.070 861.350 _ 0
448 0.070 866.670 _ 0
449 0.070 871.990 _ 0
450 0.070 877.590 _ 0
451 0.070 882.910 _ 0
452 0.070 888.230 _ 0
453 0.070 893.550 _ 0
454 0.070 898.870 _ 0
455 0.070 904.470 _ 0
456 0.070 909.790 _ 0
457 0.070 915.110 _ 0
458 0.070 920.430 _ 0
459 0.070 925.750 _ 0
460 0.070 931.350 _ 0
461 0.070 936.670 _ 0
462 0.070 941.990 _ 0
463 0.070 947.310 _ 0
464 0.070 952.630 _ 0
465 0.070 958.230 _ 0
466 0.070 963.550 _ 0
467 0.070 968.870 _ 0
468 0.070 974.190 _ 0
469 0.070 979.510 _ 0
470 0.070 985.110 _ 0
471 0.070 990.430 _ 0
472 0.070 995.750 _ 0
473 0.070 1001.070 _ 0
474 0.070 1006.390 _ 0
475 0.070 1011.990 _ 0
476 0.070 1017.310 _ 0
477 0.070 1022.630 _ 0
478 0.070 1027.950 _ 0
479 0.070 1033.270 _ 0
480 0.070 1038.870 _ 0
481 0.070 1044.190 _ 0
482 0.070 1049.510 _ 0
483 0.070 1054.830 _ 0
484 0.070 1060.150 _ 0
485 0.070 1065.750 _ 0
486 0.070 1071.070 _ 0
487 0.070 1076.390 _ 0
488 0.070 1081.710 _ 0
489 0.070 1087.030 _ 0
490 0.070 1092.630 _ 0
491 0.070 1097.950 _ 0
492 0.070 1103.270 _ 0
493 0.070 1108.590 _ 0
494 0.070 1114.190 _ 0
495 1110.400 841.500 N 0
555 1177.960 595.100 N 0
615 1177.960 761.500 N 0
675 1110.400 554.500 N 0
735 1245.600 1262.700 N 0
795 1245.600 83.900 N 0
855 1313.240 831.700 N 0
915 1177.960 83.900 N 0
975 704.485 527.900 N 0
1035 907.405 389.300 N 0
1095 1042.760 554.500 N 0
1155 1178.040 932.500 N 0
1215 1313.240 544.700 N 0
1275 1313.240 688.700 N 0
1335 1245.600 582.500 N 0
1395 1313.240 1262.700 N 0
1455 1313.240 83.900 N 0
1515 1313.240 975.700 N 0
1575 1110.400 83.900 S 0
1635 907.405 533.500 N 0
1695 839.835 397.700 N 0
1755 975.045 534.900 N 0
1815 1245.600 921.300 N 0
1875 1313.240 400.500 N 0
1935 1245.600 751.700 N 0
1995 1245.600 414.500 N 0
2055 1178.040 1262.700 S 0
2115 1313.240 256.100 N 0
2175 1251.310 1118.700 N 0
2235 1110.400 253.300 S 0
2295 772.125 541.900 N 0
2355 772.125 385.100 N 0
2415 839.835 541.900 N 0
2475 1042.760 841.500 N 0
2535 1177.960 424.300 N 0
2595 1110.400 698.500 S 0
2655 1110.400 410.300 N 0
2715 1183.670 1097.700 N 0
2775 1245.600 247.700 N 0
2835 1116.090 1097.700 N 0
2895 1177.960 247.700 N 0
2955 636.915 518.100 N 0
3015 975.045 390.700 N 0
3075 1042.690 390.700 N 0
3135 163.435 970.100 S 0
3195 772.195 978.500 S 0
3255 632.355 830.300 N 0
3315 501.565 971.500 N 0
3375 231.075 940.700 S 0
3435 839.765 973.100 N 0
3495 565.475 681.700 S 0
3555 574.905 1125.700 N 0
3615 501.635 366.900 N 0
3675 636.915 366.900 N 0
3735 636.915 75.500 S 0
3795 366.285 979.900 N 0
3855 1048.390 985.500 N 0
3915 1042.760 698.500 N 0
3975 433.995 979.900 S 0
4035 169.135 1122.900 N 0
4095 777.895 1269.900 N 0
4155 700.685 671.900 N 0
4215 507.265 1269.900 N 0
4275 501.635 75.500 S 0
4335 907.405 79.900 N 0
4395 1042.690 79.900 N 0
4455 298.645 970.100 N 0
4515 980.745 985.500 N 0
4575 903.605 820.500 N 0
4635 439.695 1125.700 N 0
4695 101.495 1117.300 N 0
4755 710.185 1269.900 N 0
4815 768.325 685.900 N 0
4875 574.905 1269.900 N 0
4935 569.205 75.500 N 0
4995 704.485 223.900 N 0
5055 975.045 79.900 N 0
5115 169.135 1269.900 N 0
5175 1110.320 1262.700 N 0
5235 975.045 698.500 N 0
5295 304.345 1269.900 N 0
5355 101.495 1269.900 S 0
5415 913.105 1261.500 N 0
5475 633.115 662.100 S 0
5535 710.185 1125.700 N 0
5595 366.355 75.500 S 0
5655 772.125 231.100 N 0
5715 839.835 79.900 N 0
5775 236.775 1269.900 N 0
5835 913.105 1117.300 N 0
5895 907.405 677.500 N 0
5955 372.055 1125.700 N 0
6015 33.855 1122.900 N 0
6075 845.465 1269.900 N 0
6135 497.075 803.700 N 0
6195 642.545 1269.900 N 0
6255 433.995 75.500 S 0
6315 636.915 223.900 N 0
6375 1042.690 238.100 N 0
6435 33.855 1269.900 N 0
6495 980.745 1128.500 N 0
6555 835.205 828.900 N 0
6615 439.695 1269.900 N 0
6675 33.855 979.900 S 0
6735 777.895 1125.700 N 0
6795 767.565 830.300 N 0
6855 642.545 1125.700 N 0
6915 501.635 218.500 N 0
6975 839.835 242.300 N 0
7035 975.045 246.500 N 0
7095 236.775 1122.900 N 0
7155 1042.690 1272.700 N 0
7215 835.965 685.900 N 0
7275 372.055 1269.900 N 0
7335 33.855 835.700 S 0
7395 975.045 841.500 N 0
7455 564.715 827.500 N 0
7515 636.845 978.500 N 0
7575 569.205 223.900 N 0
7635 907.405 230.900 N 0
7695 704.485 75.500 N 0
7755 304.345 1122.900 N 0
7815 845.465 1117.300 N 0
7875 704.485 978.500 N 0
7935 507.265 1125.700 N 0
7995 101.875 825.900 S 0
8055 907.405 964.500 N 0
8115 699.925 830.300 N 0
8175 569.205 978.500 N 0
8235 433.995 361.300 N 0
8295 704.485 373.900 N 0
8355 772.125 75.500 N 0
8415 569.205 366.900 S 0
8475 673.599 673.542 N 0
8510 673.479 673.526 N 0
8530 673.404 673.378 N 0
8550 673.390 673.402 N 0
8564 673.494 673.549 N 0
8586 673.401 673.372 N 0
8618 673.758 673.541 N 0
8662 673.704 673.365 N 0
8703 673.392 673.439 N 0
8733 673.530 673.323 N 0
8739 673.527 673.340 N 0
8746 673.523 673.361 N 0
8749 673.521 673.385 N 0
8753 673.462 673.370 N 0
8756 673.576 673.475 N 0
8762 673.449 673.458 N 0
8770 673.460 673.479 N 0
8775 673.415 673.423 N 0
8786 673.467 673.352 N 0
8792 673.565 673.506 N 0
8801 673.528 673.359 N 0
8805 673.520 673.387 N 0
8808 673.454 673.469 N 0
8825 673.527 673.342 N 0
8837 673.459 673.410 N 0
8845 673.508 673.514 N 0
8865 673.458 673.489 N 0
8869 673.501 673.462 N 0
8878 673.480 673.325 N 0
8883 673.474 673.484 N 0
8890 673.523 673.387 N 0
8894 673.525 673.387 N 0
8897 673.506 673.318 N 0
8901 673.580 673.325 N 0
8906 673.584 673.389 N 0
8915 673.430 673.419 N 0
8922 673.429 673.356 N 0
8928 673.464 673.546 N 0
8966 673.406 673.364 N 0
8985 673.718 673.445 N 0
9030 673.518 673.592 N 0
9066 673.419 673.338 N 0
9098 673.439 673.538 N 0
9149 673.511 673.563 N 0
9236 673.566 673.623 N 0
9283 673.568 673.193 N 0
9328 673.597 673.229 N 0
9357 673.613 673.543 N 0
9392 673.640 673.312 N 0
9404 673.468 673.520 N 0
9425 673.708 673.431 N 0
9445 673.663 673.463 N 0
9455 673.519 673.542 N 0
9473 673.474 673.548 N 0
9489 673.574 673.305 N 0
9530 673.677 673.481 N 0
9550 673.597 673.537 N 0
9568 673.452 673.440 N 0
9580 673.575 673.486 N 0
9587 673.406 673.419 N 0
9602 673.608 673.505 N 0
9608 673.602 673.290 N 0
9617 673.430 673.421 N 0
9624 673.574 673.306 N 0
9636 673.562 673.553 N 0
9657 673.640 673.490 N 0
9664 673.490 673.518 N 0
9670 673.490 673.520 N 0
9680 673.485 673.480 N 0
9686 673.568 673.505 N 0
9712 673.630 673.468 N 0
9720 673.578 673.462 N 0
9726 673.475 673.511 N 0
9732 673.446 673.408 N 0
9738 673.467 673.444 N 0
9745 673.438 673.422 N 0
9752 673.502 673.532 N 0
9771 673.487 673.314 N 0
9780 673.494 673.446 N 0
9794 673.641 673.514 N 0
9818 673.498 673.535 N 0
9828 673.425 673.417 N 0
9836 673.687 673.418 N 0
9856 673.513 673.277 N 0
9872 673.474 673.311 N 0
9880 673.484 673.364 N 0
9888 673.649 673.450 N 0
9902 673.585 673.514 N 0
9911 673.469 673.516 N 0
9925 673.609 673.322 N 0
9932 673.579 673.462 N 0
9955 673.546 673.267 N 0
9964 673.475 673.297 N 0
9969 673.438 673.423 N 0
9983 673.493 673.448 N 0
9995 673.615 673.520 N 0
10010 673.571 673.493 N 0
10021 673.637 673.297 N 0
10027 673.426 673.368 N 0
10033 673.491 673.488 N 0
10040 673.624 673.430 N 0
10045 673.527 673.361 N 0
10050 673.461 673.331 N 0
10059 673.483 673.386 N 0
10072 673.625 673.390 N 0
10079 673.579 673.522 N 0
10087 673.458 673.498 N 0
10107 673.563 673.517 N 0
10120 673.564 673.270 N 0
10127 673.588 673.508 N 0
10154 673.445 673.390 N 0
10175 673.459 673.388 N 0
10191 673.589 673.386 N 0
10215 673.583 673.433 N 0
10231 673.445 673.409 N 0
10247 673.448 673.373 N 0
10258 673.665 673.498 N 0
10295 673.684 673.396 N 0
10316 673.687 673.384 N 0
10340 673.494 673.284 N 0
10359 673.636 673.284 N 0
10383 673.545 673.282 N 0
10396 673.671 673.442 N 0
10416 673.546 673.286 N 0
10428 673.530 673.417 N 0
10434 673.576 673.526 N 0
10468 673.586 673.343 N 0
10474 673.605 673.279 N 0
10478 673.688 673.397 N 0
10492 673.707 673.385 N 0
10512 673.403 673.409 N 0
10542 673.526 673.388 N 0
10547 673.532 673.324 N 0
10577 673.510 673.484 N 0
10599 673.523 673.512 N 0
10616 673.578 673.315 N 0
10624 673.530 673.341 N 0
10637 673.698 673.366 N 0
10667 673.616 673.308 N 0
10670 673.651 673.450 N 0
10687 673.675 673.394 N 0
10690 673.588 673.413 N 0
10704 673.580 673.326 N 0
10716 673.530 673.342 N 0
10725 673.680 673.395 N 0
10749 673.582 673.327 N 0
10767 673.437 673.376 N 0
10778 673.548 673.278 N 0
10782 673.527 673.389 N 0
10789 673.596 673.530 N 0
10808 673.420 673.442 N 0
10821 673.441 673.313 N 0
10827 673.489 673.313 N 0
10838 673.537 673.452 N 0
10847 673.530 673.326 N 0
10853 673.463 673.429 N 0
10868 673.527 673.363 N 0
10885 673.532 673.343 N 0
10891 673.548 673.272 N 0
10904 673.641 673.441 N 0
10911 673.588 673.365 N 0
10920 673.413 673.324 N 0
10950 673.470 673.494 N 0
10974 673.626 673.390 N 0
11000 673.452 673.279 N 0
11021 673.585 673.515 N 0
11034 673.458 673.390 N 0
11047 673.460 673.410 N 0
11056 673.423 673.319 N 0
11078 673.581 673.463 N 0
11101 673.443 673.305 N 0
11121 673.646 673.301 N 0
11144 673.456 673.314 N 0
11160 673.646 673.427 N 0
11177 673.647 673.427 N 0
11185 673.624 673.317 N 0
11193 673.604 673.523 N 0
11201 673.427 673.454 N 0
11209 673.582 673.464 N 0
11225 673.661 673.390 N 0
11231 673.440 673.324 N 0
11236 673.490 673.431 N 0
11242 673.459 673.390 N 0
11246 673.472 673.267 N 0
11263 673.589 673.388 N 0
11270 673.584 673.463 N 0
11280 673.532 673.361 N 0
11285 673.650 673.485 N 0
11309 673.534 673.416 N 0
11323 673.535 673.434 N 0
11328 673.535 673.435 N 0
11342 673.494 673.496 N 0
11357 673.642 673.303 N 0
11361 673.539 673.451 N 0
11365 673.420 673.404 N 0
11373 673.584 673.327 N 0
11381 673.740 673.469 N 0
11413 673.664 673.446 N 0
11431 673.585 673.433 N 0
11435 673.532 673.362 N 0
11443 673.449 673.426 N 0
11472 673.430 673.379 N 0
11480 673.484 673.387 N 0
11505 673.530 673.366 N 0
11509 673.543 673.495 N 0
11525 673.501 673.464 N 0
11545 673.536 673.363 N 0
11553 673.636 673.481 N 0
11579 673.631 673.489 N 0
11608 673.441 673.324 N 0
11639 673.589 673.365 N 0
11644 673.609 673.472 N 0
11665 673.675 673.337 N 0
11677 673.590 673.413 N 0
11686 673.484 673.365 N 0
11691 673.528 673.389 N 0
11695 673.549 673.253 N 0
11719 673.592 673.364 N 0
11725 673.588 673.416 N 0
11729 673.604 673.547 N 0
11766 673.560 673.528 N 0
11780 673.659 673.457 N 0
11800 673.536 673.364 N 0
11814 673.646 673.463 N 0
11857 673.469 673.443 N 0
11870 673.624 673.366 N 0
11881 673.579 673.475 N 0
11888 673.626 673.412 N 0
11900 673.461 673.390 N 0
11913 673.424 673.381 N 0
11921 673.627 673.507 N 0
11934 673.535 673.415 N 0
11942 673.484 673.410 N 0
11947 673.440 673.362 N 0
11952 673.577 673.477 N 0
11983 673.635 673.315 N 0
11991 673.591 673.508 N 0
12013 673.529 673.389 N 0
12018 673.584 673.284 N 0
12021 673.610 673.472 N 0
12029 673.535 673.324 N 0
12037 673.439 673.422 N 0
12052 673.438 673.376 N 0
12068 673.457 673.453 N 0
12077 673.486 673.410 N 0
12082 673.628 673.306 N 0
12093 673.449 673.374 N 0
12104 673.469 673.320 N 0
12145 673.513 673.484 N 0
12158 673.526 673.517 N 0
12167 673.594 673.265 N 0
12171 673.436 673.353 N 0
12180 673.543 673.517 N 0
12185 673.585 673.450 N 0
12210 673.486 673.364 N 0
12232 673.529 673.276 N 0
12237 673.521 673.252 N 0
12266 673.624 673.368 N 0
12302 673.431 673.341 N 0
12309 673.431 673.324 N 0
12318 673.461 673.391 N 0
12325 673.589 673.514 N 0
12352 673.674 673.322 N 0
12366 673.699 673.355 N 0
12376 673.462 673.464 N 0
12398 673.496 673.496 N 0
12405 673.421 673.310 N 0
12416 673.487 673.480 N 0
12458 673.456 673.514 N 0
12472 673.523 673.250 N 0
12518 673.595 673.503 N 0
12543 673.604 673.290 N 0
12579 673.486 673.505 N 0
12586 673.514 673.484 N 0
12598 673.392 673.395 N 0
12604 673.507 673.285 N 0
12607 673.601 673.310 N 0
12614 673.469 673.445 N 0
12647 673.446 673.521 N 0
12658 673.442 673.437 N 0
12666 673.538 673.477 N 0
12675 673.591 673.509 N 0
12684 673.521 673.506 N 0
12705 673.506 673.290 N 0
12712 673.608 673.272 N 0
12722 673.557 673.543 N 0
12762 673.446 673.409 N 0
12803 673.412 673.422 N 0
12810 673.535 673.312 N 0
12817 673.535 673.437 N 0
12835 673.592 673.415 N 0
12844 673.535 673.325 N 0
12854 673.607 673.520 N 0
12876 673.543 673.476 N 0
12899 673.424 673.393 N 0
12903 673.650 673.534 N 0
12967 673.531 673.270 N 0
12986 673.679 673.381 N 0
13003 673.398 673.538 N 0
13085 673.628 673.390 N 0
13091 673.409 673.421 N 0
13125 673.565 673.273 N 0
13153 673.623 673.318 N 0
13165 673.514 673.263 N 0
13195 673.623 673.281 N 0
13205 673.628 673.365 N 0
13224 673.659 673.458 N 0
13235 673.418 673.334 N 0
13246 673.482 673.390 N 0
13253 673.462 673.410 N 0
13283 673.400 673.440 N 0
13288 673.543 673.477 N 0
13302 673.586 673.344 N 0
13316 673.493 673.432 N 0
13350 673.660 673.424 N 0
13360 673.531 673.390 N 0
13369 673.500 673.504 N 0
13393 673.482 673.325 N 0
13402 673.535 673.417 N 0
13406 673.519 673.500 N 0
13412 673.486 673.367 N 0
13418 673.616 673.335 N 0
13431 673.588 673.390 N 0
13440 673.587 673.432 N 0
13447 673.503 673.509 N 0
13471 673.638 673.508 N 0
13485 673.592 673.367 N 0
13518 673.674 673.357 N 0
13525 673.460 673.490 N 0
13539 673.628 673.413 N 0
13550 673.591 673.390 N 0
13555 673.626 673.370 N 0
13569 673.461 673.479 N 0
13589 673.650 673.390 N 0
13605 673.474 673.459 N 0
13610 673.631 673.467 N 0
13648 673.532 673.390 N 0
13663 673.537 673.313 N 0
13672 673.499 673.446 N 0
13679 673.541 673.479 N 0
13690 673.516 673.261 N 0
13710 673.548 673.282 N 0
13716 673.640 673.442 N 0
13735 673.517 673.259 N 0
13766 673.489 673.366 N 0
13792 673.611 673.275 N 0
13803 673.661 673.393 N 0
13814 673.456 673.344 N 0
13846 673.628 673.370 N 0
13860 673.530 673.253 N 0
13907 673.649 673.410 N 0
13918 673.509 673.268 N 0
13950 673.463 673.391 N 0
13961 673.593 673.390 N 0
13970 673.586 673.464 N 0
13976 673.549 673.282 N 0
13992 673.636 673.456 N 0
13998 673.573 673.493 N 0
14009 673.539 673.313 N 0
14036 673.541 673.488 N 0
14046 673.594 673.414 N 0
14056 673.602 673.489 N 0
14070 673.592 673.418 N 0
14082 673.623 673.350 N 0
14087 673.410 673.479 N 0
14120 673.497 673.448 N 0
14128 673.535 673.328 N 0
14144 673.645 673.335 N 0
14167 673.541 673.364 N 0
14178 673.586 673.436 N 0
14182 673.545 673.508 N 0
14204 673.617 673.335 N 0
14217 673.538 673.367 N 0
14222 673.482 673.499 N 0
14235 673.630 673.289 N 0
14251 673.629 673.367 N 0
14257 673.449 673.474 N 0
14270 673.596 673.416 N 0
14284 673.578 673.526 N 0
14304 673.540 673.313 N 0
14315 673.509 673.284 N 0
14336 673.541 673.326 N 0
14353 673.673 673.359 N 0
14362 673.615 673.255 N 0
14392 673.399 673.445 N 0
14397 673.574 673.307 N 0
14404 673.701 673.357 N 0
14430 673.549 673.244 N 0
14447 673.584 673.346 N 0
14456 673.460 673.547 N 0
14498 673.537 673.436 N 0
14503 673.474 673.459 N 0
14516 673.561 673.239 N 0
14543 673.568 673.506 N 0
14574 673.469 673.353 N 0
14613 673.522 673.506 N 0
14620 673.506 673.290 N 0
14638 673.434 673.328 N 0
14648 673.476 673.311 N 0
14663 673.485 673.389 N 0
14671 673.484 673.413 N 0
14678 673.545 673.531 N 0
14712 673.414 673.383 N 0
14730 673.464 673.410 N 0
14751 673.590 673.391 N 0
14757 673.511 673.519 N 0
14765 673.540 673.435 N 0
14771 673.625 673.430 N 0
14810 673.585 673.327 N 0
14816 673.584 673.450 N 0
14822 673.542 673.365 N 0
14829 673.574 673.494 N 0
14836 673.462 673.413 N 0
14850 673.591 673.368 N 0
14856 673.457 673.344 N 0
14866 673.591 673.344 N 0
14879 673.542 673.452 N 0
14892 673.468 673.475 N 0
14913 673.577 673.306 N 0
14919 673.494 673.524 N 0
14930 673.602 673.490 N 0
14964 673.504 673.463 N 0
14976 673.540 673.437 N 0
14984 673.587 673.451 N 0
14988 673.436 673.408 N 0
14998 673.517 673.493 N 0
15028 673.488 673.505 N 0
15034 673.505 673.319 N 0
15057 673.597 673.497 N 0
15061 673.649 673.391 N 0
15079 673.579 673.477 N 0
15090 673.533 673.535 N 0
15113 673.496 673.496 N 0
15134 673.529 673.525 N 0
15142 673.467 673.309 N 0
15161 673.488 673.294 N 0
15168 673.600 673.527 N 0
15207 673.476 673.459 N 0
15230 673.603 673.252 N 0
15265 673.624 673.432 N 0
15276 673.497 673.332 N 0
15297 673.563 673.520 N 0
15324 673.388 673.440 N 0
15343 673.503 673.464 N 0
15370 673.542 673.326 N 0
15379 673.653 673.495 N 0
15397 673.545 673.294 N 0
15433 673.487 673.412 N 0
15449 673.646 673.321 N 0
15465 673.544 673.452 N 0
15475 673.545 673.517 N 0
15479 673.595 673.391 N 0
15486 673.589 673.436 N 0
15493 673.544 673.313 N 0
15517 673.491 673.347 N 0
15524 673.592 673.434 N 0
15538 673.591 673.345 N 0
15547 673.543 673.315 N 0
15552 673.625 673.319 N 0
15584 673.537 673.342 N 0
15614 673.538 673.329 N 0
15620 673.476 673.287 N 0
15638 673.544 673.437 N 0
15657 673.630 673.390 N 0
15665 673.598 673.497 N 0
15672 673.600 673.496 N 0
15721 673.631 673.502 N 0
15737 673.534 673.537 N 0
15755 673.656 673.340 N 0
15766 673.500 673.295 N 0
15804 673.612 673.473 N 0
15811 673.503 673.466 N 0
15820 673.477 673.270 N 0
15842 673.510 673.285 N 0
15867 673.654 673.306 N 0
15883 673.617 673.308 N 0
15912 673.597 673.366 N 0
15918 673.539 673.418 N 0
15955 673.560 673.258 N 0
15966 673.483 673.326 N 0
15995 673.573 673.299 N 0
16012 673.648 673.371 N 0
16024 673.517 673.493 N 0
16033 673.679 673.340 N 0
16058 673.441 673.341 N 0
16070 673.543 673.299 N 0
16090 673.441 673.362 N 0
16105 673.558 673.536 N 0
16134 673.595 673.391 N 0
16148 673.667 673.339 N 0
16158 673.489 673.366 N 0
16163 673.536 673.344 N 0
16171 673.607 673.530 N 0
16183 673.582 673.545 N 0
16229 673.583 673.329 N 0
16248 673.583 673.263 N 0
16259 673.533 673.267 N 0
16289 673.513 673.486 N 0
16292 673.597 673.417 N 0
16298 673.544 673.327 N 0
16304 673.571 673.500 N 0
16322 673.536 673.345 N 0
16329 673.646 673.336 N 0
16338 673.698 673.398 N 0
16354 673.463 673.331 N 0
16362 673.685 673.397 N 0
16369 673.544 673.315 N 0
16379 673.567 673.276 N 0
16409 673.596 673.391 N 0
16414 673.693 673.416 N 0
16424 673.588 673.348 N 0
16431 673.545 673.528 N 0
16460 673.669 673.391 N 0
16476 673.586 673.466 N 0
16503 673.644 673.356 N 0
16513 673.629 673.391 N 0
16519 673.486 673.390 N 0
16524 673.539 673.465 N 0
16532 673.452 673.358 N 0
16556 673.544 673.487 N 0
16578 673.637 673.342 N 0
16621 673.481 673.470 N 0
16633 673.631 673.330 N 0
16690 673.471 673.276 N 0
16713 673.661 673.424 N 0
16728 673.497 673.450 N 0
16733 673.430 673.356 N 0
16738 673.446 673.349 N 0
16778 673.499 673.332 N 0
16783 673.544 673.502 N 0
16807 673.489 673.268 N 0
16830 673.669 673.393 N 0
16852 673.586 673.284 N 0
16865 673.489 673.315 N 0
16885 673.476 673.338 N 0
16908 673.559 673.533 N 0
16923 673.590 673.348 N 0
16933 673.605 673.291 N 0
16959 673.598 673.393 N 0
16964 673.598 673.394 N 0
16977 673.490 673.413 N 0
16996 673.625 673.545 N 0
17034 673.505 673.509 N 0
17044 673.593 673.347 N 0
17051 673.651 673.347 N 0
17066 673.492 673.347 N 0
17079 673.498 673.497 N 0
17098 673.615 673.459 N 0
17121 673.542 673.304 N 0
17132 673.523 673.506 N 0
17146 673.405 673.433 N 0
17175 673.543 673.365 N 0
17181 673.596 673.279 N 0
17199 673.544 673.437 N 0
17210 673.660 673.309 N 0
17237 673.679 673.381 N 0
17310 673.459 673.344 N 0
17340 673.619 673.335 N 0
17350 673.620 673.336 N 0
17360 673.399 673.486 N 0
17414 673.470 673.445 N 0
17434 673.542 673.345 N 0
17439 673.595 673.368 N 0
17451 673.464 673.331 N 0
17464 673.679 673.420 N 0
17482 673.500 673.332 N 0
17490 673.501 673.448 N 0
17507 673.491 673.366 N 0
17516 673.660 673.393 N 0
17539 673.587 673.329 N 0
17544 673.468 673.321 N 0
17565 673.506 673.466 N 0
17603 673.659 673.472 N 0
17614 673.544 673.367 N 0
17619 673.628 673.414 N 0
17640 673.558 673.538 N 0
17674 673.534 673.390 N 0
17710 673.606 673.541 N 0
17737 673.642 673.313 N 0
17751 673.491 673.315 N 0
17758 673.544 673.299 N 0
17786 673.588 673.451 N 0
17792 673.475 673.339 N 0
17811 673.487 673.415 N 0
17821 673.503 673.450 N 0
17839 673.544 673.328 N 0
17850 673.570 673.507 N 0
17870 673.603 673.260 N 0
17879 673.616 673.461 N 0
17916 673.576 673.266 N 0
17922 673.629 673.513 N 0
17944 673.653 673.449 N 0
17972 673.632 673.521 N 0
17989 673.603 673.393 N 0
18002 673.429 673.498 N 0
18042 673.617 673.275 N 0
18051 673.648 673.427 N 0
18065 673.557 673.547 N 0
18093 673.565 673.512 N 0
18126 673.540 673.388 N 0
18138 673.486 673.391 N 0
18151 673.589 673.260 N 0
18174 673.611 673.322 N 0
18178 673.691 673.361 N 0
18181 673.502 673.276 N 0
18188 673.488 673.370 N 0
18193 673.451 673.459 N 0
18201 673.456 673.470 N 0
18213 673.620 673.447 N 0
18222 673.525 673.287 N 0
18234 673.546 673.438 N 0
18241 673.530 673.528 N 0
18255 673.418 673.449 N 0
18289 673.593 673.349 N 0
18294 673.656 673.325 N 0
18305 673.710 673.375 N 0
18336 673.549 673.249 N 0
18357 673.509 673.286 N 0
18400 673.688 673.359 N 0
18424 673.630 673.393 N 0
18453 673.519 673.297 N 0
18473 673.571 673.295 N 0
18483 673.544 673.330 N 0
18505 673.543 673.440 N 0
18529 673.659 673.375 N 0
18561 673.653 673.469 N 0
18567 673.633 673.391 N 0
18606 673.509 673.529 N 0
18614 673.424 673.340 N 0
18630 673.449 673.309 N 0
18659 673.539 673.346 N 0
18669 673.692 673.485 N 0
18732 673.503 673.265 N 0
18792 673.602 673.310 N 0
18800 673.405 673.394 N 0
18810 673.542 673.454 N 0
18821 673.651 673.452 N 0
18830 673.541 673.466 N 0
18835 673.470 673.320 N 0
18844 673.549 673.267 N 0
18881 673.606 673.481 N 0
18899 673.440 673.425 N 0
18913 673.500 673.296 N 0
18938 673.549 673.264 N 0
18961 673.596 673.370 N 0
18973 673.561 673.258 N 0
19012 673.650 673.486 N 0
19033 673.562 673.263 N 0
19041 673.587 673.331 N 0
19056 673.404 673.341 N 0
19070 673.688 673.440 N 0
19100 673.632 673.394 N 0
19112 673.543 673.346 N 0
19126 673.596 673.419 N 0
19138 673.649 673.412 N 0
19166 673.641 673.473 N 0
19181 673.706 673.411 N 0
19207 673.664 673.446 N 0
19216 673.661 673.352 N 0
19231 673.492 673.433 N 0
19237 673.651 673.411 N 0
19246 673.583 673.535 N 0
19253 673.592 673.351 N 0
19259 673.507 673.466 N 0
19266 673.604 673.312 N 0
19283 673.661 673.334 N 0
19298 673.546 673.290 N 0
19312 673.648 673.371 N 0
19322 673.544 673.495 N 0
19327 673.435 673.451 N 0
19361 673.570 673.290 N 0
19366 673.588 673.329 N 0
19370 673.443 673.481 N 0
19409 673.542 673.479 N 0
19430 673.468 673.290 N 0
19444 673.600 673.395 N 0
19456 673.492 673.413 N 0
19461 673.443 673.313 N 0
19481 673.563 673.521 N 0
19485 673.624 673.433 N 0
19492 673.464 673.371 N 0
19499 673.681 673.314 N 0
19522 673.568 673.283 N 0
19551 673.545 673.454 N 0
19562 673.442 673.362 N 0
19579 673.672 673.498 N 0
19586 673.545 673.518 N 0
19623 673.631 673.412 N 0
19636 673.424 673.479 N 0
19641 673.636 673.305 N 0
19646 673.536 673.391 N 0
19661 673.667 673.434 N 0
19680 673.618 673.308 N 0
19695 673.659 673.322 N 0
19730 673.590 673.331 N 0
19749 673.488 673.391 N 0
19756 673.428 673.455 N 0
19767 673.646 673.464 N 0
19778 673.544 673.368 N 0
19811 673.525 673.512 N 0
19815 673.549 673.260 N 0
19839 673.578 673.486 N 0
19880 673.567 673.279 N 0
19888 673.421 673.370 N 0
19905 673.494 673.347 N 0
19919 673.590 673.435 N 0
19926 673.565 673.270 N 0
19941 673.648 673.373 N 0
19948 673.626 673.319 N 0
19961 673.466 673.429 N 0
19986 673.427 673.313 N 0
20020 673.625 673.350 N 0
20056 673.469 673.353 N 0
20109 673.629 673.369 N 0
20121 673.664 673.363 N 0
20137 673.582 673.477 N 0
20147 673.632 673.395 N 0
20169 673.437 673.478 N 0
20183 673.542 673.305 N 0
20194 673.606 673.482 N 0
20209 673.416 673.440 N 0
20250 673.620 673.447 N 0
20270 673.636 673.496 N 0
20282 673.653 673.451 N 0
20310 673.449 673.474 N 0
20326 673.487 673.480 N 0
20345 673.682 673.372 N 0
20362 673.672 673.443 N 0
20372 673.583 673.478 N 0
20393 673.619 673.505 N 0
20423 673.630 673.371 N 0
20430 673.594 673.523 N 0
20466 673.642 673.443 N 0
20482 673.491 673.414 N 0
20491 673.573 673.533 N 0
20509 673.544 673.466 N 0
20531 673.494 673.306 N 0
20543 673.503 673.296 N 0
20578 673.622 673.485 N 0
20590 673.500 673.451 N 0
20595 673.490 673.391 N 0
20606 673.419 673.449 N 0
20633 673.663 673.464 N 0
20636 673.402 673.417 N 0
20640 673.545 673.344 N 0
20644 673.621 673.448 N 0
20647 673.632 673.371 N 0
20651 673.495 673.433 N 0
20658 673.425 673.460 N 0
20661 673.507 673.475 N 0
20664 673.547 673.367 N 0
20667 673.446 673.391 N 0
20672 673.549 673.369 N 0
20675 673.593 673.436 N 0
20678 673.535 673.394 N 0
20681 673.544 673.488 N 0
20685 673.543 673.391 N 0
20688 673.587 673.465 N 0
20692 673.491 673.417 N 0
20696 673.629 673.415 N 0
20702 673.672 673.326 N 0
20725 673.602 673.395 N 0
20728 673.689 673.397 N 0
20739 673.494 673.417 N 0
20744 673.675 673.409 N 0
20752 673.650 673.393 N 0
20767 673.669 673.394 N 0
20787 673.662 673.393 N 0
20807 673.627 673.432 N 0
20827 673.542 673.417 N 0
20831 673.545 673.455 N 0
20837 673.580 673.316 N 0
20852 673.545 673.478 N 0
20860 673.542 673.418 N 0
20863 673.597 673.349 N 0
20866 673.577 673.307 N 0
20875 673.542 673.467 N 0
20880 673.538 673.395 N 0
20883 673.540 673.395 N 0
20886 673.606 673.292 N 0
20900 673.544 673.393 N 0
20903 673.543 673.397 N 0
20906 673.617 673.461 N 0
20914 673.544 673.397 N 0
20917 673.618 673.506 N 0
20943 673.544 673.347 N 0
20952 673.548 673.394 N 0
20959 673.537 673.421 N 0
20962 673.435 673.391 N 0
20970 673.544 673.419 N 0
20973 673.593 673.437 N 0
20977 673.687 673.366 N 0
20992 673.550 673.394 N 0
20995 673.545 673.399 N 0
20998 673.552 673.395 N 0
21001 673.398 673.416 N 0
21005 673.682 673.364 N 0
21028 673.405 673.385 N 0
21032 673.651 673.348 N 0
21053 673.701 673.390 N 0
21062 673.552 673.397 N 0
21065 673.544 673.420 N 0
21068 673.550 673.400 N 0
21071 673.675 673.410 N 0
21077 673.495 673.416 N 0
21080 673.491 673.391 N 0
21083 673.492 673.368 N 0
21086 673.500 673.452 N 0
21090 673.496 673.434 N 0
21093 673.595 673.438 N 0
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"C_Cpp.errorSquiggles": "disabled"
}
\ No newline at end of file
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include "FD.h"
// Plc Object class
bool PlcObject::IsHardMacro() const {
return pb_type_ == std::string("MACRO") ? true : false;
}
bool PlcObject::IsSoftMacro() const {
return pb_type_ == std::string("macro") ? true : false;
}
bool PlcObject::IsHardMacroPin() const {
return pb_type_ == std::string("MACRO_PIN") ? true : false;
}
bool PlcObject::IsSoftMacroPin() const {
return pb_type_ == std::string("macro_pin") ? true : false;
}
bool PlcObject::IsPort() const {
return pb_type_ == std::string("PORT") ? true : false;
}
void PlcObject::MakeSquare() {
const float area = width_ * height_;
width_ = std::sqrt(area);
height_ = width_;
}
const std::pair<float, float> PlcObject::GetPos() const {
if (IsHardMacroPin() == false)
return std::pair<float, float>(x_, y_);
float x = x_;
float y = y_;
// get the absolute location for macro pins
if (macro_ptr_->orient_ == std::string("N")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else if (macro_ptr_->orient_ == std::string("FN")) {
x = macro_ptr_->x_ - x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else if (macro_ptr_->orient_ == std::string("S")) {
x = macro_ptr_->x_ - x_offset_;
y = macro_ptr_->y_ - y_offset_;
} else if (macro_ptr_->orient_ == std::string("FS")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->x_ - y_offset_;
} else if (macro_ptr_->orient_ == std::string("E")) {
x = macro_ptr_->x_ + y_offset_;
y = macro_ptr_->y_ - x_offset_;
} else if (macro_ptr_->orient_ == std::string("FE")) {
x = macro_ptr_->x_ - y_offset_;
y = macro_ptr_->y_ - x_offset_;
} else if (macro_ptr_->orient_ == std::string("FW")) {
x = macro_ptr_->x_ - y_offset_;
y = macro_ptr_->y_ + x_offset_;
} else if (macro_ptr_->orient_ == std::string("W")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
}
return std::pair<float, float>(x, y);
}
float PlcObject::GetX() const {
return GetPos().first;
}
float PlcObject::GetY() const {
return GetPos().second;
}
const Rect PlcObject::GetBBox() const {
const std::pair<float, float> pos = GetPos();
const std::vector<std::string> normal_orients {
std::string("N"), std::string("FN"),
std::string("S"), std::string("FS")
};
float width = width_;
float height = height_;
if (std::find(normal_orients.begin(), normal_orients.end(), orient_) == normal_orients.end()) {
width = height_;
height = width_;
}
return Rect(pos.first - width / 2.0, pos.second - height / 2.0,
pos.first + width / 2.0, pos.second + height / 2.0);
}
void PlcObject::SetPos(float x, float y) {
x_ = x;
y_ = y;
}
void PlcObject::ResetForce() {
f_x_ = 0.0;
f_y_ = 0.0;
}
void PlcObject::AddForce(float f_x, float f_y) {
f_x_ += f_x;
f_y_ += f_y;
}
void PlcObject::NormalForce(float max_f_x, float max_f_y) {
if (max_f_x > 0.0)
f_x_ = f_x_ / max_f_x;
if (max_f_y > 0.0)
f_y_ = f_y_ / max_f_y;
}
std::pair<float, float> PlcObject::GetForce() const {
return std::pair<float, float>(f_x_, f_y_);
}
// Flip operation
void PlcObject::Flip(bool x_flag) {
if (IsHardMacro() == false)
return;
std::map<std::string, std::string> OrientMapFlipX = {
{ std::string("N"), std::string("FS") },
{ std::string("S"), std::string("FN") },
{ std::string("W"), std::string("FE") },
{ std::string("E"), std::string("FW") },
{ std::string("FN"), std::string("S") },
{ std::string("FS"), std::string("N") },
{ std::string("FW"), std::string("E") },
{ std::string("FE"), std::string("W") }
};
std::map<std::string, std::string> OrientMapFlipY = {
{ std::string("N"), std::string("FN") },
{ std::string("S"), std::string("FS") },
{ std::string("W"), std::string("FW") },
{ std::string("E"), std::string("FE") },
{ std::string("FN"), std::string("N") },
{ std::string("FS"), std::string("S") },
{ std::string("FW"), std::string("W") },
{ std::string("FE"), std::string("E") }
};
// flip across the x axis
if (x_flag == true) {
orient_ = OrientMapFlipX[orient_];
} else { // flip across the y axis
orient_ = OrientMapFlipY[orient_];
}
}
std::string PlcObject::SimpleStr() const {
std::string str = "";
str += std::to_string(node_id_) + " ";
std::stringstream stream;
stream << std::fixed << std::setprecision(3) << x_ << " ";
stream << std::fixed << std::setprecision(3) << y_;
str += stream.str() + " ";
if (IsPort() == true) {
str += "_ ";
} else {
str += orient_ + " ";
}
str += "0\n";
return str;
}
std::string PrintPlaceholder(std::string key, std::string value) {
std::string line = "";
line = " attr {\n";
line += " key: \"" + key + "\"\n";
line += " value {\n";
line += " placeholder: \"" + value + "\"\n";
line += " }\n";
line += " }\n";
return line;
}
std::string PrintPlaceholder(std::string key, float value) {
std::string line = "";
line = " attr {\n";
line += " key: \"" + key + "\"\n";
line += " value {\n";
std::stringstream stream;
stream << std::fixed << std::setprecision(6) << value;
line += " placeholder: " + stream.str() + "\n";
line += " }\n";
line += " }\n";
return line;
}
// for protocol buffer netlist
std::ostream& operator <<(std::ostream &out, PlcObject& object) {
if (object.IsPort() == true) {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
for (auto& sink : object.inputs_) {
out << " input: \"" << sink << "\"\n";
}
out << PrintPlaceholder(std::string("side"), object.side_);
out << PrintPlaceholder(std::string("type"), object.pb_type_);
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n";
} else if (object.IsSoftMacroPin() == true || object.IsHardMacroPin() == true) {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
for (auto& sink : object.inputs_) {
out << " input: \"" << sink << "\"\n";
}
out << PrintPlaceholder(std::string("macro_name"), object.macro_ptr_->name_);
out << PrintPlaceholder(std::string("type"), object.pb_type_);
if (object.weight_ > 1) {
out << PrintPlaceholder(std::string("weight"), static_cast<int>(object.weight_));
}
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("x_offset"), object.x_offset_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << PrintPlaceholder(std::string("y_offset"), object.y_offset_);
out << "}\n";
} else if (object.IsHardMacro() == true) {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("type"), object.pb_type_);
out << PrintPlaceholder(std::string("height"), object.height_);
out << PrintPlaceholder(std::string("orientation"), object.orient_);
out << PrintPlaceholder(std::string("width"), object.width_);
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n";
} else {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("height"), object.height_);
out << PrintPlaceholder(std::string("type"), object.pb_type_);
out << PrintPlaceholder(std::string("width"), object.width_);
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n";
}
return out;
}
/*
std::string PlcObject::SimpleStr() const {
std::string str = "";
str += std::to_string(node_id) + " ";
str += std::to_string(std::round(x_, 12)) + " ";
str += std::to_string(std::round(y_, 12)) + " ";
if (IsPort() == true) {
str += "_ ";
} else {
str += orient_ + " ";
}
str += "0\n";
return str;
}
*/
// Class PBFNetlist
// read netlist file for all the plc objects
void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
std::map<std::string, size_t> plc_object_id_map = { }; // map name to node_id
// read protocol buffer netlist
const std::vector<std::string> float_values {
std::string("height"), std::string("weight"), std::string("width"),
std::string("x"), std::string("x_offset"), std::string("y"), std::string("y_offset")
};
const std::vector<std::string> placeholders {
std::string("macro_name"), std::string("orientation"),
std::string("side"), std::string("type")
};
// read the files and parse the files
std::string cur_line;
std::vector<std::string> header; // trace the header file
std::ifstream file_input(netlist_pbf_file);
if (!file_input.is_open()) {
std::cout << "[ERROR] We cannot open netlist file " << netlist_pbf_file << std::endl;
}
// define lamda function to remove qoutes
auto RemoveQuotes = [&](std::string word) {
std::string new_word = "";
for (auto& ch : word)
if (ch != '\"')
new_word += std::string(1, ch);
return new_word;
};
// Read lines
size_t object_id = 0;
std::string key = "";
while (std::getline(file_input, cur_line)) {
header.push_back(cur_line);
// split the string based on space
std::string word = "";
std::vector<std::string> items;
std::istringstream ss(cur_line);
while (ss >> word)
items.push_back(RemoveQuotes(word));
// check the contents of items
if (items[0] == std::string("node")) {
if (objects_.empty() == false && (*objects_.rbegin())->name_ == std::string("__metadata__")) {
objects_.pop_back();
object_id--;
for (size_t i = 0; i < header.size() - 1; i++)
pb_netlist_header_ += header[i] + "\n";
}
objects_.push_back(std::make_shared<PlcObject>(object_id));
object_id++;
} else if (items[0] == std::string("name:")) {
(*objects_.rbegin())->name_ = items[1];
} else if (items[0] == std::string("input:")) {
(*objects_.rbegin())->inputs_.push_back(items[1]);
} else if (items[0] == std::string("key:")) {
key = items[1]; // the attribute name
} else if (items[0] == std::string("placeholder:")) {
if (key == placeholders[0]) {
(*objects_.rbegin())->m_name_ = items[1];
} else if (key == placeholders[1]) {
(*objects_.rbegin())->orient_ = items[1];
} else if (key == placeholders[2]) {
(*objects_.rbegin())->side_ = items[1];
} else if (key == placeholders[3]) {
(*objects_.rbegin())->pb_type_ = items[1];
}
} else if (items[0] == std::string("f:")) {
if (key == float_values[0]) {
(*objects_.rbegin())->height_ = std::stof(items[1]);
} else if (key == float_values[1]) {
(*objects_.rbegin())->weight_ = std::stof(items[1]);
} else if (key == float_values[2]) {
(*objects_.rbegin())->width_ = std::stof(items[1]);
} else if (key == float_values[3]) {
(*objects_.rbegin())->x_ = std::stof(items[1]);
} else if (key == float_values[4]) {
(*objects_.rbegin())->x_offset_ = std::stof(items[1]);
} else if (key == float_values[5]) {
(*objects_.rbegin())->y_ = std::stof(items[1]);
} else if (key == float_values[6]) {
(*objects_.rbegin())->y_offset_ =std::stof(items[1]);
}
}
}
// Get all the macros, standard-cell clusters and IO ports
for (auto& plc_object : objects_) {
plc_object_id_map[plc_object->name_] = plc_object->node_id_;
if (plc_object->IsHardMacro() == true) {
macros_.push_back(plc_object->node_id_);
} else if (plc_object->IsSoftMacro() == true) {
stdcell_clusters_.push_back(plc_object->node_id_);
plc_object->MakeSquare(); // convert standard-cell clusters to square shape
} else if (plc_object->IsPort() == true) {
ports_.push_back(plc_object->node_id_);
}
}
// map each plc object to its corresponding macro
for (auto& plc_object : objects_) {
if (plc_object->IsHardMacroPin() == true || plc_object->IsSoftMacroPin() == true) {
plc_object->macro_id_ = plc_object_id_map[plc_object->m_name_];
plc_object->macro_ptr_ = objects_[plc_object->macro_id_];
} else {
plc_object->macro_id_ = plc_object->node_id_;
}
}
// create nets
for (auto& plc_object : objects_) {
if (plc_object->IsHardMacroPin() == true ||
plc_object->IsSoftMacroPin() == true ||
plc_object->IsPort() == true) {
std::vector<std::shared_ptr<PlcObject> > pins { plc_object };
for (auto& input_pin : plc_object->inputs_) {
pins.push_back(objects_[plc_object_id_map[input_pin]]);
}
if (pins.size() > 1) {
plc_object->nets_.push_back(pins.size());
nets_.push_back(std::make_shared<Net>(pins, plc_object->weight_));
}
}
}
// merge macros and stdcell_clusters
macro_clusters_.insert(macro_clusters_.end(),
macros_.begin(),
macros_.end());
macro_clusters_.insert(macro_clusters_.end(),
stdcell_clusters_.begin(),
stdcell_clusters_.end());
// sort macro_clusters
std::sort(macro_clusters_.begin(), macro_clusters_.end());
}
// Parse Plc File
void PBFNetlist::RestorePlacement(std::string file_name) {
// read the plc file and parse the file
std::string cur_line;
std::ifstream file_input(file_name);
if (!file_input.is_open()) {
std::cout << "[ERROR] We cannot open plc file " << file_name << std::endl;
}
// Read lines
while (std::getline(file_input, cur_line)) {
// split the string based on space
std::string word = "";
std::vector<std::string> items;
std::istringstream ss(cur_line);
while (ss >> word)
items.push_back(word);
// check if the current line is related to header
if (items.empty() == false && items[0] == std::string("#")) {
plc_header_ += cur_line + "\n";
if (items.size() > 2 && items[1] == std::string("Columns")) {
n_rows_ = std::stoi(items[3]);
n_cols_ = std::stoi(items[6]);
} else if (items.size() > 2 && items[1] == std::string("Width")) {
canvas_width_ = std::stof(items[3]);
canvas_height_ = std::stof(items[6]);
} else if (items.size() == 10 && items[1] == std::string("Routes")) {
hroute_per_micro_ = std::stof(items[6]);
vroute_per_micro_ = std::stof(items[9]);
} else if (items.size() == 11 && items[1] == std::string("Routes")) {
hrouting_alloc_ = std::stof(items[7]);
vrouting_alloc_ = std::stof(items[10]);
} else if (items.size() == 5 && items[1] == std::string("Smoothing")) {
smooth_factor_ = std::floor(std::stof(items[4]));
} else if (items.size() == 5 && items[1] == std::string("Overlap")) {
overlap_threshold_ = std::floor(std::stof(items[4]));
}
} else if (items.size() == 5) {
size_t node_id = static_cast<size_t>(std::stoi(items[0]));
objects_[node_id]->x_ = std::stof(items[1]);
objects_[node_id]->y_ = std::stof(items[2]);
objects_[node_id]->orient_ = items[3];
}
}
// grid info
grid_width_ = canvas_width_ / n_cols_;
grid_height_ = canvas_height_ / n_rows_;
}
// Write netlist
void PBFNetlist::WriteNetlist(std::string file_name) {
std::ofstream f;
f.open(file_name);
f << pb_netlist_header_;
for (auto& plc_object : objects_)
f << *plc_object;
f.close();
}
void PBFNetlist::WritePlcFile(std::string file_name) {
std::ofstream f;
f.open(file_name);
f << plc_header_;
for (auto& plc_object : objects_)
if (plc_object->IsHardMacro() == true ||
plc_object->IsSoftMacro() == true ||
plc_object->IsPort() == true) {
f << plc_object->SimpleStr();
}
f.close();
}
// Force-directed placement
void PBFNetlist::InitSoftMacros() {
const float x = canvas_width_ / 2.0;
const float y = canvas_height_ / 2.0;
for (auto& node_id : stdcell_clusters_)
objects_[node_id]->SetPos(x, y);
}
void PBFNetlist::CalcAttractiveForce(float attractive_factor,
float io_factor,
float max_displacement) {
// traverse the nets to calculate the attractive force
for (auto& net : nets_) {
std::shared_ptr<PlcObject> src_pin = net->pins_[0];
size_t src_macro_node_id = src_pin->node_id_;
if (src_pin->IsPort() == false)
src_macro_node_id = src_pin->macro_ptr_->node_id_;
// convert multi-pin nets to two-pin nets using star model
auto iter = net->pins_.begin();
iter++;
while (iter != net->pins_.end()) {
std::shared_ptr<PlcObject>& target_pin = *iter;
size_t target_macro_node_id = target_pin->node_id_;
if (target_pin->IsPort() == false)
target_macro_node_id = target_pin->macro_ptr_->node_id_;
// check the distance between src_pin and target_pin
std::pair<float, float> src_pos = src_pin->GetPos();
std::pair<float, float> target_pos = target_pin->GetPos();
const float x_dist = -1.0 * (src_pos.first - target_pos.first);
const float y_dist = -1.0 * (src_pos.second - target_pos.second);
float k = net->weight_; // spring constant
if (src_pin->IsPort() == true or target_pin->IsPort() == true)
k = k * io_factor * attractive_factor;
else
k = k * attractive_factor;
const float f_x = k * x_dist;
const float f_y = k * y_dist;
if (src_pin->IsSoftMacroPin() == true)
src_pin->macro_ptr_->AddForce(f_x, f_y);
if (target_pin->IsSoftMacroPin() == true)
target_pin->macro_ptr_->AddForce(-1.0 * f_x, -1.0 * f_y);
iter++;
} // finish current net
} // finish traversing nets
}
void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
float max_displacement) {
// traverse the soft macros and hard macros to check possible overlap
auto iter = macro_clusters_.begin();
while (iter != macro_clusters_.end()) {
size_t src_macro = *iter;
for (auto iter_loop = ++iter;
iter_loop != macro_clusters_.end(); iter_loop++) {
size_t target_macro = *iter_loop;
// check the overlap
float x_dir = 0.0; // overlap on x direction
float y_dir = 0.0; // overlap on y direction
const Rect src_bbox = objects_[src_macro]->GetBBox();
const Rect target_bbox = objects_[target_macro]->GetBBox();
const float src_width = src_bbox.ux - src_bbox.lx;
const float src_height = src_bbox.uy - src_bbox.ly;
const float target_width = target_bbox.ux - target_bbox.lx;
const float target_height = target_bbox.uy - target_bbox.ly;
const float src_cx = (src_bbox.lx + src_bbox.ux) / 2.0;
const float src_cy = (src_bbox.ly + src_bbox.uy) / 2.0;
const float target_cx = (target_bbox.lx + target_bbox.ux) / 2.0;
const float target_cy = (target_bbox.ly + target_bbox.uy) / 2.0;
const float x_min_dist = (src_width + target_width) / 2.0 - overlap_threshold_;
const float y_min_dist = (src_height + target_height) / 2.0 - overlap_threshold_;
// if there is no overlap
if (std::abs(target_cx - src_cx) > x_min_dist)
continue;
if (std::abs(target_cy - src_cy) > y_min_dist)
continue;
// fully overlap
if (src_cx == target_cx && src_cy == target_cy) {
x_dir = -1;
y_dir = -1;
} else {
x_dir = src_cx - target_cx;
y_dir = src_cy - target_cy;
const float dist = std::sqrt(x_dir * x_dir + y_dir * y_dir);
x_dir = x_dir / dist;
y_dir = y_dir / dist;
}
// calculate the force
const float f_x = repulsive_factor * max_displacement * x_dir;
const float f_y = repulsive_factor * max_displacement * y_dir;
objects_[src_macro]->AddForce(f_x, f_y);
objects_[target_macro]->AddForce(-1.0 * f_x, -1.0 * f_y);
}
} // finish traverse all the macros and stdcell_clusters
}
void PBFNetlist::MoveNode(size_t node_id, float x_dist, float y_dist) {
objects_[node_id]->x_ += x_dist;
objects_[node_id]->y_ += y_dist;
const Rect bbox = objects_[node_id]->GetBBox();
if (bbox.lx < 0.0 || bbox.ly < 0.0
|| bbox.ux > canvas_width_
|| bbox.uy > canvas_height_) {
objects_[node_id]->x_ -= x_dist;
objects_[node_id]->y_ -= y_dist;
}
}
void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
float io_factor, float max_displacement) {
// move soft macros based on forces
// reset forces
for (auto& cluster_id : stdcell_clusters_)
objects_[cluster_id]->ResetForce();
// calculate forces
CalcAttractiveForce(attractive_factor, io_factor, max_displacement);
CalcRepulsiveForce(repulsive_factor, max_displacement);
// normalization
float max_f_x = 0.0;
float max_f_y = 0.0;
for (auto& cluster_id : stdcell_clusters_) {
const std::pair<float, float> forces = objects_[cluster_id]->GetForce();
max_f_x = std::max(max_f_x, std::abs(forces.first));
max_f_y = std::max(max_f_y, std::abs(forces.second));
}
max_f_x *= max_displacement;
max_f_y *= max_displacement;
for (auto& cluster_id : stdcell_clusters_) {
objects_[cluster_id]->NormalForce(max_f_x, max_f_y);
const std::pair<float, float> forces = objects_[cluster_id]->GetForce();
MoveNode(cluster_id, forces.first, forces.second);
}
}
void PBFNetlist::FDPlacer(float io_factor, std::vector<int> num_steps,
std::vector<float> move_distance_factor,
std::vector<float> attract_factor,
std::vector<float> repel_factor,
bool use_current_loc,
bool debug_mode)
{
// io_factor is a scalar
// num_steps, max_move_distance, attract_factor, repel_factor are vectors of
// the same size
if (debug_mode == true) {
std::cout << std::string(80, '*') << std::endl;
std::cout << "Start Force-directed Placement" << std::endl;
}
std::vector<float> max_move_distance;
const float max_size = std::max(canvas_width_, canvas_height_);
auto step_iter = num_steps.begin();
auto move_iter = move_distance_factor.begin();
while (step_iter != num_steps.end()) {
max_move_distance.push_back((*move_iter) * max_size / (*step_iter));
step_iter++;
move_iter++;
}
// initialize the location
if (use_current_loc == false)
InitSoftMacros();
for (size_t i = 0; i < num_steps.size(); i++) {
const float attractive_factor = attract_factor[i];
const float repulsive_factor = repel_factor[i];
int num_step = num_steps[i];
float max_displacement = max_move_distance[i];
if (debug_mode == true) {
std::cout << std::string(80, '-') << std::endl;
std::cout << "Iteration " << i << std::endl;
std::cout << "attractive_factor = " << attractive_factor << std::endl;
std::cout << "repulsive_factor = " << repulsive_factor << std::endl;
std::cout << "max_displacement = " << max_displacement << std::endl;
std::cout << "num_step = " << num_step << std::endl;
std::cout << "io_factor = " << io_factor << std::endl;
}
for (auto j = 0; j < num_step; j++)
MoveSoftMacros(attractive_factor, repulsive_factor, io_factor, max_displacement);
}
}
#include <vector>
#include <map>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <memory>
// Define the class to handle netlist in Protocol Buffer Format
// Basic data structure
// OrientMap : map the orientation
// PlcObject : a superset of attributes for different types of plc objects
// PBFNetlist: the top-level class for handling netlist in protocol buffer netlist
// ***************************************************************
// Define basic classes
// ***************************************************************
// Define the orientation map
static const std::map<std::string, std::string> OrientMap = {
{ std::string("N"), std::string("R0") },
{ std::string("S"), std::string("R180") },
{ std::string("W"), std::string("R90") },
{ std::string("E"), std::string("R270") },
{ std::string("FN"), std::string("MY") },
{ std::string("FS"), std::string("MX") },
{ std::string("FW"), std::string("MX90") },
{ std::string("FE"), std::string("MY90") }
};
struct Rect {
float lx = 0.0;
float ly = 0.0;
float ux = 0.0;
float uy = 0.0;
Rect(float lx_, float ly_, float ux_, float uy_) {
lx = lx_;
ly = ly_;
ux = ux_;
uy = uy_;
}
};
// Define the plc object
// This is a superset of attributes for different types of plc objects
// A plc object can only have some or all the attributes
// Please check Circuit Training repo (https://github.com/google-research/circuit_training/blob/main/docs/NETLIST_FORMAT.md) for detailed explanation
class PlcObject {
public:
// constructor
PlcObject(size_t node_id) : node_id_(node_id) { }
// functions
// GetType Information
bool IsHardMacro() const;
bool IsSoftMacro() const;
bool IsSoftMacroPin() const;
bool IsHardMacroPin() const;
bool IsPort() const;
// Make Square
void MakeSquare();
// Get real location instead of relative position
const std::pair<float, float> GetPos() const;
float GetX() const;
float GetY() const;
const Rect GetBBox() const;
void SetPos(float x, float y);
// Force related functions
void ResetForce();
void AddForce(float f_x, float f_y);
void NormalForce(float max_f_x, float max_f_y);
std::pair<float, float> GetForce() const;
// Flip operation
// if x_flag == true, flip across x axis
// else, flip across y axis
void Flip(bool x_flag);
// string representation
friend std::ostream& operator <<(std::ostream &out, PlcObject& object); // for protocol buffer netlist
std::string SimpleStr() const; // for plc file
private:
std::string name_ = "";
size_t node_id_ = 0;
float height_ = 0.0;
float width_ = 0.0;
float weight_ = 1.0;
std::string pb_type_ = "MACRO"; // hard macro
float x_ = 0.0; // center of the object
float y_ = 0.0; // center of the object
std::string orient_ = "N"; // orientation
// PBPORT
std::string side_ = "LEFT"; // attribute for IOPORT (LEFT, RIGHT, TOP, BOTTOM)
// PBMACROPIN, PBGRPPIN
float x_offset_ = 0.0; // pin offset relative to the center of macro ("N")
float y_offset_ = 0.0; // pin offset relative to the center of macro ("N")
size_t macro_id_ = 0; // the corresponding node id of macro which the pin belongs to
std::string m_name_ = "";
std::shared_ptr<PlcObject> macro_ptr_ = nullptr;
std::vector<size_t> nets_; // nets (id) connecte to this node
std::vector<std::string> inputs_;
// the forces applied to this node
float f_x_ = 0.0;
float f_y_ = 0.0;
// utility function
friend class PBFNetlist;
};
std::string PrintPlaceholder(std::string key, std::string value);
std::string PrintPlaceholder(std::string key, float value);
// Net Class
class Net {
public:
// constructor
Net(std::vector<std::shared_ptr<PlcObject> > pins, float weight) {
pins_ = pins; // the first pin is always the source pin
weight_ = weight;
}
private:
std::vector<std::shared_ptr<PlcObject> > pins_;
float weight_ = 1.0;
friend class PBFNetlist;
};
// Class PBFNetlist representing the netlist
class PBFNetlist {
public:
PBFNetlist(std::string netlist_pbf_file) {
ParseNetlistFile(netlist_pbf_file);
}
void FDPlacer(float io_factor, std::vector<int> num_steps,
std::vector<float> move_distance_factor,
std::vector<float> attract_factor,
std::vector<float> repel_factor,
bool use_current_loc,
bool debug_mode = true);
void WriteNetlist(std::string file_name);
void RestorePlacement(std::string file_name);
void WritePlcFile(std::string file_name);
private:
// information from protocol buffer netlist
std::string pb_netlist_header_ = "";
std::vector<std::shared_ptr<PlcObject> > objects_;
std::vector<size_t> macros_;
std::vector<size_t> stdcell_clusters_;
std::vector<size_t> macro_clusters_;
std::vector<size_t> ports_;
std::vector<std::shared_ptr<Net> > nets_;
// information from plc file
std::string plc_header_ = "";
int n_cols_ = -1;
int n_rows_ = -1;
float canvas_width_ = 0.0;
float canvas_height_ = 0.0;
float grid_width_ = 0.0;
float grid_height_ = 0.0;
// routing information
float smooth_factor_ = 2;
float overlap_threshold_ = 0.0;
float vrouting_alloc_ = 0.0;
float hrouting_alloc_ = 0.0;
float hroute_per_micro_ = 0.0;
float vroute_per_micro_ = 0.0;
// utility functions
void ParseNetlistFile(std::string netlist_pbf_file);
// Force-directed placement
void InitSoftMacros(); // put all the soft macros to the center of canvas
void CalcAttractiveForce(float attractive_factor, float io_factor, float max_displacement);
void CalcRepulsiveForce(float repulsive_factor, float max_displacement);
void MoveSoftMacros(float attractive_factor, float repulsive_factor,
float io_factor, float max_displacement);
void MoveNode(size_t node_id, float x_dist, float y_dist);
};
#include <iostream>
#include <chrono>
#include "FD.h"
int main(int argc, char* argv[]) {
std::string netlist_file = argv[1];
std::string plc_file = argv[2];
PBFNetlist design(netlist_file);
std::string new_netlist_file = netlist_file + ".new";
design.WriteNetlist(new_netlist_file);
design.RestorePlacement(plc_file);
const float io_factor = 1.0;
const std::vector<int> num_steps { 10, 10, 10 };
const std::vector<float> attract_factor { 100, 1.0e-3, 1.0e-5 };
const std::vector<float> repel_factor { 0.0, 1.0e6, 1.0e6 };
const std::vector<float> move_distance_factor { 1.0, 1.0, 1.0 };
const bool use_current_loc = false;
const bool debug_mode = false;
auto start_timestamp_global = std::chrono::high_resolution_clock::now();
design.FDPlacer(io_factor, num_steps,
move_distance_factor,
attract_factor,
repel_factor,
use_current_loc,
debug_mode);
auto end_timestamp_global = std::chrono::high_resolution_clock::now();
double total_global_time
= std::chrono::duration_cast<std::chrono::nanoseconds>(
end_timestamp_global - start_timestamp_global)
.count();
total_global_time *= 1e-9;
std::cout << "Runtime of FDPlacer : " << total_global_time << std::endl;
design.WritePlcFile(plc_file + ".new");
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment