gsim 0.0.2__tar.gz → 0.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {gsim-0.0.2 → gsim-0.0.4}/PKG-INFO +7 -6
  2. {gsim-0.0.2 → gsim-0.0.4}/README.md +1 -1
  3. {gsim-0.0.2 → gsim-0.0.4}/pyproject.toml +17 -10
  4. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/__init__.py +1 -1
  5. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/__init__.py +9 -13
  6. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/stack/extractor.py +4 -4
  7. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/stack/materials.py +2 -2
  8. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/stack/visualization.py +3 -3
  9. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/gcloud.py +80 -25
  10. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/__init__.py +53 -64
  11. gsim-0.0.4/src/gsim/palace/base.py +373 -0
  12. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/driven.py +26 -302
  13. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/eigenmode.py +44 -264
  14. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/electrostatic.py +35 -259
  15. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/mesh/__init__.py +13 -1
  16. gsim-0.0.4/src/gsim/palace/mesh/config_generator.py +367 -0
  17. gsim-0.0.4/src/gsim/palace/mesh/generator.py +278 -0
  18. gsim-0.0.4/src/gsim/palace/mesh/geometry.py +472 -0
  19. gsim-0.0.4/src/gsim/palace/mesh/groups.py +170 -0
  20. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/__init__.py +8 -15
  21. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/mesh.py +9 -9
  22. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/numerical.py +9 -9
  23. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/ports.py +4 -5
  24. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/problems.py +1 -1
  25. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/results.py +5 -4
  26. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/viz.py +9 -6
  27. {gsim-0.0.2 → gsim-0.0.4}/src/gsim.egg-info/PKG-INFO +7 -6
  28. {gsim-0.0.2 → gsim-0.0.4}/src/gsim.egg-info/SOURCES.txt +3 -0
  29. {gsim-0.0.2 → gsim-0.0.4}/src/gsim.egg-info/requires.txt +3 -1
  30. gsim-0.0.2/src/gsim/palace/base.py +0 -68
  31. gsim-0.0.2/src/gsim/palace/mesh/generator.py +0 -1137
  32. {gsim-0.0.2 → gsim-0.0.4}/setup.cfg +0 -0
  33. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/geometry.py +0 -0
  34. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/common/stack/__init__.py +0 -0
  35. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/mesh/gmsh_utils.py +0 -0
  36. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/mesh/pipeline.py +0 -0
  37. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/geometry.py +0 -0
  38. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/models/stack.py +0 -0
  39. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/ports/__init__.py +0 -0
  40. {gsim-0.0.2 → gsim-0.0.4}/src/gsim/palace/ports/config.py +0 -0
  41. {gsim-0.0.2 → gsim-0.0.4}/src/gsim.egg-info/dependency_links.txt +0 -0
  42. {gsim-0.0.2 → gsim-0.0.4}/src/gsim.egg-info/top_level.txt +0 -0
  43. {gsim-0.0.2 → gsim-0.0.4}/tests/test_gsim.py +0 -0
@@ -1,19 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gsim
3
- Version: 0.0.2
4
- Author-email: flaport <floris.laporte@gmail.com>
3
+ Version: 0.0.4
4
+ Author-email: GDSFactory <contact@gdsfactory.com>
5
5
  Classifier: Programming Language :: Python :: 3.12
6
- Classifier: Programming Language :: Python :: 3.13
7
6
  Classifier: Operating System :: OS Independent
8
- Requires-Python: <3.14,>=3.12
7
+ Requires-Python: ~=3.12.0
9
8
  Description-Content-Type: text/markdown
10
9
  Requires-Dist: gdsfactory>=9.32.0
11
- Requires-Dist: gdsfactoryplus>=1.3.7
10
+ Requires-Dist: gdsfactoryplus>=1.4.0
12
11
  Requires-Dist: gmsh
13
12
  Requires-Dist: meshio>=5.0.0
14
13
  Requires-Dist: plotly
15
14
  Requires-Dist: pydantic>=2.10.6
16
15
  Requires-Dist: pyvista>=0.43.0
16
+ Requires-Dist: trame-vtk
17
+ Requires-Dist: trame-vuetify
17
18
  Provides-Extra: dev
