luceda ipkiss教程 49:以pcell的方式定义线路

在ipkiss中,通常以i3.Circuit来设计线路(见教程2),以i3.Pcell的框架也可以来设计线路:
以SplitterTree为例:

在这里插入图片描述
线路仿真结果:
在这里插入图片描述
所有代码如下:

from si_fab import all as pdk
import ipkiss3.all as i3

class SplitterTree(i3.PCell):
    class Layout(i3.LayoutView):
        def _generate_instances(self, insts):
            insts += i3.place_and_route(
                insts={
                    "splitter1": pdk.MMI1x2Optimized1550(),
                    "splitter2": pdk.MMI1x2Optimized1550(),
                    "splitter3": pdk.MMI1x2Optimized1550(),
                },
                specs=[
                    i3.Place('splitter1', (0, 0)),
                    i3.Place('splitter2', (100, -30)),
                    i3.Place('splitter3', (100, 30)),
                ]
            )
            insts = i3.place_and_route(
                insts=insts,
                specs=[
                    i3.ConnectBend("splitter1:out1", "splitter2:in1", bend_radius=10),
                    i3.ConnectBend("splitter1:out2", "splitter3:in1", bend_radius=10),
                ]
            )
            return insts

        def _generate_ports(self, ports):
            ports += i3.expose_ports(
                instances=self.instances,
                port_name_map={
                    "splitter1:in1": "in1",
                    "splitter2:out1": "out1",
                    "splitter2:out2": "out2",
                    "splitter3:out1": "out3",
                    "splitter3:out2": "out4",
                }
            )
            return ports

    class Netlist(i3.NetlistFromLayout):
        pass

    class CircuitModel(i3.CircuitModelView):
        def _generate_model(self):
            return i3.HierarchicalModel.from_netlistview(self.netlist_view)


if __name__ == '__main__':
    SplitterTree().Layout().visualize(annotate=True)
    import numpy as np
    from matplotlib import pyplot as plt

    wavelengths = np.linspace(1.5, 1.6, 2001)
    cm = SplitterTree().CircuitModel()
    S = cm.get_smatrix(wavelengths=wavelengths)
    plt.plot(wavelengths, i3.signal_power_dB(S["out1", "in1"]), label="in1 -> out1")
    plt.plot(wavelengths, i3.signal_power_dB(S["out2", "in1"]), label="in1 -> out2")
    plt.plot(wavelengths, i3.signal_power_dB(S["out3", "in1"]), label="in1 -> out3")
    plt.plot(wavelengths, i3.signal_power_dB(S["out4", "in1"]), label="in1 -> out4")
    plt.plot(wavelengths, i3.signal_power_dB(S["in1", "in1"]), label="in1 -> in1")
    plt.legend()
    plt.xlabel("Wavelengths [um]")
    plt.ylabel("Transmission")
    plt.show()

以pcell的方式定义线路需要分别定义:Layout、Netlist 以及CircuitModel

Layout给出线路的版图:

    class Layout(i3.LayoutView):
        def _generate_instances(self, insts):
            insts += i3.place_and_route(
                insts={
                    "splitter1": pdk.MMI1x2Optimized1550(),
                    "splitter2": pdk.MMI1x2Optimized1550(),
                    "splitter3": pdk.MMI1x2Optimized1550(),
                },
                specs=[
                    i3.Place('splitter1', (0, 0)),
                    i3.Place('splitter2', (100, -30)),
                    i3.Place('splitter3', (100, 30)),
                ]
            )
            insts = i3.place_and_route(
                insts=insts,
                specs=[
                    i3.ConnectBend("splitter1:out1", "splitter2:in1", bend_radius=10),
                    i3.ConnectBend("splitter1:out2", "splitter3:in1", bend_radius=10),
                ]
            )
            return insts

        def _generate_ports(self, ports):
            ports += i3.expose_ports(
                instances=self.instances,
                port_name_map={
                    "splitter1:in1": "in1",
                    "splitter2:out1": "out1",
                    "splitter2:out2": "out2",
                    "splitter3:out1": "out3",
                    "splitter3:out2": "out4",
                }
            )
            return ports

