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
......@@ -1057,15 +1057,15 @@ class PBFNetlist:
y_dir = 0
src_width = src_ux - src_lx
src_height = src_uy - src_ly
target_width = target_ux - target_lx
target_height = target_uy - target_ly
src_cx = (src_lx + src_ux) / 2.0
src_cy = (src_ly + src_uy) / 2.0
target_cx = (target_lx + target_ux) / 2.0
target_cy = (target_ly + target_uy) / 2.0
min_dist = 1e-4
x_min_dist = (src_width + target_width) / 2.0
y_min_dist = (src_height + target_height) / 2.0
......@@ -1075,8 +1075,8 @@ class PBFNetlist:
if (abs(target_cy - src_cy) > (y_min_dist - min_dist)):
# there is no overlap
return None, None
# there is no overlap
# there is no overlap
if (src_cx == target_cx and src_cy == target_cy):
# fully overlap
x_dir = -1.0
......
......@@ -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.
## 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**
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">
<img src="./ariane133/FD_result_1225.png" width= "1200"/>
<img src="./ariane133/FD_result_20230112.png" width= "1200"/>
</p>
<p align="center">
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 @@
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <numeric>
#include "FD.h"
// Plc Object class
bool PlcObject::IsHardMacro() const {
return pb_type_ == std::string("MACRO") ? true : false;
}
bool PlcObject::IsSoftMacro() const {
return pb_type_ == std::string("macro") ? true : false;
}
bool PlcObject::IsHardMacroPin() const {
return pb_type_ == std::string("MACRO_PIN") ? true : false;
}
bool PlcObject::IsSoftMacroPin() const {
return pb_type_ == std::string("macro_pin") ? true : false;
}
bool PlcObject::IsPort() const {
return pb_type_ == std::string("PORT") ? true : false;
}
void PlcObject::MakeSquare() {
const float area = width_ * height_;
width_ = std::sqrt(area);
height_ = width_;
}
const std::pair<float, float> PlcObject::GetPos() const {
if (IsHardMacroPin() == false)
return std::pair<float, float>(x_, y_);
float x = x_;
float y = y_;
// get the absolute location for macro pins
if (macro_ptr_->orient_ == std::string("N")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else if (macro_ptr_->orient_ == std::string("FN")) {
x = macro_ptr_->x_ - x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else if (macro_ptr_->orient_ == std::string("S")) {
x = macro_ptr_->x_ - x_offset_;
y = macro_ptr_->y_ - y_offset_;
} else if (macro_ptr_->orient_ == std::string("FS")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->x_ - y_offset_;
} else if (macro_ptr_->orient_ == std::string("E")) {
x = macro_ptr_->x_ + y_offset_;
y = macro_ptr_->y_ - x_offset_;
} else if (macro_ptr_->orient_ == std::string("FE")) {
x = macro_ptr_->x_ - y_offset_;
y = macro_ptr_->y_ - x_offset_;
} else if (macro_ptr_->orient_ == std::string("FW")) {
x = macro_ptr_->x_ - y_offset_;
y = macro_ptr_->y_ + x_offset_;
} else if (macro_ptr_->orient_ == std::string("W")) {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
} else {
x = macro_ptr_->x_ + x_offset_;
y = macro_ptr_->y_ + y_offset_;
}
return std::pair<float, float>(x, y);
}
float PlcObject::GetX() const {
return GetPos().first;
}
float PlcObject::GetY() const {
return GetPos().second;
}
const Rect PlcObject::GetBBox() const {
const std::pair<float, float> pos = GetPos();
const std::vector<std::string> normal_orients {
std::string("N"), std::string("FN"),
std::string("S"), std::string("FS")
};
float width = width_;
float height = height_;
if (std::find(normal_orients.begin(), normal_orients.end(), orient_) == normal_orients.end()) {
width = height_;
height = width_;
}
return Rect(pos.first - width / 2.0, pos.second - height / 2.0,
pos.first + width / 2.0, pos.second + height / 2.0);
}
void PlcObject::SetPos(float x, float y) {
x_ = x;
y_ = y;
}
void PlcObject::ResetForce() {
f_x_ = 0.0;
f_y_ = 0.0;
}
void PlcObject::AddForce(float f_x, float f_y) {
f_x_ += f_x;
f_y_ += f_y;
}
void PlcObject::NormalForce(float max_f_x, float max_f_y) {
if (max_f_x > 0.0)
f_x_ = f_x_ / max_f_x;
if (max_f_y > 0.0)
f_y_ = f_y_ / max_f_y;
}
std::pair<float, float> PlcObject::GetForce() const {
return std::pair<float, float>(f_x_, f_y_);
}
// Flip operation
void PlcObject::Flip(bool x_flag) {
if (IsHardMacro() == false)
return;
std::map<std::string, std::string> OrientMapFlipX = {
{ std::string("N"), std::string("FS") },
{ std::string("S"), std::string("FN") },
{ std::string("W"), std::string("FE") },
{ std::string("E"), std::string("FW") },
{ std::string("FN"), std::string("S") },
{ std::string("FS"), std::string("N") },
{ std::string("FW"), std::string("E") },
{ std::string("FE"), std::string("W") }
};
std::map<std::string, std::string> OrientMapFlipY = {
{ std::string("N"), std::string("FN") },
{ std::string("S"), std::string("FS") },
{ std::string("W"), std::string("FW") },
{ std::string("E"), std::string("FE") },
{ std::string("FN"), std::string("N") },
{ std::string("FS"), std::string("S") },
{ std::string("FW"), std::string("W") },
{ std::string("FE"), std::string("E") }
};
// flip across the x axis
if (x_flag == true) {
orient_ = OrientMapFlipX[orient_];
} else { // flip across the y axis
orient_ = OrientMapFlipY[orient_];
}
}
std::string PlcObject::SimpleStr() const {
std::string str = "";
str += std::to_string(node_id_) + " ";
......@@ -166,9 +18,9 @@ std::string PlcObject::SimpleStr() const {
stream << std::fixed << std::setprecision(3) << y_;
str += stream.str() + " ";
if (IsPort() == true) {
str += "_ ";
str += "- ";
} else {
str += orient_ + " ";
str += GetString(orient_) + " ";
}
str += "0\n";
return str;
......@@ -193,13 +45,54 @@ std::string PrintPlaceholder(std::string key, float value) {
line += " value {\n";
std::stringstream stream;
stream << std::fixed << std::setprecision(6) << value;
line += " placeholder: " + stream.str() + "\n";
line += " f: " + stream.str() + "\n";
line += " }\n";
line += " }\n";
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
std::ostream& operator <<(std::ostream &out, PlcObject& object) {
if (object.IsPort() == true) {
......@@ -209,7 +102,7 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
out << " input: \"" << sink << "\"\n";
}
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("y"), object.y_);
out << "}\n";
......@@ -220,31 +113,31 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
out << " input: \"" << sink << "\"\n";
}
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) {
out << PrintPlaceholder(std::string("weight"), static_cast<int>(object.weight_));
}
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("x_offset"), object.x_offset_);
out << PrintPlaceholder(std::string("x_offset"), object.x_offset_N_);
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";
} else if (object.IsHardMacro() == true) {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("type"), object.pb_type_);
out << PrintPlaceholder(std::string("height"), object.height_);
out << PrintPlaceholder(std::string("orientation"), object.orient_);
out << PrintPlaceholder(std::string("width"), object.width_);
out << PrintPlaceholder(std::string("height"), object.height_N_);
out << PrintPlaceholder(std::string("orientation"), GetString(object.orient_));
out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
out << PrintPlaceholder(std::string("width"), object.width_N_);
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n";
} else {
out << "node {\n";
out << " name: \"" << object.name_ << "\"\n";
out << PrintPlaceholder(std::string("height"), object.height_);
out << PrintPlaceholder(std::string("type"), object.pb_type_);
out << PrintPlaceholder(std::string("width"), object.width_);
out << PrintPlaceholder(std::string("height"), object.height_N_);
out << PrintPlaceholder(std::string("type"), GetString(object.pb_type_));
out << PrintPlaceholder(std::string("width"), object.width_N_);
out << PrintPlaceholder(std::string("x"), object.x_);
out << PrintPlaceholder(std::string("y"), object.y_);
out << "}\n";
......@@ -252,25 +145,10 @@ std::ostream& operator <<(std::ostream &out, PlcObject& object) {
return out;
}
/*
std::string PlcObject::SimpleStr() const {
std::string str = "";
str += std::to_string(node_id) + " ";
str += std::to_string(std::round(x_, 12)) + " ";
str += std::to_string(std::round(y_, 12)) + " ";
if (IsPort() == true) {
str += "_ ";
} else {
str += orient_ + " ";
}
str += "0\n";
return str;
}
*/
// Class PBFNetlist
// read netlist file for all the plc objects
void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
// 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
// read protocol buffer netlist
const std::vector<std::string> float_values {
......@@ -326,29 +204,29 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
key = items[1]; // the attribute name
} else if (items[0] == std::string("placeholder:")) {
if (key == placeholders[0]) {
(*objects_.rbegin())->m_name_ = items[1];
(*objects_.rbegin())->macro_name_ = items[1];
} else if (key == placeholders[1]) {
(*objects_.rbegin())->orient_ = items[1];
(*objects_.rbegin())->orient_ = ORIENT_MAP.at(items[1]);
} else if (key == placeholders[2]) {
(*objects_.rbegin())->side_ = items[1];
} 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:")) {
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]) {
(*objects_.rbegin())->weight_ = std::stof(items[1]);
} 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]) {
(*objects_.rbegin())->x_ = std::stof(items[1]);
} 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]) {
(*objects_.rbegin())->y_ = std::stof(items[1]);
} 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) {
for (auto& plc_object : objects_) {
plc_object_id_map[plc_object->name_] = plc_object->node_id_;
if (plc_object->IsHardMacro() == true) {
plc_object->UpdateOrientation(grid_width_, grid_height_, n_cols_, n_rows_);
macros_.push_back(plc_object->node_id_);
} 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_);
plc_object->MakeSquare(); // convert standard-cell clusters to square shape
} else if (plc_object->IsPort() == true) {
......@@ -367,11 +247,10 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
// map each plc object to its corresponding macro
for (auto& plc_object : objects_) {
if (plc_object->IsHardMacroPin() == true || plc_object->IsSoftMacroPin() == true) {
plc_object->macro_id_ = plc_object_id_map[plc_object->m_name_];
plc_object->macro_ptr_ = objects_[plc_object->macro_id_];
} else {
plc_object->macro_id_ = plc_object->node_id_;
}
auto& macro_id = plc_object_id_map[plc_object->macro_name_];
plc_object->macro_ptr_ = objects_[macro_id];
plc_object->macro_ptr_->macro_pins_.push_back(plc_object);
}
}
// create nets
for (auto& plc_object : objects_) {
......@@ -395,7 +274,9 @@ void PBFNetlist::ParseNetlistFile(std::string netlist_pbf_file) {
macro_clusters_.insert(macro_clusters_.end(),
stdcell_clusters_.begin(),
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());
}
......@@ -431,7 +312,7 @@ void PBFNetlist::RestorePlacement(std::string file_name) {
hrouting_alloc_ = std::stof(items[7]);
vrouting_alloc_ = std::stof(items[10]);
} else if (items.size() == 5 && items[1] == std::string("Smoothing")) {
smooth_factor_ = std::floor(std::stof(items[4]));
smooth_factor_ = static_cast<int>(std::floor(std::stof(items[4])));
} else if (items.size() == 5 && items[1] == std::string("Overlap")) {
overlap_threshold_ = std::floor(std::stof(items[4]));
}
......@@ -439,15 +320,38 @@ void PBFNetlist::RestorePlacement(std::string file_name) {
size_t node_id = static_cast<size_t>(std::stoi(items[0]));
objects_[node_id]->x_ = std::stof(items[1]);
objects_[node_id]->y_ = std::stof(items[2]);
objects_[node_id]->orient_ = items[3];
objects_[node_id]->orient_ = ORIENT_MAP.at(items[3]);
}
}
// grid info
}
// grid info and create grids
grid_width_ = canvas_width_ / n_cols_;
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
void PBFNetlist::WriteNetlist(std::string file_name) {
std::ofstream f;
......@@ -475,8 +379,9 @@ void PBFNetlist::WritePlcFile(std::string file_name) {
void PBFNetlist::InitSoftMacros() {
const float x = canvas_width_ / 2.0;
const float y = canvas_height_ / 2.0;
for (auto& node_id : stdcell_clusters_)
objects_[node_id]->SetPos(x, y);
for (auto& node_id : stdcell_clusters_) {
objects_[node_id]->SetPos(x, y, grid_width_, grid_height_, n_cols_, n_rows_);
}
}
void PBFNetlist::CalcAttractiveForce(float attractive_factor,
......@@ -484,25 +389,20 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
float max_displacement) {
// traverse the nets to calculate the attractive force
for (auto& net : nets_) {
std::shared_ptr<PlcObject> src_pin = net->pins_[0];
size_t src_macro_node_id = src_pin->node_id_;
if (src_pin->IsPort() == false)
src_macro_node_id = src_pin->macro_ptr_->node_id_;
std::shared_ptr<PlcObject>& src_pin = net->pins_[0];
// convert multi-pin nets to two-pin nets using star model
auto iter = net->pins_.begin();
iter++;
while (iter != net->pins_.end()) {
std::shared_ptr<PlcObject>& target_pin = *iter;
size_t target_macro_node_id = target_pin->node_id_;
if (target_pin->IsPort() == false)
target_macro_node_id = target_pin->macro_ptr_->node_id_;
// check the distance between src_pin and target_pin
std::pair<float, float> src_pos = src_pin->GetPos();
std::pair<float, float> target_pos = target_pin->GetPos();
const float x_dist = -1.0 * (src_pos.first - target_pos.first);
const float y_dist = -1.0 * (src_pos.second - target_pos.second);
if (x_dist != 0.0 || y_dist != 0.0) {
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;
else
k = k * attractive_factor;
......@@ -512,6 +412,7 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
src_pin->macro_ptr_->AddForce(f_x, f_y);
if (target_pin->IsSoftMacroPin() == true)
target_pin->macro_ptr_->AddForce(-1.0 * f_x, -1.0 * f_y);
}
iter++;
} // finish current net
} // finish traversing nets
......@@ -519,18 +420,30 @@ void PBFNetlist::CalcAttractiveForce(float attractive_factor,
void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
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
auto iter = macro_clusters_.begin();
while (iter != macro_clusters_.end()) {
size_t src_macro = *iter;
size_t init_src_macro = *iter;
for (auto iter_loop = ++iter;
iter_loop != macro_clusters_.end(); 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
float x_dir = 0.0; // overlap on x direction
float y_dir = 0.0; // overlap on y direction
const Rect src_bbox = objects_[src_macro]->GetBBox();
const Rect target_bbox = objects_[target_macro]->GetBBox();
const float src_width = src_bbox.ux - src_bbox.lx;
const float src_height = src_bbox.uy - src_bbox.ly;
const float target_width = target_bbox.ux - target_bbox.lx;
......@@ -539,8 +452,9 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
const float src_cy = (src_bbox.ly + src_bbox.uy) / 2.0;
const float target_cx = (target_bbox.lx + target_bbox.ux) / 2.0;
const float target_cy = (target_bbox.ly + target_bbox.uy) / 2.0;
const float x_min_dist = (src_width + target_width) / 2.0 - overlap_threshold_;
const float y_min_dist = (src_height + target_height) / 2.0 - overlap_threshold_;
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 (std::abs(target_cx - src_cx) > x_min_dist)
continue;
......@@ -560,22 +474,19 @@ void PBFNetlist::CalcRepulsiveForce(float repulsive_factor,
// calculate the force
const float f_x = repulsive_factor * max_displacement * x_dir;
const float f_y = repulsive_factor * max_displacement * y_dir;
objects_[src_macro]->AddForce(f_x, f_y);
objects_[target_macro]->AddForce(-1.0 * f_x, -1.0 * f_y);
objects_[src_macro]->AddForce(f_x, f_y);
objects_[target_macro]->AddForce(-1.0 * f_x, -1.0 * f_y);
}
} // finish traverse all the macros and stdcell_clusters
}
void PBFNetlist::MoveNode(size_t node_id, float x_dist, float y_dist) {
objects_[node_id]->x_ += x_dist;
objects_[node_id]->y_ += y_dist;
const Rect bbox = objects_[node_id]->GetBBox();
if (bbox.lx < 0.0 || bbox.ly < 0.0
|| bbox.ux > canvas_width_
|| bbox.uy > canvas_height_) {
objects_[node_id]->x_ -= x_dist;
objects_[node_id]->y_ -= y_dist;
}
float x = objects_[node_id]->x_ + x_dist;
float y = objects_[node_id]->y_ + y_dist;
float width = objects_[node_id]->width_ / 2.0;
float height = objects_[node_id]->height_ / 2.0;
if (x - width >= 0.0 && y - height >= 0.0 && x + width <= canvas_width_ && y + height <= canvas_height_)
objects_[node_id]->SetPos(x, y, grid_width_, grid_height_, n_cols_, n_rows_);
}
void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
......@@ -585,8 +496,10 @@ void PBFNetlist::MoveSoftMacros(float attractive_factor, float repulsive_factor,
for (auto& cluster_id : stdcell_clusters_)
objects_[cluster_id]->ResetForce();
// calculate forces
CalcAttractiveForce(attractive_factor, io_factor, max_displacement);
CalcRepulsiveForce(repulsive_factor, max_displacement);
if (repulsive_factor == 0 || (attractive_factor / repulsive_factor > 1e-4))
CalcAttractiveForce(attractive_factor, io_factor, max_displacement);
if (attractive_factor == 0.0 || (repulsive_factor / attractive_factor > 1e-4))
CalcRepulsiveForce(repulsive_factor, max_displacement);
// normalization
float max_f_x = 0.0;
float max_f_y = 0.0;
......@@ -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_y = std::max(max_f_y, std::abs(forces.second));
}
max_f_x *= max_displacement;
max_f_y *= max_displacement;
for (auto& cluster_id : stdcell_clusters_) {
objects_[cluster_id]->NormalForce(max_f_x, max_f_y);
const std::pair<float, float> forces = objects_[cluster_id]->GetForce();
MoveNode(cluster_id, forces.first, forces.second);
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,
for (size_t i = 0; i < num_steps.size(); i++) {
const float attractive_factor = attract_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];
float max_displacement = max_move_distance[i];
if (debug_mode == true) {
......@@ -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 @@
#include <string>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <memory>
#include <random>
#include <set>
#include <cassert>
// Define the class to handle netlist in Protocol Buffer Format
// Basic data structure
// OrientMap : map the orientation
// PlcObject : a superset of attributes for different types of plc objects
// PBFNetlist: the top-level class for handling netlist in protocol buffer netlist
// ***************************************************************
// Define basic classes
// ***************************************************************
// Enumerate Type
// 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
static const std::map<std::string, std::string> OrientMap = {
{ std::string("N"), std::string("R0") },
{ std::string("S"), std::string("R180") },
{ std::string("W"), std::string("R90") },
{ std::string("E"), std::string("R270") },
{ std::string("FN"), std::string("MY") },
{ std::string("FS"), std::string("MX") },
{ std::string("FW"), std::string("MX90") },
{ std::string("FE"), std::string("MY90") }
enum ORIENTATION { N, S, W, E, FN, FS, FW, FE, NONE};
// string representation
inline std::string GetString(ORIENTATION orient) {
switch (orient)
{
case N:
return std::string("N");
case S:
return std::string("S");
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 {
float lx = 0.0;
float ly = 0.0;
float ux = 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_) {
lx = lx_;
ly = ly_;
......@@ -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
// This is a superset of attributes for different types of plc objects
// A plc object can only have some or all the attributes
......@@ -53,57 +144,250 @@ class PlcObject {
PlcObject(size_t node_id) : node_id_(node_id) { }
// functions
// GetType Information
bool IsHardMacro() const;
bool IsSoftMacro() const;
bool IsSoftMacroPin() const;
bool IsHardMacroPin() const;
bool IsPort() const;
inline bool IsHardMacro() const {
return pb_type_ == MACRO;
}
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
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
const std::pair<float, float> GetPos() const;
float GetX() const;
float GetY() const;
const Rect GetBBox() const;
void SetPos(float x, float y);
inline const std::pair<float, float> GetPos() const {
return std::pair<float, float>(x_, 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
void ResetForce();
void AddForce(float f_x, float f_y);
void NormalForce(float max_f_x, float max_f_y);
std::pair<float, float> GetForce() const;
inline void ResetForce() {
f_x_ = 0.0;
f_y_ = 0.0;
}
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
// Flop operation can only be applied to hard macro
// if x_flag == true, flip across x 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
friend std::ostream& operator <<(std::ostream &out, PlcObject& object); // for protocol buffer netlist
std::string SimpleStr() const; // for plc file
private:
// inherient attributes
std::string name_ = "";
size_t node_id_ = 0;
float height_ = 0.0;
float width_ = 0.0;
float weight_ = 1.0;
std::string pb_type_ = "MACRO"; // hard macro
float x_ = 0.0; // center of the object
float y_ = 0.0; // center of the object
std::string orient_ = "N"; // orientation
// PBPORT
std::string side_ = "LEFT"; // attribute for IOPORT (LEFT, RIGHT, TOP, BOTTOM)
// PBMACROPIN, PBGRPPIN
float x_offset_ = 0.0; // pin offset relative to the center of macro ("N")
float y_offset_ = 0.0; // pin offset relative to the center of macro ("N")
size_t macro_id_ = 0; // the corresponding node id of macro which the pin belongs to
std::string m_name_ = "";
PBTYPE pb_type_ = MACRO; // hard macro
// we define xx_N_ becuase the Portocol buffer netlist required these values to generate the netlist file
float width_N_ = 0.0;
float height_N_ = 0.0;
float x_offset_N_ = 0.0;
float y_offset_N_ = 0.0;
std::string macro_name_ = ""; // the correponding macro names
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<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
float f_x_ = 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
friend class PBFNetlist;
friend class Net;
};
std::string PrintPlaceholder(std::string key, std::string value);
......@@ -117,26 +401,175 @@ class Net {
pins_ = pins; // the first pin is always the source pin
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:
std::vector<std::shared_ptr<PlcObject> > pins_;
float weight_ = 1.0;
float HPWL_ = 0.0; // wirelength
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 {
public:
PBFNetlist(std::string netlist_pbf_file) {
ParseNetlistFile(netlist_pbf_file);
}
void FDPlacer(float io_factor, std::vector<int> num_steps,
std::vector<float> move_distance_factor,
std::vector<float> attract_factor,
std::vector<float> repel_factor,
bool use_current_loc,
bool debug_mode = true);
float CalcCost();
void WriteNetlist(std::string file_name);
void RestorePlacement(std::string file_name);
void WritePlcFile(std::string file_name);
......@@ -144,11 +577,15 @@ class PBFNetlist {
// information from protocol buffer netlist
std::string pb_netlist_header_ = "";
std::vector<std::shared_ptr<PlcObject> > objects_;
std::vector<std::shared_ptr<PlcObject> > pre_objects_;
std::vector<size_t> macros_;
std::vector<size_t> stdcell_clusters_;
std::vector<size_t> macro_clusters_;
std::vector<size_t> ports_;
std::set<size_t> placed_macros_;
std::vector<std::shared_ptr<Net> > nets_;
std::vector<std::shared_ptr<Grid> > grids_;
// information from plc file
std::string plc_header_ = "";
int n_cols_ = -1;
......@@ -158,12 +595,31 @@ class PBFNetlist {
float grid_width_ = 0.0;
float grid_height_ = 0.0;
// routing information
float smooth_factor_ = 2;
int smooth_factor_ = 2;
float overlap_threshold_ = 0.0;
float vrouting_alloc_ = 0.0;
float hrouting_alloc_ = 0.0;
float hroute_per_micro_ = 0.0;
float vroute_per_micro_ = 0.0;
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
void ParseNetlistFile(std::string netlist_pbf_file);
// Force-directed placement
......@@ -173,6 +629,18 @@ class PBFNetlist {
void MoveSoftMacros(float attractive_factor, float repulsive_factor,
float io_factor, float max_displacement);
void MoveNode(size_t node_id, float x_dist, float y_dist);
// 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);
};
......@@ -181,18 +649,3 @@ class PBFNetlist {
......@@ -6,23 +6,27 @@ int main(int argc, char* argv[]) {
std::string netlist_file = argv[1];
std::string plc_file = argv[2];
PBFNetlist design(netlist_file);
std::string new_netlist_file = netlist_file + ".new";
std::string new_netlist_file = netlist_file + ".os_cpp.txt";
design.WriteNetlist(new_netlist_file);
design.RestorePlacement(plc_file);
const float io_factor = 1.0;
const std::vector<int> num_steps { 10, 10, 10 };
const std::vector<float> attract_factor { 100, 1.0e-3, 1.0e-5 };
const std::vector<float> repel_factor { 0.0, 1.0e6, 1.0e6 };
const std::vector<int> num_steps { 100, 100, 100 };
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 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();
design.FDPlacer(io_factor, num_steps,
move_distance_factor,
attract_factor,
repel_factor,
use_current_loc,
debug_mode);
auto end_timestamp_global = std::chrono::high_resolution_clock::now();
double total_global_time
= std::chrono::duration_cast<std::chrono::nanoseconds>(
......@@ -30,6 +34,6 @@ int main(int argc, char* argv[]) {
.count();
total_global_time *= 1e-9;
std::cout << "Runtime of FDPlacer : " << total_global_time << std::endl;
design.WritePlcFile(plc_file + ".new");
design.WritePlcFile(plc_file + ".os_cpp.txt");
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