18
19
  Requires-Dist: altair>=5.5.0; extra == "dev"
19
20
  Requires-Dist: build>=1.2.0; extra == "dev"
@@ -46,7 +47,7 @@ Requires-Dist: ty>=0.0.13; extra == "dev"
46
47
  Provides-Extra: docs
47
48
  Requires-Dist: ihp-gdsfactory>=0.1.4; extra == "docs"
48
49
 
49
- # Gsim 0.0.2
50
+ # Gsim 0.0.4
50
51
 
51
52
  > a GDSFactory Simulation Plugin
52
53
 
@@ -1,4 +1,4 @@
1
- # Gsim 0.0.2
1
+ # Gsim 0.0.4
2
2
 
3
3
  > a GDSFactory Simulation Plugin
4
4
 
@@ -3,26 +3,27 @@ build-backend = "setuptools.build_meta"
3
3
  requires = ["setuptools>=61", "uv", "build", "wheel"]
4
4
 
5
5
  [project]
6
- authors = [{name = "flaport", email = "floris.laporte@gmail.com"}]
6
+ authors = [{name = "GDSFactory", email = "contact@gdsfactory.com"}]
7
7
  classifiers = [
8
8
  "Programming Language :: Python :: 3.12",
9
- "Programming Language :: Python :: 3.13",
10
9
  "Operating System :: OS Independent"
11
10
  ]
12
11
  dependencies = [
13
12
  "gdsfactory>=9.32.0",
14
- "gdsfactoryplus>=1.3.7",
13
+ "gdsfactoryplus>=1.4.0",
15
14
  "gmsh",
16
15
  "meshio>=5.0.0",
17
16
  "plotly",
18
17
  "pydantic>=2.10.6",
19
- "pyvista>=0.43.0"
18
+ "pyvista>=0.43.0",
19
+ "trame-vtk",
20
+ "trame-vuetify"
20
21
  ]
21
22
  description = ""
22
23
  name = "gsim"
23
24
  readme = "README.md"
24
- requires-python = ">=3.12,<3.14"
25
- version = "0.0.2"
25
+ requires-python = "~=3.12.0"
26
+ version = "0.0.4"
26
27
 
27
28
  [project.optional-dependencies]
