Skip to content

Changelog

Added

Changed

  • abstract.fiber is one component stepped in sections, instead of a chain of single-section components, and its default max_phase is 0.15: nonlinear spans run 2 to 5 times faster and are more accurate.
  • The default max_phase of AnalyticWaveguideTimeStepper and AnalyticWaveguideModel.nonlinear is 0.15, up from 0.05: nonlinear waveguides need about three times fewer sections for a smaller error.
  • The black_box_component of each model draws the model’s schematic symbol in a box with the model type below it, as the abstract components do, instead of a placeholder marked “BB”.
  • A reference query in updates that selects no reference emits a RuntimeWarning, and an invalid query raises ValueError or TypeError instead of KeyError, RuntimeError or re.error.
  • Gradient evaluation with Tidy3DModel reuses structure reconstructions and permittivity samples within an evaluation, reducing repeated work for parametric components.

Fixed

Added

  • reference_chain creates a chain of connected references from a text sequence, with explicit ports, mirroring, repetition and spacers.
  • parametric.fill tiles a region with a structure or component at a fixed pitch, around keep-out layers.
  • intersects tests whether two sets of structures overlap or touch.
  • Argument min_width in parametric.transition, so that layers present on only one side of the transition do not taper down to zero width.
  • Argument verbose in live_viewer.LiveViewer to silence its messages.
  • live_viewer.LiveViewer works behind path proxies, such as code-server’s /proxy/<port>/, and accepts edits from the code-server host without extra settings.
  • Terminals can be wired into nets in the LiveViewer’s layout view, as ports are, and the Properties panel lists a cell’s models with the active one marked.

Changed

  • Breaking: target_neff in PortSpec and FiberPort defaults to None, which estimates it from the cross-section media at the solve frequencies. The port specifications in basic_technology use this new setting.
  • Ports whose specifications differ only in target_neff can be connected directly, including designs saved with the previous basic_technology.
  • Breaking: arguments of live_viewer.LiveViewer after port are keyword-only.
  • Breaking: removed the deprecated Technology.connections attribute and connections argument of Technology (use Technology.connected_layers), the arguments bend90 and bend90_cost of parametric.route_auto (use bend and bend_cost), and the from_bytes class methods of the built-in models.

Added

Changed

  • Breaking: live_viewer.LiveViewer listens on 127.0.0.1 by default. To reach it from another machine, use an SSH tunnel or the new host and allowed_hosts arguments. Creating a viewer again on the same port replaces the previous one.
  • Breaking: Abstract Components are drawn in the layout as their schematic symbols, which changes their size and port positions.
  • Faster time-domain simulations: built-in time steppers run in native code, and CircuitTimeStepper can compile circuits with numba (install the numba extra; see config.compile_circuit_time_steppers). Results can differ slightly from previous versions: loops without delay are solved with Newton’s method, and noise samples differ for the same seed.
  • PhotonForge settings are kept in tidy3d’s configuration under [plugins.photonforge], where they can be saved and overridden with TIDY3D_PLUGINS__PHOTONFORGE__<NAME> environment variables. Setting remote_logging = false there stops sending usage data (see Privacy and Usage Data).
  • SVG previews of virtual nets draw dashed lines only between members not yet connected by metal.

Fixed

  • Tidy3DModel.batch_data no longer returns an empty batch when the Tidy3D local cache is disabled or cold. Tasks without a local copy are resolved through their own ids and downloaded when the data is accessed.
  • pda.list_libraries failing for accounts with access to many projects.
  • Adding the first component to an empty PDA project.
  • Saving from the PDA GUI no longer drops a component’s own geometry, ports and models.
  • SVG previews showing the wrong geometry for different components that share a PDA id, such as two versions of one component.
  • BraggGratingModel.bragg_wavelength includes dispersion when solving the Bragg condition, and accepts an interpolated effective index without a reference frequency.
  • Dispersion in AnalyticWaveguideTimeStepper and abstract.fiber no longer attenuates signals near the edges of the simulation band.
  • Breaking: signs that did not follow the e−iωte^{-i\omega t} time convention. frequency in OpticalPulseTimeStepper placed the pulse on the wrong side of the carrier, and a positive chirp gave a down-chirp instead of an up-chirp. A positive chirp in ElectroAbsorptionModTimeStepper, AnalyticWaveguideModel and AmplitudeModTimeStepper red-shifted the rising edge; it now blue-shifts it, as datasheet values expect. Results change only for nonzero values of these arguments.
  • EMEModel failing on components with a FiberPort.
  • CircuitModel failing on unrotated references to components with a FiberPort.
  • Entries in config.default_kwargs for a parametric function, such as "bend", were passed to other functions, such as the routers, as the argument with the same name.
  • Argument turns of parametric.circular_spiral was shown with length units in parameter forms.

