luceda ipkiss教程 38:等长波导布线

news2025/1/13 13:39:01

这次介绍通过调整圆弧角度实现等长弯曲波导布线的案例:
在这里插入图片描述
四段波导的长度分别为:
在这里插入图片描述

所有代码如下:

from si_fab import all as pdk
from ipkiss3 import all as i3
class MMI1x4(i3.PCell):
    _name_prefix = "MMI1x4"  # adding a name that will be added to every instance of this class
    trace_template = i3.TraceTemplateProperty(doc="Trace template of the access waveguide.")
    width = i3.PositiveNumberProperty(default=15.0, doc="Width of the MMI section.")
    length = i3.PositiveNumberProperty(default=20.0, doc="Length of the MMI section.")
    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):
            # 2. Similar to the circuit, here we are creating some local variables to improve the readability of
            # the code.

            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, 0.0),
                end_coord=(0.0, 0.0),
                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 * 3),
                end_coord=(length + taper_length, half_waveguide_spacing * 3),
                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,
            )
            elems += i3.Wedge(
                layer=core_layer,
                begin_coord=(length, -half_waveguide_spacing * 3),
                end_coord=(length + taper_length, -half_waveguide_spacing * 3),
                begin_width=taper_width,
                end_width=core_width,
            )

            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

            # 3. Using parameters allows us to place the ports automatically. This is important as otherwise it would
            # be easy to change the geometries of a component but not the ports. This would not raise errors, but the
            # design would not work after fabrication, as you would incur in waveguide misalignments.

            ports += i3.OpticalPort(
                name="in",
                position=(-taper_length, 0.0),
                angle=180.0,
                trace_template=trace_template,
            )
            ports += i3.OpticalPort(
                name="out3",
                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,
            )
            ports += i3.OpticalPort(
                name="out4",
                position=(length + taper_length, -half_waveguide_spacing * 3),
                angle=0.0,
                trace_template=trace_template,
            )
            ports += i3.OpticalPort(
                name="out1",
                position=(length + taper_length, half_waveguide_spacing * 3),
                angle=0.0,
                trace_template=trace_template,
            )
            return ports

    class Netlist(i3.NetlistFromLayout):
        pass

class demo(i3.Circuit):
    _name_prefix = "demo"  # adding a name that will be added to every instance of this class
    mmi = i3.ChildCellProperty()

    def _default_mmi(self):
        return MMI1x4()

    def _default_insts(self):
        def wg(end_angle):
            arc = i3.RoundedWaveguide(trace_template=pdk.SWG450())
            arc.Layout(shape=i3.ShapeArc(radius=50,
                                         start_angle=0,
                                         end_angle=end_angle,
                                         start_face_angle=90,
                                         end_face_angle=end_angle + 90), )
            return arc
        insts = {
            "mmi1": self.mmi.modified_copy(waveguide_spacing=4),
            "mmi2": self.mmi.modified_copy(waveguide_spacing=2),
            "wg1": wg(end_angle=18.0015),
            "wg2": wg(end_angle=19.07135),
            "wg3": wg(end_angle=19.988),
            "wg4": wg(end_angle=20.75-0.00005),
        }
        return insts

    def _default_specs(self):
        specs = []
        specs += [
            i3.Place("mmi1:in", (0, 0)),
            i3.Place("mmi2:in", (200, 0), 0),
            i3.Join("wg1:in", "mmi1:out1"),
            i3.Join("wg2:in", "mmi1:out2"),
            i3.Join("wg3:in", "mmi1:out3"),
            i3.Join("wg4:in", "mmi1:out4"),
            i3.ConnectBend("wg1:out", "mmi2:out4", bend_radius=50),
            i3.ConnectBend("wg2:out", "mmi2:out3", bend_radius=50),
            i3.ConnectBend("wg3:out", "mmi2:out2", bend_radius=50),
            i3.ConnectBend("wg4:out", "mmi2:out1", bend_radius=50),
        ]
        return specs


if __name__ == "__main__":
    demo_layout = demo().Layout()
    l1 = demo().Layout().instances["wg1"].reference.trace_length() + demo().Layout().instances[
        "wg1_out_to_mmi2_out4"].reference.trace_length()
    l2 = demo().Layout().instances["wg2"].reference.trace_length() + demo().Layout().instances[
        "wg2_out_to_mmi2_out3"].reference.trace_length()
    l3 = demo().Layout().instances["wg3"].reference.trace_length() + demo().Layout().instances[
        "wg3_out_to_mmi2_out2"].reference.trace_length()
    l4 = demo().Layout().instances["wg4"].reference.trace_length() + demo().Layout().instances[
        "wg4_out_to_mmi2_out1"].reference.trace_length()
    print(l1)
    print(l2)
    print(l3)
    print(l4)
    demo_layout.visualize()

代码的核心是调整四段圆弧的角度:

"wg1": wg(end_angle=18.0015),
"wg2": wg(end_angle=19.07135),
"wg3": wg(end_angle=19.988),
"wg4": wg(end_angle=20.75-0.00005),

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

事务--02---TCC模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 TCC模式两阶段提交 的模型 1.流程分析阶段一( Try ):阶段二(Confirm):阶段二(Canncel): 2.事…

利用ARCGIS做地下水脆弱性评价分析

(一)行政边界数据、土地利用数据和土壤类型数据 本文所用到的河北唐山行政边界数据、土地利用数据和土壤类型数据均来源于中国科学院资源环境科学与数据中心(https://www.resdc.cn/Default.aspx)。 (二)地…

【shell】正则表达式和AWK

一.正则表达式 通配符匹配文件(而且是已存在的文件) 基本正则表达式扩展正则表达式 可以使用 man 手册帮助 正则表达式:匹配的是文章中的字符 通配符:匹配的是文件名 任意单个字符 1.元字符(字符匹配&…

SAP_ABAP_编程基础_内表_创建内表 / 填充内表 / 读取内表 /修改和删除内表行 / 内表排序 / 创建顺序表 / 比较内表 / 初始化内表

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读470次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform,相信很多朋友也用过,这里再次进行详细分享下。 transform有4个比较常用的功能,总结如下: 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

观海微电子---AF、AG、AR 的差别和作用

一、名称解释及原理 1.AF ---- Anti-fingerprint,中文为抗指纹。一般 SiO2AF 材料(DON,M4、道康宁 AF 材料),一般采用真空蒸发镀膜法。 原理:AF 防污防指纹玻璃是根据荷叶原理,在玻璃外表面涂制…

⭐ Unity + ARKIT ARFace脸部追踪

相比之前的图像物体检测,这脸部检测实现起来会更加的简单。 (1)首先我们先在场景中的物体上添加一个AR Face Mananger组件: (2)以上組件的 Face Prefab所代表的就是脸部的模型也就是覆盖在脸部上面的投影模…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时,CPU在一个时间点只能做一件事,因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基,以时间片的方式分别执行来实现的,只不过实现起来细节比较复…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探…

五、Linux基础软件安装

目录 1、安装JDK 2、安装Mysql 接下来,我们来学习如何在linux上安装JDK和Mysql,安装之前需要在Linux上提前创建三个目录: mkdir -p /export/software #软件包存放目录 mkdir -p /export/server #安装目录 mkdir -p /export/data #数据存放目录…

【Windows】解决Windows11错误0x80190001

1. 安装Fiddler网络调试工具 下载链接:Fiddler Classic 注:获取安装包的过程中可能要获取邮箱信息,但不用验证邮箱,大概是给你的邮箱发广告信息,问题不大。 在“开始”界面找到Fiddler Classic,点击运行…

封装flutter webview页面

例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class MyWebView extends StatefulWidget {const MyWebView({super.key, required this.webViewUrl,…

入门Python+Vue 全栈开发可视化BI数据项目几个要点总结

随着数据的快速增长和业务的复杂性,越来越多的企业开始关注数据分析和可视化。在本文中,我们将介绍如何使用Python和Vue进行全栈开发,构建一个可视化BI数据项目,并总结几个关键要点。 首先,Python是一种强大而灵活的编…

【JAVA面向对象编程】--- 探索子类如何继承父类

🌈个人主页: Aileen_0v0🔥学习专栏: Java学习系列专栏 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 继承的普通成员方法调用 及 普通成员变量修改 构造方法的调用 子类构造方法 继承 package Inherit;class Animal …

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件,它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同,可以将企业软件分为以下几类。 1. 企业资源计划(ERP&#xff09…

rest_framework_django 学习笔记二(视图路由)

rest_framework_django 学习笔记二(视图路由) rest_framwork_django学习笔记一(序列化器) 一、rest framework 中Request 与 Response 1、Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,二是REST Fame…

git解决冲突

记录一次 git 解决冲突的过程。 情况是前一段时间我基于本地的 master 分支上新建了一个分支比如叫做 weight_linear: git checkout -b weight_linear 然后我已经在这个分支上进行了修改并上传到 github 上了,比如: git add . git commit -m "u…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中,我们学习了fork()函数用来创建子进程。 子进程是父进程的副本,复制父进程除代码段以外的其他数据,代码段数据和父进程共享。 子进程的PID与父进程不同: 而创建新进程则不同。 与fork()不同…

传统算法: Pygame 实现深度优先搜索(DFS)

使用 Pygame 模块实现了深度优先搜索(DFS)的动画演示。首先,它通过邻接矩阵表示了一个图的结构,其中每个节点表示一个字符,每个字符的邻居表示与之相邻的节点。然后,通过深度优先搜索算法递归地访问所有节点,过程中通过动画效果可视化每一步的变化。每次访问一个节点,该…