Netlist 给出线路中的逻辑连接关系:
layout中定义了ports,Netlist可以直接从Layout继承

class Netlist(i3.NetlistFromLayout):
        pass

CircuitModel 给出线路中的逻辑连接关系:
线路中的每个器件都有了CircuitModel,所有整个线路的CircuitModel可以通过HierarchicalModel来定义

class CircuitModel(i3.CircuitModelView):
        def _generate_model(self):
            return i3.HierarchicalModel.from_netlistview(self.netlist_view)

线路仿真:

	import numpy as np
    from matplotlib import pyplot as plt
    wavelengths = np.linspace(1.5, 1.6, 2001)
    cm = SplitterTree().CircuitModel()
    S = cm.get_smatrix(wavelengths=wavelengths)
    plt.plot(wavelengths, i3.signal_power_dB(S["out1", "in1"]), label="in1 -> out1")
    plt.plot(wavelengths, i3.signal_power_dB(S["out2", "in1"]), label="in1 -> out2")
    plt.plot(wavelengths, i3.signal_power_dB(S["out3", "in1"]), label="in1 -> out3")
    plt.plot(wavelengths, i3.signal_power_dB(S["out4", "in1"]), label="in1 -> out4")
    plt.plot(wavelengths, i3.signal_power_dB(S["in1", "in1"]), label="in1 -> in1")
    plt.legend()
    plt.xlabel("Wavelengths [um]")
    plt.ylabel("Transmission")
    plt.show()

线路仿真结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CIDR(无类域间路由)与VLSM(可变长度子网掩码)的区别

CIDR和VLSM的介绍 CIDR CIDR(Classless Inter-Domain Routing,无类域间路由)是一种用于对互联网协议(IP)地址进行聚合和分配的标准。CIDR的引入旨在解决IPv4地址空间的不足和低效分配的问题。在传统的IP地址规划中&a…

《Java已死、前端已凉》:真相与焦虑的辩证

文章目录 Java 企业级支柱Java 在企业级应用中的地位后端开发的支柱Java生态系统的强大 前端:蓬勃发展的创新引擎新技术的涌现用户体验的重要性 Java的演进与创新云原生时代的 Java开发效率和生态系统 前端技术的未来走向WebAssembly 的崛起可访问性和国际化的重要性…

FPGA巩固基础:秒表的设计

设计要求: 6位8段数码管,低三位显示毫秒计数,最高位显示分钟,其余两位显示秒计数。 开始案件与暂停按键,复位按键直接全部归零。 扩展部分:每计满一次,led移位一次。 框图设计: …

功能测试转向自动化测试 。10 年 心路历程——愿测试人不再迷茫

十年测试心路历程: 由于历史原因,大部分测试人员,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测试工具,比如抓包,数据库,linux 等。 我大学学的计算机专业&#…

AI创作系统ChatGPT网站源码+搭建部署教程文档,AI绘画,支持TSS GPT语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

利用有限制通配符来提升API的灵活性

在Java中,有限制通配符(bounded wildcard)允许你在泛型中指定一个范围,从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子: 假设有一个简单的…

本地生活服务商被清退怎么办,仅需多来客一套系统就可恢复业务

除了区域服务商,今年全国本地生活服务商全军覆没。只怪某本地生活服务平台韭菜割的太快。专割服务商的韭菜。从公示的数据来看今年至少没收服务商的保证金高达近四个亿,这是什么概念?! 最近的一文公告更是除了区域服务商&#xf…

【Oracle】创建表

目录 方法一:CREATE TABLE 语法 创建表示例1:创建stuinfo(学生信息表) 创建表示例2:添加stuinfo(学生信息表)约束 方法二:CREATE TABLE AS 语法 创建表示例3: 创建表示例4:实现对select查询的结果进行…

flowable之三 启动一个流程并跟踪