Added

Changed

  • Component.get_netlist lists the physical and the virtual N-way MNA nodes.
  • Conversion to SPICE raises an error on hierarchies that use terminal connections, which it cannot represent.
  • GDSII readers warn and skip on malformed data that is not geometry-related. Geometry-related errors remain fatal.

Fixed

  • Argument metal_layer of basic_technology was ignored, and its value was never validated.
  • Layer names in Technology.connections are now resolved against the technology being created or configured, instead of the default technology.
  • Call-time technology updates in Reference.update now chain to the referenced component.
  • abstract.ring_resonator now passes the complex coupling factors to its time stepper instead of magnitude only.

Changed

  • Made the new layout readers (for GDSII and OASIS files) more lenient with degenerate structures.

Added

  • Support for transformed Reference arrays (columns > 1 or rows > 1).
  • Automatic notebook updates in live_viewer.LiveViewer after successful cell execution in Jupyter notebooks/IPython.
  • Support for file attachments on individual PDA components.
  • spice module for generating SPICE models and converting components to Verilog-A. Removed in 1.5.4 in favour of TimeStepper.write_verilog_a.

Changed

  • Breaking: changed defaults on parametric.route_auto for better performance. The grid size now defaults to half the routing radius, and collision checks default to the layers used by the routed waveguide.
  • Improved accuracy for extrusions with sidewall angles.
  • Improved memory usage on GDSII and OASIS reading and writing.
  • Improved live_viewer.LiveViewer performance and responsiveness for large layouts, hierarchy filtering, and raster rendering.
  • Local mode-solving (config.use_local_mode_solver) available only when subpixel is enabled in tidy3d-extras package to guarantee accuracy.
  • Documented that DelayedTimeStepper quantizes delays down to whole time steps.

Fixed

  • PhotodiodeTimeStepper shot noise now follows the instantaneous space-charge-limited photocurrent by default, independent of the simulation time step.
  • RingTimeStepper now rejects non-unitary coupling coefficients during construction.
  • ElectricalAmplifierTimeStepper compression_power and ip3 handling to correctly apply to real tones.
  • OpticalPulseTimeStepper relative intensity noise now applies to optical power instead of field amplitude.
  • Reflection coefficient no longer ignored in OpticalPulseTimeStepper.
  • DMLaserTimeStepper relative intensity noise application independent of time step.
  • Corrected bend, S-bend, and crossing costs in parametric.route_auto, including off-grid component access, and improved 45-degree bend normalization and collision protection.
  • Improved network connection robustness for PDA.

Added

Changed

  • The default abstract.phase_modulator now includes dispersion introduced by a non-zero value of n_group, aligning it to the default behavior of other Abstract Components.
  • MuxDemuxModel now uses causal Butterworth filters with integer order and constant reflections.
  • Port names now use natural ordering across models and time steppers (P9 before P10).
  • photonforge-server --example will use the latest compatible Abstract Component Library it finds, instead of raising an error if the exact version is not found.

Fixed

  • Bug in pda.Project.add_library not working when library name is not unique.
  • Bug in pda.Project producing an error whenever a model or component schema is upgraded.
  • Bug in PDA using the wrong library name for projects that were renamed after being versioned.
  • Bug in delay buffers using the wrong value until the delay was reached, making the result of CircuitTimeStepper order-dependent in certain situations.
  • pole_residue_fit not providing a clear error or warning when the requested number of poles is above the limit in certain cases.
  • Bug in load_snp preventing files to load properly when frequency points were scaled.
  • Bug in serialization of bytes objects in phf files.
  • Model copies not including customized TimeStepper.

Added

Changed

  • More robust parametric component name hashing.
  • Changed the name of the default cladding material in basic_technology to "Palik_LowLoss" because "Palik_LossLess" is deprecated in Tidy3d.

Fixed

  • Incorrect duplicate name error when adding or updating routes in PDA projects.
  • Missing degrees to radians conversion factor in phase_bias for MZMTimeStepper.
  • Default return loss of a few Abstract Components to ensure passivity.

Added

  • Argument carrier_frequency to SMatrixTimeStepper and smarter selection of electrical or optical model when time-stepping circuits.

Changed

Fixed

  • Bug in photonforge-server preventing use of read-only libraries.

Added

Changed

  • Performance improvements in the PDA system for storing and loading large projects or libraries.

Fixed

Added

  • Time-domain simulation support for built-in lumped elements.

