Home Forums Nazca Connecting two dissimilar ribbons

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #5707
    mbjvrijn
    Member

    Hey,

    I’m currently working on the design of a PCB in Nazca and I have the situation that I have two ribbons with a pitch of 150 um, a width of 75 um and 30 traces close to the chip and I want to connect those to one ribbon with a pitch of 500 um, a width of 300 um and 60 traces. My question is twofold:

    How do I add ribbons to my design? I’ve seen it demonstrated once, but I’ve forgot the syntax.

    Is it currently possible to connect two ribbons that aren’t equal or is there a smart way to create that possibility?

    #5711
    Ronald
    Keymaster

    Dear mjbvrijn,

    As of Nazca 0.5.4 a waveguide in a specific layer inside a xsection can be defined by providing the left edge and right edge of the waveguide independently. Multiple of such guides can be defined inside a single xsection. The edge is define by y = a*w+b, as clarified in the picture below. Parameter w is the width setting of the xsection.

    As long as you can describe an edge of by a single y = a*w +b statement, a standard inteconnect taper will work for a case as you describe, as shown in the next example. Note that a and b parameters for an edge are provided as tuples (a, b) via the keywords leftedge and rightedge:

    import nazca as nd
    
    xs = nd.add_xsection(name='GSG')
    nd.add_layer(name='L1', layer=1)
    nd.add_layer2xsection(xsection='GSG', leftedge=(0.5, 0), rightedge=(-0.5, 0), layer='L1')
    nd.add_layer2xsection(xsection='GSG', leftedge=(3.5, 0), rightedge=(1.5, 0), layer='L1')
    nd.add_layer2xsection(xsection='GSG', leftedge=(-1.5, 0), rightedge=(-3.5, 0),layer='L1')
    
    tr = nd.interconnects.Interconnect(xs='GSG', width=3.0, radius=40)
    
    tr.strt(length=40).put(0)
    tr.taper(length=20, width2=6.0).put()
    tr.strt(length=40, width=6.0).put()
    
    nd.export_plt()

    If you start with the dimension on the left (y1) and right (y2) side of the taper in the above example you can find a and b of an edge as follows:

    y1 = a1 * w1 + b1

    y2 = a2 * w2 + b2

    and solve for y1 =  y2

    This gives

    a = (y1 – y2) / (w1 – w2)

    b = (y2*w1 – y1*w2) / (w1 – w2)

    and note that the widths w1 and w2 can be considered scaling numbers instead of actual widths of a guide in the xsection.

    Ronald

    #5712
    mbjvrijn
    Member

    Dear Ronald,

    As I understand it you are proposing to use the definition of the xsection to create a large ribbon that can have nicely defined taper. I’ve tried to use this, but I don’t think you can change the pitch of the ribbon in this way and it’s a bit challenging to connect this to the rest of the circuit.

    import nazca as nd
    
    xs = nd.add_xsection(name='GSG')
    nd.add_layer(name='L1', layer=1)
    n_ribbon=20
    for i in range(0,n_ribbon):
        nd.add_layer2xsection(xsection='GSG', leftedge=(1.5-n_ribbon+2*i, 0), rightedge=(0.5-n_ribbon+2*i, 0), layer='L1')
    
    tr = nd.interconnects.Interconnect(xs='GSG', width=3.0, radius=40)
    
    tr.strt(length=40).put(0)
    tr.taper(length=20, width2=6.0).put()
    tr.strt(length=40, width=6.0).put()
    
    nd.export_plt()

    At the moment I’m using a slightly scruffy method that only works because I’m working in metals that only use 1 layer, where I use a polygon to define a taper based on the pin information.

    import nazca as nd
    
    xs = nd.add_xsection(name='metal_strt')
    nd.add_layer(name='L1', layer=1)
    nd.add_layer2xsection(xsection='metal_strt', leftedge=(0.5, 0), rightedge=(-0.5, 0), layer='L1')
    ic=nd.interconnects.Interconnect(xs='metal_strt', width=3.0, radius=40)
    
    in_wg=ic.strt(10).put(0,0)
    out_wg=ic.strt(length=10,width=20.0).put(30,20)
    
    width_in=in_wg.pin['b0'].width
    x_in=in_wg.pin['b0'].xya()[0]
    y_in=in_wg.pin['b0'].xya()[1]
    
    width_out=out_wg.pin['a0'].width
    x_out=out_wg.pin['a0'].xya()[0]
    y_out=out_wg.pin['a0'].xya()[1]
    
    nd.Polygon(layer=1,points=[(x_in,y_in+width_in/2),(x_in,y_in-width_in/2),(x_out,y_out-width_out/2),(x_out,y_out+width_out/2)]).put(0,0)
    
    nd.export_gds()

    For now this works. If you were suggesting something else and I misinterpreted your code, I’d be happy with a cleaner solution.

    Kind regards

    #5714
    Ronald
    Keymaster

    Dear mbjvrijn,

    The shape in your second code sample

    can be reproduced using the relations for a and b in my previous post. In the code below I took y1 and y2 from the output of your code. The centre line of the interconnect lies at y=0.

    import nazca as nd
    
    # get (a, b) for the left and right edge:
    def get_edge(y1, y2):
        w1 = 1.0 # w1 and w2 can be chosen arbitrary, but not the same
        w2 = 2.0
        a = (y1 - y2) / (w1 - w2)
        b = (y2*w1 - y1*w2) / (w1 - w2)
        return a, b
    
    al, bl = get_edge(y1=1.5, y2=30)
    ar, br = get_edge(y1=-1.5, y2=10)
    
    # The actual xsection definition:
    
    xs = nd.add_xsection(name='metal_strt')
    nd.add_layer(name='L1', layer=1)
    nd.add_layer2xsection(xsection='metal_strt', leftedge=(al, bl), rightedge=(ar, br), layer='L1')
    ic = nd.interconnects.Interconnect(xs='metal_strt', width=1.0, radius=40) # reuse w1 value from (a, b) calc.
    
    ic.strt(10).put(0)
    ic.taper(20, width2=2.0).put() # reuse w2 value from the (a, b) calculation
    ic.strt(10, width=2.0).put()
    
    nd.export_plt()

    Ronald

    #5825
    Ronald
    Keymaster

    Dear mbjvrjn,

    A tutorial on this topic has been added in xsections and layers

    Ronald

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