首页 > 其他分享 >luceda ipkiss教程 63:器件端口延伸ExtendPorts

luceda ipkiss教程 63:器件端口延伸ExtendPorts

时间:2024-03-18 22:31:45浏览次数:27  
标签:taper i3 spacing width length 63 luceda ipkiss waveguide

案例分享:通过picazzo3库中的ExtendPorts函数实现器件的端口延伸
如:
在这里插入图片描述
所有代码如下:

from si_fab import all as pdk
from ipkiss3 import all as i3
from picazzo3.container.extend_ports import ExtendPorts


# Building the MMI PCell with properties that describe its geometry
class MMI2x2(i3.PCell):
    """MMI with 2 input and 2 outputs."""

    _name_prefix = "MMI2x2"
    trace_template = i3.TraceTemplateProperty(
        doc="Trace template of the access waveguide"
    )
    width = i3.PositiveNumberProperty(default=4.0, doc="Width of the MMI section.")
    length = i3.PositiveNumberProperty(default=20.0, doc="Length of the MMI secion.")
    taper_width = i3.PositiveNumberProperty(default=1.0, doc="Width of the taper.")
    taper_length = i3.PositiveNumberProperty(default=5.0, doc="Length of the taper")
    waveguide_spacing = i3.PositiveNumberProperty(
        default=2.0, doc="Spacing between the waveguides."
    )

    def _default_trace_template(self):
        return pdk.SiWireWaveguideTemplate()

    class Layout(i3.LayoutView):
        def _generate_elements(self, elems):
            length = self.length
            width = self.width
            taper_length = self.taper_length
            taper_width = self.taper_width
            half_waveguide_spacing = 0.5 * self.waveguide_spacing
            core_layer = self.trace_template.core_layer
            cladding_layer = self.trace_template.cladding_layer
            core_width = self.trace_template.core_width

            # Si core
            elems += i3.Rectangle(
                layer=core_layer,
                center=(0.5 * length, 0.0),
                box_size=(length, width),
            )
            elems += i3.Wedge(
                layer=core_layer,
                begin_coord=(-taper_length, -half_waveguide_spacing),
                end_coord=(0.0, -half_waveguide_spacing),
                begin_width=core_width,
                end_width=taper_width,
            )
            elems += i3.Wedge(
                layer=core_layer,
                begin_coord=(-taper_length, half_waveguide_spacing),
                end_coord=(0.0, half_waveguide_spacing),
                begin_width=core_width,
                end_width=taper_width,
            )
            elems += i3.Wedge(
                layer=core_layer,
                begin_coord=(length, half_waveguide_spacing),
                end_coord=(length + taper_length, half_waveguide_spacing),
                begin_width=taper_width,
                end_width=core_width,
            )
            elems += i3.Wedge(
                layer=core_layer,
                begin_coord=(length, -half_waveguide_spacing),
                end_coord=(length + taper_length, -half_waveguide_spacing),
                begin_width=taper_width,
                end_width=core_width,
            )

            # Cladding
            elems += i3.Rectangle(
                layer=cladding_layer,
                center=(0.5 * length, 0.0),
                box_size=(length + 2 * taper_length, width + 2.0),
            )
            return elems

        def _generate_ports(self, ports):
            length = self.length
            taper_length = self.taper_length
            trace_template = self.trace_template
            half_waveguide_spacing = 0.5 * self.waveguide_spacing

            ports += i3.OpticalPort(
                name="in1",
                position=(-taper_length, -half_waveguide_spacing),
                angle=180.0,
                trace_template=trace_template,
            )
            ports += i3.OpticalPort(
                name="in2",
                position=(-taper_length, half_waveguide_spacing),
                angle=180.0,
                trace_template=trace_template,
            )
            ports += i3.OpticalPort(
                name="out1",
                position=(length + taper_length, -half_waveguide_spacing),
                angle=0.0,
                trace_template=trace_template,
            )
            ports += i3.OpticalPort(
                name="out2",
                position=(length + taper_length, half_waveguide_spacing),
                angle=0.0,
                trace_template=trace_template,
            )
            return ports


if __name__ == "__main__":
    port_labels = ["in1", "in2", "out1", "out2"]
    my_container = ExtendPorts(
        contents=MMI2x2(), port_labels=port_labels, auto_transition=True
    )
    layout = my_container.Layout(extension_length=10.0, area_layer_on=False)
    layout.visualize()

