Coverage for tests/rcx25/rcx25_test.py: 100%
145 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-03-31 19:36 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-03-31 19:36 +0000
1#
2# --------------------------------------------------------------------------------
3# SPDX-FileCopyrightText: 2024 Martin Jan Köhler and Harald Pretl
4# Johannes Kepler University, Institute for Integrated Circuits.
5#
6# This file is part of KPEX
7# (see https://github.com/martinjankoehler/klayout-pex).
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
21# SPDX-License-Identifier: GPL-3.0-or-later
22# --------------------------------------------------------------------------------
23#
24from __future__ import annotations
26import io
27import json
28import tempfile
30import allure
31import csv_diff
32import os
33import pytest
34from typing import *
36import klayout.db as kdb
37import klayout.lay as klay
39from klayout_pex.kpex_cli import KpexCLI
40from klayout_pex.rcx25.extraction_results import CellExtractionResults
43CSVPath = str
44PNGPath = str
45parent_suite = "kpex/2.5D Extraction Tests"
46tags = ("PEX", "2.5D", "MAGIC")
49def _kpex_pdk_dir() -> str:
50 return os.path.realpath(os.path.join(__file__, '..', '..', '..',
51 'pdk', 'sky130A', 'libs.tech', 'kpex'))
54def _sky130a_testdata_dir() -> str:
55 return os.path.realpath(os.path.join(__file__, '..', '..', '..',
56 'testdata', 'designs', 'sky130A'))
59def _gds(*path_components) -> str:
60 return os.path.join(_sky130a_testdata_dir(), *path_components)
63def _save_layout_preview(gds_path: str,
64 output_png_path: str):
65 kdb.Technology.clear_technologies()
66 default_lyt_path = os.path.abspath(f"{_kpex_pdk_dir()}/sky130A.lyt")
67 tech = kdb.Technology.create_technology('sky130A')
68 tech.load(default_lyt_path)
70 lv = klay.LayoutView()
71 lv.load_layout(gds_path)
72 lv.max_hier()
73 lv.set_config('background-color', '#000000')
74 lv.set_config('bitmap-oversampling', '1')
75 lv.set_config('default-font-size', '4')
76 lv.set_config('default-text-size', '0.1')
77 lv.save_image_with_options(
78 output_png_path,
79 width=4096, height=2160
80 # ,
81 # linewidth=2,
82 # resolution=0.25 # 4x as large fonts
83 )
85def _run_rcx25d_single_cell(*path_components) -> Tuple[CellExtractionResults, CSVPath, PNGPath]:
86 gds_path = _gds(*path_components)
88 preview_png_path = tempfile.mktemp(prefix=f"layout_preview_", suffix=".png")
89 _save_layout_preview(gds_path, preview_png_path)
90 output_dir_path = os.path.realpath(os.path.join(__file__, '..', '..', '..', 'output_sky130A'))
91 cli = KpexCLI()
92 cli.main(['main',
93 '--pdk', 'sky130A',
94 '--gds', gds_path,
95 '--out_dir', output_dir_path,
96 '--2.5D',
97 '--halo', '10000',
98 '--scale', 'n'])
99 assert cli.rcx25_extraction_results is not None
100 assert len(cli.rcx25_extraction_results.cell_extraction_results) == 1 # assume single cell test
101 results = list(cli.rcx25_extraction_results.cell_extraction_results.values())[0]
102 assert results.cell_name == path_components[-1][:-len('.gds.gz')]
103 return results, cli.rcx25_extracted_csv_path, preview_png_path
106def assert_expected_matches_obtained(*path_components,
107 expected_csv_content: str) -> CellExtractionResults:
108 result, csv, preview_png = _run_rcx25d_single_cell(*path_components)
109 allure.attach.file(csv, name='pex_obtained.csv', attachment_type=allure.attachment_type.CSV)
110 allure.attach.file(preview_png, name='📸 layout_preview.png', attachment_type=allure.attachment_type.PNG)
111 expected_csv = csv_diff.load_csv(io.StringIO(expected_csv_content), key='Device')
112 with open(csv, 'r') as f:
113 obtained_csv = csv_diff.load_csv(f, key='Device')
114 diff = csv_diff.compare(expected_csv, obtained_csv, show_unchanged=False)
115 human_diff = csv_diff.human_text(
116 diff, current=obtained_csv, extras=(('Net1','{Net1}'),('Net2','{Net2}'))
117 )
118 allure.attach(expected_csv_content, name='pex_expected.csv', attachment_type=allure.attachment_type.CSV)
119 allure.attach(json.dumps(diff, sort_keys=True, indent=' ').encode("utf8"),
120 name='pex_diff.json', attachment_type=allure.attachment_type.JSON)
121 allure.attach(human_diff.encode("utf8"), name='‼️ pex_diff.txt', attachment_type=allure.attachment_type.TEXT)
122 # assert diff['added'] == []
123 # assert diff['removed'] == []
124 # assert diff['changed'] == []
125 # assert diff['columns_added'] == []
126 # assert diff['columns_removed'] == []
127 assert human_diff == '', 'Diff detected'
128 return result
130@allure.parent_suite(parent_suite)
131@allure.tag(*tags)
132@pytest.mark.slow
133def test_single_plate_100um_x_100um_li1_over_substrate():
134 # MAGIC GIVES (8.3 revision 485):
135 #_______________________________ NOTE: with halo=8µm __________________________________
136 # C0 PLATE VSUBS 0.38618p
137 assert_expected_matches_obtained(
138 'test_patterns', 'single_plate_100um_x_100um_li1_over_substrate.gds.gz',
139 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
140C1;PLATE;VSUBS;386.179;"""
141 )
144@allure.parent_suite(parent_suite)
145@allure.tag(*tags)
146@pytest.mark.slow
147@pytest.mark.wip
148def test_overlap_plates_100um_x_100um_li1_m1():
149 # MAGIC GIVES (8.3 revision 485):
150 #_______________________________ NOTE: with halo=8µm __________________________________
151 # C2 LOWER VSUBS 0.38618p
152 # C0 UPPER LOWER 0.294756p
153 # C1 UPPER VSUBS 0.205833p
154 #_______________________________ NOTE: with halo=50µm __________________________________
155 # C2 LOWER VSUBS 0.38618p
156 # C0 LOWER UPPER 0.294867p
157 # C1 UPPER VSUBS 0.205621p
158 # NOTE: magic with --magic_halo=50 (µm) gives UPPER-VSUBS of 0.205621p
159 # which is due to the handling of https://github.com/martinjankoehler/magic/issues/1
160 assert_expected_matches_obtained(
161 'test_patterns', 'overlap_plates_100um_x_100um_li1_m1.gds.gz',
162 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
163C1;LOWER;VSUBS;386.179;
164C2;UPPER;VSUBS;205.619;
165C3;LOWER;UPPER;294.867;"""
166 )
168@allure.parent_suite(parent_suite)
169@allure.tag(*tags)
170@pytest.mark.slow
171@pytest.mark.wip
172def test_overlap_plates_100um_x_100um_li1_m1_m2_m3():
173 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
174 #_______________________________ NOTE: with halo=8µm __________________________________
175 # C7 li1 VSUBS 0.38618p
176 # C6 met1 VSUBS 0.205833p
177 # C5 met2 VSUBS 52.151802f
178 # C4 met3 VSUBS 0.136643p
179 # C3 li1 met1 0.294756p
180 # C0 met1 met2 0.680652p
181 # C2 li1 met2 99.3128f
182 # C1 li1 met3 5.59194f
183 #_______________________________ NOTE: with halo=50µm __________________________________
184 # C9 li1 VSUBS 0.38618p
185 # C8 met1 VSUBS 0.205621p
186 # C7 met2 VSUBS 51.5767f
187 # C6 met3 VSUBS 0.136103p
188 # C5 li1 met1 0.294867p
189 # C4 li1 met2 99.518005f
190 # C2 met1 met2 0.680769p
191 # C3 li1 met3 6.01281f
192 # C1 met1 met3 0.012287f
193 # C0 met2 met3 0.0422f
195 assert_expected_matches_obtained(
196 'test_patterns', 'overlap_plates_100um_x_100um_li1_m1_m2_m3.gds.gz',
197 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
198C1;VSUBS;li1;386.179;
199C2;VSUBS;met1;205.619;
200C3;VSUBS;met2;51.574;
201C4;VSUBS;met3;136.063;
202C5;li1;met1;294.867;
203C6;li1;met2;99.518;
204C7;met1;met2;680.769;
205C8;li1;met3;6.013;
206C9;met1;met3;0.016;
207C10;met2;met3;0.056;"""
208 )
211@allure.parent_suite(parent_suite)
212@allure.tag(*tags)
213@pytest.mark.slow
214@pytest.mark.wip
215def test_sidewall_100um_x_100um_distance_200nm_li1():
216 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
217 # _______________________________ NOTE: with halo=8µm __________________________________
218 # C0 A B 7.5f
219 # C1 B VSUBS 8.231f
220 # C2 A VSUBS 8.231f
221 # _______________________________ NOTE: with halo=50µm __________________________________
222 # (same!)
224 assert_expected_matches_obtained(
225 'test_patterns', 'sidewall_100um_x_100um_distance_200nm_li1.gds.gz',
226 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
227C1;B;VSUBS;8.231;
228C2;A;VSUBS;8.231;
229C3;A;B;7.5;"""
230 )
233@allure.parent_suite(parent_suite)
234@allure.tag(*tags)
235@pytest.mark.slow
236@pytest.mark.wip
237def test_sidewall_net_uturn_l1_redux():
238 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
239 # _______________________________ NOTE: with halo=8µm __________________________________
240 # C1 C1 VSUBS 12.5876f
241 # C2 C0 VSUBS 38.1255f
242 # C0 C0 C1 1.87386f
243 # _______________________________ NOTE: with halo=50µm __________________________________
244 # (same!)
246 assert_expected_matches_obtained(
247 'test_patterns', 'sidewall_net_uturn_l1_redux.gds.gz',
248 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
249C1;C1;VSUBS;12.588;
250C2;C0;VSUBS;38.125;
251C3;C0;C1;1.874;"""
252 )
255@allure.parent_suite(parent_suite)
256@allure.tag(*tags)
257@pytest.mark.slow
258@pytest.mark.wip
259def test_sidewall_cap_vpp_04p4x04p6_l1_redux():
260 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
261 # _______________________________ NOTE: with halo=8µm __________________________________
262 # C1 C1 VSUBS 0.086832f
263 # C2 C0 VSUBS 0.300359f
264 # C0 C0 C1 0.286226f
265 # _______________________________ NOTE: with halo=50µm __________________________________
266 # (same!)
268 assert_expected_matches_obtained(
269 'test_patterns', 'sidewall_cap_vpp_04p4x04p6_l1_redux.gds.gz',
270 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
271C1;C1;VSUBS;0.087;
272C2;C0;VSUBS;0.3;
273C3;C0;C1;0.286;"""
274 )
277@allure.parent_suite(parent_suite)
278@allure.tag(*tags)
279@pytest.mark.slow
280@pytest.mark.wip
281def test_near_body_shield_li1_m1():
282 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
283 #_______________________________ NOTE: with halo=8µm __________________________________
284 # C5 BOTTOM VSUBS 0.405082p
285 # C1 BOTTOM TOPB 0.215823p # DIFFERS marginally <0,1fF
286 # C2 BOTTOM TOPA 0.215823p # DIFFERS marginally <0,1fF
287 # C0 TOPA TOPB 0.502857f
288 # C3 TOPB VSUBS 0.737292f # DIFFERS, but that's a MAGIC issue (see test_overlap_plates_100um_x_100um_li1_m1)
289 # C4 TOPA VSUBS 0.737292f # DIFFERS, but that's a MAGIC issue (see test_overlap_plates_100um_x_100um_li1_m1)
290 #_______________________________ NOTE: with halo=50µm __________________________________
291 # NOTE: with halo=50µm, C3/C4 becomes 0.29976f
292 # see https://github.com/martinjankoehler/magic/issues/2
294 assert_expected_matches_obtained(
295 'test_patterns', 'near_body_shield_li1_m1.gds.gz',
296 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
297C1;BOTTOM;VSUBS;405.081;
298C2;BOTTOM;TOPB;215.972;
299C3;BOTTOM;TOPA;215.972;
300C4;TOPA;TOPB;0.503;
301C5;TOPA;VSUBS;0.299;
302C6;TOPB;VSUBS;0.299;"""
303 )
306@allure.parent_suite(parent_suite)
307@allure.tag(*tags)
308@pytest.mark.slow
309@pytest.mark.wip
310def test_lateral_fringe_shield_by_same_polygon_li1():
311 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
312 #_______________________________ NOTE: with halo=8µm __________________________________
313 # C0 C0 VSUBS 6.41431f $ **FLOATING
314 #_______________________________ NOTE: with halo=50µm __________________________________
315 # C0 C0 VSUBS 6.41431f $ **FLOATING
316 assert_expected_matches_obtained(
317 'test_patterns', 'lateral_fringe_shield_by_same_polygon_li1.gds.gz',
318 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
319C1;C0;VSUBS;6.414;"""
320 )
323@allure.parent_suite(parent_suite)
324@allure.tag(*tags)
325@pytest.mark.slow
326@pytest.mark.wip
327def test_sideoverlap_simple_plates_li1_m1():
328 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
329 # _______________________________ NOTE: with halo=8µm __________________________________
330 # C2 li1 VSUBS 7.931799f
331 # C1 met1 VSUBS 0.248901p
332 # C0 li1 met1 0.143335f
333 # _______________________________ NOTE: with halo=50µm __________________________________
334 # C2 li1 VSUBS 7.931799f
335 # C1 met1 VSUBS 0.248901p
336 # C0 li1 met1 0.156859f
338 assert_expected_matches_obtained(
339 'test_patterns', 'sideoverlap_simple_plates_li1_m1.gds.gz',
340 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
341C1;VSUBS;li1;7.931;
342C2;VSUBS;met1;248.899;
343C3;li1;met1;0.157;"""
344 )
346@allure.parent_suite(parent_suite)
347@allure.tag(*tags)
348@pytest.mark.slow
349@pytest.mark.wip
350def test_sideoverlap_shielding_simple_plates_li1_m1_m2():
351 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
352 # _______________________________ NOTE: with halo=8µm __________________________________
353 # C5 li1 VSUBS 11.7936f
354 # C4 met1 VSUBS 57.990803f
355 # C2 li1 met1 15.661301f
356 # C0 met1 met2 0.257488p
357 # C3 met2 VSUBS 5.29197f
358 # C1 li1 met2 0.151641f
359 # _______________________________ NOTE: with halo=50µm __________________________________
360 # C5 li1 VSUBS 11.7936f
361 # C4 met1 VSUBS 57.990803f
362 # C2 li1 met1 15.709599f
363 # C0 met1 met2 0.257488p
364 # C3 met2 VSUBS 5.29197f
365 # C1 li1 met2 0.151641f
367 assert_expected_matches_obtained(
368 'test_patterns', 'sideoverlap_shielding_simple_plates_li1_m1_m2.gds.gz',
369 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
370C1;VSUBS;li1;11.793;
371C2;VSUBS;met1;57.99;
372C3;li1;met1;15.71;
373C4;met1;met2;257.488;
374C5;VSUBS;met2;5.291;
375C6;li1;met2;0.152;"""
376 )
379@allure.parent_suite(parent_suite)
380@allure.tag(*tags)
381@pytest.mark.slow
382@pytest.mark.wip
383def test_sideoverlap_plates_li1_m1():
384 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
385 # _______________________________ NOTE: with halo=50µm __________________________________
386 # C15 LOWER_NoHaloOverlap_InsideTop VSUBS 51.9938f
387 # C12 LOWER_OutsideHalo VSUBS 73.274605f
388 # C17 LOWER_PartialSideHaloOverlap_Separated VSUBS 90.6184f
389 # C13 LOWER_PartialSideHaloOverlap_BothSides_separated VSUBS 7.93086f
390 # C14 LOWER_PartialSideHaloOverlap_Touching VSUBS 13.637f
391 # C16 LOWER_FullHaloOverlap VSUBS 0.177602p
392 # C11 UPPER VSUBS 0.214853p
393 # C8 LOWER_NoHaloOverlap_InsideTop UPPER 0.146991p
394 # C7 LOWER_PartialSideHaloOverlap_Touching UPPER 32.1587f
395 # C10 LOWER_FullHaloOverlap UPPER 0.262817p
396 # C3 LOWER_FullHaloOverlap LOWER_NoHaloOverlap_InsideTop 0.12574f
397 # C2 LOWER_NoHaloOverlap_InsideTop LOWER_PartialSideHaloOverlap_Touching 0.063307f
398 # C9 LOWER_NoHaloOverlap_InsideTop LOWER_OutsideHalo 0.06287f
399 # C1 LOWER_FullHaloOverlap LOWER_OutsideHalo 0.100592f
400 # C4 LOWER_PartialSideHaloOverlap_Separated LOWER_FullHaloOverlap 0.248054f
401 # C5 LOWER_OutsideHalo UPPER 0.076223f
402 # C6 LOWER_PartialSideHaloOverlap_BothSides_separated UPPER 0.261432f
403 # C0 LOWER_PartialSideHaloOverlap_Separated UPPER 0.148834f
404 #
406 assert_expected_matches_obtained(
407 'test_patterns', 'sideoverlap_plates_li1_m1.gds.gz',
408 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
409C1;LOWER_NoHaloOverlap_InsideTop;VSUBS;51.994;
410C2;LOWER_OutsideHalo;VSUBS;73.274;
411C3;LOWER_PartialSideHaloOverlap_Separated;VSUBS;90.618;
412C4;LOWER_PartialSideHaloOverlap_BothSides_separated;VSUBS;7.931;
413C5;LOWER_PartialSideHaloOverlap_Touching;VSUBS;13.637;
414C6;LOWER_FullHaloOverlap;VSUBS;177.601;
415C7;UPPER;VSUBS;214.85;
416C8;LOWER_NoHaloOverlap_InsideTop;UPPER;146.991;
417C9;LOWER_PartialSideHaloOverlap_Touching;UPPER;32.159;
418C10;LOWER_FullHaloOverlap;UPPER;262.817;
419C11;LOWER_FullHaloOverlap;LOWER_NoHaloOverlap_InsideTop;0.126;
420C12;LOWER_NoHaloOverlap_InsideTop;LOWER_PartialSideHaloOverlap_Touching;0.063;
421C13;LOWER_NoHaloOverlap_InsideTop;LOWER_OutsideHalo;0.063;
422C14;LOWER_FullHaloOverlap;LOWER_OutsideHalo;0.101;
423C15;LOWER_FullHaloOverlap;LOWER_PartialSideHaloOverlap_BothSides_separated;0.001;
424C16;LOWER_FullHaloOverlap;LOWER_PartialSideHaloOverlap_Separated;0.248;
425C17;LOWER_OutsideHalo;UPPER;0.076;
426C18;LOWER_PartialSideHaloOverlap_BothSides_separated;UPPER;0.261;
427C19;LOWER_PartialSideHaloOverlap_Separated;UPPER;0.149;"""
428 )
431@allure.parent_suite(parent_suite)
432@allure.tag(*tags)
433@pytest.mark.slow
434@pytest.mark.wip
435def test_sideoverlap_fingered_li1_m1_patternA():
436 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
437 # _______________________________ NOTE: with halo=50µm __________________________________
438 #
439 # C2 LOWER VSUBS 5.89976f
440 # C1 UPPER VSUBS 72.328f
441 # C0 LOWER UPPER 0.357768f
443 assert_expected_matches_obtained(
444 'test_patterns', 'sideoverlap_fingered_li1_m1_patternA.gds.gz',
445 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
446C1;LOWER;VSUBS;5.9;
447C2;UPPER;VSUBS;72.327;
448C3;LOWER;UPPER;0.358;"""
449 )
452@allure.parent_suite(parent_suite)
453@allure.tag(*tags)
454@pytest.mark.slow
455@pytest.mark.wip
456def test_sideoverlap_fingered_li1_m1():
457 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
458 # _______________________________ NOTE: with halo=50µm __________________________________
459 #
460 # C6 LOWER_PartialSideHaloOverlap_Fingered2 VSUBS 8.15974f
461 # C8 LOWER_PartialSideHaloOverlap_Fingered3 VSUBS 8.16395f
462 # C7 LOWER_PartialSideHaloOverlap_Fingered1 VSUBS 5.8844f
463 # C5 LOWER_PartialSideHaloOverlap_Fingered4 VSUBS 5.88862f
464 # C4 UPPER VSUBS 0.215283p
465 # C0 LOWER_PartialSideHaloOverlap_Fingered3 UPPER 0.158769f
466 # C2 LOWER_PartialSideHaloOverlap_Fingered2 UPPER 2.46581f
467 # C1 LOWER_PartialSideHaloOverlap_Fingered4 UPPER 0.35839f
468 # C3 LOWER_PartialSideHaloOverlap_Fingered1 UPPER 0.244356f
470 assert_expected_matches_obtained(
471 'test_patterns', 'sideoverlap_fingered_li1_m1.gds.gz',
472 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
473C1;LOWER_PartialSideHaloOverlap_Fingered2;VSUBS;8.16;
474C2;LOWER_PartialSideHaloOverlap_Fingered3;VSUBS;8.164;
475C3;LOWER_PartialSideHaloOverlap_Fingered1;VSUBS;5.884;
476C4;LOWER_PartialSideHaloOverlap_Fingered4;VSUBS;5.889;
477C5;UPPER;VSUBS;215.281;
478C6;LOWER_PartialSideHaloOverlap_Fingered2;LOWER_PartialSideHaloOverlap_Fingered3;0.002;
479C7;LOWER_PartialSideHaloOverlap_Fingered1;LOWER_PartialSideHaloOverlap_Fingered2;0.003;
480C8;LOWER_PartialSideHaloOverlap_Fingered1;LOWER_PartialSideHaloOverlap_Fingered4;0.016;
481C9;LOWER_PartialSideHaloOverlap_Fingered3;UPPER;0.159;
482C10;LOWER_PartialSideHaloOverlap_Fingered2;UPPER;2.466;
483C11;LOWER_PartialSideHaloOverlap_Fingered4;UPPER;0.358;
484C12;LOWER_PartialSideHaloOverlap_Fingered1;UPPER;0.244;"""
485 )
488@allure.parent_suite(parent_suite)
489@allure.tag(*tags)
490@pytest.mark.slow
491@pytest.mark.wip
492def test_sideoverlap_complex_li1_m1():
493 # MAGIC GIVES (8.3 revision 485): (sorting changed to match order)
494 # _______________________________ NOTE: with halo=50µm __________________________________
495 #
496 # C6 Complex_Shape_L VSUBS 3.19991f
497 # C8 Complex_Shape_T VSUBS 3.19991f
498 # C7 Complex_Shape_R VSUBS 3.19991f
499 # C5 Complex_Shape_B VSUBS 3.19991f
500 # C4 UPPER VSUBS 13.0192f
501 # C0 Complex_Shape_B UPPER 1.34751f
502 # C3 Complex_Shape_T UPPER 0.064969f
503 # C2 Complex_Shape_R UPPER 0.089357f
504 # C1 Complex_Shape_L UPPER 0.24889f
506 assert_expected_matches_obtained(
507 'test_patterns', 'sideoverlap_complex_li1_m1.gds.gz',
508 expected_csv_content="""Device;Net1;Net2;Capacitance [fF];Resistance [Ω]
509C1;Complex_Shape_L;VSUBS;3.2;
510C2;Complex_Shape_T;VSUBS;3.2;
511C3;Complex_Shape_R;VSUBS;3.2;
512C4;Complex_Shape_B;VSUBS;3.2;
513C5;UPPER;VSUBS;13.019;
514C6;Complex_Shape_B;UPPER;1.348;
515C7;Complex_Shape_T;UPPER;0.065;
516C8;Complex_Shape_R;UPPER;0.089;
517C9;Complex_Shape_L;UPPER;0.249;"""
518 )