/opics

OPICS : An S-parameter based photonic circuit simulator

Primary LanguagePythonMIT LicenseMIT

opics_logo

Open Photonic Integrated Circuit Simulator (OPICS)

OPICS is an S-parameter based photonic integrated circuit simulator. For more information, refer to OPICS Documentation

OPICS Quickstart

Installing OPICS

Installing from pypi

The easiest way to install OPICS is using pip pypi:

pip install opics

Installing from source

Download the OPICS source code.

git clone https://github.com/jaspreetj/opics

Install the OPICS package using pip.

pip install -e ./opics

Once the package is installed, it can be imported using:

import opics
   ____  ____  _______________
  / __ / __ /  _/ ____/ ___/
 / / / / /_/ // // /    __ / /_/ / ____// // /___ ___/ /
____/_/   /___/____//____/

OPICS version 0.3.1

OPICS Libraries

Listing available libraries

The package does not come with any component libraries pre-installed. You can select and download available libraries from the library catalogue.

library_catalogue = opics.libraries.library_catalogue

print(f"Available Libraries: {[_ for _ in library_catalogue.keys()]} ")
Available Libraries: ['ebeam', 'shuksan']

Downloading libraries

The OPICS libraries are downloaded by passing in library_name, library_url, and library_path to the libraries.download_library module. The module returns True if the library is downloaded successfully.

library = library_catalogue["ebeam"]


import os
installation_path = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop\\delete')

opics.libraries.download_library(
    library_name=library["name"],
    library_url=library["dl_link"],
    library_path=installation_path,
)

# reload libraries
import importlib
importlib.reload(opics.libraries)
<module 'opics.libraries' from 'c:\users\jeida\documents\github\dev-jaspreetj\opics\opics\libraries\__init__.py'>

List installed libraries

opics.libraries.installed_libraries
['ebeam']

List library components

opics.libraries.ebeam.components_list
['BDC',
 'DC_halfring',
 'GC',
 'Switch',
 'TunableWG',
 'Waveguide',
 'Y',
 'ebeam_y_1550',
 'ebeam_gc_te1550',
 'ebeam_wg_integral_1550']

Remove libraries

Any of the installed libraries can be removed using the libraries.remove_library module.

opics.libraries.remove_library("ebeam")

importlib.reload(opics.libraries)

print(opics.libraries.installed_libraries)
[]
#reinstall ebeam library
opics.libraries.download_library(
    library_name=library["name"],
    library_url=library["dl_link"],
    library_path=installation_path,
)

importlib.reload(opics.libraries)

print(opics.libraries.installed_libraries)
Download start
Download finished.
['ebeam']

Library components

Let’s take a look at the library components.

ebeam_lib = opics.libraries.ebeam

Listing library components

ebeam_lib.components_list
['BDC',
 'DC_halfring',
 'GC',
 'Switch',
 'TunableWG',
 'Waveguide',
 'Y',
 'ebeam_y_1550',
 'ebeam_gc_te1550',
 'ebeam_wg_integral_1550']

Let’s take a look inside a component for more information on its parameters and layout, such as port locations.

ebeam_lib.Y?

Setting up a simulation

The network module is used to define a circuit, add and connect components. The network module takes network_id and f as inputs. If no f or frequency data points specified, the network module uses the default value specified in opics.globals.F.

from opics import Network
from opics.globals import C
import numpy as np

freq = np.linspace(C * 1e6 / 1.5, C * 1e6 / 1.6, 2000)
circuit = Network(network_id="circuit_name", f=freq)

Once an empty network is defined. We can start by adding components.

input_gc = circuit.add_component(ebeam_lib.GC)
y = circuit.add_component(ebeam_lib.Y)
wg2 = circuit.add_component(ebeam_lib.Waveguide, params=dict(length=0e-6))
wg1 = circuit.add_component(ebeam_lib.Waveguide, params={"length":15e-6})
y2 = circuit.add_component(ebeam_lib.Y)
output_gc = circuit.add_component(ebeam_lib.GC)

We can also define custom port names for components for easy reference.

input_gc.set_port_reference(0, "input_port")
output_gc.set_port_reference(0, "output_port")

Connect components using the Network.connect module.

circuit.connect(input_gc, 1, y, 0)
circuit.connect(y, 1, wg1, 0)
circuit.connect(y, 2, wg2, 0)
circuit.connect(y2, 0, output_gc, 1)
circuit.connect(wg1, 1, y2, 1)
circuit.connect(wg2, 1, y2, 2)

Simulate the network/circuit

circuit.simulate_network()
<opics.components.componentModel at 0x2334a11daf0>

Plot the simulated response

circuit.sim_result.plot_sparameters(show_freq=False)

/notebooks/_static/00-Quickstart_files/00-Quickstart_30_0.png

An interactive plot can be spawned by enabling the interactive option.

circuit.sim_result.plot_sparameters(show_freq=False, interactive=True)

Citing

You can cite the package as

@misc{jhoja-2020-opics,
  author = {Jaspreet Jhoja},
  title = {OPICS: An Open Photonic Integrated Circuit Solver},
  year = {2020},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/jaspreetj/OPICS}}
}