Home Forums Nazca How to measure and control AMZI imbalance

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #6483
    Marcin Zyskowski
    Participant

    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)
    #6486
    Ronald
    Keymaster

    Dear 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,
    Ronald

    #6487
    Marcin Zyskowski
    Participant

    Dear 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.

    #6491
    Ronald
    Keymaster

    Dear 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

Viewing 4 posts - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.