通过:

port_labels = ["in1", "in2", "out1", "out2"]

可以选择需要延伸的端口,如;

port_labels = ["in2", "out1"]

在这里插入图片描述

标签:taper,i3,spacing,width,length,63,luceda,ipkiss,waveguide
From: https://blog.csdn.net/qq_34316088/article/details/136824138

相关文章

  • 63. 不同路径 IIc
    intuniquePathsWithObstacles(int**obstacleGrid,intobstacleGridSize,int*obstacleGridColSize){if(obstacleGridSize==0)return0;intm=obstacleGridSize,n=*obstacleGridColSize;int**dp=(int**)malloc(sizeof(int*)*m);for(inti=0;i<m;......
  • 滴水逆向笔记系列-win32总结10-63.IAT HOOK-64.Inline HOOK
    第六十三课IATHOOK这节课得把前面PE部分的IAT表复习好,再来做就简单多了1.IATHOOK是什么其实就是找到IAT表的位置再换成自己定义的函数,只是我们替换的函数需要和原函数的结构保持一直,比如我们要HOOKMessagebox函数,那么我们需要定义一个MyMessagebox函数,他的结构应该与Messa......
  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目链接:园丁的烦恼挺经典的题目,转化成二维数点去做这玩意和常规的偏序计数问题有区别:转化为求\(a\lex\leb\\&\&\c\ley\led\)的数量,这种就别想着拆来拆去了,这种权值类带偏序计数类问题,是经典的可差性问题,我们计:\(ans(x,l,r)\)表示\(t\lex,l\ley\ler\)的数......
  • P2633 Count on a tree 题解
    题目链接:Countonatree大概可以认为是树上主席树的板子我在之前的某些题解提到了,主席树一般来说有两个基本功能:可持久化功能,可以选择回退或者新增版本。对于可差性问题,可以有更好的转化为前缀和做法,常见的问题为权值类型问题。在树上的路径第\(k\)大,显然如果我们能......
  • Educational Codeforces Round 163 A-E
    A.SpecialCharacters构造。形如\(A\)和\(B\)这类单个字符构成的字符串对答案的贡献为\(0\),而\(AA\)和\(AAAA\)这类多个相同字符构成的字符串对答案的贡献固定为\(2\)​,则无法构造出奇数值,由第二类字符串拼接即可构造出偶数值。时间复杂度:\(O(n)\)。#include<bit......
  • Educational Codeforces Round 163 (Rated for Div. 2)
    EducationalCodeforcesRound163(RatedforDiv.2)A-SpecialCharacters解题思路:一个相同的连续段会贡献两个特殊字符,所以答案一定是偶数,找个不同的数分隔开即可。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll......
  • 力扣刷题Days19-637.二叉树的层平均数
    目录1,题目2,代码2.1广度优先遍历2.2深度优先遍历3,学习与总结1,题目给定一个非空二叉树的根节点 root ,以数组的形式返回每一层节点的平均值。2,代码2.1广度优先遍历/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*......
  • 无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模
    本篇文章主要介绍三款无线模块:无线电模块ODIN-W263-06B专为物联网网关应用而设计,QN9080-001-M17Y支持蓝牙和NFC的模块,RS9116W-DB00-AB1多协议无线模块——明佳达1、ODIN-W2系列:具有Wi-Fi和蓝牙双模式(蓝牙BR/EDR和蓝牙低能耗v4.2)描述:ODIN-W2是一款紧凑而强大的独立多无线电模块......
  • 稳定可靠:PW2163降压芯片,实现5V至3.3V/3V高效转换,3A电流稳定输出
    在现代电子设备中,电源管理芯片发挥着至关重要的作用。PW2163作为一款高效稳定的500kHz同步降压DC-DC转换器,凭借其出色的性能和广泛的应用领域,已成为众多电子设备中的电源管理新选择。 一、PW2163的显著特点与优势PW2163具有内部集成低RDS(ON)的主开关和同步开关,这一设计有助于最......
  • RedisCluster集群中的插槽为什么是16384个?
    RedisCluster集群中的插槽为什么是16384个?CRC16的算法原理。1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位,若该位为0左移一位,若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5.重复将所有输入数据操作完成以上步骤......