Changed

  • Increased timeout for finding and retrieving PDA documents to better accpunt for connection problems.

Fixed

  • Fix time-dependent term sign in all LumpedModel to be compatible with the Tidy3d convention e−iωte^{-i\omega t}.
  • Removed the connection limit for the PDA client to handle larger data payloads.

Added

  • Support for Tidy3d’s automatic differentiation and adjoint optimization with parametric components.

Changed

  • Added the flexibility of specifying the phase of the coupling coefficient in the RingTimeStepper.
  • Improved live_viewer.LiveViewer: faster rendering, support for large layouts (millions of shapes), shape-snapping ruler, geometry culling by layer, cell or hierarchy depth.

Fixed

  • Bug in photonforge-server not resolving required parameters correctly from all referenced components.
  • Bug in pda.Project.add_library ignoring the selected library version and always using latest.

Added

Changed

  • More performance improvements to the PDA system and photonforge-server.
  • Breaking: pda.Project.reload renamed to pda.Project.load_latest.

Fixed

  • Bug in analytic models not using the provided reference frequency to compute dispersion.
  • PDA projects are loaded at specific versions or tags as read-only.
  • PDA incompatibility with python < 3.12.
  • Bug in PDA projects preventing custom modules to be saved in certain scenarios.
  • Bug in deep copying objects with cyclic dependencies through parametric keyword arguments.

Changed

  • Performance improvements to the PDA system and photonforge-server when loading projects or adding libraries.

Fixed

  • Bug on the photonforge-server that prevented parametric components to be updated after copy and paste.

Added

Changed

  • Improved parametric function naming scheme to avoid using hashes too frequently.
  • Simplified handling of butt-coupling connections that internally use an EMEModel.
  • Component extrusion uses ConstructiveSolid to merge structures with common media.
  • Coordinate snapping on parametric components is more robust to most numerical inaccuracy sources.
  • SVG representations make use hatching patterns defined in LayerSpec.
  • Breaking: Argument change in PhaseModTimeStepper: tau_rc was replaced by a more convenient f_3dB.

Fixed

  • Component.update affecting the wrong component through caching.
  • Path.bezier bug that prevented high order bezier curves from working.
  • Handle circuits with both electrical and optical connections that require phase corrections simultaneously.
  • Improved automatic extrusion tolerance for RF ports with self-intersecting geometries.
  • n_group2 precedence in AnalyticMZIModel
  • Circuit simulations with transformed sub-components and user-defined bounds are now correctly transformed.
  • Bug in TerminatedModTimeStepper affecting cases where the source was not matched to the modulator’s characteristic impedance.
  • Energy conservation bug in PhotodiodeTimeStepper when a reflection coefficient was used.

Added

Changed

  • WaveguideModel has increased phase accuracy for bends by accounting for polarization rotations between ports.
  • route_length was improved to work with multi-path waveguides, like CPW transmission lines.

Fixed

  • Breaking: EMEModel compatibility fix for Tidy3d 2.10.2 (EMEModels created with Tidy3d 2.10.1 and PhotonForge 1.3.0 and 1.3.1 will be incompatible with this and future releases due to a schema change in Tidy3d.).
  • Bug in Tidy3DModel when simulating a small region inside a large component that affected extended ports.
  • Bug in parametric.route_taper when both terminal structures were 1-dimensional and orthogonal.
  • Invalid Euler bend parameters now raise proper error.
  • Division by zero in some waveguide models when vpi_L was set to 0.
  • Division by zero error in empty circuits.

Fixed

  • SVG previews no rendering the correct colors.

Added

  • Support for connections between ports with different profiles in Component.get_netlist, bridged through EME or an impedance mismatch model in circuits.
  • PortSpec.impedance to be used on electrical ports to pre-define the port impedance.
  • Terminated phase modulator time stepper TerminatedModTimeStepper
  • Argument post_load_function to load_layout to help automating port/pin detection when loading layout files.

Changed

  • Breaking: classes derived from TimeStepper require a keys attribute or property, and the interface for TimeStepper.step_single uses arrays instead of dictionaries for improved performance. Custom user-defined time steppers will have to be manually updated.
  • Impedance argument z0 controls the conversion between wave amplitudes and voltages/currents in DMLaserTimeStepper and PhotodiodeTimeStepper

Fixed

Fixed

Added

  • Interpolator to be used when certain class arguments must be defined as interpolated values.
  • config.svg_reference_depth replaces the now deprecated config.svg_references to give more fine-grained control over reference display in SVG previews.
  • Support for transforming empty paths into polygons when their end caps allow it.

