Cad.py is an interface used to programmatically create photonic circuits. It can be used to create any kind of segment, specifying its size, index, offset and width.
To use the interface you have to import various classes:
from Cad import Circuit
from Structs import *- Circuit, which is the interface.
- The file
Structs.pycontains classes used to define some properties of the photonic circuit
To run the code a specific Python interpreter must be used, which is contained in this directory: C:/Synopsys/PhotonicSolutions/2019.09/RSoft/bin/rspython.exe
c1 = Circuit(dimension=d, dimension_y=n, in_file_name="index_file", out_file_name="out_file")Where with the dimension you can specify if the design is 2D or 3D (2 or 3), dimension_y is the height of the segments, in_file_name is the name of the ".ind" file (RSoft format) without the file extension and the out_file_name is the name of the file with the simulation results.
To add a segment to the circuit you can use the following method:
c1.add_segment(pos=vec3(x, y, z), offset=vec3(x, y, z), dimension_x=n, index=i)where c1 is the circuit object previously created, pos=vec3(x, y, z) is the position of the segment, offset=vec3(x, y, z) is the offset of the segment, dimension_x is the width of the segment and the index is the refractive index of the segment.
c1.add_pathway(segments)Where segments is an array of strings with the segments you want in that pathway:
c1.add_pathway(["1", "4", "8"])To add a monitor to a pathway you first need to create a pathway, then you can create the monitor:
c1.add_monitor(pathway, monitor_type.TYPE, tilt, monitor_component.COMPONENT)Where pathway is the number of the pathway you want to add the monitor to, monitor_type.TYPE is the type of the monitor, tilt is the tilt of the monitor and monitor_component.COMPONENT is the component of the monitor (minor or major).
Example:
c1.add_monitor(1, monitor_type.MONITOR_FILE_POWER
, "0", monitor_component.COMPONENT_MINOR)You can find all of the "
monitor_type" and "monitor_component" here.
When you create a launch field you have to pay attention to some things:
- If you don't create a launch field by calling this function there the default one will stil be created, which has position (0, 0, 0) and a power of 1.
- When you create the first lauch field, you just change the value of the default one.
To create a launch field you can use the following method:
c1.add_launch_field(x_position, power, launch_type.TYPE, launch_pathway, launch_tilt)You can find all of the
launch_typehere.
Example:
c1.add_launch_field(0, 1, launch_type.LAUNCH_WGMODE, 0, 1)Once you have added all of the components to the circuit you can run the simulation with this method:
c1.run_simulation()This method will run the simulation, create the .ind file and all of the files that contain simulation results.
⚠️ Attention!⚠️ : This method returns an array which contains the last value all the monitors recorded, which means that if you do not add a monitor it will returnNone.
The files will be created in a specific location. Once the simulation starts, in the folder where the .py file is, the /res directory will be generated. Inside of it you will find other two folders.
Inside the /res/ind folder there will be the .ind file. It is the file you can load on RSoft CAD as it contains the circuit's information.
Inside the /res/sim folder there will be all of the files genereted by running the simulation. The .mon file contains the data all the monitors captured. If there are no monitors in the circuit that file will not be present.
All the monitor types:
- MONITOR_FILE_POWER
- MONITOR_FILE_PHASE
- MONITOR_WGMODE_POWER
- MONITOR_WGMODE_PHASE
- MONITOR_GAUSS_POWER
- MONITOR_GAUSS_PHASE
- MONITOR_LAUNCH_POWER
- MONITOR_LAUNCH_PHASE
- MONITOR_WG_POWER
- MONITOR_TOTAL_POWER
- MONITOR_FIELD_NEFF
- MONITOR_FIELD_WIDTH
- MONITOR_FIELD_HEIGHT
All the monitor components:
- COMPONENT_MINOR
- COMPONENT_MAJOR
All the launch types:
- LAUNCH_FILE
- LAUNCH_COMPMODE
- LAUNCH_WGMODE
- LAUNCH_GAUSSIAN
- LAUNCH_RECTANGLE
- LAUNCH_MULTIMODE
- LAUNCH_PLANEWAVE
from Cad import Circuit
from Structs import launch_field_all, vec3, vec2, monitor_type, monitor_component, launch_type
def main():
c1 = Circuit(dimension=2, dimension_y=3, in_file_name="design", out_file_name="result")
c1.add_segment(pos=vec3(0, 0, 0), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(2, 0, 0), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(4, 0, 0), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(6, 0, 0), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(3, 0, 1), offset=vec3(0, 0, 7), dimension_x=7, index=2)
for i in [float(k) / 2 for k in range(4, 14, 1)]:
for j in[float(l) / 2 for l in range(1, 12, 1)]:
c1.add_segment(pos=vec3(j, 0, i), offset=vec3(0, 0, 0.5), dimension_x=0.5, index=3)
c1.add_segment(pos=vec3(0, 0, 8), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(2, 0, 8), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(4, 0, 8), offset=vec3(0, 0, 1), dimension_x=1, index=2)
c1.add_segment(pos=vec3(6, 0, 8), offset=vec3(0, 0, 1), dimension_x=1, index=2)
for i in range(1,5):
c1.add_pathway([str(10*11+5+i)])
c1.add_monitor(1, monitor_type.MONITOR_WGMODE_POWER, "1", monitor_component.COMPONENT_MINOR)
c1.add_monitor(2, monitor_type.MONITOR_WGMODE_POWER, "2", monitor_component.COMPONENT_MINOR)
c1.add_monitor(3, monitor_type.MONITOR_WGMODE_POWER, "3", monitor_component.COMPONENT_MINOR)
c1.add_monitor(4, monitor_type.MONITOR_WGMODE_POWER, "4", monitor_component.COMPONENT_MINOR)
c1.add_lauch_field(launch_field_all(0, 1, launch_type.LAUNCH_WGMODE, 0, 1))
c1.add_lauch_field(launch_field_all(2, 1, launch_type.LAUNCH_WGMODE, 0, 1))
c1.add_lauch_field(launch_field_all(4, 1, launch_type.LAUNCH_WGMODE, 0, 1))
c1.add_lauch_field(launch_field_all(6, 1, launch_type.LAUNCH_WGMODE, 0, 1))
print(c1.run_simulation())
main()This is the result of the code above:




