luceda ipkiss教程 71:统计线路中器件的个数

**案例分享:**统计线路中某一器件的个数
如,统计SplitterTree中mmi的个数:
在这里插入图片描述
在这里插入图片描述
所有代码如下:

# Copyright (C) 2020 Luceda Photonics

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


class GeneralizedSplitterTree(i3.Circuit):
    splitter = i3.ChildCellProperty(doc="Splitter used.")
    n_levels = i3.PositiveIntProperty(default=3, doc="Number of tree levels.")
    spacing_x = i3.PositiveNumberProperty(default=100.0, doc="Horizontal spacing between the splitter levels.")
    spacing_y = i3.PositiveNumberProperty(default=50.0, doc="Vertical spacing between the splitters in the last level.")

    def _default_splitter(self):
        return pdk.MMI1x2Optimized1550()  # try changing this to the y-junction in the si_fab PDK

    def _default_insts(self):
        insts = {}

        # 1.  Using nested for loops we can add all the splitters we need for the circuit, as well as name them
        # according to their position (level) in the circuit. Also note that the splitter is a parameter, so we could
        # easily replace all the MMIs with different MMIs or a y-splitter with just one change to the code.

        for level in range(self.n_levels):
            for splitter_no in range(2 ** level):
                insts[f"sp_{level}_{splitter_no}"] = self.splitter
        return insts

    def _default_specs(self):
        specs = []

        # 2. Placing the MMIs is fairly straight forward, using local variables of x and y coordinates to help improve
        # the readability of the code. The "y-coord" in particular is not obvious, however the coordinate is derived
        # from the level and number in each level due to the relationship between each MMI. Again we use nested for
        # loops to achieve this.

        for level in range(self.n_levels):
            for splitter in range(2 ** level):
                x_coord = level * self.spacing_x
                y_coord = self.spacing_y * (
                        -0.5 * 2 ** (self.n_levels - 1) + ((splitter + 0.5) * 2 ** (self.n_levels - level - 1))
                )
                specs.append(i3.Place(f"sp_{level}_{splitter}", (x_coord, y_coord)))

        # 3. For each MMI there are two output ports that need connecting. We decide how best to do this, using
        # "splitter % 2" which returns the remainder from dividing by 2. This will be 0 for even numbers and non-zero
        # for odd numbers. In this way we can separate the two outputs correctly.
        # In the level loop we start at 1, but then subtract 1 during the naming as the final level will not have any
        # connections.

        for level in range(1, self.n_levels):
            for splitter in range(2 ** level):
                if splitter % 2 == 0:
                    in_port = f"sp_{level - 1}_{int(splitter / 2)}:out1"
                else:
                    in_port = f"sp_{level - 1}_{int(splitter / 2)}:out2"
                out_port = f"sp_{level}_{splitter}:in1"
                specs.append(i3.ConnectBend(in_port, out_port))
        return specs

    def _default_exposed_ports(self):
        # 4. In the same way we can expose the ports in the circuit. By default, all unconnected ports would be exposed,
        # but we want to rename them for simplicity.

        exposed_ports = {"sp_0_0:in1": "in"}  # adding the input port
        cnt = 1  # we use a local variable to keep track of how many output we have labeled
        level = self.n_levels - 1
        n_splitters = 2 ** level
        for splitter in range(n_splitters):  # looping over the output ports
            exposed_ports[f"sp_{level}_{splitter}:out1"] = f"out{cnt}"
            cnt += 1
            exposed_ports[f"sp_{level}_{splitter}:out2"] = f"out{cnt}"
            cnt += 1
        return exposed_ports


if __name__ == "__main__":
    splitter_tree1 = GeneralizedSplitterTree(n_levels=5, splitter=pdk.MMI1x2Optimized1550())
    splitter_tree1_layout = splitter_tree1.Layout()
    splitter_tree1_layout.visualize()

    component_counted = pdk.MMI1x2Optimized1550()
    num_mmi = sum(1 for elems in splitter_tree1.Layout().layout if component_counted.name in elems.reference.name)
    print(num_mmi)

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

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

相关文章

手机恢复出厂设置会怎么样?一切回到了原点?

随着智能手机的普及,我们每天都在与手机紧密互动,里边存储了大量的个人信息和应用数据。然而,有时候我们会遇到手机卡顿、应用崩溃或数据丢失的问题。这时,恢复出厂设置成为了许多人的选择。那么,手机恢复出厂设置会怎…

专项技能训练五《云计算网络技术与应用》实训8-1:建立基于OpenvSwitch的GRE隧道

文章目录 建立基于OpenvSwitch的GRE隧道1. 使用VMware安装2个CentOS 7虚拟机,安装时记得都开启CPU虚拟化,第一台命名为“Docker”,第二台命名为“KVM”。2. 安装完虚拟机后,进入虚拟机,修改网络配置(onboot…

数据序列包分析

基于数据序列包分析各部分的内容及含义,可能会考大题 基于本例分析,每部分含义如下: 时间(Time): 时间戳显示了数据包在网络中被捕获的具体时间。在本例中,如"0.000000"表示第一个数据…

Golang | Leetcode Golang题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; func sortColors(nums []int) {p0, p2 : 0, len(nums)-1for i : 0; i < p2; i {for ; i < p2 && nums[i] 2; p2-- {nums[i], nums[p2] nums[p2], nums[i]}if nums[i] 0 {nums[i], nums[p0] nums[p0], nums[i]p0}} }

共用nacos造成的开发问题记录

目录 1.需求提出 2.系统架构 3.问题抛出 4.解决办法 1.配置私有命名空间 2.给服务加后缀 1.需求提出 本地调试用到哪个服务启动哪个服务&#xff0c;其他支持服务调用测试环境上的&#xff0c;目的是避免本地启动多个服务&#xff0c;消耗电脑配置。 2.系统架构 项目是…

im(即时通讯)是什么?

在当今数字化时代&#xff0c;即时通讯&#xff08;IM&#xff09;已经成为企业内部沟通与协作中不可或缺的工具。作为一种实时的即时通讯方式&#xff0c;IM能够极大提高团队成员之间的沟通效率&#xff0c;帮助企业快速响应变化&#xff0c;并增强内部协作与创新能力。 Work…

猫不仅吃猫粮,还可以吃这种食物,这些主食冻干喵吃了会开心哦

随着科学养猫的普及&#xff0c;主食冻干喂养越来越受欢迎&#xff0c;主食冻干喂养对猫的好处很多&#xff0c;它符合猫咪的天性&#xff0c;可以提供全面的营养&#xff0c;保持牙齿和牙龈的健康&#xff0c;还有助于维持健康的消化系统。所以铲屎官们不要在局限只给猫咪喂猫…

无需设置环境变量,Linux下最正确的Java离线安装方式

背景 公司研发网络是离线环境&#xff0c;需要安装Java环境&#xff0c;网上教程大多是在线安装或者通过设置环境变量安装&#xff0c;设置环境变量的方式是最常见的&#xff0c;但确隐藏了很多坑&#xff0c;例如环境变量有时候会不生效&#xff0c;如果你的程序通过systemd启…

6 7 8 9 11 12 15 17 18 20 22cm散热风扇防护网风扇金属网罩

品牌&#xff1a;威驰 颜色分类&#xff1a;60mm/6cm金属网,80mm/8cm金属网,92mm/9.2cm金属网,110mm/11cm金属网,120mm/12cm金属网,150mm/15cm金属网,172mm/17.2cm金属网,200mm/20cm金属网,280mm/28cm金属网 1产品参数&#xff0c;防护网罩60 80 90 110 120 125 145 150 180…

46.乐理基础-音符的组合方式-延音线

以四分音符为一拍的时候想要某个音符的时长为1.25拍的时候&#xff0c;没法表示出来&#xff0c;使用普通的音符、加了附点、或复附点的音符就是没办法表示出1.25拍。 最后一种组合音符拍号的记号&#xff0c;延音线&#xff0c;如下图&#xff0c;以四分音符为一拍&#xff0…

打造高效协作的领导班子:实践与策略

随着市场竞争的加剧&#xff0c;高效协作的领导班子对于组织的成功至关重要。本文旨在从实践与策略两个维度&#xff0c;深入剖析如何构建并优化高效协作的领导班子&#xff0c;进而提升组织的整体效能。 一、引言 在快速变化的时代背景下&#xff0c;领导班子的高效协作成为组…

从项目开始学习Vue——02(若依框架)

往期&#xff1a; 从项目开始学习Vue——01 目录标题 一、基础插件&#xff08;一&#xff09;路由Vue Router&#xff08;二&#xff09;导航守卫&#xff08;路由拦截器&#xff09;二、Vuex&#xff08;一&#xff09;什么是VuexVuex的部分介绍内容&#xff1a; &#xff08…

LabVIEW学习记录4-局部变量、全局变量、共享变量

【LabVIEW】局部变量、全局变量、共享变量 一、变量定义二、内存分配三、竞争状态四、变量创建及简单使用示例4.1 局部变量4.1.1 局部变量的创建4.1.2 局部变量的编程实例 4.2 全局变量4.2.1 创建4.2.2 调用4.2.3 编程实例 4.3 共享变量 一、变量定义 LabVIEW&#xff08;Labor…

Spring Boot与RSocket实现高效实时数据通信

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

LeetCode-2960. 统计已测试设备【数组 模拟】

LeetCode-2960. 统计已测试设备【数组 模拟】 题目描述&#xff1a;解题思路一&#xff1a;模拟解题思路二&#xff1a; 一次遍历&#xff0c;简洁写法解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages &#xf…

这套英文可视化界面,真的在UI设计上给我很多启发。

设计师在追求高颜值的英文可视化UI界面时&#xff0c;可以从以下几个方面获取启发&#xff1a; 1. 布局与排版&#xff1a; 观察一些知名的英文可视化UI界面&#xff0c;可以启发设计师对于页面布局和文本排版的设计。例如&#xff0c;可以关注页面元素的对齐方式、间距设置、…

2024高安全个人密码本程序源码,贴身密码管家-随机密码备忘录二代密码

项目概述&#xff1a; 在这个网络高度发展的时代&#xff0c;每个人都需要上网&#xff0c;而上网就不可避免地需要使用账号和密码。 在众多账号的情况下&#xff0c;你是否还在为复杂难记的密码感到烦恼&#xff1f;现在只需要记录一次&#xff0c; 就可以随时查看你的密码…

前端笔记-day02

文章目录 01-无序列表02-有序列表03-定义列表04-表格06-表格-合并单元格07-表单-input08-表单-input占位文本09-表单-单选框10-表单-上传多个文件11-表单-多选框12-表单-下拉菜单13-表单-文本域14-表单-label标签15-表单-按钮16-无语义-span和div17-字体实体19-注册登录页面 01…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法&#xff0c;每个key都可以寻址到对应的服务器&#xff0c;比如&#xff0c;查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A&#xff0c;如图所示。 但如果服务器数量发生变化&#x…

嵌入式人工智能是一个怎样的概念呢?

嵌入式人工智能将会是未来几年人工智能发展的主要方向之一&#xff0c;并且会伴随着一系列的职位和角色的出现。虽然目前还没有嵌入式人工智能的确切定义&#xff0c;但随着人工智能的不断发展&#xff0c;它势必会延伸到边缘、终端和嵌入式市场。 嵌入式人工智能具有速度快、功…