gdsfactory is an EDA (electronics design automation) tool to Layout Integrated Circuits.

Overview

gdsfactory 3.5.5

gdsfactory is an EDA (electronics design automation) tool to Layout Integrated Circuits.

It is build on top of phidl gdspy and klayout to provide you with functions to build your GDSII components, PDKs and masks for different foundries.

You just need to adapt the functions to your foundry and build your own library of elements (see UBC PDK example).

gdsfactory provides you with:

  • functions easily adaptable to define components
  • functions to route electrical ports to pads and optical ports grating couplers
  • functions to define components, circuits or masks in python and YAML files

As input, gdsfactory needs you to write python or YAML code to describe your layouts.

As output it creates a GDSII file which is the most common filetype used by the CMOS industry. It also can output YAML components settings (that you can use for measurement and data analysis). You can also easily adapt this metadata output files to your needs.

Documentation

What nice things come from phidl?

  • functional programming that follow UNIX philosophy
  • nice API to create and modify Components
  • Easy definition of paths, cross-sections and extrude them into Components
  • Easy definition of ports, to connect components. Ports in phidl have name, position, width and orientation (in degrees)
    • gdsfactory expands phidl ports with layer, port_type (optical, electrical, vertical_te, vertical_tm ...) and cross_section
    • gdsfactory adds renaming ports functions (clockwise, counter_clockwise ...)

What nice things come from klayout?

  • GDS viewer. gdsfactory can send GDS files directly to klayout, you just need to have klayout open
  • layer colormaps for showing in klayout, matplotlib, trimesh (using the same colors)
  • fast boolean xor to avoid geometric regressions on Components geometry

What functionality does gdsfactory provides you on top phidl/gdspy/klayout?

  • @cell decorator for decorating functions that create components
    • autonames Components with a unique name that depends on the input parameters
    • avoids duplicated names and faster runtime implementing a cache. If you try to call the same component function with the same parameters, you get the component directly from the cache.
    • automatically adds cell parameters into a component.info (full, default, changed) as well as any other info metadata (polarization, wavelength, test_protocol, simulation_settings ...)
    • writes component metadata in YAML including port information (name, position, width, orientation, type, layer)
  • routing functions where the routes are composed of configurable bends and straight sections (for circuit simulations you still have the concept of what the route is made of)
    • get_route: for single routes between component ports
    • get_route_from_steps: for single routes between ports where we define the steps or bends
    • get_bundle: for bundles of routes (river routing)
    • get_bundle_path_length_match: for routes that need to keep the same path length
    • get_route(auto_widen=True): for routes that expand to wider waveguides to reduce loss and phase errors
    • get_route(impossible route): for impossible routes it raises a warning and returns a FlexPath on an error layer
  • testing framework to avoid unwanted regressions
    • checks geometric GDS changes by making a boolean difference between GDS cells
    • checks metadata changes, including port location and component settings
  • large library of photonics and electrical components that you can easily customize to your technology
  • read components from GDS, numpy, YAML
  • export components to GDS, YAML or 3D (trimesh, STL ...)
  • export netlist in YAML format
  • plugins to compute Sparameters using for example Ansys Lumerical FDTD

How can you learn more?

gdsfactory is all written in python and requires some basic knowledge of python. If you are new to python you can find many books, youTube videos and courses available online.

Once you are familiar with python, you can also:

Installation

First, you need to install klayout to visualize the GDS files that you create.

gdsfactory works for python>=3.7 in Windows, MacOs and Linux. Github runs all the tests at least once a day for different versions of python (3.7, 3.8, 3.9)

If you are on Windows, I recommend you install gdsfactory with Anaconda3 or Miniconda3.

conda install -c conda-forge gdspy
pip install gdsfactory
gf tool install

For Linux and MacOs you can also install gdsfactory without Anaconda3:

pip install gdsfactory
gf tool install

Or you can install the development version if you plan to contribute to gdsfactory:

git clone https://github.com/gdsfactory/gdsfactory.git
cd gdsfactory
make install

To summarize: There are 2 methods to install gdsfactory

  1. pip install gdsfactory will download it from PyPi (python package index)
  2. you can download it from GitHub in your computer and link the library to your python
git clone https://github.com/gdsfactory/gdsfactory.git
cd gdsfactory
make install

for updating 1. you need to pip install gdsfactory --upgrade for updating 2. you need to pull from GitHub the latest changes

cd gdsfactory
git pull

After installing you should be able to import gdsfactory as gf from a python script.

  • gdsfactory
    • components: define a basic library of generic components that you can customize
    • gdsdiff: hash geometry and show differences by displaying boolean operations in klayout
    • klayout: klayout generic tech layers and klive macro
    • klive: stream GDS directly to klayout
    • ports: to connect components
    • routing: add waveguides to connect components
    • samples: python tutorial
    • tests:
  • docs/notebooks: jupyter-notebooks based tutorial

Plugins

We try to keep gdsfactory core with minimum depedencies. So when you run pip install gdsfactory you do not install any plugins by default. If you want to install gdsfactory together with all the plugins you can run

pip install gdsfactory[full]

Trimesh

For (3D rendering and STL export)

meep / mpb

Open source FDTD / mode simulator. Requires you to run conda install -c conda-forge pymeep

tidy3d

For FDTD simulations on the web. It will require you to create an account on simulation.cloud

Links

