From 6262d4b2e3ecf6759831f0b41608a0bb1d8e1025 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Thu, 28 Nov 2024 16:54:43 +0200 Subject: [PATCH 01/10] REFACTOR: EDB configuration example for DCIR setup --- examples/use_configuration/dcir.py | 157 +++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 examples/use_configuration/dcir.py diff --git a/examples/use_configuration/dcir.py b/examples/use_configuration/dcir.py new file mode 100644 index 0000000000..cea9359841 --- /dev/null +++ b/examples/use_configuration/dcir.py @@ -0,0 +1,157 @@ +# # DCIR Setup Leveraging EDB Configuration Format + +# ## Import the required packages + +import json + +# + +import os +import tempfile + +from ansys.aedt.core import Hfss3dLayout +from ansys.aedt.core.downloads import download_file + +from pyedb import Edb + +AEDT_VERSION = "2024.2" +NG_MODE = False + +# - + +# Download the example BGA Package design. + +temp_folder = tempfile.TemporaryDirectory(suffix=".ansys") +file_edb = download_file(source=r"edb/BGA_Package.aedb", destination=temp_folder.name) + +# ## Load example layout + +edbapp = Edb(file_edb, edbversion=AEDT_VERSION) + +# ## Create config file + +# Define Component with solderballs. + +cfg_components = [ + { + "reference_designator": "FCHIP", + "part_type": "other", + "solder_ball_properties": { + "shape": "cylinder", + "diameter": "0.1mm", + "height": "0.085mm", + "chip_orientation": "chip_up", + }, + "port_properties": { + "reference_offset": 0, + "reference_size_auto": False, + "reference_size_x": 0, + "reference_size_y": 0, + }, + }, + { + "reference_designator": "BGA", + "part_type": "io", + "solder_ball_properties": { + "shape": "cylinder", + "diameter": "0.45mm", + "height": "0.45mm", + "chip_orientation": "chip_down", + }, + "port_properties": { + "reference_offset": 0, + "reference_size_auto": False, + "reference_size_x": 0, + "reference_size_y": 0, + }, + }, +] + +# Define Pin Groups on Components. + +cfg_pin_groups = [ + {"name": "BGA_VSS", "reference_designator": "BGA", "net": "VSS"}, + {"name": "BGA_VDD", "reference_designator": "BGA", "net": "VDD"}, +] + +# Define sources. + +cfg_sources = [ + { + "name": "FCHIP_Current", + "reference_designator": "FCHIP", + "type": "current", + "magnitude": 2, + "distributed": True, + "positive_terminal": {"net": "VDD"}, + "negative_terminal": {"nearest_pin": {"reference_net": "VSS", "search_radius": 5e-3}}, + }, + { + "name": "BGA_Voltage", + "reference_designator": "BGA", + "type": "voltage", + "magnitude": 1, + "positive_terminal": {"pin_group": "BGA_VDD"}, + "negative_terminal": {"pin_group": "BGA_VSS"}, + }, +] + +# Define DCIR setup. + +cfg_setups = [ + { + "name": "siwave_dc", + "type": "siwave_dc", + "dc_slider_position": 1, + "dc_ir_settings": {"export_dc_thermal_data": True}, + } +] + +# Create final configuration. + +cfg = { + "components": cfg_components, + "sources": cfg_sources, + "pin_groups": cfg_pin_groups, + "setups": cfg_setups, +} + +# Create the config file. + +file_json = os.path.join(temp_folder.name, "edb_configuration.json") +with open(file_json, "w") as f: + json.dump(cfg, f, indent=4, ensure_ascii=False) + +# ## Apply Config file + +# Apply configuration to the example layout + +edbapp.configuration.load(config_file=file_json) +edbapp.configuration.run() + +# Save and close EDB. + +edbapp.save() +edbapp.close() + +# The configured EDB file is saved in a temp folder. + +print(temp_folder.name) + +# ## Load edb into HFSS 3D Layout. + +h3d = Hfss3dLayout(edbapp.edbpath, version=AEDT_VERSION, non_graphical=NG_MODE, new_desktop=True) + +# Solve. + +h3d.analyze(setup="siwave_dc") + +# Plot insertion loss. + +h3d.post.create_fieldplot_layers_nets(layers_nets=[["VDD_C1", "VDD"]], quantity="Voltage", setup="siwave_dc") + +# Shut Down Electronics Desktop + +h3d.close_desktop() + +# All project files are saved in the folder ``temp_file.dir``. If you've run this example as a Jupyter notebook you +# can retrieve those project files. From a94d863e31b28201a1b2be0085e30f0bbf8a41db Mon Sep 17 00:00:00 2001 From: gkorompi Date: Thu, 23 Jan 2025 13:53:59 +0200 Subject: [PATCH 02/10] import_gdss --- src/pyedb/dotnet/edb.py | 11 ++- .../dotnet/edb_core/edb_data/control_file.py | 74 ++++++++++++++++--- 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/src/pyedb/dotnet/edb.py b/src/pyedb/dotnet/edb.py index 6562606753..ed3b619397 100644 --- a/src/pyedb/dotnet/edb.py +++ b/src/pyedb/dotnet/edb.py @@ -603,7 +603,7 @@ def create_edb(self): def import_layout_pcb( self, input_file, - working_dir, + working_dir="", anstranslator_full_path="", use_ppe=False, control_file=None, @@ -616,7 +616,7 @@ def import_layout_pcb( ---------- input_file : str Full path to the board file. - working_dir : str + working_dir : str, optional Directory in which to create the ``aedb`` folder. The name given to the AEDB file is the same as the name of the board file. anstranslator_full_path : str, optional @@ -1510,6 +1510,13 @@ def import_gds_file( else: return False else: + if anstranslator_full_path and os.path.exists(anstranslator_full_path): + path = anstranslator_full_path + else: + path = os.path.join(self.base_path, "anstranslator") + if is_windows: + path += ".exe" + temp_map_file = os.path.splitext(inputGDS)[0] + ".map" temp_layermap_file = os.path.splitext(inputGDS)[0] + ".layermap" diff --git a/src/pyedb/dotnet/edb_core/edb_data/control_file.py b/src/pyedb/dotnet/edb_core/edb_data/control_file.py index 076b85f575..f330394ec0 100644 --- a/src/pyedb/dotnet/edb_core/edb_data/control_file.py +++ b/src/pyedb/dotnet/edb_core/edb_data/control_file.py @@ -964,14 +964,14 @@ def _write_xml(self, root): class ControlFileSetup: """Setup Class.""" - def __init__(self, name): + def __init__(self, name, adapt_freq="1GHz", maxdelta=0.02, maxpasses=10): self.name = name self.enabled = True self.save_fields = False self.save_rad_fields = False - self.frequency = "1GHz" - self.maxpasses = 10 - self.max_delta = 0.02 + self.frequency = adapt_freq + self.maxpasses = maxpasses + self.max_delta = maxdelta self.union_polygons = True self.small_voids_area = 0 self.mode_type = "IC" @@ -1082,7 +1082,7 @@ class ControlFileSetups: def __init__(self): self.setups = [] - def add_setup(self, name, frequency): + def add_setup(self, name, adapt_freq, maxdelta, maxpasses): """Add a new setup Parameters @@ -1096,8 +1096,25 @@ def add_setup(self, name, frequency): ------- :class:`pyedb.dotnet.edb_core.edb_data.control_file.ControlFileSetup` """ - setup = ControlFileSetup(name) - setup.frequency = frequency + setup = ControlFileSetup(name, adapt_freq, maxdelta, maxpasses) + self.setups.append(setup) + return setup + + def output_variables(self, name, adapt_freq, maxdelta, maxpasses): + """Add a output variable + + Parameters + ---------- + name : str + Setup name. + frequency : str + Setup Frequency. + + Returns + ------- + :class:`pyedb.dotnet.edb_core.edb_data.control_file.ControlFileSetup` + """ + setup = ControlFileSetup(name, adapt_freq, maxdelta, maxpasses) self.setups.append(setup) return setup @@ -1112,17 +1129,17 @@ class ControlFile: def __init__(self, xml_input=None, tecnhology=None, layer_map=None): self.stackup = ControlFileStackup() + self.boundaries = ControlFileBoundaries() + self.setups = ControlFileSetups() if xml_input: self.parse_xml(xml_input) if tecnhology: self.parse_technology(tecnhology) if layer_map: self.parse_layer_map(layer_map) - self.boundaries = ControlFileBoundaries() self.remove_holes = False self.remove_holes_area_minimum = 30 self.remove_holes_units = "um" - self.setups = ControlFileSetups() self.components = ControlFileComponents() self.import_options = ControlFileImportOptions() pass @@ -1262,6 +1279,42 @@ def parse_xml(self, xml_input): via.remove_unconnected = ( True if i.attrib["RemoveUnconnected"] == "true" else False ) + if el.tag == "Boundaries": + for port_el in el: + if port_el.tag == "CircuitPortPt": + self.boundaries.add_port( + name=port_el.attrib["Name"], + x1=port_el.attrib["x1"], + y1=port_el.attrib["y1"], + layer1=port_el.attrib["Layer1"], + x2=port_el.attrib["x2"], + y2=port_el.attrib["y2"], + layer2=port_el.attrib["Layer2"], + z0=port_el.attrib["Z0"], + ) + if el.tag == "SimulationSetups": + for setup_el in el: + if setup_el.tag == "HFSSSetup": + if "Name" in setup_el.attrib: + name = setup_el.attrib["Name"] + for hfsssettings_el in setup_el: + if hfsssettings_el.tag == "HFSSSimulationSettings": + for hfssadaptsettings_el in hfsssettings_el: + if hfssadaptsettings_el.tag == "HFSSAdaptiveSettings": + for adaptsettings_el in hfssadaptsettings_el: + if adaptsettings_el.tag == "AdaptiveSettings": + for singlefreqdatalist in adaptsettings_el: + if singlefreqdatalist.tag == "SingleFrequencyDataList": + for adaptfreqdata in singlefreqdatalist: + if adaptfreqdata.tag == "AdaptiveFrequencyData": + for adaptfreqdata_el in adaptfreqdata: + if adaptfreqdata_el.tag == "AdaptiveFrequency": + adapt_freq = adaptfreqdata_el.text + elif adaptfreqdata_el.tag == "MaxDelta": + maxdelta = adaptfreqdata_el.text + elif adaptfreqdata_el.tag == "MaxPasses": + maxpasses = adaptfreqdata_el.text + self.setups.add_setup(name, adapt_freq, maxdelta, maxpasses) return True def write_xml(self, xml_output): @@ -1278,8 +1331,7 @@ def write_xml(self, xml_output): """ control = ET.Element("{http://www.ansys.com/control}Control", attrib={"schemaVersion": "1.0"}) self.stackup._write_xml(control) - if self.boundaries.ports or self.boundaries.extents: - self.boundaries._write_xml(control) + self.boundaries._write_xml(control) if self.remove_holes: hole = ET.SubElement(control, "RemoveHoles") hole.set("HoleAreaMinimum", str(self.remove_holes_area_minimum)) From 9ef9ade999a5606bd6ca5f073563cd4ff5917964 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Thu, 23 Jan 2025 15:24:16 +0200 Subject: [PATCH 03/10] import_gdss --- src/pyedb/dotnet/edb.py | 4 ++-- .../dotnet/edb_core/edb_data/control_file.py | 18 ------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/src/pyedb/dotnet/edb.py b/src/pyedb/dotnet/edb.py index ed3b619397..782796009b 100644 --- a/src/pyedb/dotnet/edb.py +++ b/src/pyedb/dotnet/edb.py @@ -1536,10 +1536,10 @@ def import_gds_file( else: self.logger.error("Unable to define control file.") - command = [anstranslator_full_path, inputGDS, f'-g="{map_file}"', f'-c="{control_file}"'] + command = [path, inputGDS, f'-g="{map_file}"', f'-c="{control_file}"'] else: command = [ - anstranslator_full_path, + path, inputGDS, f'-o="{control_file_temp}"' f'-t="{tech_file}"', f'-g="{map_file}"', diff --git a/src/pyedb/dotnet/edb_core/edb_data/control_file.py b/src/pyedb/dotnet/edb_core/edb_data/control_file.py index f330394ec0..14ed95ed1e 100644 --- a/src/pyedb/dotnet/edb_core/edb_data/control_file.py +++ b/src/pyedb/dotnet/edb_core/edb_data/control_file.py @@ -1100,24 +1100,6 @@ def add_setup(self, name, adapt_freq, maxdelta, maxpasses): self.setups.append(setup) return setup - def output_variables(self, name, adapt_freq, maxdelta, maxpasses): - """Add a output variable - - Parameters - ---------- - name : str - Setup name. - frequency : str - Setup Frequency. - - Returns - ------- - :class:`pyedb.dotnet.edb_core.edb_data.control_file.ControlFileSetup` - """ - setup = ControlFileSetup(name, adapt_freq, maxdelta, maxpasses) - self.setups.append(setup) - return setup - def _write_xml(self, root): content = ET.SubElement(root, "SimulationSetups") for setup in self.setups: From 42313333acdf42a164ee8d690f85264da715b74c Mon Sep 17 00:00:00 2001 From: gkorompi Date: Thu, 23 Jan 2025 17:01:15 +0200 Subject: [PATCH 04/10] import_gdsss --- tests/legacy/system/test_edb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/legacy/system/test_edb.py b/tests/legacy/system/test_edb.py index 211440484d..d7c78fa1de 100644 --- a/tests/legacy/system/test_edb.py +++ b/tests/legacy/system/test_edb.py @@ -1341,7 +1341,7 @@ def test_import_gds_from_tech(self): self.local_scratch.copyfile(gds_in, gds_out) c = ControlFile(c_file_in, layer_map=c_map) - setup = c.setups.add_setup("Setup1", "1GHz") + setup = c.setups.add_setup("Setup1", "1GHz", 0.02, 10) setup.add_sweep("Sweep1", "0.01GHz", "5GHz", "0.1GHz") c.boundaries.units = "um" c.stackup.units = "um" @@ -1495,7 +1495,7 @@ def test_add_layer_api_with_control_file(self): ) assert ctrl.boundaries.ports # setup using q3D for DC point - setup = ctrl.setups.add_setup("test_setup", "10GHz") + setup = ctrl.setups.add_setup("test_setup", "10GHz", 0.02, 10) assert setup setup.add_sweep( name="test_sweep", From ea268232340780e6425459cfe4705c95f959c908 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 09:50:33 +0200 Subject: [PATCH 05/10] import_gdss --- examples/legacy_standalone/10_GDS_workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/legacy_standalone/10_GDS_workflow.py b/examples/legacy_standalone/10_GDS_workflow.py index 13525ee49b..5ba2c5f900 100644 --- a/examples/legacy_standalone/10_GDS_workflow.py +++ b/examples/legacy_standalone/10_GDS_workflow.py @@ -54,7 +54,7 @@ # # This code sets up a simulation with HFSS and adds a frequency sweep. -setup = c.setups.add_setup("Setup1", "1GHz") +setup = c.setups.add_setup("Setup1", "1GHz", 0.02, 10) setup.add_sweep("Sweep1", "0.01GHz", "5GHz", "0.1GHz") # ## Provide additional stackup settings From 495af8ebeaf1c2c355c3d237876510c7088502b4 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 10:35:10 +0200 Subject: [PATCH 06/10] import_gds --- ..._fictitious_dtc_example_control_no_map.xml | 21 +++++++++++++++++++ tests/legacy/system/test_edb.py | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/tests/example_models/cad/GDS/sky130_fictitious_dtc_example_control_no_map.xml b/tests/example_models/cad/GDS/sky130_fictitious_dtc_example_control_no_map.xml index a27a8562d5..51abc4db35 100644 --- a/tests/example_models/cad/GDS/sky130_fictitious_dtc_example_control_no_map.xml +++ b/tests/example_models/cad/GDS/sky130_fictitious_dtc_example_control_no_map.xml @@ -106,4 +106,25 @@ + + + + + + + + + + + + 0.5GHz + 0.01 + 10 + + + + + + + \ No newline at end of file diff --git a/tests/legacy/system/test_edb.py b/tests/legacy/system/test_edb.py index d7c78fa1de..8c604cdf7c 100644 --- a/tests/legacy/system/test_edb.py +++ b/tests/legacy/system/test_edb.py @@ -1364,8 +1364,8 @@ def test_import_gds_from_tech(self): ) assert edb - assert "P1" in edb.excitations - assert "Setup1" in edb.setups + assert "P1" and "P2" in edb.excitations + assert "Setup1" and "Setup Test" in edb.setups assert "B1" in edb.components.instances edb.close() From f373e33030dda54b2c62301277551ec08ab04734 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 10:43:53 +0200 Subject: [PATCH 07/10] import_gds --- src/pyedb/dotnet/edb_core/edb_data/control_file.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/edb_data/control_file.py b/src/pyedb/dotnet/edb_core/edb_data/control_file.py index 14ed95ed1e..34c8259c55 100644 --- a/src/pyedb/dotnet/edb_core/edb_data/control_file.py +++ b/src/pyedb/dotnet/edb_core/edb_data/control_file.py @@ -1088,9 +1088,13 @@ def add_setup(self, name, adapt_freq, maxdelta, maxpasses): Parameters ---------- name : str - Setup name. - frequency : str + Setup Name. + adapt_freq : str Setup Frequency. + maxdelta : float + Maximum Delta. + maxdelta : int + Maximum Number of Passes. Returns ------- From 4335894e3f8d4c4c4bd6d043ebc21f10195a5ab1 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 10:44:09 +0200 Subject: [PATCH 08/10] import_gds --- src/pyedb/dotnet/edb_core/edb_data/control_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyedb/dotnet/edb_core/edb_data/control_file.py b/src/pyedb/dotnet/edb_core/edb_data/control_file.py index 34c8259c55..c0ca1b9574 100644 --- a/src/pyedb/dotnet/edb_core/edb_data/control_file.py +++ b/src/pyedb/dotnet/edb_core/edb_data/control_file.py @@ -1093,7 +1093,7 @@ def add_setup(self, name, adapt_freq, maxdelta, maxpasses): Setup Frequency. maxdelta : float Maximum Delta. - maxdelta : int + maxpasses : int Maximum Number of Passes. Returns From 204c57143226a758c3018fb4efcd3174cf7c00d3 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 14:20:47 +0200 Subject: [PATCH 09/10] import_gds --- .../dotnet/edb_core/edb_data/control_file.py | 61 +++++++++++-------- tests/legacy/system/test_edb.py | 2 +- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/pyedb/dotnet/edb_core/edb_data/control_file.py b/src/pyedb/dotnet/edb_core/edb_data/control_file.py index c0ca1b9574..3d3e191aec 100644 --- a/src/pyedb/dotnet/edb_core/edb_data/control_file.py +++ b/src/pyedb/dotnet/edb_core/edb_data/control_file.py @@ -25,6 +25,7 @@ import re import subprocess import sys +import xml from pyedb.edb_logger import pyedb_logger from pyedb.generic.general_methods import ET, env_path, env_value, is_linux @@ -1089,11 +1090,11 @@ def add_setup(self, name, adapt_freq, maxdelta, maxpasses): ---------- name : str Setup Name. - adapt_freq : str + adapt_freq : str, optional Setup Frequency. - maxdelta : float + maxdelta : float, optional Maximum Delta. - maxpasses : int + maxpasses : int, optional Maximum Number of Passes. Returns @@ -1278,29 +1279,37 @@ def parse_xml(self, xml_input): layer2=port_el.attrib["Layer2"], z0=port_el.attrib["Z0"], ) - if el.tag == "SimulationSetups": - for setup_el in el: - if setup_el.tag == "HFSSSetup": - if "Name" in setup_el.attrib: - name = setup_el.attrib["Name"] - for hfsssettings_el in setup_el: - if hfsssettings_el.tag == "HFSSSimulationSettings": - for hfssadaptsettings_el in hfsssettings_el: - if hfssadaptsettings_el.tag == "HFSSAdaptiveSettings": - for adaptsettings_el in hfssadaptsettings_el: - if adaptsettings_el.tag == "AdaptiveSettings": - for singlefreqdatalist in adaptsettings_el: - if singlefreqdatalist.tag == "SingleFrequencyDataList": - for adaptfreqdata in singlefreqdatalist: - if adaptfreqdata.tag == "AdaptiveFrequencyData": - for adaptfreqdata_el in adaptfreqdata: - if adaptfreqdata_el.tag == "AdaptiveFrequency": - adapt_freq = adaptfreqdata_el.text - elif adaptfreqdata_el.tag == "MaxDelta": - maxdelta = adaptfreqdata_el.text - elif adaptfreqdata_el.tag == "MaxPasses": - maxpasses = adaptfreqdata_el.text - self.setups.add_setup(name, adapt_freq, maxdelta, maxpasses) + setups = root.find("SimulationSetups") + if setups: + hfsssetup = setups.find("HFSSSetup") + if hfsssetup: + if "Name" in hfsssetup.attrib: + name = hfsssetup.attrib["Name"] + hfsssimset = hfsssetup.find("HFSSSimulationSettings") + if hfsssimset: + hfssadaptset = hfsssimset.find("HFSSAdaptiveSettings") + if hfssadaptset: + adaptset = hfssadaptset.find("AdaptiveSettings") + if adaptset: + singlefreqdatalist = adaptset.find("SingleFrequencyDataList") + if singlefreqdatalist: + adaptfreqdata = singlefreqdatalist.find("AdaptiveFrequencyData") + if adaptfreqdata: + if isinstance( + adaptfreqdata.find("AdaptiveFrequency"), xml.etree.ElementTree.Element + ): + adapt_freq = adaptfreqdata.find("AdaptiveFrequency").text + else: + adapt_freq = "1GHz" + if isinstance(adaptfreqdata.find("MaxDelta"), xml.etree.ElementTree.Element): + maxdelta = adaptfreqdata.find("MaxDelta").text + else: + maxdelta = 0.02 + if isinstance(adaptfreqdata.find("MaxPasses"), xml.etree.ElementTree.Element): + maxpasses = adaptfreqdata.find("MaxPasses").text + else: + maxpasses = 10 + self.setups.add_setup(name, adapt_freq, maxdelta, maxpasses) return True def write_xml(self, xml_output): diff --git a/tests/legacy/system/test_edb.py b/tests/legacy/system/test_edb.py index 8c604cdf7c..f9ed57ce84 100644 --- a/tests/legacy/system/test_edb.py +++ b/tests/legacy/system/test_edb.py @@ -1341,7 +1341,7 @@ def test_import_gds_from_tech(self): self.local_scratch.copyfile(gds_in, gds_out) c = ControlFile(c_file_in, layer_map=c_map) - setup = c.setups.add_setup("Setup1", "1GHz", 0.02, 10) + setup = c.setups.add_setup("Setup1", "1GHz", 0.02) setup.add_sweep("Sweep1", "0.01GHz", "5GHz", "0.1GHz") c.boundaries.units = "um" c.stackup.units = "um" From b39f5087e85008d2c802a5de6c1b073533331e29 Mon Sep 17 00:00:00 2001 From: gkorompi Date: Fri, 24 Jan 2025 15:14:38 +0200 Subject: [PATCH 10/10] import_gds --- tests/legacy/system/test_edb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/legacy/system/test_edb.py b/tests/legacy/system/test_edb.py index f9ed57ce84..8c604cdf7c 100644 --- a/tests/legacy/system/test_edb.py +++ b/tests/legacy/system/test_edb.py @@ -1341,7 +1341,7 @@ def test_import_gds_from_tech(self): self.local_scratch.copyfile(gds_in, gds_out) c = ControlFile(c_file_in, layer_map=c_map) - setup = c.setups.add_setup("Setup1", "1GHz", 0.02) + setup = c.setups.add_setup("Setup1", "1GHz", 0.02, 10) setup.add_sweep("Sweep1", "0.01GHz", "5GHz", "0.1GHz") c.boundaries.units = "um" c.stackup.units = "um"