28
29
  dev = [
@@ -56,12 +57,9 @@ dev = [
56
57
  "ty>=0.0.13"
57
58
  ]
58
59
  docs = [
59
- "ihp-gdsfactory>=0.1.4",
60
+ "ihp-gdsfactory>=0.1.4"
60
61
  ]
61
62
 
62
- [tool.bver.git]
63
- commit-template = "Release {new-version}"
64
-
65
63
  [[tool.bver.file]]
66
64
  src = "README.md"
67
65
 
@@ -71,6 +69,9 @@ src = "pyproject.toml"
71
69
  [[tool.bver.file]]
72
70
  src = "src/gsim/__init__.py"
73
71
 
72
+ [tool.bver.git]
73
+ commit-template = "Release {new-version}"
74
+
74
75
  [tool.mypy]
75
76
  mypy_path = ["src"]
76
77
  python_version = "3.12"
@@ -166,6 +167,7 @@ ignore = [
166
167
  "TC001", # typing-only-first-party-import
167
168
  "TC002", # typing-only-third-party-import
168
169
  "TC003", # typing-only-standard-library-import
170
+ "PLC0415", # import-outside-top-level (needed for lazy imports to avoid circular deps)
169
171
  "TC006", # runtime-cast-value
170
172
  "TD001", # invalid-todo-tag
171
173
  "TD002", # missing-todo-author
@@ -191,6 +193,11 @@ select = ["ALL"]
191
193
  "SLF001", # private-member-access
192
194
  "T201" # print
193
195
  ]
196
+ "docs/hooks.py" = [
197
+ "ARG001", # unused-function-argument (MkDocs hooks require specific signatures)
198
+ "INP001", # implicit-namespace-package
199
+ "PERF401" # use-list-extend (keeping for readability)
200
+ ]
194
201
  "scripts/*.py" = [
195
202
  "ANN", # flake8-annotations
196
203
  "ARG001", # unused-function-argument
@@ -9,7 +9,7 @@ Currently includes:
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
- __version__ = "0.0.2"
12
+ __version__ = "0.0.4"
13
13
 
14
14
  __all__ = [
15
15
  "__version__",
@@ -35,27 +35,23 @@ from gsim.common.stack import (
35
35
  Stack = LayerStack
36
36
 
37
37
  __all__ = [
38
- # Geometry
38
+ "MATERIALS_DB",
39
39
  "Geometry",
40
- # Stack (LayerStack is the primary name, Stack is an alias)
40
+ "Layer",
41
41
  "LayerStack",
42
+ "MaterialProperties",
42
43
  "Stack",
43
- "Layer",
44
44
  "StackLayer",
45
45
  "ValidationResult",
46
- # Stack functions
47
- "get_stack",
48
- "load_stack_yaml",
49
46
  "extract_from_pdk",
50
47
  "extract_layer_stack",
51
- "parse_layer_stack",
52
- "print_stack",
53
- "print_stack_table",
54
- "plot_stack",
55
- # Materials
56
- "MATERIALS_DB",
57
- "MaterialProperties",
58
48
  "get_material_properties",
49
+ "get_stack",
50
+ "load_stack_yaml",
59
51
  "material_is_conductor",
60
52
  "material_is_dielectric",
53
+ "parse_layer_stack",
54
+ "plot_stack",
55
+ "print_stack",
56
+ "print_stack_table",
61
57
  ]
@@ -288,7 +288,7 @@ def _get_gds_layer_tuple(layer_level: LayerLevel) -> tuple[int, int]:
288
288
  if hasattr(layer, "layer"):
289
289
  inner = layer.layer
290
290
  if hasattr(inner, "layer") and hasattr(inner, "datatype"):
291
- return (int(inner.layer), int(inner.datatype))
291
+ return (int(inner.layer), int(inner.datatype)) # type: ignore[arg-type]
292
292
  if isinstance(inner, int):
293
293
  datatype = getattr(layer, "datatype", 0)
294
294
  return (int(inner), int(datatype) if datatype else 0)
@@ -299,11 +299,11 @@ def _get_gds_layer_tuple(layer_level: LayerLevel) -> tuple[int, int]:
299
299
  return (int(innermost), int(datatype) if datatype else 0)
300
300
 
301
301
  if hasattr(layer, "layer") and hasattr(layer, "datatype"):
302
- return (int(layer.layer), int(layer.datatype))
302
+ return (int(layer.layer), int(layer.datatype)) # type: ignore[arg-type]
303
303
 
304
304
  if hasattr(layer, "value"):
305
305
  if isinstance(layer.value, tuple):
306
- return (int(layer.value[0]), int(layer.value[1]))
306
+ return (int(layer.value[0]), int(layer.value[1])) # type: ignore[arg-type]
307
307
  if isinstance(layer.value, int):
308
308
  return (int(layer.value), 0)
309
309
 
@@ -314,7 +314,7 @@ def _get_gds_layer_tuple(layer_level: LayerLevel) -> tuple[int, int]:
314
314
  return (0, 0)
315
315
 
316
316
  try:
317
- return (int(layer), 0)
317
+ return (int(layer), 0) # type: ignore[arg-type]
318
318
  except (TypeError, ValueError):
319
319
  logger.warning("Could not parse layer %s, using (0, 0)", layer)
320
320
  return (0, 0)
@@ -33,14 +33,14 @@ class MaterialProperties(BaseModel):
33
33
  return d
34
34
 
35
35
  @classmethod
36
- def conductor(cls, conductivity: float = 5.8e7) -> "MaterialProperties":
36
+ def conductor(cls, conductivity: float = 5.8e7) -> MaterialProperties:
37
37
  """Create a conductor material."""
38
38
  return cls(type="conductor", conductivity=conductivity)
39
39
 
40
40
  @classmethod
41
41
  def dielectric(
42
42
  cls, permittivity: float, loss_tangent: float = 0.0
43
- ) -> "MaterialProperties":
43
+ ) -> MaterialProperties:
44
44
  """Create a dielectric material."""
45
45
  return cls(
46
46
  type="dielectric", permittivity=permittivity, loss_tangent=loss_tangent
@@ -43,15 +43,15 @@ def _get_gds_layer_number(layer_level: LayerLevel) -> int | None:
43
43
  if hasattr(layer, "layer"):
44
44
  inner = layer.layer
45
45
  if hasattr(inner, "layer"):
46
- return int(inner.layer)
46
+ return int(inner.layer) # type: ignore[arg-type]
47
47
  if isinstance(inner, int):
48
48
  return int(inner)
49
49
 
50
50
  # Handle enum with value
51
51
  if hasattr(layer, "value"):
52
52
  if isinstance(layer.value, tuple):
53
- return int(layer.value[0])
54
- return int(layer.value)
53
+ return int(layer.value[0]) # type: ignore[arg-type]
54
+ return int(layer.value) # type: ignore[arg-type]
55
55
 
56
56
  return None
57
57
 
@@ -16,17 +16,74 @@ Usage:
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- import zipfile
20
19
  from pathlib import Path
21
20
  from typing import TYPE_CHECKING
22
21
 
23
- from gdsfactoryplus import sim # type: ignore[import-untyped]
22
+ from gdsfactoryplus import sim
24
23
 
25
24
  if TYPE_CHECKING:
26
25
  from collections.abc import Callable
27
26
  from typing import Literal
28
27
 
29
28
 
29
+ def _handle_failed_job(job, output_dir: Path, verbose: bool) -> None:
30
+ """Handle a failed simulation job by downloading logs and raising informative error.
31
+
32
+ Args:
33
+ job: The finished Job object with non-zero exit code
34
+ output_dir: Directory to download logs to
35
+ verbose: Whether to print progress
36
+
37
+ Raises:
38
+ RuntimeError: Always raised with detailed error information
39
+ """
40
+ error_parts = [
41
+ f"Simulation failed with exit code {job.exit_code}",
42
+ f"Status: {job.status.value}",
43
+ ]
44
+
45
+ if job.status_reason:
46
+ error_parts.append(f"Reason: {job.status_reason}")
47
+ if job.detail_reason:
48
+ error_parts.append(f"Details: {job.detail_reason}")
49
+
50
+ # Try to download logs even though job failed
51
+ try:
52
+ if job.download_urls:
53
+ if verbose:
54
+ print("Downloading logs from failed job...") # noqa: T201
55
+
56
+ raw_results = sim.download_results(job, output_dir=output_dir)
57
+
58
+ # Flatten results to find all files
59
+ all_files: dict[str, Path] = {}
60
+ for result_path in raw_results.values():
61
+ if result_path.is_dir():
62
+ for file_path in result_path.rglob("*"):
63
+ if file_path.is_file() and not file_path.name.startswith("."):
64
+ all_files[file_path.name] = file_path
65
+ else:
66
+ all_files[result_path.name] = result_path
67
+
68
+ # Look for log files and display them
69
+ log_files = ["palace.log", "stdout.log", "stderr.log", "output.log"]
70
+ for log_name in log_files:
71
+ if log_name in all_files:
72
+ content = all_files[log_name].read_text()
73
+ error_parts.append(f"\n--- {log_name} (last 100 lines) ---")
74
+ lines = content.strip().split("\n")
75
+ error_parts.append("\n".join(lines[-100:]))
76
+ break
77
+
78
+ if verbose and all_files:
79
+ print(f"Logs downloaded to {output_dir}") # noqa: T201
80
+
81
+ except Exception as e:
82
+ error_parts.append(f"(Failed to download logs: {e})")
83
+
84
+ raise RuntimeError("\n".join(error_parts))
85
+
86
+
30
87
  def _get_job_definition(job_type: str):
31
88
  """Get JobDefinition enum value by name."""
32
89
  job_type_upper = job_type.upper()
@@ -37,7 +94,7 @@ def _get_job_definition(job_type: str):
37
94
 
38
95
 
39
96
  def upload_simulation_dir(input_dir: str | Path, job_type: str):
40
- """Zip all files in a directory and upload for simulation.
97
+ """Upload a simulation directory for cloud execution.
41
98
 
42
99
  Args:
43
100
  input_dir: Directory containing simulation files
@@ -47,21 +104,8 @@ def upload_simulation_dir(input_dir: str | Path, job_type: str):
47
104
  PreJob object from gdsfactoryplus
48
105
  """
49
106
  input_dir = Path(input_dir)
50
- zip_path = Path("_gsim_upload.zip")
51
-
52
- try:
53
- with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_STORED) as zf:
54
- for file in input_dir.rglob("*"):
55
- if file.is_file():
56
- zf.write(file, arcname=file.relative_to(input_dir))
57
-
58
- job_definition = _get_job_definition(job_type)
59
- pre_job = sim.upload_simulation(path=zip_path, job_definition=job_definition)
60
- finally:
61
- if zip_path.exists():
62
- zip_path.unlink()
63
-
64
- return pre_job
107
+ job_definition = _get_job_definition(job_type)
108
+ return sim.upload_simulation(path=input_dir, job_definition=job_definition)
65
109
 
66
110
 
67
111
  def run_simulation(
@@ -125,18 +169,29 @@ def run_simulation(
125
169
 
126
170
  # Check status
127
171
  if finished_job.exit_code != 0:
128
- raise RuntimeError(
129
- f"Simulation failed with exit code {finished_job.exit_code}. "
130
- f"Status: {finished_job.status.value}"
131
- )
172
+ _handle_failed_job(finished_job, output_dir, verbose)
132
173
 
133
174
  # Download
134
- results = sim.download_results(finished_job)
175
+ raw_results = sim.download_results(
176
+ finished_job, output_dir=f"sim-data-{finished_job.job_name}"
177
+ )
178
+
179
+ # Flatten results: gdsfactoryplus returns extracted directories,
180
+ # but we want a dict of filename -> Path for individual files
181
+ results: dict[str, Path] = {}
182
+ for result_path in raw_results.values():
183
+ if result_path.is_dir():
184
+ # Recursively find all files in the extracted directory
185
+ for file_path in result_path.rglob("*"):
186
+ if file_path.is_file() and not file_path.name.startswith("."):
187
+ results[file_path.name] = file_path
188
+ else:
189
+ results[result_path.name] = result_path
135
190
 
136
191
  if verbose and results:
192
+ # Find common parent directory for display
137
193
  first_path = next(iter(results.values()))
138
- download_dir = first_path.parent
139
- print(f"Downloaded {len(results)} files to {download_dir}") # noqa: T201
194
+ print(f"Downloaded {len(results)} files to {first_path.parent}") # noqa: T201
140
195
 
141
196
  return results
142
197
 
@@ -29,12 +29,30 @@ from __future__ import annotations
29
29
 
30
30
  from functools import partial
31
31
 
32
- from gsim.gcloud import print_job_summary
33
- from gsim.gcloud import run_simulation as _run_simulation
34
-
35
32
  # Common components (shared with FDTD)
36
33
  from gsim.common import Geometry, LayerStack, Stack
37
34
 
35
+ # Stack utilities (from common, shared with FDTD)
36
+ from gsim.common.stack import (
37
+ MATERIALS_DB,
38
+ Layer,
39
+ MaterialProperties,
40
+ StackLayer,
41
+ extract_from_pdk,
42
+ extract_layer_stack,
43
+ get_material_properties,
44
+ get_stack,
45
+ load_stack_yaml,
46
+ material_is_conductor,
47
+ material_is_dielectric,
48
+ parse_layer_stack,
49
+ plot_stack,
50
+ print_stack,
51
+ print_stack_table,
52
+ )
53
+ from gsim.gcloud import print_job_summary
54
+ from gsim.gcloud import run_simulation as _run_simulation
55
+
38
56
  # New simulation classes (composition, no inheritance)
39
57
  from gsim.palace.driven import DrivenSim
40
58
  from gsim.palace.eigenmode import EigenmodeSim
@@ -58,7 +76,6 @@ from gsim.palace.models import (
58
76
  GeometryConfig,
59
77
  MagnetostaticConfig,
60
78
  MaterialConfig,
61
- MeshConfig as MeshConfigModel,
62
79
  NumericalConfig,
63
80
  PortConfig,
64
81
  SimulationResult,
@@ -67,6 +84,9 @@ from gsim.palace.models import (
67
84
  ValidationResult,
68
85
  WavePortConfig,
69
86
  )
87
+ from gsim.palace.models import (
88
+ MeshConfig as MeshConfigModel,
89
+ )
70
90
 
71
91
  # Port utilities
72
92
  from gsim.palace.ports import (
@@ -79,91 +99,60 @@ from gsim.palace.ports import (
79
99
  extract_ports,
80
100
  )
81
101
 
82
- # Stack utilities (from common, shared with FDTD)
83
- from gsim.common.stack import (
84
- MATERIALS_DB,
85
- Layer,
86
- LayerStack,
87
- MaterialProperties,
88
- StackLayer,
89
- ValidationResult as StackValidationResult,
90
- extract_from_pdk,
91
- extract_layer_stack,
92
- get_material_properties,
93
- get_stack,
94
- load_stack_yaml,
95
- material_is_conductor,
96
- material_is_dielectric,
97
- parse_layer_stack,
98
- plot_stack,
99
- print_stack,
100
- print_stack_table,
101
- )
102
-
103
102
  # Visualization
104
103
  from gsim.viz import plot_mesh
105
104
 
106
-
107
105
  __all__ = [
108
- # Primary simulation classes (new API)
106
+ "MATERIALS_DB",
107
+ "CPWPortConfig",
108
+ "DrivenConfig",
109
109
  "DrivenSim",
110
+ "EigenmodeConfig",
110
111
  "EigenmodeSim",
112
+ "ElectrostaticConfig",
111
113
  "ElectrostaticSim",
112
- # Common components (shared with FDTD)
113
114
  "Geometry",
114
- "Stack",
115
- # Problem configs
116
- "DrivenConfig",
117
- "EigenmodeConfig",
118
- "ElectrostaticConfig",
119
- "MagnetostaticConfig",
120
- "TransientConfig",
121
- # Port configs
122
- "CPWPortConfig",
123
- "PortConfig",
124
- "TerminalConfig",
125
- "WavePortConfig",
126
- # Other configs
127
115
  "GeometryConfig",
116
+ "GroundPlane",
117
+ "Layer",
118
+ "LayerStack",
119
+ "MagnetostaticConfig",
128
120
  "MaterialConfig",
121
+ "MaterialProperties",
122
+ "MeshConfig",
129
123
  "MeshConfigModel",
124
+ "MeshPreset",
125
+ "MeshResult",
130
126
  "NumericalConfig",
127
+ "PalacePort",
128
+ "PortConfig",
129
+ "PortGeometry",
130
+ "PortType",
131
131
  "SimulationResult",
132
+ "Stack",
133
+ "StackLayer",
134
+ "TerminalConfig",
135
+ "TransientConfig",
132
136
  "ValidationResult",
133
- # Stack utilities
134
- "MATERIALS_DB",
135
- "Layer",
136
- "LayerStack",
137
- "MaterialProperties",
137
+ "WavePortConfig",
138
+ "configure_cpw_port",
139
+ "configure_inplane_port",
140
+ "configure_via_port",
138
141
  "extract_from_pdk",
139
142
  "extract_layer_stack",
143
+ "extract_ports",
144
+ "generate_mesh",
140
145
  "get_material_properties",
141
146
  "get_stack",
142
147
  "load_stack_yaml",
143
148
  "material_is_conductor",
144
149
  "material_is_dielectric",
145
150
  "parse_layer_stack",
151
+ "plot_mesh",
146
152
  "plot_stack",
153
+ "print_job_summary",
147
154
  "print_stack",
148
155
  "print_stack_table",
149
- # Mesh utilities
150
- "GroundPlane",
151
- "MeshConfig",
152
- "MeshPreset",
153
- "MeshResult",
154
- "generate_mesh",
155
- "plot_mesh",
156
- # Port utilities
157
- "PalacePort",
158
- "PortGeometry",
159
- "PortType",
160
- "StackLayer",
161
- "configure_cpw_port",
162
- "configure_inplane_port",
163
- "configure_via_port",
164
- "extract_ports",
165
- # Cloud
166
- "print_job_summary",
167
156
  "run_simulation",
168
157
  ]
169
158