Commit c510ccb8 by sakundu

Merge branch 'main' of github.com:TILOS-AI-Institute/MacroPlacement into main

parents cfdb672b 1804a82f
{
"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
...@@ -35,10 +35,38 @@ Here f_x_max (f_y_max) is the absolute value of f_x (f_y) which has the maximum ...@@ -35,10 +35,38 @@ Here f_x_max (f_y_max) is the absolute value of f_x (f_y) which has the maximum
After normalization, the standard-cell clusters are moved based on the forces exerted on them. The move which will push the standard-cell clusters outside of canvas will be canceled. After normalization, the standard-cell clusters are moved based on the forces exerted on them. The move which will push the standard-cell clusters outside of canvas will be canceled.
## How to run our implementation
We provide implementations in both [python](https://github.com/TILOS-AI-Institute/MacroPlacement/blob/main/CodeElements/FDPlacement/FD.py) and [c++](https://github.com/TILOS-AI-Institute/MacroPlacement/tree/main/CodeElements/FDPlacement/src).
To run the FD placer implemented in python, you need to install all the dependencies of [Circuit Training](https://github.com/google-research/circuit_training.git).
You can set the testcase and related parameters in [FD.py](https://github.com/TILOS-AI-Institute/MacroPlacement/blob/449e837dc1c2ec927a08976ec7925ddfe53f9f04/CodeElements/FDPlacement/FD.py#L1395).
Then you can our FD placer as following:
```
python FD.py
```
To run the FD placer implemented in c++, you need to compile c++ codes as following:
```
mkdir build
cd build
cmake ..
```
You can set the related parameters in [main.cpp](https://github.com/TILOS-AI-Institute/MacroPlacement/blob/449e837dc1c2ec927a08976ec7925ddfe53f9f04/CodeElements/FDPlacement/src/main.cpp#L14) before you compile the codes.
Then you can run FD placer as following:
```
./build/fd_placer ariane133/ariane.pb.txt ariane133/ariane.plc
```
## **Experimental results** ## **Experimental results**
We have tested our codes on the Ariane133 (NanGate45). The experimental results are presented below. We have tested our codes on the Ariane133 (NanGate45). The experimental results are presented below.
The results from our python implementation and our c++ implementation are a little different. This is due to the precision loss while converting from python codes to C++ codes.
<p align="center"> <p align="center">
<img src="./ariane133/FD_result_1225.png" width= "1200"/> <img src="./ariane133/FD_result_20230112.png" width= "1200"/>
</p> </p>
<p align="center"> <p align="center">
Figure 1. results for Ariane133 (NanGate45). Figure 1. results for Ariane133 (NanGate45).
......
# 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
# 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 1147.924 519.771 N 0
8510 1121.068 772.375 N 0
8530 1099.112 484.324 N 0
8550 1021.974 471.144 N 0
8564 1138.980 989.011 N 0
8586 1145.401 325.330 N 0
8618 1013.386 616.272 N 0
8662 967.417 461.058 N 0
8703 1036.043 628.743 N 0
8733 1183.753 846.440 N 0
8739 1201.745 524.430 N 0
8746 1175.089 830.464 N 0
8749 1094.576 630.328 N 0
8753 1261.087 1006.050 N 0
8756 1144.223 225.623 N 0
8762 982.616 623.474 N 0
8770 952.123 466.007 N 0
8775 966.522 625.823 N 0
8786 1171.630 852.716 N 0
8792 1143.850 482.722 N 0
8801 1133.416 772.875 N 0
8805 1046.685 482.841 N 0
8808 1149.770 1171.479 N 0
8825 1163.246 336.912 N 0
8837 1165.780 1029.189 N 0
8845 1010.960 625.973 N 0
8865 903.418 462.861 N 0
8869 974.330 612.846 N 0
8878 1077.511 820.016 N 0
8883 1123.136 482.299 N 0
8890 1075.609 755.030 N 0
8894 1020.192 479.741 N 0
8897 1126.601 997.672 N 0
8901 1158.694 352.480 N 0
8906 817.934 463.201 N 0
8915 977.923 459.532 N 0
8922 995.012 462.592 N 0
8928 282.855 1045.935 N 0
8966 810.465 1048.832 N 0
8985 803.419 886.535 N 0
9030 468.704 1050.208 N 0
9066 225.718 1015.249 N 0
9098 766.008 1051.236 N 0
9149 678.544 919.834 N 0
9236 538.498 1052.339 N 0
9283 514.143 291.555 N 0
9328 754.860 302.842 N 0
9357 812.269 161.156 N 0
9392 330.031 1046.386 N 0
9404 909.587 1041.773 N 0
9425 978.038 769.152 N 0
9445 512.716 1056.615 N 0
9455 220.969 1048.047 N 0
9473 891.854 1040.303 N 0
9489 725.610 915.057 N 0
9530 587.279 293.028 N 0
9550 821.526 325.573 N 0
9568 815.680 310.328 N 0
9580 270.514 1071.114 N 0
9587 822.399 1044.163 N 0
9602 526.105 1053.048 N 0
9608 267.594 1041.628 N 0
9617 849.292 1045.854 N 0
9624 779.918 761.090 N 0
9636 557.930 1053.595 N 0
9657 615.887 291.454 N 0
9664 700.310 296.596 N 0
9670 237.994 1194.735 N 0
9680 201.877 1089.916 N 0
9686 806.695 910.925 N 0
9712 612.152 1057.692 N 0
9720 532.287 288.561 N 0
9726 717.199 295.866 N 0
9732 737.547 246.210 N 0
9738 308.112 1195.055 N 0
9745 872.909 1047.079 N 0
9752 481.025 1044.920 N 0
9771 197.988 1008.450 N 0
9780 602.733 901.932 N 0
9794 633.423 292.561 N 0
9818 685.652 296.985 N 0
9828 875.585 1038.433 N 0
9836 668.121 754.203 N 0
9856 262.980 1014.811 N 0
9872 792.909 1053.723 N 0
9880 811.391 899.550 N 0
9888 625.562 1047.597 N 0
9902 578.107 294.520 N 0
9911 751.368 313.226 N 0
9925 340.547 1053.964 N 0
9932 716.899 900.727 N 0
9955 197.861 879.650 N 0
9964 921.172 892.403 N 0
9969 593.918 906.488 N 0
9983 471.038 898.397 N 0
9995 605.671 296.980 N 0
10010 745.442 296.449 N 0
10021 276.801 899.239 N 0
10027 812.727 1068.318 N 0
10033 668.819 903.695 N 0
10040 537.604 1033.961 N 0
10045 276.968 889.211 N 0
10050 806.087 974.051 N 0
10059 667.511 902.214 N 0
10072 500.932 873.571 N 0
10079 438.482 437.336 N 0
10087 721.175 450.190 N 0
10107 730.604 298.124 N 0
10120 473.398 434.606 N 0
10127 326.434 523.366 N 0
10154 304.935 483.817 N 0
10175 274.397 492.465 N 0
10191 273.901 515.405 N 0
10215 262.984 502.210 N 0
10231 267.833 588.435 N 0
10247 262.806 623.276 N 0
10258 259.155 735.243 N 0
10295 222.719 618.051 N 0
10316 206.796 672.720 N 0
10340 412.946 901.473 N 0
10359 355.739 902.862 N 0
10383 291.046 897.507 N 0
10396 603.577 566.209 N 0
10416 725.549 600.274 N 0
10428 786.812 611.142 N 0
10434 522.343 900.207 N 0
10468 536.609 911.503 N 0
10474 593.333 761.163 N 0
10478 990.437 627.374 N 0
10492 986.446 610.611 N 0
10512 1071.285 476.460 N 0
10542 738.013 768.121 N 0
10547 524.584 721.972 N 0
10577 857.168 637.587 N 0
10599 755.581 608.667 N 0
10616 550.157 576.785 N 0
10624 922.529 750.956 N 0
10637 882.761 610.474 N 0
10667 876.878 258.484 N 0
10670 523.472 732.180 N 0
10687 487.674 902.436 N 0
10690 384.353 468.132 N 0
10704 392.211 875.884 N 0
10716 740.898 734.847 N 0
10725 518.008 889.543 N 0
10749 732.160 752.700 N 0
10767 507.945 921.810 N 0
10778 677.039 934.874 N 0
10782 670.952 643.861 N 0
10789 641.831 760.137 N 0
10808 1085.725 918.725 N 0
10821 654.323 710.971 N 0
10827 733.604 616.516 N 0
10838 597.672 736.539 N 0
10847 519.727 881.045 N 0
10853 401.090 683.733 N 0
10868 426.579 811.116 N 0
10885 560.484 756.372 N 0
10891 714.897 925.364 N 0
10904 699.719 563.509 N 0
10911 621.978 537.602 N 0
10920 872.372 900.231 N 0
10950 757.844 911.266 N 0
10974 530.430 1044.814 N 0
11000 938.844 895.374 N 0
11021 541.033 436.542 N 0
11034 674.663 453.087 N 0
11047 734.518 304.999 N 0
11056 737.127 1057.969 N 0
11078 704.624 904.949 N 0
11101 435.425 905.000 N 0
11121 300.874 1044.479 N 0
11144 786.069 1052.110 N 0
11160 751.163 450.651 N 0
11177 378.447 539.583 N 0
11185 483.879 695.749 N 0
11193 456.728 908.842 N 0
11201 284.987 870.070 N 0
11209 659.346 593.756 N 0
11225 588.094 436.991 N 0
11231 700.939 773.636 N 0
11236 784.743 634.655 N 0
11242 571.912 514.830 N 0
11246 903.029 901.415 N 0
11263 523.187 555.647 N 0
11270 686.381 530.118 N 0
11280 598.263 580.376 N 0
11285 614.467 931.712 N 0
11309 491.434 546.277 N 0
11323 739.592 606.343 N 0
11328 597.106 455.708 N 0
11342 333.236 900.611 N 0
11357 567.090 724.659 N 0
11361 812.786 609.420 N 0
11365 828.970 490.984 N 0
11373 481.124 534.563 N 0
11381 717.871 952.900 N 0
11413 422.009 680.992 N 0
11431 769.533 618.600 N 0
11435 377.186 633.198 N 0
11443 534.085 556.175 N 0
11472 860.972 1045.184 N 0
11480 538.671 901.668 N 0
11505 686.452 909.059 N 0
11509 375.381 873.692 N 0
11525 652.496 480.854 N 0
11545 789.533 758.258 N 0
11553 589.762 935.650 N 0
11579 445.016 646.636 N 0
11608 455.919 695.535 N 0
11639 506.905 512.513 N 0
11644 496.264 673.194 N 0
11665 459.077 704.888 N 0
11677 315.054 893.984 N 0
11686 616.050 905.200 N 0
11691 673.292 604.603 N 0
11695 528.021 438.385 N 0
11719 726.408 444.932 N 0
11725 495.028 561.055 N 0
11729 590.944 910.608 N 0
11766 285.071 739.051 N 0
11780 565.556 578.163 N 0
11800 544.867 543.633 N 0
11814 382.236 505.627 N 0
11857 414.802 531.630 N 0
11870 643.120 590.721 N 0
11881 507.868 502.379 N 0
11888 404.229 527.338 N 0
11900 652.090 589.310 N 0
11913 789.747 562.301 N 0
11921 289.997 570.973 N 0
11934 248.344 638.073 N 0
11942 570.648 602.584 N 0
11947 366.839 411.069 N 0
11952 570.366 535.945 N 0
11983 239.895 728.191 N 0
11991 693.237 890.864 N 0
12013 728.079 602.547 N 0
12018 616.047 736.449 N 0
12021 557.093 598.021 N 0
12029 547.009 510.202 N 0
12037 489.884 512.246 N 0
12052 868.904 658.961 N 0
12068 380.814 487.039 N 0
12077 712.824 614.672 N 0
12082 310.391 542.697 N 0
12093 755.046 524.841 N 0
12104 598.785 609.655 N 0
12145 442.311 592.789 N 0
12158 722.920 524.362 N 0
12167 396.539 775.670 N 0
12171 517.010 761.340 N 0
12180 361.324 468.798 N 0
12185 734.626 665.848 N 0
12210 793.708 594.703 N 0
12232 576.640 781.630 N 0
12237 400.131 695.700 N 0
12266 338.707 402.454 N 0
12302 499.440 449.266 N 0
12309 841.978 925.987 N 0
12318 894.109 610.785 N 0
12325 568.057 753.598 N 0
12352 905.521 867.001 N 0
12366 416.480 842.276 N 0
12376 371.501 718.818 N 0
12398 474.728 565.797 N 0
12405 668.620 966.576 N 0
12416 815.471 766.277 N 0
12458 792.916 588.620 N 0
12472 454.192 666.289 N 0
12518 385.288 434.991 N 0
12543 767.053 726.786 N 0
12579 514.554 707.297 N 0
12586 325.934 432.985 N 0
12598 1093.051 783.298 N 0
12604 397.510 722.883 N 0
12607 473.809 594.113 N 0
12614 491.027 688.118 N 0
12647 900.724 486.800 N 0
12658 391.461 661.392 N 0
12666 522.775 510.301 N 0
12675 259.529 472.370 N 0
12684 888.383 421.679 N 0
12705 248.003 844.632 N 0
12712 321.145 834.485 N 0
12722 380.737 340.453 N 0
12762 570.558 801.426 N 0
12803 813.428 596.701 N 0
12810 349.116 873.772 N 0
12817 775.776 442.431 N 0
12835 901.719 587.407 N 0
12844 671.171 782.890 N 0
12854 611.872 427.996 N 0
12876 472.357 564.954 N 0
12899 531.174 538.428 N 0
12903 623.307 553.132 N 0
12967 483.947 860.182 N 0
12986 340.203 774.492 N 0
13003 743.597 912.969 N 0
13085 704.568 584.285 N 0
13091 376.452 376.676 N 0
13125 552.052 687.221 N 0
13153 565.362 549.747 N 0
13165 358.807 609.646 N 0
13195 612.697 791.546 N 0
13205 366.879 659.171 N 0
13224 551.858 528.238 N 0
13235 710.809 1043.072 N 0
13246 737.053 598.562 N 0
13253 742.279 778.897 N 0
13283 938.143 649.812 N 0
13288 901.148 612.939 N 0
13302 951.141 798.236 N 0
13316 668.904 768.877 N 0
13350 382.962 561.552 N 0
13360 803.301 929.259 N 0
13369 309.940 705.504 N 0
13393 627.347 574.817 N 0
13402 942.773 762.698 N 0
13406 589.425 603.251 N 0
13412 661.589 609.816 N 0
13418 528.325 561.094 N 0
13431 870.032 764.506 N 0
13440 536.618 579.027 N 0
13447 714.069 694.546 N 0
13471 540.111 480.995 N 0
13485 443.927 600.503 N 0
13518 454.883 924.945 N 0
13525 752.289 364.023 N 0
13539 737.698 702.586 N 0
13550 885.220 759.299 N 0
13555 554.519 309.879 N 0
13569 300.531 402.235 N 0
13589 497.449 624.523 N 0
13605 478.738 503.333 N 0
13610 766.692 746.220 N 0
13648 649.456 576.614 N 0
13663 198.079 811.870 N 0
13672 659.418 311.847 N 0
13679 933.245 447.146 N 0
13690 409.173 495.656 N 0
13710 610.293 955.377 N 0
13716 879.920 606.665 N 0
13735 342.360 634.212 N 0
13766 313.539 639.148 N 0
13792 646.781 931.046 N 0
13803 421.403 593.196 N 0
13814 707.626 758.388 N 0
13846 812.843 647.835 N 0
13860 718.112 726.966 N 0
13907 442.558 566.878 N 0
13918 353.129 571.559 N 0
13950 995.865 651.622 N 0
13961 738.511 759.858 N 0
13970 874.132 776.861 N 0
13976 359.206 436.951 N 0
13992 575.590 462.332 N 0
13998 427.208 866.107 N 0
14009 517.192 691.494 N 0
14036 677.475 567.088 N 0
14046 255.648 564.068 N 0
14056 799.493 456.208 N 0
14070 469.503 483.971 N 0
14082 962.669 765.925 N 0
14087 515.196 622.059 N 0
14120 794.817 754.847 N 0
14128 535.198 939.249 N 0
14144 659.628 759.223 N 0
14167 693.447 717.792 N 0
14178 897.197 639.685 N 0
14182 709.367 647.056 N 0
14204 526.223 575.238 N 0
14217 611.266 757.486 N 0
14222 791.812 491.619 N 0
14235 372.495 772.435 N 0
14251 705.089 755.250 N 0
14257 438.085 492.789 N 0
14270 339.609 368.427 N 0
14284 936.107 474.473 N 0
14304 451.191 818.192 N 0
14315 558.772 629.629 N 0
14336 378.558 851.707 N 0
14353 496.585 888.015 N 0
14362 661.221 275.988 N 0
14392 1003.141 744.013 N 0
14397 528.554 526.641 N 0
14404 871.623 706.464 N 0
14430 599.201 526.691 N 0
14447 443.369 557.302 N 0
14456 649.815 854.799 N 0
14498 875.845 635.737 N 0
14503 667.859 596.551 N 0
14516 315.413 572.554 N 0
14543 629.922 733.466 N 0
14574 342.748 741.611 N 0
14613 527.778 642.540 N 0
14620 327.189 865.854 N 0
14638 654.625 353.365 N 0
14648 492.884 647.643 N 0
14663 708.201 599.742 N 0
14671 605.810 549.770 N 0
14678 766.814 804.940 N 0
14712 962.338 733.611 N 0
14730 738.728 892.855 N 0
14751 733.588 744.976 N 0
14757 606.094 330.481 N 0
14765 813.752 624.352 N 0
14771 744.312 868.413 N 0
14810 671.018 695.817 N 0
14816 755.728 621.278 N 0
14822 932.104 738.970 N 0
14829 494.447 613.392 N 0
14836 310.589 672.964 N 0
14850 461.481 619.462 N 0
14856 856.727 885.374 N 0
14866 390.624 900.241 N 0
14879 483.978 277.506 N 0
14892 733.377 622.689 N 0
14913 609.817 542.648 N 0
14919 703.017 488.184 N 0
14930 740.750 719.597 N 0
14964 883.788 454.670 N 0
14976 468.123 456.379 N 0
14984 752.363 636.917 N 0
14988 789.470 319.746 N 0
14998 831.612 414.599 N 0
15028 532.062 590.133 N 0
15034 619.300 596.832 N 0
15057 745.438 581.788 N 0
15061 385.579 585.909 N 0
15079 788.135 416.026 N 0
15090 838.290 721.073 N 0
15113 692.167 616.854 N 0
15134 750.062 471.314 N 0
15142 698.558 430.692 N 0
15161 795.638 474.219 N 0
15168 860.056 729.224 N 0
15207 587.584 420.643 N 0
15230 662.428 296.239 N 0
15265 650.749 899.567 N 0
15276 788.912 726.879 N 0
15297 420.027 647.975 N 0
15324 1045.654 755.800 N 0
15343 898.704 763.758 N 0
15370 569.078 522.931 N 0
15379 572.253 492.281 N 0
15397 175.265 685.298 N 0
15433 627.306 741.343 N 0
15449 461.850 749.929 N 0
15465 858.611 455.988 N 0
15475 411.329 560.441 N 0
15479 448.722 875.986 N 0
15486 809.940 726.757 N 0
15493 546.126 597.393 N 0
15517 663.838 578.705 N 0
15524 418.519 434.793 N 0
15538 652.065 883.387 N 0
15547 493.273 774.444 N 0
15552 693.713 752.142 N 0
15584 239.941 684.581 N 0
15614 559.809 771.973 N 0
15620 588.160 753.710 N 0
15638 477.560 878.432 N 0
15657 758.483 702.395 N 0
15665 440.696 524.828 N 0
15672 711.205 805.445 N 0
15721 199.124 728.800 N 0
15737 262.987 414.134 N 0
15755 582.043 847.453 N 0
15766 530.668 689.483 N 0
15804 784.150 645.174 N 0
15811 735.408 566.138 N 0
15820 615.130 759.252 N 0
15842 584.564 712.825 N 0
15867 956.577 926.540 N 0
15883 900.271 793.543 N 0
15912 842.958 642.712 N 0
15918 652.125 550.568 N 0
15955 357.697 799.443 N 0
15966 813.066 778.119 N 0
15995 712.948 750.541 N 0
16012 823.790 592.360 N 0
16024 469.674 646.174 N 0
16033 783.847 915.886 N 0
16058 403.336 874.011 N 0
16070 758.696 745.783 N 0
16090 863.618 486.797 N 0
16105 814.629 702.858 N 0
16134 541.784 462.261 N 0
16148 579.432 885.383 N 0
16158 828.756 744.183 N 0
16163 823.594 567.198 N 0
16171 303.647 511.082 N 0
16183 678.952 673.000 N 0
16229 586.306 743.435 N 0
16248 512.982 856.530 N 0
16259 571.838 563.930 N 0
16289 589.132 692.056 N 0
16292 856.273 765.860 N 0
16298 709.144 882.224 N 0
16304 332.913 603.786 N 0
16322 452.173 859.127 N 0
16329 659.590 1063.004 N 0
16338 399.550 747.646 N 0
16354 951.997 621.160 N 0
16362 547.383 850.394 N 0
16369 415.381 582.920 N 0
16379 540.823 721.331 N 0
16409 818.060 622.455 N 0
16414 198.970 768.220 N 0
16424 269.294 672.686 N 0
16431 329.422 503.692 N 0
16460 283.383 608.135 N 0
16476 674.327 798.255 N 0
16503 415.725 401.449 N 0
16513 835.291 785.095 N 0
16519 774.070 604.884 N 0
16524 755.842 619.038 N 0
16532 373.151 748.645 N 0
16556 870.450 466.156 N 0
16578 577.188 741.023 N 0
16621 689.304 486.436 N 0
16633 426.038 721.081 N 0
16690 484.779 726.691 N 0
16713 343.797 721.761 N 0
16728 812.300 753.072 N 0
16733 657.005 776.202 N 0
16738 534.589 655.402 N 0
16778 820.981 524.651 N 0
16783 647.990 795.085 N 0
16807 534.218 627.017 N 0
16830 283.896 806.612 N 0
16852 649.000 691.714 N 0
16865 658.316 732.997 N 0
16885 842.207 890.108 N 0
16908 1065.248 615.013 N 0
16923 498.819 575.391 N 0
16933 795.490 805.361 N 0
16959 899.824 740.020 N 0
16964 729.433 575.311 N 0
16977 452.657 623.305 N 0
16996 568.186 455.133 N 0
17034 473.586 599.424 N 0
17044 866.844 747.850 N 0
17051 548.133 888.507 N 0
17066 477.378 621.867 N 0
17079 309.970 602.870 N 0
17098 591.381 639.686 N 0
17121 359.340 501.388 N 0
17132 729.967 635.301 N 0
17146 260.836 709.360 N 0
17175 667.386 744.128 N 0
17181 619.448 690.846 N 0
17199 592.436 585.282 N 0
17210 611.879 391.710 N 0
17237 583.718 481.677 N 0
17310 587.425 622.061 N 0
17340 576.817 568.967 N 0
17350 545.932 528.032 N 0
17360 384.052 816.545 N 0
17414 767.591 771.891 N 0
17434 617.554 620.710 N 0
17439 609.056 596.135 N 0
17451 909.608 713.904 N 0
17464 850.550 607.358 N 0
17482 997.857 590.533 N 0
17490 855.032 320.922 N 0
17507 754.330 943.724 N 0
17516 720.727 768.161 N 0
17539 614.742 506.246 N 0
17544 508.930 726.789 N 0
17565 532.076 731.721 N 0
17603 648.622 819.752 N 0
17614 667.762 735.459 N 0
17619 386.109 529.703 N 0
17640 829.775 752.711 N 0
17674 845.627 583.127 N 0
17710 659.764 518.191 N 0
17737 676.502 828.239 N 0
17751 696.749 398.452 N 0
17758 647.641 620.344 N 0
17786 835.483 619.521 N 0
17792 500.482 896.965 N 0
17811 594.643 515.762 N 0
17821 613.711 438.624 N 0
17839 578.348 591.783 N 0
17850 277.071 768.127 N 0
17870 347.821 832.864 N 0
17879 462.588 727.903 N 0
17916 614.712 881.545 N 0
17922 248.153 810.762 N 0
17944 450.100 677.167 N 0
17972 623.107 476.901 N 0
17989 339.892 709.450 N 0
18002 447.273 791.886 N 0
18042 451.885 835.203 N 0
18051 384.575 610.054 N 0
18065 785.640 733.069 N 0
18093 371.314 697.409 N 0
18126 550.182 403.028 N 0
18138 744.740 425.007 N 0
18151 664.608 584.184 N 0
18174 774.485 858.987 N 0
18178 572.393 884.622 N 0
18181 540.344 793.440 N 0
18188 708.595 626.301 N 0
18193 616.272 453.027 N 0
18201 425.118 623.122 N 0
18213 916.430 756.196 N 0
18222 567.512 911.781 N 0
18234 627.950 757.014 N 0
18241 345.057 534.651 N 0
18255 425.121 704.252 N 0
18289 706.869 729.608 N 0
18294 283.758 833.065 N 0
18305 811.667 669.659 N 0
18336 661.975 724.255 N 0
18357 611.852 815.372 N 0
18400 320.301 805.211 N 0
18424 681.935 728.920 N 0
18453 617.595 737.660 N 0
18473 818.313 849.121 N 0
18483 491.099 480.708 N 0
18505 829.458 612.374 N 0
18529 468.568 539.507 N 0
18561 958.985 573.557 N 0
18567 207.433 639.670 N 0
18606 655.582 438.590 N 0
18614 742.359 480.883 N 0
18630 426.548 796.338 N 0
18659 666.434 750.692 N 0
18669 766.146 560.917 N 0
18732 560.890 652.589 N 0
18792 581.342 573.543 N 0
18800 656.707 397.754 N 0
18810 933.222 580.581 N 0
18821 600.183 477.241 N 0
18830 696.750 595.216 N 0
18835 858.855 563.490 N 0
18844 525.819 602.079 N 0
18881 811.686 749.057 N 0
18899 881.781 589.378 N 0
18913 534.591 740.368 N 0
18938 452.826 893.685 N 0
18961 418.470 616.943 N 0
18973 741.315 802.238 N 0
19012 393.655 802.226 N 0
19033 479.435 927.245 N 0
19041 714.920 743.289 N 0
19056 1005.167 790.865 N 0
19070 314.769 769.456 N 0
19100 624.520 780.313 N 0
19112 791.103 703.129 N 0
19126 426.769 668.153 N 0
19138 812.068 807.480 N 0
19166 423.476 470.227 N 0
19181 393.553 846.069 N 0
19207 248.652 535.080 N 0
19216 784.814 891.286 N 0
19231 855.920 778.234 N 0
19237 341.445 564.486 N 0
19246 374.299 684.860 N 0
19253 854.396 760.829 N 0
19259 761.535 652.574 N 0
19266 393.846 626.159 N 0
19283 745.138 895.407 N 0
19298 493.671 533.979 N 0
19312 769.843 755.445 N 0
19322 622.403 580.675 N 0
19327 453.504 732.749 N 0
19361 648.834 919.991 N 0
19366 787.982 781.982 N 0
19370 476.432 680.525 N 0
19409 627.981 713.294 N 0
19430 430.373 740.235 N 0
19444 421.065 564.515 N 0
19456 707.645 780.400 N 0
19461 524.399 764.317 N 0
19481 459.074 505.413 N 0
19485 650.219 602.557 N 0
19492 616.712 652.934 N 0
19499 590.402 1042.917 N 0
19522 442.863 756.025 N 0
19551 931.440 613.508 N 0
19562 649.098 637.822 N 0
19579 955.685 610.331 N 0
19586 676.601 621.534 N 0
19623 341.234 662.458 N 0
19636 827.567 450.630 N 0
19641 618.891 882.186 N 0
19646 780.447 587.544 N 0
19661 457.595 427.258 N 0
19680 655.433 737.001 N 0
19695 236.471 760.959 N 0
19730 607.996 716.058 N 0
19749 757.907 770.038 N 0
19756 281.554 639.321 N 0
19767 549.032 453.866 N 0
19778 997.421 762.947 N 0
19811 438.758 533.209 N 0
19815 393.224 645.337 N 0
19839 497.986 586.850 N 0
19880 493.011 451.982 N 0
19888 314.219 743.860 N 0
19905 746.205 589.799 N 0
19919 855.469 618.415 N 0
19926 465.339 790.005 N 0
19941 695.080 745.298 N 0
19948 611.849 846.823 N 0
19961 500.365 650.019 N 0
19986 691.517 450.519 N 0
20020 866.939 807.847 N 0
20056 429.618 759.089 N 0
20109 693.120 596.701 N 0
20121 677.579 878.720 N 0
20137 281.721 546.895 N 0
20147 493.694 746.252 N 0
20169 654.758 428.805 N 0
20183 500.352 405.178 N 0
20194 425.900 496.984 N 0
20209 578.342 766.762 N 0
20250 562.089 740.970 N 0
20270 326.799 468.402 N 0
20282 833.587 764.435 N 0
20310 704.976 324.880 N 0
20326 630.519 599.749 N 0
20345 483.858 829.680 N 0
20362 520.574 827.949 N 0
20372 726.721 781.249 N 0
20393 246.416 600.046 N 0
20423 715.621 848.118 N 0
20430 873.502 734.584 N 0
20466 523.913 486.970 N 0
20482 688.574 579.952 N 0
20491 297.869 441.354 N 0
20509 457.362 465.396 N 0
20531 896.030 557.706 N 0
20543 430.168 882.421 N 0
20578 411.684 465.426 N 0
20590 799.110 629.603 N 0
20595 335.779 686.865 N 0
20606 1101.809 926.544 N 0
20633 1147.459 995.391 N 0
20636 494.693 1195.247 N 0
20640 802.430 608.865 N 0
20644 810.175 149.061 N 0
20647 882.185 1167.149 N 0
20651 950.187 768.322 N 0
20658 206.577 1166.836 N 0
20661 255.641 1043.554 N 0
20664 612.839 1107.849 N 0
20667 672.558 906.489 N 0
20672 435.899 1057.546 N 0
20675 629.430 907.731 N 0
20678 726.100 597.061 N 0
20681 514.138 1042.082 N 0
20685 380.622 706.850 N 0
20688 574.226 584.129 N 0
20692 305.091 473.310 N 0
20696 292.407 487.937 N 0
20702 205.886 688.628 N 0
20725 793.311 616.379 N 0
20728 853.139 467.951 N 0
20739 805.277 907.512 N 0
20744 845.636 469.246 N 0
20752 214.835 870.745 N 0
20767 220.561 874.400 N 0
20787 267.432 927.390 N 0
20807 199.670 987.825 N 0
20827 603.808 914.846 N 0
20831 950.403 1031.597 N 0
20837 230.065 872.630 N 0
20852 752.269 1048.820 N 0
20860 803.082 874.347 N 0
20863 1006.380 612.479 N 0
20866 577.164 551.220 N 0
20875 959.909 629.370 N 0
20880 701.692 736.469 N 0
20883 681.691 605.499 N 0
20886 316.099 1042.382 N 0
20900 704.279 735.619 N 0
20903 702.310 740.651 N 0
20906 226.986 784.826 N 0
20914 736.554 445.571 N 0
20917 499.386 1049.915 N 0
20943 360.866 638.053 N 0
20952 752.154 764.585 N 0
20959 301.200 624.343 N 0
20962 376.834 901.016 N 0
20970 410.260 703.464 N 0
20973 306.103 721.733 N 0
20977 285.818 694.596 N 0
20992 667.073 908.918 N 0
20995 698.364 739.409 N 0
20998 547.854 766.711 N 0
21001 776.631 624.533 N 0
21005 834.571 469.126 N 0
21028 937.050 769.976 N 0
21032 927.900 596.200 N 0
21053 894.520 745.475 N 0
21062 333.352 588.766 N 0
21065 766.735 762.824 N 0
21068 689.573 600.469 N 0
21071 781.895 618.149 N 0
21077 726.318 598.784 N 0
21080 686.529 601.259 N 0
21083 674.723 441.596 N 0
21086 475.672 472.297 N 0
21090 303.512 588.242 N 0
21093 374.081 637.134 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
...@@ -6,158 +6,10 @@ ...@@ -6,158 +6,10 @@
#include <iomanip> #include <iomanip>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <numeric>
#include "FD.h" #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 PlcObject::SimpleStr() const {
std::string str = ""; std::string str = "";
str += std::to_string(node_id_) + " "; str += std::to_string(node_id_) + " ";
...@@ -166,9 +18,9 @@ std::string PlcObject::SimpleStr() const { ...@@ -166,9 +18,9 @@ std::string PlcObject::SimpleStr() const {
stream << std::fixed << std::setprecision(3) << y_; stream << std::fixed << std::setprecision(3) << y_;
str += stream.str() + " "; str += stream.str() + " ";
if (IsPort() == true) { if (IsPort() == true) {
str += "_ "; str += "- ";
} else { } else {
str += orient_ + " "; str += GetString(orient_) + " ";
} }
str += "0\n"; str += "0\n";
return str; return str;
...@@ -193,13 +45,54 @@ std::string PrintPlaceholder(std::string key, float value) { ...@@ -193,13 +45,54 @@ std::string PrintPlaceholder(std::string key, float value) {
line += " value {\n"; line += " value {\n";
std::stringstream stream; std::stringstream stream;
stream << std::fixed << std::setprecision(6) << value; stream << std::fixed << std::setprecision(6) << value;
line += " placeholder: " + stream.str() + "\n"; line += " f: " + stream.str() + "\n";
line += " }\n"; line += " }\n";
line += " }\n"; line += " }\n";
return line; return line;
} }
void PlcObject::SetPos(float x, float y, float grid_width, float grid_height, int num_cols, int num_rows) {
if (pb_type_ == MACROPIN || pb_type_ == GRPPIN)
return;
x_ = x;
y_ = y;
UpdateBBox(grid_width, grid_height, num_cols, num_rows);
if (pb_type_ == GRP || pb_type_ == MACRO) { // update corresponding bbox
for (auto& pin : macro_pins_) {
pin->x_ = x + x_offset_;
pin->y_ = y + y_offset_;
pin->UpdateBBox(grid_width, grid_height, num_cols, num_rows);
}
}
}
void PlcObject::UpdateBBox(float grid_width, float grid_height, int num_cols, int num_rows) {
// update bounding box
bbox_.lx = x_ - width_ / 2.0;
bbox_.ly = y_ - height_ / 2.0;
bbox_.ux = x_ + width_ / 2.0;
bbox_.uy = y_ + height_ / 2.0;
grid_bbox_.lx_id = static_cast<int>(std::floor(bbox_.lx / grid_width));
grid_bbox_.ly_id = static_cast<int>(std::floor(bbox_.ly / grid_height));
grid_bbox_.ux_id = static_cast<int>(std::floor(bbox_.ux / grid_width));
grid_bbox_.uy_id = static_cast<int>(std::floor(bbox_.uy / grid_height));
if (grid_bbox_.lx_id < 0)
grid_bbox_.lx_id = 0;
if (grid_bbox_.ly_id < 0)
grid_bbox_.ly_id = 0;
if (grid_bbox_.ux_id >= num_cols)
grid_bbox_.ux_id = num_cols - 1;
if (grid_bbox_.uy_id >= num_rows)
grid_bbox_.uy_id = num_rows - 1;
assert(grid_bbox_.lx_id >= 0);
assert(grid_bbox_.ly_id >= 0);
assert(grid_bbox_.ux_id < num_cols);
assert(grid_bbox_.uy_id < num_rows);
}
// for protocol buffer netlist // for protocol buffer netlist
std::ostream& operator <<(std::ostream &out, PlcObject& object) { std::ostream& operator <<(std::ostream &out, PlcObject& object) {
if (object.IsPort() == true) { if (object.IsPort() == true) {
...@@ -209,7 +102,7 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) { ...@@ -209,7 +102,7 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
out << " input: \"" << sink << "\"\n"; out << " input: \"" << sink << "\"\n";
} }
out << PrintPlaceholder(std::string("side"), object.side_); out << PrintPlaceholder(std::string("side"), object.side_);
out << PrintPlaceholder(std::string("type"), object.pb_type_); out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
out << PrintPlaceholder(std::string("x"), object.x_); out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_); out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n"; out << "}\n";
...@@ -220,31 +113,31 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) { ...@@ -220,31 +113,31 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
out << " input: \"" << sink << "\"\n"; out << " input: \"" << sink << "\"\n";
} }
out << PrintPlaceholder(std::string("macro_name"), object.macro_ptr_->name_); out << PrintPlaceholder(std::string("macro_name"), object.macro_ptr_->name_);
out << PrintPlaceholder(std::string("type"), object.pb_type_); out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
if (object.weight_ > 1) { if (object.weight_ > 1) {
out << PrintPlaceholder(std::string("weight"), static_cast<int>(object.weight_)); out << PrintPlaceholder(std::string("weight"), static_cast<int>(object.weight_));
} }
out << PrintPlaceholder(std::string("x"), object.x_); out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("x_offset"), object.x_offset_); out << PrintPlaceholder(std::string("x_offset"), object.x_offset_N_);
out << PrintPlaceholder(std::string("y"), object.y_); out << PrintPlaceholder(std::string("y"), object.y_);
out << PrintPlaceholder(std::string("y_offset"), object.y_offset_); out << PrintPlaceholder(std::string("y_offset"), object.y_offset_N_);
out << "}\n"; out << "}\n";
} else if (object.IsHardMacro() == true) { } else if (object.IsHardMacro() == true) {
out << "node {\n"; out << "node {\n";
out << " name: \"" << object.name_ << "\"\n"; out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("type"), object.pb_type_); out << PrintPlaceholder(std::string("height"), object.height_N_);
out << PrintPlaceholder(std::string("height"), object.height_); out << PrintPlaceholder(std::string("orientation"), GetString(object.orient_));
out << PrintPlaceholder(std::string("orientation"), object.orient_); out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
out << PrintPlaceholder(std::string("width"), object.width_); out << PrintPlaceholder(std::string("width"), object.width_N_);
out << PrintPlaceholder(std::string("x"), object.x_); out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_); out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n"; out << "}\n";
} else { } else {
out << "node {\n"; out << "node {\n";
out << " name: \"" << object.name_ << "\"\n"; out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("height"), object.height_); out << PrintPlaceholder(std::string("height"), object.height_N_);
out << PrintPlaceholder(std::string("type"), object.pb_type_); out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
out << PrintPlaceholder(std::string("width"), object.width_); out << PrintPlaceholder(std::string("width"), object.width_N_);
out << PrintPlaceholder(std::string("x"), object.x_); out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_); out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n"; out << "}\n";
...@@ -252,25 +145,10 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) { ...@@ -252,25 +145,10 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
return out; 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 // Class PBFNetlist
// read netlist file for all the plc objects // read netlist file for all the plc objects
void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) { void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
// we need this std::string related to map to map macro_pin to macro
std::map<std::string, size_t> plc_object_id_map = { }; // map name to node_id std::map<std::string, size_t> plc_object_id_map = { }; // map name to node_id
// read protocol buffer netlist // read protocol buffer netlist
const std::vector<std::string> float_values { const std::vector<std::string> float_values {
...@@ -326,29 +204,29 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) { ...@@ -326,29 +204,29 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
key = items[1]; // the attribute name key = items[1]; // the attribute name
} else if (items[0] == std::string("placeholder:")) { } else if (items[0] == std::string("placeholder:")) {
if (key == placeholders[0]) { if (key == placeholders[0]) {
(*objects_.rbegin())->m_name_ = items[1]; (*objects_.rbegin())->macro_name_ = items[1];
} else if (key == placeholders[1]) { } else if (key == placeholders[1]) {
(*objects_.rbegin())->orient_ = items[1]; (*objects_.rbegin())->orient_ = ORIENT_MAP.at(items[1]);
} else if (key == placeholders[2]) { } else if (key == placeholders[2]) {
(*objects_.rbegin())->side_ = items[1]; (*objects_.rbegin())->side_ = items[1];
} else if (key == placeholders[3]) { } else if (key == placeholders[3]) {
(*objects_.rbegin())->pb_type_ = items[1]; (*objects_.rbegin())->pb_type_ = PBTYPE_MAP.at(items[1]);
} }
} else if (items[0] == std::string("f:")) { } else if (items[0] == std::string("f:")) {
if (key == float_values[0]) { if (key == float_values[0]) {
(*objects_.rbegin())->height_ = std::stof(items[1]); (*objects_.rbegin())->height_N_ = std::stof(items[1]);
} else if (key == float_values[1]) { } else if (key == float_values[1]) {
(*objects_.rbegin())->weight_ = std::stof(items[1]); (*objects_.rbegin())->weight_ = std::stof(items[1]);
} else if (key == float_values[2]) { } else if (key == float_values[2]) {
(*objects_.rbegin())->width_ = std::stof(items[1]); (*objects_.rbegin())->width_N_ = std::stof(items[1]);
} else if (key == float_values[3]) { } else if (key == float_values[3]) {
(*objects_.rbegin())->x_ = std::stof(items[1]); (*objects_.rbegin())->x_ = std::stof(items[1]);
} else if (key == float_values[4]) { } else if (key == float_values[4]) {
(*objects_.rbegin())->x_offset_ = std::stof(items[1]); (*objects_.rbegin())->x_offset_N_ = std::stof(items[1]);
} else if (key == float_values[5]) { } else if (key == float_values[5]) {
(*objects_.rbegin())->y_ = std::stof(items[1]); (*objects_.rbegin())->y_ = std::stof(items[1]);
} else if (key == float_values[6]) { } else if (key == float_values[6]) {
(*objects_.rbegin())->y_offset_ =std::stof(items[1]); (*objects_.rbegin())->y_offset_N_ =std::stof(items[1]);
} }
} }
} }
...@@ -356,8 +234,10 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) { ...@@ -356,8 +234,10 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
for (auto& plc_object : objects_) { for (auto& plc_object : objects_) {
plc_object_id_map[plc_object->name_] = plc_object->node_id_; plc_object_id_map[plc_object->name_] = plc_object->node_id_;
if (plc_object->IsHardMacro() == true) { if (plc_object->IsHardMacro() == true) {
plc_object->UpdateOrientation(grid_width_, grid_height_, n_cols_, n_rows_);
macros_.push_back(plc_object->node_id_); macros_.push_back(plc_object->node_id_);
} else if (plc_object->IsSoftMacro() == true) { } else if (plc_object->IsSoftMacro() == true) {
plc_object->UpdateOrientation(grid_width_, grid_height_, n_cols_, n_rows_);
stdcell_clusters_.push_back(plc_object->node_id_); stdcell_clusters_.push_back(plc_object->node_id_);
plc_object->MakeSquare(); // convert standard-cell clusters to square shape plc_object->MakeSquare(); // convert standard-cell clusters to square shape
} else if (plc_object->IsPort() == true) { } else if (plc_object->IsPort() == true) {
...@@ -367,10 +247,9 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) { ...@@ -367,10 +247,9 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
// map each plc object to its corresponding macro // map each plc object to its corresponding macro
for (auto& plc_object : objects_) { for (auto& plc_object : objects_) {
if (plc_object->IsHardMacroPin() == true || plc_object->IsSoftMacroPin() == true) { if (plc_object->IsHardMacroPin() == true || plc_object->IsSoftMacroPin() == true) {
plc_object->macro_id_ = plc_object_id_map[plc_object->m_name_]; auto& macro_id = plc_object_id_map[plc_object->macro_name_];
plc_object->macro_ptr_ = objects_[plc_object->macro_id_]; plc_object->macro_ptr_ = objects_[macro_id];
} else { plc_object->macro_ptr_->macro_pins_.push_back(plc_object);
plc_object->macro_id_ = plc_object->node_id_;
} }
} }
// create nets // create nets
...@@ -395,7 +274,9 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) { ...@@ -395,7 +274,9 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
macro_clusters_.insert(macro_clusters_.end(), macro_clusters_.insert(macro_clusters_.end(),
stdcell_clusters_.begin(), stdcell_clusters_.begin(),
stdcell_clusters_.end()); stdcell_clusters_.end());
// sort macro_clusters // sort macro_clusters.
// We need this beacuse the FD placer calculates the repulsive force
// following this order
std::sort(macro_clusters_.begin(), macro_clusters_.end()); std::sort(macro_clusters_.begin(), macro_clusters_.end());
} }
...@@ -431,7 +312,7 @@ void PBFNetlist::RestorePlacement(std::string file_name) { ...@@ -431,7 +312,7 @@ void PBFNetlist::RestorePlacement(std::string file_name) {
hrouting_alloc_ = std::stof(items[7]); hrouting_alloc_ = std::stof(items[7]);
vrouting_alloc_ = std::stof(items[10]); vrouting_alloc_ = std::stof(items[10]);
} else if (items.size() == 5 && items[1] == std::string("Smoothing")) { } else if (items.size() == 5 && items[1] == std::string("Smoothing")) {
smooth_factor_ = std::floor(std::stof(items[4])); smooth_factor_ = static_cast<int>(std::floor(std::stof(items[4])));
} else if (items.size() == 5 && items[1] == std::string("Overlap")) { } else if (items.size() == 5 && items[1] == std::string("Overlap")) {
overlap_threshold_ = std::floor(std::stof(items[4])); overlap_threshold_ = std::floor(std::stof(items[4]));
} }
...@@ -439,15 +320,38 @@ void PBFNetlist::RestorePlacement(std::string file_name) { ...@@ -439,15 +320,38 @@ void PBFNetlist::RestorePlacement(std::string file_name) {
size_t node_id = static_cast<size_t>(std::stoi(items[0])); size_t node_id = static_cast<size_t>(std::stoi(items[0]));
objects_[node_id]->x_ = std::stof(items[1]); objects_[node_id]->x_ = std::stof(items[1]);
objects_[node_id]->y_ = std::stof(items[2]); objects_[node_id]->y_ = std::stof(items[2]);
objects_[node_id]->orient_ = items[3]; objects_[node_id]->orient_ = ORIENT_MAP.at(items[3]);
} }
} }
// grid info // grid info and create grids
grid_width_ = canvas_width_ / n_cols_; grid_width_ = canvas_width_ / n_cols_;
grid_height_ = canvas_height_ / n_rows_; grid_height_ = canvas_height_ / n_rows_;
for (int y_id = 0; y_id < n_rows_; y_id++) {
for (int x_id = 0; x_id < n_cols_; x_id++) {
grids_.push_back(std::make_shared<Grid>(grid_width_,
grid_height_,
n_cols_,
n_rows_,
x_id, y_id,
smooth_factor_));
}
}
// update the information about plc object
for (auto& plc_object : objects_) {
if (plc_object->IsHardMacro() == true)
plc_object->UpdateOrientation(grid_width_, grid_height_, n_cols_, n_rows_);
plc_object->SetPos(plc_object->x_, plc_object->y_, grid_width_, grid_height_, n_cols_, n_rows_);
}
// calculate norm HPWL
norm_HPWL_ = 0.0;
for (auto& net : nets_)
norm_HPWL_ += net->weight_;
norm_HPWL_ *= (canvas_width_ + canvas_height_);
// top k grids
top_k_ = std::max(1, static_cast<int>(std::floor(n_cols_ * n_rows_ * 0.1)));
top_k_congestion_ = std::max(1, static_cast<int>(std::floor(n_cols_ * n_rows_ * 0.1)));
} }
// Write netlist // Write netlist
void PBFNetlist::WriteNetlist(std::string file_name) { void PBFNetlist::WriteNetlist(std::string file_name) {
std::ofstream f; std::ofstream f;
...@@ -475,8 +379,9 @@ void PBFNetlist::WritePlcFile(std::string file_name) { ...@@ -475,8 +379,9 @@ void PBFNetlist::WritePlcFile(std::string file_name) {
void PBFNetlist::InitSoftMacros() { void PBFNetlist::InitSoftMacros() {
const float x = canvas_width_ / 2.0; const float x = canvas_width_ / 2.0;
const float y = canvas_height_ / 2.0; const float y = canvas_height_ / 2.0;
for (auto& node_id : stdcell_clusters_) for (auto& node_id : stdcell_clusters_) {
objects_[node_id]->SetPos(x, y); objects_[node_id]->SetPos(x, y, grid_width_, grid_height_, n_cols_, n_rows_);
}
} }
void PBFNetlist::CalcAttractiveForce(float attractive_factor, void PBFNetlist::CalcAttractiveForce(float attractive_factor,
...@@ -484,25 +389,20 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor, ...@@ -484,25 +389,20 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
float max_displacement) { float max_displacement) {
// traverse the nets to calculate the attractive force // traverse the nets to calculate the attractive force
for (auto& net : nets_) { for (auto& net : nets_) {
std::shared_ptr<PlcObject> src_pin = net->pins_[0]; 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 // convert multi-pin nets to two-pin nets using star model
auto iter = net->pins_.begin(); auto iter = net->pins_.begin();
iter++; iter++;
while (iter != net->pins_.end()) { while (iter != net->pins_.end()) {
std::shared_ptr<PlcObject>& target_pin = *iter; 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 // check the distance between src_pin and target_pin
std::pair<float, float> src_pos = src_pin->GetPos(); std::pair<float, float> src_pos = src_pin->GetPos();
std::pair<float, float> target_pos = target_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 x_dist = -1.0 * (src_pos.first - target_pos.first);
const float y_dist = -1.0 * (src_pos.second - target_pos.second); const float y_dist = -1.0 * (src_pos.second - target_pos.second);
if (x_dist != 0.0 || y_dist != 0.0) {
float k = net->weight_; // spring constant float k = net->weight_; // spring constant
if (src_pin->IsPort() == true or target_pin->IsPort() == true) if (src_pin->IsPort() == true || target_pin->IsPort() == true)
k = k * io_factor * attractive_factor; k = k * io_factor * attractive_factor;
else else
k = k * attractive_factor; k = k * attractive_factor;
...@@ -512,6 +412,7 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor, ...@@ -512,6 +412,7 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
src_pin->macro_ptr_->AddForce(f_x, f_y); src_pin->macro_ptr_->AddForce(f_x, f_y);
if (target_pin->IsSoftMacroPin() == true) if (target_pin->IsSoftMacroPin() == true)
target_pin->macro_ptr_->AddForce(-1.0 * f_x, -1.0 * f_y); target_pin->macro_ptr_->AddForce(-1.0 * f_x, -1.0 * f_y);
}
iter++; iter++;
} // finish current net } // finish current net
} // finish traversing nets } // finish traversing nets
...@@ -519,18 +420,30 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor, ...@@ -519,18 +420,30 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
void PBFNetlist::CalcRepulsiveForce(float repulsive_factor, void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
float max_displacement) { float max_displacement) {
std::sort(macro_clusters_.begin(), macro_clusters_.end(),
[&](size_t src, size_t target) {
return objects_[src]->bbox_.lx < objects_[target]->bbox_.lx;
});
// traverse the soft macros and hard macros to check possible overlap // traverse the soft macros and hard macros to check possible overlap
auto iter = macro_clusters_.begin(); auto iter = macro_clusters_.begin();
while (iter != macro_clusters_.end()) { while (iter != macro_clusters_.end()) {
size_t src_macro = *iter; size_t init_src_macro = *iter;
for (auto iter_loop = ++iter; for (auto iter_loop = ++iter;
iter_loop != macro_clusters_.end(); iter_loop++) { iter_loop != macro_clusters_.end(); iter_loop++) {
size_t target_macro = *iter_loop; size_t target_macro = *iter_loop;
size_t src_macro = init_src_macro;
if (src_macro > target_macro) {
std::swap(src_macro, target_macro);
}
const Rect src_bbox = objects_[src_macro]->GetBBox();
const Rect target_bbox = objects_[target_macro]->GetBBox();
if (src_bbox.ux <= target_bbox.lx)
break;
if (src_bbox.ly >= target_bbox.uy || src_bbox.uy <= target_bbox.ly)
continue;
// check the overlap // check the overlap
float x_dir = 0.0; // overlap on x direction float x_dir = 0.0; // overlap on x direction
float y_dir = 0.0; // overlap on y 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_width = src_bbox.ux - src_bbox.lx;
const float src_height = src_bbox.uy - src_bbox.ly; const float src_height = src_bbox.uy - src_bbox.ly;
const float target_width = target_bbox.ux - target_bbox.lx; const float target_width = target_bbox.ux - target_bbox.lx;
...@@ -539,8 +452,9 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor, ...@@ -539,8 +452,9 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
const float src_cy = (src_bbox.ly + src_bbox.uy) / 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_cx = (target_bbox.lx + target_bbox.ux) / 2.0;
const float target_cy = (target_bbox.ly + target_bbox.uy) / 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_; const float x_min_dist = (src_width + target_width) / 2.0 - min_dist_;
const float y_min_dist = (src_height + target_height) / 2.0 - min_dist_;
// if there is no overlap // if there is no overlap
if (std::abs(target_cx - src_cx) > x_min_dist) if (std::abs(target_cx - src_cx) > x_min_dist)
continue; continue;
...@@ -567,15 +481,12 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor, ...@@ -567,15 +481,12 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
} }
void PBFNetlist::MoveNode(size_t node_id, float x_dist, float y_dist) { void PBFNetlist::MoveNode(size_t node_id, float x_dist, float y_dist) {
objects_[node_id]->x_ += x_dist; float x = objects_[node_id]->x_ + x_dist;
objects_[node_id]->y_ += y_dist; float y = objects_[node_id]->y_ + y_dist;
const Rect bbox = objects_[node_id]->GetBBox(); float width = objects_[node_id]->width_ / 2.0;
if (bbox.lx < 0.0 || bbox.ly < 0.0 float height = objects_[node_id]->height_ / 2.0;
|| bbox.ux > canvas_width_ if (x - width >= 0.0 && y - height >= 0.0 && x + width <= canvas_width_ && y + height <= canvas_height_)
|| bbox.uy > canvas_height_) { objects_[node_id]->SetPos(x, y, grid_width_, grid_height_, n_cols_, n_rows_);
objects_[node_id]->x_ -= x_dist;
objects_[node_id]->y_ -= y_dist;
}
} }
void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor, void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
...@@ -585,7 +496,9 @@ void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor, ...@@ -585,7 +496,9 @@ void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
for (auto& cluster_id : stdcell_clusters_) for (auto& cluster_id : stdcell_clusters_)
objects_[cluster_id]->ResetForce(); objects_[cluster_id]->ResetForce();
// calculate forces // calculate forces
if (repulsive_factor == 0 || (attractive_factor / repulsive_factor > 1e-4))
CalcAttractiveForce(attractive_factor, io_factor, max_displacement); CalcAttractiveForce(attractive_factor, io_factor, max_displacement);
if (attractive_factor == 0.0 || (repulsive_factor / attractive_factor > 1e-4))
CalcRepulsiveForce(repulsive_factor, max_displacement); CalcRepulsiveForce(repulsive_factor, max_displacement);
// normalization // normalization
float max_f_x = 0.0; float max_f_x = 0.0;
...@@ -595,12 +508,10 @@ void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor, ...@@ -595,12 +508,10 @@ void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
max_f_x = std::max(max_f_x, std::abs(forces.first)); 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_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_) { for (auto& cluster_id : stdcell_clusters_) {
objects_[cluster_id]->NormalForce(max_f_x, max_f_y); objects_[cluster_id]->NormalForce(max_f_x, max_f_y);
const std::pair<float, float> forces = objects_[cluster_id]->GetForce(); const std::pair<float, float> forces = objects_[cluster_id]->GetForce();
MoveNode(cluster_id, forces.first, forces.second); MoveNode(cluster_id, forces.first * max_displacement, forces.second * max_displacement);
} }
} }
...@@ -633,6 +544,8 @@ void PBFNetlist::FDPlacer(float io_factor, std::vector<int> num_steps, ...@@ -633,6 +544,8 @@ void PBFNetlist::FDPlacer(float io_factor, std::vector<int> num_steps,
for (size_t i = 0; i < num_steps.size(); i++) { for (size_t i = 0; i < num_steps.size(); i++) {
const float attractive_factor = attract_factor[i]; const float attractive_factor = attract_factor[i];
const float repulsive_factor = repel_factor[i]; const float repulsive_factor = repel_factor[i];
if (attractive_factor == 0.0 && repulsive_factor == 0.0)
continue;
int num_step = num_steps[i]; int num_step = num_steps[i];
float max_displacement = max_move_distance[i]; float max_displacement = max_move_distance[i];
if (debug_mode == true) { if (debug_mode == true) {
...@@ -649,6 +562,304 @@ void PBFNetlist::FDPlacer(float io_factor, std::vector<int> num_steps, ...@@ -649,6 +562,304 @@ void PBFNetlist::FDPlacer(float io_factor, std::vector<int> num_steps,
} }
} }
// Get routing information
// 2-pin net routing
// flag = true for adding and flag = false for reducing
void PBFNetlist::TwoPinNetRouting(std::shared_ptr<Net> net, bool flag) {
// calculate horizontal congestion
// This function will only be called when both src and sink are Port or Pins, so lx_id = ux_id
std::shared_ptr<PlcObject>& src = net->pins_[0];
std::shared_ptr<PlcObject>& sink = net->pins_[1];
const int min_col_id = std::min(src->grid_bbox_.lx_id, sink->grid_bbox_.lx_id);
const int max_col_id = std::max(src->grid_bbox_.lx_id, sink->grid_bbox_.lx_id);
for (int col_id = min_col_id; col_id < max_col_id; col_id++) {
grids_[src->grid_bbox_.ly_id * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
}
const int min_row_id = std::min(src->grid_bbox_.ly_id, sink->grid_bbox_.ly_id);
const int max_row_id = std::max(src->grid_bbox_.ly_id, sink->grid_bbox_.ly_id);
for (int row_id = min_row_id; row_id < max_row_id; row_id++) {
grids_[row_id * n_cols_ + sink->grid_bbox_.ly_id]->UpdateCongestionV(net->weight_, flag);
}
}
void PBFNetlist::TwoPinNetRouting(std::shared_ptr<PlcObject> src, std::shared_ptr<PlcObject> sink,
float weight, bool flag) {
// calculate horizontal congestion
// This function will only be called when both src and sink are Port or Pins, so lx_id = ux_id
const int min_col_id = std::min(src->grid_bbox_.lx_id, sink->grid_bbox_.lx_id);
const int max_col_id = std::max(src->grid_bbox_.lx_id, sink->grid_bbox_.lx_id);
for (int col_id = min_col_id; col_id < max_col_id; col_id++) {
grids_[src->grid_bbox_.ly_id * n_cols_ + col_id]->UpdateCongestionH(weight, flag);
}
const int min_row_id = std::min(src->grid_bbox_.ly_id, sink->grid_bbox_.ly_id);
const int max_row_id = std::max(src->grid_bbox_.ly_id, sink->grid_bbox_.ly_id);
for (int row_id = min_row_id; row_id < max_row_id; row_id++) {
grids_[row_id * n_cols_ + sink->grid_bbox_.ly_id]->UpdateCongestionV(weight, flag);
}
}
// Get routing information (general case)
// multi-pin nets are decomposed into multiple two-pin nets
void PBFNetlist::UpdateRouting(std::shared_ptr<Net> net, bool flag) {
// check the conditions using switch clauses
switch(net->pins_.size()) {
case 1:
return; // ignore all single-pin net
case 2: {
TwoPinNetRouting(net, flag);
}
return;
case 3: {
// sort pins based on col_id
std::sort(net->pins_.begin(), net->pins_.end(),
[&](std::shared_ptr<PlcObject> src, std::shared_ptr<PlcObject> sink) {
return src->grid_bbox_.lx_id < sink->grid_bbox_.lx_id;
});
// define alias for better understanding
int& col_id_1 = net->pins_[0]->grid_bbox_.lx_id;
int& col_id_2 = net->pins_[1]->grid_bbox_.lx_id;
int& col_id_3 = net->pins_[2]->grid_bbox_.lx_id;
int& row_id_1 = net->pins_[0]->grid_bbox_.ly_id;
int& row_id_2 = net->pins_[1]->grid_bbox_.ly_id;
int& row_id_3 = net->pins_[2]->grid_bbox_.ly_id;
// checking L Routing condition
if (col_id_1 < col_id_2 && col_id_2 < col_id_3 &&
std::min(row_id_1, row_id_3) < row_id_2 &&
std::max(row_id_1, row_id_3) > row_id_2) {
// L routing
for (auto col_id = col_id_1; col_id < col_id_2; col_id++)
grids_[row_id_1 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto col_id = col_id_2; col_id < col_id_3; col_id++)
grids_[row_id_2 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto row_id = std::min(row_id_1, row_id_2); row_id < std::max(row_id_1, row_id_2); row_id++)
grids_[row_id * n_cols_ + col_id_2]->UpdateCongestionV(net->weight_, flag);
for (auto row_id = std::min(row_id_2, row_id_3); row_id < std::max(row_id_2, row_id_3); row_id++)
grids_[row_id * n_cols_ + col_id_3]->UpdateCongestionV(net->weight_, flag);
return;
} else if (col_id_2 == col_id_3 && col_id_1 < col_id_2 && row_id_1 < std::min(row_id_2, row_id_3)) {
// check if condition 2
for (auto col_id = col_id_1; col_id < col_id_2; col_id++)
grids_[row_id_1 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto row_id = row_id_1; row_id < std::max(row_id_2, row_id_3); row_id++)
grids_[row_id * n_cols_ + col_id_2]->UpdateCongestionV(net->weight_, flag);
return;
} else if (row_id_2 == row_id_3) {
// check if condition 3
for (auto col_id = col_id_1; col_id < col_id_2; col_id++)
grids_[row_id_1 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto col_id = col_id_2; col_id < col_id_3; col_id++)
grids_[row_id_2 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto row_id = std::min(row_id_2, row_id_3); row_id < std::max(row_id_2, row_id_3); row_id++)
grids_[row_id * n_cols_ + col_id_2]->UpdateCongestionV(net->weight_, flag);
return;
} else {
// T routing
// when we come to T routing, we already have
// col_id_min = col_id_1
// col_id_max = col_id_2
for (auto col_id = col_id_1; col_id < col_id_3; col_id++)
grids_[row_id_2 * n_cols_ + col_id]->UpdateCongestionH(net->weight_, flag);
for (auto row_id = std::min(row_id_1, row_id_2); row_id < std::max(row_id_1, row_id_2); row_id++)
grids_[row_id * n_cols_ + col_id_1]->UpdateCongestionV(net->weight_, flag);
for (auto row_id = std::min(row_id_2, row_id_3); row_id < std::max(row_id_2, row_id_3); row_id++)
grids_[row_id * n_cols_ + col_id_3]->UpdateCongestionV(net->weight_, flag);
return;
}
}
return;
default: {
// multi-pin nets are decomposed into multiple two-pin nets using star model
for (size_t i = 1; i < net->pins_.size(); i++) {
TwoPinNetRouting(net->pins_[0], net->pins_[i], net->weight_, flag);
}
}
return;
}
}
// Update the congestion caused by macro
// true for add and false for reduce
void PBFNetlist::UpdateMacroCongestion(std::shared_ptr<PlcObject> plc_object, bool flag) {
// calculate the horizontal and vertical congestion independently
const GridRect& grid_bbox = plc_object->grid_bbox_;
for (int row_id = grid_bbox.ly_id; row_id < grid_bbox.uy_id; row_id++) {
float v_overlap = grid_height_;
if (row_id == grid_bbox.ly_id)
v_overlap = (row_id + 1) * grid_height_ - plc_object->bbox_.ly;
for (int col_id = grid_bbox.lx_id; col_id < grid_bbox.ux_id; col_id++) {
float h_overlap = grid_width_;
if (col_id == grid_bbox.lx_id)
h_overlap = (col_id + 1) * grid_width_ - plc_object->bbox_.lx;
auto& grid = grids_[row_id * n_cols_ + col_id];
grid->UpdateMacroCongestionH(h_overlap * hrouting_alloc_, flag);
grid->UpdateMacroCongestionV(v_overlap * vrouting_alloc_, flag);
}
}
}
// Calculate the cost from scratch
float PBFNetlist::CalcCost() {
// reset
for (auto& grid : grids_)
grid->Reset();
// calculate wirelength cost
HPWL_ = 0.0;
for (auto& net : nets_) {
net->UpdateHPWL();
HPWL_ += net->HPWL_;
}
HPWL_ = HPWL_ / norm_HPWL_;
std::cout << "[Calculate Cost] wirelength cost : " << HPWL_ << std::endl;
// calculate the density
for (auto& node_id : macro_clusters_) {
Rect rect = objects_[node_id]->GetBBox();
const int lx_id = std::floor(rect.lx / grid_width_);
const int ly_id = std::floor(rect.ly / grid_height_);
int ux_id = std::floor(rect.ux / grid_width_);
int uy_id = std::floor(rect.uy / grid_height_);
if (ux_id == n_cols_)
ux_id = n_cols_ - 1;
if (uy_id == n_rows_)
uy_id = n_rows_ - 1;
for (int y_id = ly_id; y_id <= uy_id; y_id++) {
for (int x_id = lx_id; x_id <= ux_id; x_id++) {
grids_[y_id * n_cols_ + x_id]->UpdateOverlap(rect, true);
}
}
}
// get the top 10 % density
std::vector<float> density_list;
for (auto& grid : grids_)
density_list.push_back(grid->GetDensity());
std::sort(density_list.begin(), density_list.end(), std::greater<float>());
density_ = 0.0;
for (int i = 0; i < top_k_; i++)
density_ += density_list[i];
density_ = density_ / top_k_ * 0.5;
std::cout << "[Calculate Cost] Density cost : " << density_ << std::endl;
// calculate the congestion cost
// update the congestion caused by net
for (auto& net : nets_)
UpdateRouting(net, true);
// update the congestion caused by macro
for (auto& macro : macros_)
UpdateMacroCongestion(objects_[macro], true);
// smooth the congestion by net
for (auto& grid : grids_)
grid->UpdateSmoothCongestion();
std::vector<float> congestion_list;
for (auto& grid : grids_) {
congestion_list.push_back(
(grid->smooth_ver_congestion_ + grid->macro_ver_congestion_) / (grid_width_ * vroute_per_micro_) +
(grid->smooth_hor_congestion_ + grid->macro_hor_congestion_) / (grid_height_ * hroute_per_micro_)
);
congestion_list.push_back((grid->macro_ver_congestion_) / (grid_width_ * vroute_per_micro_));
congestion_list.push_back((grid->macro_hor_congestion_) / (grid_height_ * hroute_per_micro_));
}
std::sort(congestion_list.begin(), congestion_list.end(), std::greater<float>());
congestion_ = 0.0;
for (int i = 0; i < top_k_congestion_; i++)
congestion_ += congestion_list[i];
congestion_ = congestion_ / top_k_congestion_;
std::cout << "[Calculate Cost] Congestion cost : " << congestion_ << std::endl;
return HPWL_ + density_ * 0.5 + congestion_ * 0.5;
}
// Simulated Annealing related functions
void PBFNetlist::InitMacroPlacement(bool spiral_flag) {
// determine the order of grids
placed_macros_.clear();
std::vector<int> grid_order(grids_.size());
if (spiral_flag == true) {
// arrange grid in a spiral manner
std::vector<bool> visited_flag(grids_.size(), false);
// direction in a counter clock-wise manner
std::vector<int> dir_row { 0, 1, 0, -1};
std::vector<int> dir_col { 1, 0, -1, 0};
int row_id = 0;
int col_id = 0;
int dir_id = 0;
for (int i = 0; i < n_cols_ * n_rows_; i++) {
const int grid_id = row_id * n_cols_ + col_id;
visited_flag[grid_id] = true;
grid_order[i] = grid_id;
const int next_row = row_id + dir_row[dir_id];
const int next_col = col_id + dir_col[dir_id];
const int next_grid_id = next_row * n_cols_ + next_col;
if (0 <= next_row && next_row < n_rows_ &&
0 <= next_col && next_col < n_cols_ &&
visited_flag[next_grid_id] == false) {
col_id = next_col;
row_id = next_row;
} else {
dir_id = (dir_id + 1) % 4;
row_id += dir_row[dir_id];
col_id += dir_col[dir_id];
}
}
} else {
std::iota(grid_order.begin(), grid_order.end(), 0);
}
std::vector<size_t> sorted_macros = macros_;
// sort macros based on area in an non-decreasing order
std::sort(sorted_macros.begin(), sorted_macros.end(),
[&](size_t a, int b) {
return objects_[a]->width_ * objects_[a]->height_ >
objects_[b]->width_ * objects_[b]->height_;
});
for (auto& macro : sorted_macros) {
for (auto& grid_id : grid_order) {
if (grids_[grid_id]->available_ == false)
continue; // this grid has been occupied by other macros
objects_[macro]->SetPos(grids_[grid_id]->x_, grids_[grid_id]->y_,
grid_width_, grid_height_, n_cols_, n_rows_);
auto& rect = objects_[macro]->bbox_;
if (rect.lx < 0.0 || rect.ly < 0.0 ||
rect.ux > canvas_width_ || rect.uy > canvas_height_)
continue;
// check if there is an overlap with other macros
if (CheckOverlap(macro) == true)
continue; // This is some overlap with other placed macros
// place macro on this grid
grids_[grid_id]->available_ = true;
placed_macros_.insert(macro);
break;
}
} // placed all the macros
if (placed_macros_.size() != macros_.size()) {
std::cout << "[ERROR] There is no valid initial macro tiling" << std::endl;
}
}
bool PBFNetlist::CheckOverlap(size_t macro) {
if (placed_macros_.empty() == true)
return false;
for (auto& placed_macro : placed_macros_) {
if (macro == placed_macro)
continue;
auto& rect1 = objects_[placed_macro]->bbox_;
auto& rect2 = objects_[macro]->bbox_;
if (rect1.lx >= rect2.ux || rect1.ly >= rect2.uy ||
rect1.ux <= rect2.lx || rect1.uy <= rect2.ly)
continue; // This is no overlap
else
return true;
}
return false;
}
bool PBFNetlist::IsFeasible(size_t macro) {
if (objects_[macro]->bbox_.lx < 0.0 || objects_[macro]->bbox_.ly < 0.0 ||
objects_[macro]->bbox_.ux > canvas_width_ ||
objects_[macro]->bbox_.uy > canvas_height_)
return false;
if (CheckOverlap(macro) == true)
return false;
return true;
}
......
...@@ -4,36 +4,105 @@ ...@@ -4,36 +4,105 @@
#include <string> #include <string>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include <algorithm>
#include <cmath>
#include <memory> #include <memory>
#include <random>
#include <set>
#include <cassert>
// Define the class to handle netlist in Protocol Buffer Format // Define the class to handle netlist in Protocol Buffer Format
// Basic data structure // Basic data structure
// OrientMap : map the orientation
// PlcObject : a superset of attributes for different types of plc objects // PlcObject : a superset of attributes for different types of plc objects
// PBFNetlist: the top-level class for handling netlist in protocol buffer netlist // PBFNetlist: the top-level class for handling netlist in protocol buffer netlist
// *************************************************************** // Enumerate Type
// Define basic classes // MACROPIN for hard macro pin
// *************************************************************** // GRPIN for soft macro pin (standard-cell cluster)
// GRP for soft macro (standard-cell cluster)
enum PBTYPE { MACRO, PORT, MACROPIN, GRPPIN, GRP};
// string representation
inline std::string GetString(PBTYPE pb_type) {
switch (pb_type)
{
case MACRO:
return std::string("MACRO");
case PORT:
return std::string("PORT");
case MACROPIN:
return std::string("MACRO_PIN");
case GRPPIN:
return std::string("macro_pin");
case GRP:
return std::string("macro");
default:
return std::string("MACRO");
}
}
static const std::map<std::string, PBTYPE> PBTYPE_MAP = {
{ std::string("MACRO"), MACRO } ,
{ std::string("PORT"), PORT } ,
{ std::string("MACRO_PIN"), MACROPIN } ,
{ std::string("macro_pin"), GRPPIN } ,
{ std::string("macro"), GRP }
};
// Define the orientation map enum ORIENTATION { N, S, W, E, FN, FS, FW, FE, NONE};
static const std::map<std::string, std::string> OrientMap = { // string representation
{ std::string("N"), std::string("R0") }, inline std::string GetString(ORIENTATION orient) {
{ std::string("S"), std::string("R180") }, switch (orient)
{ std::string("W"), std::string("R90") }, {
{ std::string("E"), std::string("R270") }, case N:
{ std::string("FN"), std::string("MY") }, return std::string("N");
{ std::string("FS"), std::string("MX") }, case S:
{ std::string("FW"), std::string("MX90") }, return std::string("S");
{ std::string("FE"), std::string("MY90") } case W:
return std::string("W");
case E:
return std::string("E");
case FN:
return std::string("FN");
case FS:
return std::string("FS");
case FW:
return std::string("FW");
case FE:
return std::string("FE");
default:
return std::string("-");
}
}
static const std::map<std::string, ORIENTATION> ORIENT_MAP = {
{ std::string("N"), N },
{ std::string("S"), S },
{ std::string("W"), W },
{ std::string("E"), E },
{ std::string("FN"), N },
{ std::string("FS"), FS },
{ std::string("FW"), FW },
{ std::string("FE"), FE },
{ std::string("-"), NONE}
}; };
// ***************************************************************
// Define basic classes
// ***************************************************************
struct Rect { struct Rect {
float lx = 0.0; float lx = 0.0;
float ly = 0.0; float ly = 0.0;
float ux = 0.0; float ux = 0.0;
float uy = 0.0; float uy = 0.0;
Rect() {
lx = 0.0;
ly = 0.0;
ux = 0.0;
uy = 0.0;
}
Rect(float lx_, float ly_, float ux_, float uy_) { Rect(float lx_, float ly_, float ux_, float uy_) {
lx = lx_; lx = lx_;
ly = ly_; ly = ly_;
...@@ -43,6 +112,28 @@ struct Rect { ...@@ -43,6 +112,28 @@ struct Rect {
}; };
struct GridRect {
int lx_id = 0;
int ly_id = 0;
int ux_id = 0;
int uy_id = 0;
GridRect() {
lx_id = 0;
ly_id = 0;
ux_id = 0;
uy_id = 0;
}
GridRect(int lx_id_, int ly_id_, int ux_id_, int uy_id_) {
lx_id = lx_id_;
ly_id = ly_id_;
ux_id = ux_id_;
uy_id = uy_id_;
}
};
// Define the plc object // Define the plc object
// This is a superset of attributes for different types of plc objects // This is a superset of attributes for different types of plc objects
// A plc object can only have some or all the attributes // A plc object can only have some or all the attributes
...@@ -53,57 +144,250 @@ class PlcObject { ...@@ -53,57 +144,250 @@ class PlcObject {
PlcObject(size_t node_id) : node_id_(node_id) { } PlcObject(size_t node_id) : node_id_(node_id) { }
// functions // functions
// GetType Information // GetType Information
bool IsHardMacro() const; inline bool IsHardMacro() const {
bool IsSoftMacro() const; return pb_type_ == MACRO;
bool IsSoftMacroPin() const; }
bool IsHardMacroPin() const;
bool IsPort() const; inline bool IsSoftMacro() const {
return pb_type_ == GRP;
}
inline bool IsSoftMacroPin() const {
return pb_type_ == GRPPIN;
}
inline bool IsHardMacroPin() const {
return pb_type_ == MACROPIN;
}
inline bool IsPort() const {
return pb_type_ == PORT;
}
// Make Square // Make Square
void MakeSquare(); inline void MakeSquare() {
const float area = width_N_ * height_N_;
width_N_ = std::sqrt(area);
height_N_ = width_N_;
width_ = width_N_;
height_ = height_N_;
}
// Get real location instead of relative position // Get real location instead of relative position
const std::pair<float, float> GetPos() const; inline const std::pair<float, float> GetPos() const {
float GetX() const; return std::pair<float, float>(x_, y_);
float GetY() const; }
const Rect GetBBox() const;
void SetPos(float x, float y); inline float GetX() const {
return x_;
}
inline float GetY() const {
return y_;
}
inline const Rect GetBBox() const {
return bbox_;
}
inline const GridRect GetGridBBox() const {
return grid_bbox_;
}
// we need grid_width and grid_height to calculate the grid_bbox
// We cannot set the location of MACROPIN and GRPPIN.
// Because the locations of MACROPIN and GRPPIN are determined by MACRO and GRP.
// When you specify the location of MACRO and GRP, the locations of coorepsonding MACROPINs and
// GRPPINs will also be updated.
// We only call this function after reading plc file
void SetPos(float x, float y, float grid_width, float grid_height, int num_cols, int num_rows);
// Force related functions // Force related functions
void ResetForce(); inline void ResetForce() {
void AddForce(float f_x, float f_y); f_x_ = 0.0;
void NormalForce(float max_f_x, float max_f_y); f_y_ = 0.0;
std::pair<float, float> GetForce() const; }
inline void AddForce(float f_x, float f_y) {
f_x_ += f_x;
f_y_ += f_y;
}
inline void 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;
}
inline std::pair<float, float> GetForce() const {
return std::pair<float, float>(f_x_, f_y_);
}
// Flip operation // Flip operation
// Flop operation can only be applied to hard macro
// if x_flag == true, flip across x axis // if x_flag == true, flip across x axis
// else, flip across y axis // else, flip across y axis
void Flip(bool x_flag); void Flip(bool x_flag, float grid_width, float grid_height, int num_cols, int num_rows) {
if (pb_type_ != MACRO)
return;
if (x_flag == true) { // flip around x axis
switch (orient_)
{
case N:
orient_ = FS;
break;
case FN:
orient_ = S;
break;
case S:
orient_ = FN;
break;
case FS:
orient_ = N;
break;
case E:
orient_ = FW;
break;
case FE:
orient_ = W;
break;
case FW:
orient_ = E;
break;
case W:
orient_ = FE;
break;
default:
orient_ = N;
break;
}
} else { // flip around y axis
switch (orient_)
{
case N:
orient_ = FN;
break;
case FN:
orient_ = N;
break;
case S:
orient_ = FS;
break;
case FS:
orient_ = S;
break;
case E:
orient_ = FE;
break;
case FE:
orient_ = E;
break;
case FW:
orient_ = W;
break;
case W:
orient_ = FW;
break;
default:
orient_ = N;
break;
}
}
UpdateOrientation(grid_width, grid_height, num_cols, num_rows); // when the orientation update, we need update cooresponding items
}
// string representation // string representation
friend std::ostream& operator <<(std::ostream &out, PlcObject& object); // for protocol buffer netlist friend std::ostream& operator <<(std::ostream &out, PlcObject& object); // for protocol buffer netlist
std::string SimpleStr() const; // for plc file std::string SimpleStr() const; // for plc file
private: private:
// inherient attributes
std::string name_ = ""; std::string name_ = "";
size_t node_id_ = 0; size_t node_id_ = 0;
float height_ = 0.0;
float width_ = 0.0;
float weight_ = 1.0; float weight_ = 1.0;
std::string pb_type_ = "MACRO"; // hard macro PBTYPE pb_type_ = MACRO; // hard macro
float x_ = 0.0; // center of the object // we define xx_N_ becuase the Portocol buffer netlist required these values to generate the netlist file
float y_ = 0.0; // center of the object float width_N_ = 0.0;
std::string orient_ = "N"; // orientation float height_N_ = 0.0;
// PBPORT float x_offset_N_ = 0.0;
std::string side_ = "LEFT"; // attribute for IOPORT (LEFT, RIGHT, TOP, BOTTOM) float y_offset_N_ = 0.0;
// PBMACROPIN, PBGRPPIN std::string macro_name_ = ""; // the correponding macro names
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::shared_ptr<PlcObject> macro_ptr_ = nullptr;
std::vector<std::shared_ptr<PlcObject> > macro_pins_; // pins connnected to this macro
std::vector<size_t> nets_; // nets (id) connecte to this node std::vector<size_t> nets_; // nets (id) connecte to this node
std::vector<std::string> inputs_; std::vector<std::string> inputs_; // sinks driven by this node
std::string side_ = "LEFT"; // attribute for IOPORT (LEFT, RIGHT, TOP, BOTTOM)
// real information (can be updated)
float x_ = 0.0; // center of the object
float y_ = 0.0; // center of the object
float height_ = 0.0;
float width_ = 0.0;
float x_offset_ = 0.0;
float y_offset_ = 0.0;
ORIENTATION orient_ = N; // orientation
Rect bbox_;
GridRect grid_bbox_; // gridding box
// the forces applied to this node // the forces applied to this node
float f_x_ = 0.0; float f_x_ = 0.0;
float f_y_ = 0.0; float f_y_ = 0.0;
void UpdateBBox(float grid_width, float grid_height, int num_cols, int num_rows);
void UpdateOrientation(float grid_width, float grid_height, int num_cols, int num_rows) {
// update the hard macro information first
if (orient_ == E || orient_ == FN || orient_ == W || orient_ == FW) {
width_ = height_N_;
height_ = width_N_;
} else {
width_ = width_N_;
height_ = height_N_;
}
UpdateBBox(grid_width, grid_height, num_cols, num_rows);
// update the cooresponding bboxes of pins
for (auto& pin : macro_pins_) {
switch (orient_)
{
case N:
pin->x_offset_ = pin->x_offset_N_;
pin->y_offset_ = pin->y_offset_N_;
break;
case FN:
pin->x_offset_ = -1 * pin->x_offset_N_;
pin->y_offset_ = pin->y_offset_N_;
break;
case S:
pin->x_offset_ = -1 * pin->x_offset_N_;
pin->y_offset_ = -1 * pin->y_offset_N_;
break;
case FS:
pin->x_offset_ = pin->x_offset_N_;
pin->y_offset_ = -1 * pin->y_offset_N_;
break;
case E:
pin->x_offset_ = pin->y_offset_N_;
pin->y_offset_ = -1 * pin->x_offset_N_;
break;
case FE:
pin->x_offset_ = -1 * pin->y_offset_N_;
pin->y_offset_ = -1 * pin->x_offset_N_;
break;
case FW:
pin->x_offset_ = -1 * pin->y_offset_N_;
pin->y_offset_ = pin->x_offset_N_;
break;
case W:
pin->x_offset_ = pin->y_offset_N_;
pin->y_offset_ = pin->x_offset_N_;
break;
default:
break;
}
pin->UpdateBBox(grid_width, grid_height, num_cols, num_rows);
}
}
// utility function // utility function
friend class PBFNetlist; friend class PBFNetlist;
friend class Net;
}; };
std::string PrintPlaceholder(std::string key, std::string value); std::string PrintPlaceholder(std::string key, std::string value);
...@@ -117,26 +401,175 @@ class Net { ...@@ -117,26 +401,175 @@ class Net {
pins_ = pins; // the first pin is always the source pin pins_ = pins; // the first pin is always the source pin
weight_ = weight; weight_ = weight;
} }
inline void Reset() {
HPWL_ = 0.0;
}
inline void UpdateHPWL() {
float x_min = std::numeric_limits<float>::max();
float y_min = std::numeric_limits<float>::max();
float x_max = 0.0;
float y_max = 0.0;
for (auto& pin : pins_) {
x_min = std::min(x_min, pin->x_);
x_max = std::max(x_max, pin->x_);
y_min = std::min(y_min, pin->y_);
y_max = std::max(y_max, pin->y_);
}
HPWL_ = weight_ * (y_max - y_min + x_max - x_min);
}
private: private:
std::vector<std::shared_ptr<PlcObject> > pins_; std::vector<std::shared_ptr<PlcObject> > pins_;
float weight_ = 1.0; float weight_ = 1.0;
float HPWL_ = 0.0; // wirelength
friend class PBFNetlist; friend class PBFNetlist;
}; };
class Grid {
public:
Grid() { }
Grid(float grid_width, float grid_height,
int num_cols, int num_rows,
int x_id, int y_id,
int smooth_factor) {
grid_area_ = grid_width * grid_height;
num_cols_ = num_cols;
num_rows_ = num_rows;
x_id_ = x_id;
y_id_ = y_id;
id_ = y_id_ * num_cols + x_id_;
smooth_factor_ = smooth_factor;
bbox_ = Rect(x_id * grid_width, y_id * grid_height,
(x_id_ + 1) * grid_width, (y_id_ + 1) * grid_height);
x_ = (bbox_.lx + bbox_.ux) / 2.0;
y_ = (bbox_.ly + bbox_.uy) / 2.0;
}
// reset the status of grids
inline void Reset() {
overlap_area_ = 0.0;
hor_congestion_ = 0.0;
ver_congestion_ = 0.0;
macro_hor_congestion_ = 0.0;
macro_ver_congestion_ = 0.0;
smooth_hor_congestion_ = 0.0;
smooth_ver_congestion_ = 0.0;
}
// Check overlap area
inline float CalcOverlap(Rect rect) {
const float x_overlap = std::min(bbox_.ux, rect.ux) - std::max(bbox_.lx, rect.lx);
const float y_overlap = std::min(bbox_.uy, rect.uy) - std::max(bbox_.ly, rect.ly);
if (x_overlap <= 0.0 || y_overlap <= 0.0)
return 0.0;
else
return x_overlap * y_overlap;
}
// check overlap threshold
inline std::pair<float, float> CalcHVOverlap(Rect rect) {
const float x_overlap = std::min(bbox_.ux, rect.ux) - std::max(bbox_.lx, rect.lx);
const float y_overlap = std::min(bbox_.uy, rect.uy) - std::max(bbox_.ly, rect.ly);
return std::pair<float, float>(std::max(x_overlap, 0.0f),
std::max(y_overlap, 0.0f));
}
// For Macro and Standard-cell cluster
// update overlap: True for Add and False for Reduce
inline void UpdateOverlap(Rect rect, bool flag = false) {
const float x_overlap = std::min(bbox_.ux, rect.ux) - std::max(bbox_.lx, rect.lx);
const float y_overlap = std::min(bbox_.uy, rect.uy) - std::max(bbox_.ly, rect.ly);
if (x_overlap <= 0.0 || y_overlap <= 0.0)
return;
else if (flag == true)
overlap_area_ += x_overlap * y_overlap;
else if (flag == false)
overlap_area_ -= x_overlap * y_overlap;
}
// Calculate density
inline float GetDensity() {
return overlap_area_ / grid_area_;
}
// Check congestion
// Update congestion: true for add and false for reduce
inline void UpdateCongestionH(float congestion, bool flag = false) {
if (flag == true)
hor_congestion_ += congestion;
else
hor_congestion_ -= congestion;
}
inline void UpdateCongestionV(float congestion, bool flag = false) {
if (flag == true)
ver_congestion_ += congestion;
else
ver_congestion_ -= congestion;
}
inline void UpdateMacroCongestionH(float congestion, bool flag = false) {
if (flag == true)
macro_hor_congestion_ += congestion;
else
macro_hor_congestion_ -= congestion;
}
inline void UpdateMacroCongestionV(float congestion, bool flag = false) {
if (flag == true)
macro_ver_congestion_ += congestion;
else
macro_ver_congestion_ -= congestion;
}
// smoothing the congestion
inline void UpdateSmoothCongestion() {
// smooth horizontal congestion
const int h_start = std::max(0, x_id_ - smooth_factor_);
const int h_end = std::min(num_cols_ - 1, x_id_ + smooth_factor_);
smooth_hor_congestion_ = hor_congestion_ * (1.0 + 1.0 / (h_end - h_start));
const int v_start = std::max(0, y_id_ - smooth_factor_);
const int v_end = std::min(num_rows_ - 1, y_id_ + smooth_factor_);
smooth_ver_congestion_ = ver_congestion_ * (1.0 + 1.0 / (v_end - v_start));
}
private:
int x_id_ = 0;
int y_id_ = 0;
int id_ = 0.0; // all grids are arranged in a row-based manner
float grid_area_ = 0.0;
int num_cols_ = 0;
int num_rows_ = 0;
int smooth_factor_ = 0.0;
float overlap_area_ = 0.0; // the area of macros overlapped with the current grid
float hor_congestion_ = 0.0;
float ver_congestion_ = 0.0;
float macro_hor_congestion_ = 0.0;
float macro_ver_congestion_ = 0.0;
float smooth_hor_congestion_ = 0.0;
float smooth_ver_congestion_ = 0.0;
Rect bbox_; // bounding box of current grid
float x_ = 0.0; // center location
float y_ = 0.0; // center location
bool available_ = true; // if the grid has been occupied by a hard macro
friend class PBFNetlist;
};
// Class PBFNetlist representing the netlist // Class PBFNetlist representing the netlist
class PBFNetlist { class PBFNetlist {
public: public:
PBFNetlist(std::string netlist_pbf_file) { PBFNetlist(std::string netlist_pbf_file) {
ParseNetlistFile(netlist_pbf_file); ParseNetlistFile(netlist_pbf_file);
} }
void FDPlacer(float io_factor, std::vector<int> num_steps, void FDPlacer(float io_factor, std::vector<int> num_steps,
std::vector<float> move_distance_factor, std::vector<float> move_distance_factor,
std::vector<float> attract_factor, std::vector<float> attract_factor,
std::vector<float> repel_factor, std::vector<float> repel_factor,
bool use_current_loc, bool use_current_loc,
bool debug_mode = true); bool debug_mode = true);
float CalcCost();
void WriteNetlist(std::string file_name); void WriteNetlist(std::string file_name);
void RestorePlacement(std::string file_name); void RestorePlacement(std::string file_name);
void WritePlcFile(std::string file_name); void WritePlcFile(std::string file_name);
...@@ -144,11 +577,15 @@ class PBFNetlist { ...@@ -144,11 +577,15 @@ class PBFNetlist {
// information from protocol buffer netlist // information from protocol buffer netlist
std::string pb_netlist_header_ = ""; std::string pb_netlist_header_ = "";
std::vector<std::shared_ptr<PlcObject> > objects_; std::vector<std::shared_ptr<PlcObject> > objects_;
std::vector<std::shared_ptr<PlcObject> > pre_objects_;
std::vector<size_t> macros_; std::vector<size_t> macros_;
std::vector<size_t> stdcell_clusters_; std::vector<size_t> stdcell_clusters_;
std::vector<size_t> macro_clusters_; std::vector<size_t> macro_clusters_;
std::vector<size_t> ports_; std::vector<size_t> ports_;
std::set<size_t> placed_macros_;
std::vector<std::shared_ptr<Net> > nets_; std::vector<std::shared_ptr<Net> > nets_;
std::vector<std::shared_ptr<Grid> > grids_;
// information from plc file // information from plc file
std::string plc_header_ = ""; std::string plc_header_ = "";
int n_cols_ = -1; int n_cols_ = -1;
...@@ -158,12 +595,31 @@ class PBFNetlist { ...@@ -158,12 +595,31 @@ class PBFNetlist {
float grid_width_ = 0.0; float grid_width_ = 0.0;
float grid_height_ = 0.0; float grid_height_ = 0.0;
// routing information // routing information
float smooth_factor_ = 2; int smooth_factor_ = 2;
float overlap_threshold_ = 0.0; float overlap_threshold_ = 0.0;
float vrouting_alloc_ = 0.0; float vrouting_alloc_ = 0.0;
float hrouting_alloc_ = 0.0; float hrouting_alloc_ = 0.0;
float hroute_per_micro_ = 0.0; float hroute_per_micro_ = 0.0;
float vroute_per_micro_ = 0.0; float vroute_per_micro_ = 0.0;
float min_dist_ = 1e-4;
// random seed setting
int seed_ = 0;
std::mt19937 generator_;
std::uniform_real_distribution<float> distribution_;
std::default_random_engine rng_;
// cost function
float HPWL_ = 0.0;
float norm_HPWL_ = 1.0;
int top_k_ = 1;
float density_ = 0.0;
int top_k_congestion_ = 1;
float congestion_ = 0.0;
// probabilities
std::vector<float> action_probs_ { 0.0, 0.0, 0.0, 0.0, 0.0};
// utility functions // utility functions
void ParseNetlistFile(std::string netlist_pbf_file); void ParseNetlistFile(std::string netlist_pbf_file);
// Force-directed placement // Force-directed placement
...@@ -173,22 +629,19 @@ class PBFNetlist { ...@@ -173,22 +629,19 @@ class PBFNetlist {
void MoveSoftMacros(float attractive_factor, float repulsive_factor, void MoveSoftMacros(float attractive_factor, float repulsive_factor,
float io_factor, float max_displacement); float io_factor, float max_displacement);
void MoveNode(size_t node_id, float x_dist, float y_dist); void MoveNode(size_t node_id, float x_dist, float y_dist);
};
// Cost Related information
// Routing congestion
void TwoPinNetRouting(std::shared_ptr<Net> net, bool flag = true);
void TwoPinNetRouting(std::shared_ptr<PlcObject> src, std::shared_ptr<PlcObject> sink,
float weight, bool flag);
void UpdateRouting(std::shared_ptr<Net> net, bool flag = true);
void UpdateMacroCongestion(std::shared_ptr<PlcObject> plc_object, bool flag);
// Simulated Annealing related macros
void InitMacroPlacement(bool spiral_flag = true);
bool CheckOverlap(size_t macro);
bool IsFeasible(size_t macro);
};
......
...@@ -6,23 +6,27 @@ int main(int argc, char* argv[]) { ...@@ -6,23 +6,27 @@ int main(int argc, char* argv[]) {
std::string netlist_file = argv[1]; std::string netlist_file = argv[1];
std::string plc_file = argv[2]; std::string plc_file = argv[2];
PBFNetlist design(netlist_file); PBFNetlist design(netlist_file);
std::string new_netlist_file = netlist_file + ".new"; std::string new_netlist_file = netlist_file + ".os_cpp.txt";
design.WriteNetlist(new_netlist_file); design.WriteNetlist(new_netlist_file);
design.RestorePlacement(plc_file); design.RestorePlacement(plc_file);
const float io_factor = 1.0; 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<int> num_steps { 100, 100, 100 };
const std::vector<float> repel_factor { 0.0, 1.0e6, 1.0e6 }; const std::vector<float> attract_factor { 100.0, 1.0e-3, 1.0e-5 };
const std::vector<float> repel_factor { 0.0, 1.0e6, 1.0e7 };
const std::vector<float> move_distance_factor { 1.0, 1.0, 1.0 }; const std::vector<float> move_distance_factor { 1.0, 1.0, 1.0 };
const bool use_current_loc = false; const bool use_current_loc = false;
const bool debug_mode = false; const bool debug_mode = true;
auto start_timestamp_global = std::chrono::high_resolution_clock::now(); auto start_timestamp_global = std::chrono::high_resolution_clock::now();
design.FDPlacer(io_factor, num_steps, design.FDPlacer(io_factor, num_steps,
move_distance_factor, move_distance_factor,
attract_factor, attract_factor,
repel_factor, repel_factor,
use_current_loc, use_current_loc,
debug_mode); debug_mode);
auto end_timestamp_global = std::chrono::high_resolution_clock::now(); auto end_timestamp_global = std::chrono::high_resolution_clock::now();
double total_global_time double total_global_time
= std::chrono::duration_cast<std::chrono::nanoseconds>( = std::chrono::duration_cast<std::chrono::nanoseconds>(
...@@ -30,6 +34,6 @@ int main(int argc, char* argv[]) { ...@@ -30,6 +34,6 @@ int main(int argc, char* argv[]) {
.count(); .count();
total_global_time *= 1e-9; total_global_time *= 1e-9;
std::cout << "Runtime of FDPlacer : " << total_global_time << std::endl; std::cout << "Runtime of FDPlacer : " << total_global_time << std::endl;
design.WritePlcFile(plc_file + ".new"); design.WritePlcFile(plc_file + ".os_cpp.txt");
return 0; 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