Changed

  • New parametric component arguments for setting models. Old “kwargs” style parameters have been deprecated.
  • Improved performance of CircuitTimeStepper.
  • Better default model naming.

Fixed

  • Removed unused arguments show_progress and model_kwargs from plot_s_matrix.

Added

Fixed

Added

Changed

  • LayerSpec will be assigned a random color and pattern when none are specified.
  • Fix for translation of Gaussian source w.r.t. their field monitor, improving reciprocity of results.
  • Model.start implementations can return an SMatrix instance directly. Class ModelResult has been deprecated.
  • Tidy3DModel.batch_data replace the now deprecated data_path_for, batch_file_for, and batch_data_for.
  • EMEModel.simulation_data replace the now deprecated data_path_for, data_file_for, and simulation_data_for.

Fixed

Fixed

  • Error in PHF storage for Path.

Added

  • Argument use_angle_rotation to Tidy3D conversion functions from Port and FiberPort, to enamble angle_rotation in the ModeSpec they generate, if necessary.

Changed

  • Mode fields are only stored in Tidy3d simulation data when needed for mode remapping.

Fixed

  • Critical error in annotated types from parametric component library (unhashable types).

Added

Changed

  • Deprecation: All json methods have been deprecated for removal in the 1.2 release.

Fixed

  • Memory access bug in S matrix comparison.
  • Other minor memory leak fixes.

Added

Changed

  • WaveguideModel now accepts a PortSpec or the string "cross-section" for more flexible propagation index calculation.
  • Updated minimal config.grid size to avoid truncation errors when snapping ports.
  • Updated default settings for electrical simulations (experimental feature).
  • Updated default values for electrical simulation grids and cpw_spec.

Fixed

Added

Fixed

  • Backwards compatibility fix in phf files using specific parametric technologies.

Fixed

  • Crash when no active model is present in phf file.

Added

Changed

  • Analytical models include all-zero elements in S matrix output.

Fixed

  • Tidy3D simulation hanging when an error occurs during upload or download.
  • Axis label in plot_s_matrix.
  • Component.detect_ports properly detects and ignores co-linear vertices in polygons.
  • Data arrays from numpy and xarray within Tidy3D objects breaking serialization.

Added

Changed

  • Parallel upload and download of Tidy3D tasks.
  • Default run_time quality factor changed from 10 to 5 in order to decrease the default estimated cost of Tidy3D runs.
  • Use default precision in mode solver.
  • Remove out-of bounds structures from simulations to avoid Tidy3D warnings.
  • Where available, default keyword arguments for parametric components and technologies are included in Component.parametric_kwargs and Technology.parametric_kwargs.

Fixed

  • Bug in MaskSpec comparison.
  • Do not create complex geometry with more than 100 sub-geometries to avoid errors in Tidy3D.
  • Vernier scale stencil bug fix to generate proper geometry.
  • Support for numpy complex scalars in phf streams.
  • Better HTML escaping in SVG representations.
  • Improved Tidy3D object conversion to include spatial data arrays in runtime caches.
  • Port mode numbering for S matrices is consistent with and without setting PortSpec.polarization.
  • Bug in error handling within paths.

Added

  • Attribute _id for internal use.
  • Configuration option config.svg_label_scaling.

Changed

  • More robust guarantees for gradients for path endpoints.
  • Paths are stored as polygons by default in GDSII and OASIS files.
  • Reference.component can be set.
  • Simplified updates argument in CircuitModel.start.

Fixed

  • Path alignment fixes for parametric couplers.
  • Minor docstring fixes.

Added

  • Complex vector fitting for baseband signals via pole_residue_fit with real=False.

Changed

  • Sign convention for the frequency variable in PoleResidueMatrix.
  • In pole_residue_fit, min_poles and max_poles now count a single conjugate pair as two poles.
  • S matrices store all-zeros instead of dropping them.
  • Routes can be specified by reference and port name to facilitate updating if the reference is transformed.

Fixed

  • Significant accuracy improvements in pole_residue_fit.
  • Component comparison takes ports into account.

Fixed

  • Function stencil.as_component takes a technology argument for the created component.
  • Apply union to polygons before erosion, as indicated in the documentation.

Added

Changed

Fixed

Changed

  • Suppress extrusion error message from Tidy3D when falling back to triangular mesh.

Fixed

  • Always export paths with round or beveled joins as polygons.
  • Forbid inheritance from PhotonForge classes (except Model) because the internal design does not support it.
  • Error when parsing arguments in Path.parametric.
  • Runtime errors in EMEModel.
  • Degenerate port modes are handled correctly when symmetry is used in Tidy3DModel and EMEModel.

Initial release.