Tagged: pathfinder, tracking
- This topic has 3 replies, 2 voices, and was last updated 3 years, 4 months ago by Ronald.
-
AuthorPosts
-
7 May 2021 at 17:31 #6483Marcin ZyskowskiParticipant
Today I created a simple AMZI with EOPMs for arms. I want the imbalance to be 5 um. Everything is connected with s-bends, and there are also isolation sections in the circuit.
Since EOPMs are “stiff”, while s-bends are “elastic”, when one of the AMZI arms is extended, the s-bend waveguides that connect it with other elements, slightly change their shape.
My concern is that what if such change compensates/increases the nominal imbalance? I wanted to make sure, so I used Nazca’s pathfinder, but I got the following message: “WARNING: pathfinder.py: Desired start pin sp_mmi1x2_dp has no desired trackertype (dis).”
I have three questions:
1. Do I understand correctly that this is how to use pathfinder?
2. If yes, how to avoid this warning about no trackertype?
3. Is there some smart way to make an AMZI without such worries?Below is my code:
import nazca as nd import smart as sp from nazca.interconnects import Interconnect #required building blocks eopmS=sp.basic_eopm_dc_dp(length=2500) #shorter arm of AMZI eopmL=sp.basic_eopm_dc_dp(length=2505) #longer arm of AMZIO mmi=sp.mmi1x2_dp() pisoS = sp.iso_dp (length=30) #isolation section (I need it there) #AMZI left_mmi = mmi.put(0) top_eopm = eopmS.put(left_mmi.pin['b0'].move(140, 50)) #shorter, upper arm of AMZI bot_eopm = eopmL.put(left_mmi.pin['b1'].move(140-2.5, -50), flip=True) #longer, lower arm of AMZI right_mmi = mmi.put('b1', top_eopm.pin['b0'].move(140, -50)) BLiso = pisoS.put('a0',left_mmi.pin['b1'].move(57,-17,-33)) #bottom left isolation section TLiso = pisoS.put('a0',left_mmi.pin['b0'].move(57,17,33)) #top left isolation section sp.deep.sbend_p2p(left_mmi.pin['b0'], TLiso.pin['a0']).put() sp.deep.sbend_p2p(TLiso.pin['b0'], top_eopm.pin['a0']).put() sp.deep.sbend_p2p(left_mmi.pin['b1'], BLiso.pin['a0']).put() sp.deep.sbend_p2p(BLiso.pin['b0'], bot_eopm.pin['a0']).put() TRiso = pisoS.put('b0',right_mmi.pin['b1'].move(57,-17,-33)) #top right isolation section BRiso = pisoS.put('b0',right_mmi.pin['b0'].move(57,17,33)) #bottom right isolation section sp.deep.sbend_p2p(bot_eopm.pin['b0'], BRiso.pin['a0']).put() sp.deep.sbend_p2p(top_eopm.pin['b0'], TRiso.pin['a0']).put() sp.deep.sbend_p2p(TRiso.pin['b0'],right_mmi.pin['b1']).put() sp.deep.sbend_p2p(BRiso.pin['b0'],right_mmi.pin['b0']).put() nd.pathfinder(start=left_mmi.pin['a0'], end=right_mmi.pin['a0']) #the problem starts here gdsname = r'blabla' nd.export_gds( filename=gdsname, clear=True)
8 May 2021 at 14:04 #6486RonaldKeymasterDear Marcin,
You follow the right approach, though note that paths have to be defined in the building blocks you use. The message says that cell sp_mmi1x2_dp has no path information (no tracker), so the pathfinder can not continue. A Nazca path can track various connection types (tracker, e.g. for optical or electrical netlists, or polarization states). Demofab in nazca.demofab has some basic examples, using connect_path().
Note that in Nazca.0.5.13 the nd.pathfinder() function has been renamed nd.findpath() to avoid confusion with the module already named pathfinder.
See also this trial cellsthread on MZI optimization.
Regards,
Ronald11 May 2021 at 12:33 #6487Marcin ZyskowskiParticipantDear Ronald,
From your post I understood that I should use connect_path() in order to make pathfinder work. This is how the last four lines look like now:
nd.connect_path(left_mmi.pin['a0'],right_mmi.pin['a0'],1,"opt") nd.pathfinder(start=left_mmi.pin['a0'], end=right_mmi.pin['a0']) gdsname = r'blabla' nd.export_gds( filename=gdsname, clear=True)</pre>
This time again I have the message about lack of desired tracker type.
13 May 2021 at 09:23 #6491RonaldKeymasterDear Marcin,
That’s indeed the way forward. Though, the mmi ‘a0’ pin is connected to itself in your example. If you also use it as start pin you will have a zero length path only. If I use the below in nazca.0.5.13 (
nd.findpath(...)
) it does what I expect.nd.connect_path(left_mmi.pin['a0'], right_mmi.pin['b0'], 1.0) # note the 'b0'
One can not use an “opt” connectivity without implementing compact models in the PDK under the “opt” connections. Something using “trace”, along this post, could be quite useful. You can multiply the geometrical lengths with your own compact (refractive index) model. The MMI you can not trace, as the trace method is intended for 2-port components only, but you do use what you know about its phase transmission to set your target arm diff.
Regards,
Ronald -
AuthorPosts
- You must be logged in to reply to this topic.