1. 背景介绍 当我们部署一个流程并启动后,Flowable会按照既定流程定义及进行节点处理以及自动流转,从一个节点执行到下一个节点,直至结束。在此过程中,系统如何处理BPMN XML文件?节点如何进行流转?本文对f…

「Swift」Xcode多Target创建

前言:我们日常开发中会使用多个环境,如Dev、UAT,每个环境对应的业务功能都不同,但每个环境之间都只存在较小的差异,所以此时可以使用创建多个Target来实现,每个Target对应这个一个App,可以实现一…

离散型概率密度函数的分布列⇔分布函数

目录 一、super误区 1.分布函数的定义 二、分布列⇒分布函数 二、分布列⇐分布函数 一、super误区 我在读定义的时候陷入了一个误区,与大家分享一下。 1.分布函数的定义 由于是离散型的概率密度函数,我把他抽象到数轴上理解: 如下分布…

【教3妹学编程-算法题】反转二叉树的奇数层

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:“你不是真正的快乐, 你的…

Python求小于m的最大10个素数

为了找到小于m的最大10个素数&#xff0c;我们首先需要确定m的值。然后&#xff0c;我们可以使用一个简单的算法来检查每一个小于m的数字是否是素数。 下面是一个Python代码示例&#xff0c;可以找到小于m的最大10个素数&#xff1a; def is_prime(n): if n < 1: …

JAVA 反射

JAVA 反射 动态语言 动态语言&#xff0c;是指程序在运行时可以改变其结构&#xff1a;新的函数可以引进&#xff0c;已有的函数可以被删除等结构上的变化。比如常见的 JavaScript 就是动态语言&#xff0c;除此之外 Ruby,Python 等也属于动态语言&#xff0c;而 C、C则不属于…

【Idea】SpringBoot项目中,jar包引用冲突异常的排查 / SM2算法中使用bcprov-jdk15to18的报错冲突问题

问题描述以及解决方法&#xff1a; 项目中使用了bcprov-jdk15to18 pom依赖&#xff0c;但是发现代码中引入的版本不正确。 追溯代码发现版本引入的是bcprov-jdk15on&#xff0c;而不是bcprov-jdk15to18&#xff0c;但是我找了半天pom依赖也没有发现有引入bcprov-jdk15on依赖。…

JMeter下载与安装

文章目录 前言一、安装java环境&#xff08;JDK下载与安装&#xff09;二、JMeter下载三、JMeter安装1.解压缩2.配置环境变量 四、JMeter启动&#xff08;启动成功则代表JMeter安装成功&#xff09;五、JMeter汉化&#xff08;将JMeter修改成中文&#xff09;1.方法一&#xff…

MFC画折线图,基于x64系统

由于项目的需要&#xff0c;需要画一个折线图。 传统的Teechart、MSChart、HighSpeedChart一般是只能配置在x86系统下&#xff0c;等到使用x64系统下运行就是会报出不知名的错误&#xff0c;这个地方让人很苦恼。 我在进行配置的过程之中&#xff0c;使用Teechart将x86配置好…

卫星影像5天一更新的地图网站

如果全球影像每5天一更新&#xff0c;并集多种地图数据源于一体的PB级海量地图数据该怎样去管理呢&#xff1f; 这是当我了解到SOAR网站之后&#xff0c;思考过的一个问题。 全球最大的在线地图网站 在SOAR的官方网站&#xff0c;据称它是世界上最大的在线地图网站。 它是集…

大数据Doris(三十六):Duplicate 模型(冗余模型)介绍

文章目录 Duplicate 模型(冗余模型)介绍 一、创建doris表 二、插入数据

Unity中Batching优化的GPU实例化整理总结

文章目录 前言一、GPU Instancing的支持1、硬件支持2、Shader支持3、脚本支持 二、我们来顺着理一下GPU实例化的使用步骤1、GPU实例化前的C#代码准备2、在 appdata 和 v2f 中定义GPU实例化ID3、在顶点着色 和 片元着色器 设置GPU Instance ID&#xff0c;使实例化对象顶点位置正…