Comments
  • Simpler install

    Simpler install

    How can we simplify the installation process?

    Options

    • executable window anaconda on packager. Ship anaconda environment, use constructor to create a conda installer, or mambstructor for mamba

    @tvt173 @HelgeGehring @simbilod @flaport @thomasdorch

    opened by joamatab 27
  • Meep adjoint optimization plugin / gmeep extension

    Meep adjoint optimization plugin / gmeep extension

    It would be nice to extend gmeep's capabilities to include Meep's adjoint optimization features. This way, we can optimize some of gdsfactory's primitive components such as mmi1x2, generate a gdsfactory component from them, and eventually gds files.

    Things to do:

    • [x] Figure out how to setup a Meep adjoint optimization simulation from gdsfactory components
    • [x] Figure out how to extract a gdsfactory Component object, and eventually a gds file, from the PNG files generated by Meep

    For the latter, we can convert the PNG's to a numpy array, and then use gf.read.from_np to generate a gdsfactory component, as per @joamatab's suggestion. Or, if there's a way to create gds files straight from Meep, we can just turn those into a gdsfactory component.

    enhancement 
    opened by SkandanC 19
  • complex circuit simulation

    complex circuit simulation

    """FIXME.
    
    
    """
    import numpy as np
    import matplotlib.pyplot as plt
    import jax.numpy as jnp
    import sax
    import gdsfactory as gf
    
    
    def straight(wl=1.5, length=10.0, neff=2.4) -> sax.SDict:
        return sax.reciprocal({("o1", "o2"): jnp.exp(2j * jnp.pi * neff * length / wl)})
    
    
    def mmi1x2() -> sax.SDict:
        """Returns an ideal 1x2 splitter."""
        return sax.reciprocal(
            {
                ("o1", "o2"): 0.5**0.5,
                ("o1", "o3"): 0.5**0.5,
            }
        )
    
    
    def mmi2x2(*, coupling: float = 0.5) -> sax.SDict:
        """Returns an ideal 2x2 splitter.
    
        Args:
            coupling: power coupling coefficient.
        """
        kappa = coupling**0.5
        tau = (1 - coupling) ** 0.5
        return sax.reciprocal(
            {
                ("o1", "o4"): tau,
                ("o1", "o3"): 1j * kappa,
                ("o2", "o4"): 1j * kappa,
                ("o2", "o3"): tau,
            }
        )
    
    
    def bend_euler(wl: float = 1.5, length: float = 20.0, loss: float = 50e-3) -> sax.SDict:
        """Returns bend Sparameters."""
        amplitude = jnp.asarray(10 ** (-loss * length / 20), dtype=complex)
        return {k: amplitude * v for k, v in straight(wl=wl, length=length).items()}
    
    
    def phase_shifter(
        wl: float = 1.55,
        neff: float = 2.34,
        voltage: float = 0,
        length: float = 10,
        loss: float = 0.0,
    ) -> sax.SDict:
        """Returns simple phase shifter model.
    
        Args:
            wl: wavelength in um.
            neff: effective index.
            voltage: voltage per PI phase shift.
            length: in um.
            loss: in dB.
        """
        deltaphi = voltage * jnp.pi
        phase = 2 * jnp.pi * neff * length / wl + deltaphi
        amplitude = jnp.asarray(10 ** (-loss * length / 20), dtype=complex)
        transmission = amplitude * jnp.exp(1j * phase)
        return sax.reciprocal(
            {
                ("o1", "o2"): transmission,
            }
        )
    
    
    models = {
        "bend_euler": bend_euler,
        "mmi1x2": mmi1x2,
        "mmi2x2": mmi2x2,
        "straight": straight,
        "taper": straight,
        "straight_heater_metal_undercut": phase_shifter,
        "compass": sax.models.passthru(10),
        "via": sax.models.passthru(10),
    }
    
    
    if __name__ == "__main__":
        c = gf.components.switch_tree(bend_s=None)
        c.show(show_ports=True)
        n = netlist = c.get_netlist_recursive(
            exclude_port_types=("electrical", "placement")
        )
        # netlist.pop(list(n.keys())[0])
        mzi_circuit, _ = sax.circuit(netlist=netlist, models=models)
        S = mzi_circuit(wl=1.55)
        wl = np.linspace(1.5, 1.6, 256)
        S = mzi_circuit(wl=wl)
    
        plt.figure(figsize=(14, 4))
        plt.title("MZI")
    
        plt.plot(1e3 * wl, jnp.abs(S["o1_0_0", "o2_1_9"]) ** 2)
        plt.plot(1e3 * wl, jnp.abs(S["o1_0_0", "o3_1_6"]) ** 2)
        plt.plot(1e3 * wl, jnp.abs(S["o1_0_0", "o2_1_5"]) ** 2)
        plt.plot(1e3 * wl, jnp.abs(S["o1_0_0", "o3_1_10"]) ** 2)
        plt.xlabel("λ [nm]")
        plt.ylabel("T")
        plt.grid(True)
        plt.show()
    
    bug 
    opened by joamatab 15
  • schematic driven layout

    schematic driven layout

    image

    How can we make schematic capture of the circuits?

    we currently support netlist flow

    it would be great to support something like this for analog design flow

    opened by joamatab 13
  • support different port naming conventions

    support different port naming conventions

    some functions, like meep and tidy3d write sparameters assume the o1, o2, o3 ... port names.it would be great to enable other port naming conventions.

    Here are some other port conventions

    • Siepic pdk uses opt1, opt2, opt3
    • IPKISS2 uses E0, W0, N0, N1
    • IPKISS3 uses in0, in1, out1, out0
    help wanted 
    opened by joamatab 13
  • remove gdspy dependency from gdsfactory

    remove gdspy dependency from gdsfactory

    gdsfactory is built on top of gdspy

    The main issues are:

    • extra dependencies makes the package harder to install and sometimes hard to follow and document
    • gdspy is no longer developed (only in maintenance mode). gdstk is supposed to be the successor of gdspy
    • gdspy requires conda install for windows. Now you can install gdsfactory through mamba/conda but it would be nice to only depend on one package manager such as pip

    We have some options

    1. switch to klayout API

    • Klayout has faster booleans
    • Klayout builds wheels for windows pip install klayout. So no more need to conda install gdsfactory for windows users.
    • Klayout is already an optional dependency
    • Klayout API is not super well documented

    See @amccaugh work on the phidl klayout backed @sebastian-goeldi @thomaslima

    See zeropdk

    2. switch to gdstk

    • gdstk is an improved version of gdspy

    3. switch to rust

    https://github.com/dan-fritchman/Layout21/

    What do you think?

    @thomasdorch @tvt173 @flaport @basnijholt

    p2 
    opened by joamatab 12
  • Meow plugin

    Meow plugin

    Can call MEOW directly on component + layerstack to get single-wavelength Sparameters from EME

    • Converts gdsfactory LayerStack to MEOW extrusion rules
    • Converts gdsfactory materials to MEOW material
    • Converts MEOW output S-parameter format to gdsfactory S-parameter format
    • Validates component, currently can only simulate 2-ports components with west and east-facing ports
    • Documentation notebook showing simple calls
    opened by simbilod 11
  • Get gdsfactory PCells working on KLayout

    Get gdsfactory PCells working on KLayout

    We can now use gdsfactory generic pdk (or any other pdk derived from it), straight in KLayout.

    Major stuff:

    • Combined link_gdsfactory_python and import_generic_pcells.
    • Added a class to turn gdsfactory Components to Klayout PCells
    • Progress bar to show component loading progress
    • Fix bug preventing update of PCells without changing name - This was an issue on gdsfactory's side, doing gf.clear_cache() fixed it

    Things to improve:

    • Flayout does not support tuple of floats as parameters for the PCells, so such Component arguments cannot be modified
    • Same as above with CrossSectio, ComponentType and other such types
    opened by SkandanC 10
  • gdspy dependency is failing in python3.7 and python3.8 venv environments

    gdspy dependency is failing in python3.7 and python3.8 venv environments

    Describe the bug There is an installation error for gdspy package. This is how it looks like when you install it - image

    To Reproduce I created a venv for both python3.7 and 3.8. Let me know you are able to reproduce the error using this method.

    Expected behavior Clean installation

    Suggested fix No idea

    opened by saicharan0112 10
  • Meep integration: cell size not correctly calculated

    Meep integration: cell size not correctly calculated

    The size of the Mode monitor is not correctly taken into account for bends:

    from gdsfactory.components import bend_euler
    from gdsfactory.simulation.gmeep import write_sparameters_meep
    from gdsfactory.simulation.effective_permittivity import calculate_effective_permittivity
    
    bend = bend_euler(radius=5)
    material_name_to_meep = {
        'si': float(calculate_effective_permittivity(3.477 ** 2, 1.444 ** 2, 1.444 ** 2, .22, 1.55, 'te')[0] ** .5)}
    write_sparameters_meep(bend, resolution=20, is_3d=False, animate=True, material_name_to_meep=material_name_to_meep)
    

    image

    opened by HelgeGehring 10
  • Meep initialization time

    Meep initialization time

    Is it normal for 2D Meep simulations to be much slower to initialize than to actually run? I have been using the conda-forge Meep package with MPICH and write_sparameters_meep_mpi can take upwards of 5-10 minutes to initialize and perform subpixel averaging on a simulation domain of 20 x 10 at 30-40 resolution using 24 threads, but the simulation itself only takes maybe 30 seconds to a minute.

    If this is normal, is there anything we can do to speed up this part of the simulation?

    opened by thomasdorch 10
  • Bump tidy3d-beta from 1.8.0 to 1.8.1

    Bump tidy3d-beta from 1.8.0 to 1.8.1

    Bumps tidy3d-beta from 1.8.0 to 1.8.1.

    Changelog

    Sourced from tidy3d-beta's changelog.

    [1.8.1] - 2022-12-30

    Added

    • Environment variable TIDY3D_SSL_VERIFY to optionally disable SSL authentication (default is True).
    • Billed FlexUnit cost displayed at the end of web.monitor.

    Fixed

    • Bug on Windows systems with submitting CustomFieldSource data to the server.
    • Fix to FieldData.symmetry_expanded_copy for monitors with colocate=True.

    Changed

    • The Simulation version updater is called every time a Simulation object is loaded, not just from_file.
    • Boundary specifications that rely on the default Periodic boundary now print a deprecation warning, as the default boundaries will change to PML in Tidy3D 2.0.
    Commits
    • 8263515 changelog and schema for 1.8.1
    • 3297bb3 Fix to print deprecation warning when initializing BoundarySpec from classmet...
    • 3c6399d boundary spec deprecation warning and updated tests to always set boundaries ...
    • 892888b fixed pylint error
    • 6d362a1 fixed typo in Lorentz.coeffs
    • 211ba45 Showing billed FlexUnit at the end of web.monitor
    • a7de987 deprecation warnings for API updates in 2.0
    • e9cbec6 use updater anytime simulation constructed using validator
    • 04ed621 Fix to symmetry_expanded_copy for colocating monitors
    • 1736296 Fix to bug on Windows with temporary file
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 1
  • Reorganize tidy3d mode and mode overlap computations

    Reorganize tidy3d mode and mode overlap computations

    In Tidy3D 1.8.0 we introduced FieldData.dot(other_data) and ModeSolverData.dot(other_data) methods to correctly compute overlaps between two sets of mode data from the mode solver or field data from the FDTD solver. One thing that this does better compared to the current implementation in the gdsfactory Tidy3D plugin is that the fields are spatially colocated to the same positions (the centers of the Yee grid), while in the plugin the raw fields are used, which live on the Yee grid.

    This return should then use the natively supported dot method. Also, modes are now normalized coming out of the solver, so this is not needed (the abs value can be put e.g. in the return statement if this is entirely removed, e.g. return r, np.abs(integral)**2.

    However, looking through the tidy3d mode plugin, I see that it utilizes our low-level compute_modes function directly, instead of our mode solver. The fields that come out of those are not packaged in a ModeSolverData and they are not normalized, so this would be more work than I thought. I see two possible approaches:

    • Rewrite the gdsfactory plugin to use the tidy3d ModeSolver directly rather than the lower-level compute_modes function. If needed, we could add a way for the ModeSolver to use arrays of n, k as opposed to structures + a mode plane, but I don't see why this would be needed. If the Tidy3D solver plugin doesn't need to use those, it should be possible to use the mode solver just through structure definitions too. So I think this is the preferred approach.
    • Keep the current compute_modes usage but create a ModeSolverData with normalized modes out of the output fields. This would seem to require porting some of the tidy3d ModeSolver code to the plugin here, which doesn't make that much sense to me.

    @joamatab has mentioned that this loss computation seems too good to be true, hopefully this will fix this but it will be good to see.

    @lucas-flexcompute maybe you could have a look at this when you find some time?

    opened by momchil-flex 0
  • [WIP] generic S-parameter JAX interpolator

    [WIP] generic S-parameter JAX interpolator

    Addresses #1054 #653

    Work in progress on automating N-D input to M-D output S-parameter interpolation for circuit and variability simulations. Feedback welcomed!

    Currently only the EME sub-simulator is interfaced, but most of the work is done in a generic parent class.

    Usage is designed to be very simple: (1) user parametrizes a Component, and provides a LayerStack (2) user calls a child of the Model class, specifying simulation parameters and which parameters are swept across what range. Parameters can be Component arguments, LayerStack thicknesses, and others (like wavelength is simulation depends on it) (3) simulations are run and an interpolator is returned that can give S-parameters within the ND input range

    Example:

        import gdsfactory as gf
        from gdsfactory.cross_section import rib, strip
        from gdsfactory.simulation.sax.parameter import LayerStackThickness, NamedParameter
        from gdsfactory.tech import LayerStack
    
    """Define component"""
    
        c = gf.components.taper_cross_section_linear(
            cross_section1=rib(width=2), cross_section2=rib(width=0.5)
        )
        c.show()
    
    """Define LayerStack"""
    
        layerstack = gf.tech.get_layer_stack_generic()
        filtered_layerstack = LayerStack(
            layers={
                k: layerstack.layers[k]
                for k in (
                    "slab90",
                    "core",
                    "box",
                    "clad",
                )
            }
        )
    
    """Parametrize component: here, we fix one width, and make length and the other width changeable:"""
    
        trainable_strip_strip_taper = (
            lambda parameters: gf.components.taper_cross_section_linear(
                length=parameters["length"],
                cross_section1=strip(width=0.5),
                cross_section2=strip(width=parameters["width2"]),
            )
        )
    
    """Create a model object, which defines simulator to use and which variable to sweep and in what range"""
        strip_strip_taper_model = MeowEMEModel(
            component=trainable_strip_strip_taper,
            layerstack=filtered_layerstack,
            simulation_settings={
                "mode_res": 100,
                "cell_length": 0.5,
                "num_eme_modes": 4,
                "spacing_x": 1,
                "spacing_y": -3,
                "overwrite": False,
            },
            trainable_parameters={
                "length": NamedParameter(min_value=5, 
                                            max_value=6, 
                                            nominal_value=6, 
                                            step=1
                                            ),
                "width2": NamedParameter(
                    min_value=1.0, 
                    max_value=1.0, 
                    nominal_value=1.0, 
                    step=1.0
                ),
                "wavelength": NamedParameter(
                    min_value=1.545, 
                    max_value=1.555, 
                    nominal_value=1.55, 
                    step=0.005
                ),
                "core_thickness": LayerStackThickness(
                    layerstack=filtered_layerstack,
                    min_value=0.19,
                    max_value=0.25,
                    nominal_value=0.22,
                    layername="core",
                    step=0.3,
                ),
            },
            num_modes=2,
        )
    
    """Get the interpolator"""
        # input_vectors, output_vectors = strip_strip_taper_model.get_data()
        interpolator = strip_strip_taper_model.get_nd_nd_interp()
    
        import jax.numpy as jnp
    
    """Evaluate the interpolator"""
        params = jnp.stack(
            jnp.broadcast_arrays(
                jnp.asarray([6.0, 6.0, 6.0]),
                jnp.asarray([1.0, 1.0, 1.0]),
                jnp.asarray([1.55, 1.5, 1.55]),
                jnp.asarray([0.22, 0.22, 0.19]),
            ),
            0,
        )
        print(interpolator["[email protected],[email protected]"](params))
    

    Output:

    Getting examples: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:00<00:00,  6.61it/s]
    
    [0.9993654+2.4627744e-25j 0.9993654-2.4463871e-25j
     0.9993654+2.4627744e-25j]
    

    TODO:

    • [ ] Wrap the interpolator in a Dict to make its inputs directly compatible with SAX SDicts
    • [ ] More consistent use of JAX/JIT
    • [ ] Add tests
    • [ ] Add waveguide sub-simulator for interpolation
    • [ ] Add 2.5D FDTD sub-simulator for interpolation
    • [ ] Show JAX differentiability
    • [ ] Notebook example
    • [ ] Nice GIF showing component optimization at circuit level

    Maybe:

    • [ ] Neural net interpolation (I've made it work, but it requires lots of simulations, does not seem worth it over NDinterp so far)
    • [ ] Neural net interpolation for optical modes like EMEpy, could speed EME up
    opened by simbilod 2
  • TODOs / roadmap

    TODOs / roadmap

    Things that would be great to finish by the end of the Photonics West conference in San Francisco at the end of January

    image

    image

    Design

    • [ ] Fix klayout backend and compare with gdstk #1031
    • [ ] Convert YAML netlist to spice #681
    • [ ] Add generators for photonic components (taper, grating coupler, MMIs …)
    • [ ] Define test sequence for lab measurements (validation)
    • [ ] Fit simulations to build circuit models (coupler, waveguide …)
    • [ ] Extend simulators to support Analog design (spice) and RF quantum workflows.
    • [ ] Serialize GDS files to YAML (preserving hieararchy)

    Verification

    • [ ] LVS #934
    • [ ] DFM Design for manufacturing. Simulate designs with erosion/dilation. Simulate devices after lithography (rounding effects)
    • [ ] Yield estimation based on layout aware monte carlo simulations from erosion/dilation simulations

    Validation

    • [ ] Data analysis flow. Extract device parameters from measurements.
    • [ ] Webapp for comparing simulations and measurements (correlation database)
    • [ ] Add example scripts and documentation for deploying and using the database #992

    @flaport @thomasdorch @SkandanC @simbilod @HelgeGehring @sebastian-goeldi @Jan-David-Black @proppy @mdecea @smartalech @damienbonneau @heitzmann @xin-flex @nikosavola @mithro

    enhancement 
    opened by joamatab 0
  • Mirroring cross-sections

    Mirroring cross-sections

    In #1048 I added an argument to flip the offsets of all sections in the pn cross-section

    What would be the best place to add such a feature to generic cross-sections? Say, an argument in CrossSection that, if True, flips the signs of offset, all section offsets, all cladding_offsets, and all bbox_offsets?

    CrossSection does not have a constructor where we could do this (it currently uses the BaseModel one). We could override that init and add the preprocessing there. Alternatively, if path.extrude is always called on cross-sections, maybe we could put it here. Does that cover all cases?

    enhancement 
    opened by simbilod 2
  • [WIP] Unify layer display properties between KLayout, matplotlib, and holoviews (Sourcery refactored)

    [WIP] Unify layer display properties between KLayout, matplotlib, and holoviews (Sourcery refactored)

    Pull Request #1014 refactored by Sourcery.

    Since the original Pull Request was opened as a fork in a contributor's repository, we are unable to create a Pull Request branching from it.

    To incorporate these changes, you can either:

    1. Merge this Pull Request instead of the original, or

    2. Ask your contributor to locally incorporate these commits and push them to the original Pull Request

      Incorporate changes via command line
      git fetch https://github.com/gdsfactory/gdsfactory pull/1014/head
      git merge --ff-only FETCH_HEAD
      git push

    NOTE: As code is pushed to the original Pull Request, Sourcery will re-run and update (force-push) this Pull Request with new refactorings as necessary. If Sourcery finds no refactorings at any point, this Pull Request will be closed automatically.

    See our documentation here.

    Run Sourcery locally

    Reduce the feedback loop during development by using the Sourcery editor plugin:

    Help us improve this pull request!

    opened by sourcery-ai[bot] 1
Releases(v6.16.1)
Turn your Raspberry Pi Pico into a USB Rubber Ducky

pico-ducky Turn your Raspberry Pi Pico into a USB Rubber Ducky Install Requirements CircuitPython for the Raspberry Pi Pico adafruit-circuitpython-bun

Konstantinos 5 Nov 08, 2022
Raspberry Pi & Accelerometer with Losant's EEA

Raspberry Pi & Accelerometer with Losant's EEA This is a repository that contains companion code to this EEA How To guide. Each folder is named accord

Losant 1 Oct 29, 2021
Micro Displays for Raspberry Pi

micro-displays Micro Displays for Raspberry Pi Why? I'm super bored in lockdown. Add a Raspberry Pi 400 and a few tiny displays... The top half of the

ig 291 Jul 06, 2022
Custom component for Home Assistant that integrates Candy/Haier Wi-Fi washing machines (also known as Simply-Fi).

Candy Home Assistant component Custom component for Home Assistant that integrates Candy/Haier Wi-Fi washing machines (also known as Simply-Fi). This

Olivér Falvai 61 Dec 29, 2022
Open-Source board for converting RaspberryPI to Brain-computer interface

The easiest way to the neuroscience world with the shield for RaspberryPi - PIEEG (website). Open-source. Crowdsupply This project is the result of se

Ildaron 436 Jan 01, 2023
Resmed_myair_sensors - This is a Home Assistant custom component to pull daily CPAP data from ResMed's myAir service using an undocumented API

resmed_myair This component will set up the following platforms. Platform Description sensor Show info from the myAir API. Installation Using the tool

Preston Tamkin 17 Dec 29, 2022
PBA: Pleco Breeding Assistant

A small monitor that reports the external, fishroom and water change parameters to have suitable water parameters and induce breeding. These two features already represent 50% of the "reproductive su

Mirko Mancin 1 Jan 19, 2022
Setup DevTerm to be a cool non-GUI device

DevTerm hobby project I bought this amazing device: DevTerm A-0604. It has a beefy ARM processor, runs a custom version of Armbian, embraces Open Sour

Alex Shteinikov 9 Nov 17, 2022
A DiY holiday project to demonstrate how you can send data from adafruitIO cloud to a balena edge device

holiday-star balena ❤️ adafruitIO Introduction A DiY holiday project to demonstrate how you can send data from adafruitIO cloud to a balena edge devic

Ayan Pahwa 3 Dec 20, 2021
OpenStickFirmware is open source software designed to handle any and all tasks required in a custom Fight Stick

OpenStickFirmware is open source software designed to handle any and all tasks required in a custom Fight Stick. It can handle being the brains of your entire stick, or just handling the bells and wh

Sleep Unit 23 Nov 24, 2022
Programmable Rainbow Redstone Computer

Programmable Rainbow Redstone Computer Table of contents What is it? Program flasher How to use it What is it? PRRC is Programmable Rainbow Redstone C

Fern H 2 Jun 07, 2022
An arduino/ESP project that can play back G-Force data previously recorded

An arduino/ESP project that can play back G-Force data previously recorded

7 Apr 12, 2022
Programming of Robotics Systems course at the University of Aveiro, Portugal, 2021-2022.

Programação de Sistemas Robóticos Miguel Riem Oliveira Universidade de Aveiro 2021-2022 Projeto AtlasCar Projecto RACE IROS 2014 AtlasCar2 ATOM IROS 2

Miguel Riem de Oliveira 22 Jul 13, 2022
The goal of this project is for anyone with an old printer to be able to double-sided printing.

Welcome to PDF-double-side! Hi! I'm 15. I have a old printer so I can't print double-sided outs. The goal of this project is for anyone with an old pr

DejaVu 4 Dec 28, 2021
Brogrammer-keyboard - FIrmware for the Brogrammer Keyboard v1.0

Brogrammer Keyboard Firmware The package contains the firmware that runs on the Brogrammer Keyboard v1.0 See https://imgur.com/a/oY5QZ14 This keyboard

Devin Hartleben 1 Apr 21, 2022
emhass: Energy Management for Home Assistant

emhass EMHASS: Energy Management for Home Assistant Context This module was conceived as an energy management optimization tool for residential electr

David 70 Dec 24, 2022
A module for cross-platform control of the mouse and keyboard in python that is simple to install and use.

PyUserInput PyUserInput is a group project so we've moved the project over to a group organization: https://github.com/PyUserInput/PyUserInput . That

Paul Barton 1k Dec 27, 2022
Huawei Solar sensors for Home Assistant

Huawei Solar Sensors This integration splits out the various values that are fetched from your Huawei Solar inverter into separate HomeAssistant senso

Thijs Walcarius 151 Dec 31, 2022
Control DJI Tello with Raspberry Pi and PS4 Controller

Control-DJI-Tello-with-Raspberry-Pi-and-PS4-Controller Demo of this project see

MohammadReza Sharifi 24 Aug 11, 2022
A low power 1U Raspberry Pi cluster server for inexpensive colocation.

Raspberry Pi 1U Server There are server colocation providers that allow hosting a 1U server for as low as $30/month, but there's a catch: There are re

Paul Brown 627 Dec 31, 2022