luceda ipkiss教程 57:画微环调制器

news2024/12/24 7:50:15

案例分享:画微环调制器
在这里插入图片描述
全部代码如下:

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

class DC(i3.PCell):
    straight_length = i3.PositiveNumberProperty(default=200)
    radius = i3.PositiveNumberProperty(default=50)
    spacing = i3.PositiveNumberProperty(default=1)
    straight_waveguide = i3.ChildCellProperty()
    arc_waveguide = i3.ChildCellProperty()
    trace_template = i3.TraceTemplateProperty(
        default=pdk.SWG450(), doc="The trace template for waveguide and heater"
    )

    def _default_straight_waveguide(self):
        wg = i3.Waveguide(trace_template=self.trace_template)
        wg.Layout(shape=i3.Shape([(0, 0), (self.straight_length, 0)]))
        return wg

    def _default_arc_waveguide(self):
        wg = i3.RoundedWaveguide(trace_template=self.trace_template)
        wg.Layout(shape=i3.ShapeArc(radius=self.radius, start_angle=0, start_face_angle=90, end_angle=180,
                                    end_face_angle=270))
        return wg
    class Layout(i3.LayoutView):
        def _generate_instances(self, insts):
            insts += i3.place_and_route(
                insts={
                    "wg1": self.straight_waveguide,
                    "wg2": self.arc_waveguide,
                },
                specs=[
                    i3.Place("wg1:in", (-self.straight_length / 2, 0)),
                ]
            )
            insts = i3.place_and_route(
                insts=insts,
                specs=[
                    i3.PlaceRelative("wg2:out", "wg1:in",
                                     (self.straight_length / 2 - self.radius, -self.radius - self.spacing))

                ]
            )
            return insts

        def _generate_ports(self, ports):
            ports += i3.expose_ports(
                instances=self.instances,
                port_name_map={
                    "wg1:in": "in1",
                    "wg2:in": "out2",
                    "wg1:out": "out1",
                    "wg2:out": "in2",
                }
            )
            return ports

    class Netlist(i3.NetlistFromLayout):
        pass

class Ring_modulator(i3.Circuit):
    _name_prefix = "Ring_modulator"
    dc = i3.ChildCellProperty()
    heater = i3.ChildCellProperty()
    radius = i3.PositiveNumberProperty(default=50)
    dc_distance = i3.PositiveNumberProperty(default=300)
    heater_length = i3.PositiveNumberProperty(default=100)
    trace_template = i3.TraceTemplateProperty(
        default=pdk.SWG450(), doc="The trace template for waveguide and heater"
    )
    straight_length = i3.PositiveNumberProperty(default=200)
    spacing = i3.PositiveNumberProperty(default=0.8)

    # Set the default value for the heater
    def _default_dc(self):
        return DC(straight_length=self.straight_length,
                  radius=self.radius,
                  trace_template=self.trace_template,
                  spacing=self.spacing)

    def _default_heater(self):
        ht = pdk.HeatedWaveguide(trace_template=self.trace_template)
        ht.Layout(shape=i3.Shape([(0, 0), (self.heater_length, 0)]))
        return ht

    def _default_insts(self):  # element naming
        insts = {
            "heater1": self.heater,
            "heater2": self.heater,
            "dc1": self.dc,
            "dc2": self.dc,
        }
        return insts

    def _default_specs(self):  # coordinate
        specs = [
            i3.Place("dc1", (0.0, 0.0)),
            i3.PlaceRelative("dc2", "dc1", (0.0, -self.dc_distance)),
            i3.FlipV("dc2"),
            i3.Place("heater1", (-self.radius, -self.dc_distance / 2 - self.heater_length / 2), 90),
            i3.Place("heater2", (self.radius, -self.dc_distance / 2 - self.heater_length / 2), 90),
            i3.ConnectManhattan("dc1:in2", "heater1:out"),
            i3.ConnectManhattan("dc1:out2", "heater2:out"),
            i3.ConnectManhattan("dc2:in2", "heater1:in"),
            i3.ConnectManhattan("dc2:out2", "heater2:in"),
        ]
        return specs

    def _default_exposed_ports(self):  # port definition
        exposed_ports = {
                "heater1:elec1": "elec1",
                "heater1:elec2": "elec2",
                "heater2:elec1": "elec3",
                "heater2:elec2": "elec4",
                "dc1:in1": "in1",
                "dc2:in1": "in2",
                "dc1:out1": "out1",
                "dc2:out1": "out2",
        }
        return exposed_ports

if __name__ == "__main__":
    Ring_modulator().Layout().visualize(annotate=True,legacy=True)

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

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

相关文章

推荐系统算法 协同过滤算法详解(二)皮尔森相关系数

目录 前言 协同过滤算法(简称CF) 皮尔森(pearson)相关系数公式 算法介绍 算法示例1: 算法示例2 前言 理解吧同胞们,实在是没办发把wps公式复制到文章上,只能截图了,我服了!!! 协同过滤算法…

基于中文垃圾短信数据集的经典文本分类算法实现

垃圾短信的泛滥给人们的日常生活带来了严重干扰,其中诈骗短信更是威胁到人们的信息与财产安全。因此,研究如何构建一种自动拦截过滤垃圾短信的机制有较强的实际应用价值。本文基于中文垃圾短信数据集,分别对比了朴素贝叶斯、逻辑回归、随机森…

数据结构——排序算法代码实现、包含注释易理解可运行(C语言,持续更新中~~)

一、排序 1.1 直接插入排序 1.1.1 思想 插入排序的核心操作是将待排序元素与已排序序列中的元素进行比较,并找到合适的位置进行插入。这个过程可以通过不断地将元素向右移动来实现。 插入排序的优势在于对于小规模或基本有序的数组,它的性能非常好。…

【经验分享】豆瓣小组的文章/帖子怎么删除?

#豆瓣小组的文章/帖子怎么删除?# 第一步: 手机登录豆瓣app ↓ 点右下角“我” ↓ 然后在页面点击我的小组 ↓ 点我发布的 ↓ ↓ 再任意点开一个帖子 ↓ 在文章和帖子的右上角有一个笔状的图标,切记不是右上角的横三点… ↓ ↓ 最后点下边的…

odoo 一日一技 owl Registry示例 在用户菜单增加开发者模式开关

# 示例介绍 在Odoo中,开发者模式是一个非常有用的工具,它允许开发人员对系统进行调试。如果每次都要去设置中打开调试模式将非常麻烦,上篇文章讲述了如何使用 owl registry,这篇我们来进行实操。 本文将介绍如何在Odoo的用户菜单…

令人感动的创富故事编号001:27岁Python程序员年入$600万+

27岁Python程序员年入$600万 27岁的你,在做什么? 为家庭生计而努力搬砖,辛勤工作? 还是放弃挣扎,选择躺平呢? 当我们还在为未来道路感到困惑之际,年仅27岁的Reilly已经迈向了财富自由的大门…

Socket 文件描述符

文件描述符的作用是什么? 每一个进程都有一个数据结构 task_struct,该结构体里有一个指向「文件描述符数组」的成员指针。该数组里列出这个进程打开的所有文件的文件描述符。数组的下标是文件描述符,是一个整数,而数组的内容是一…

用VR技术让党建“活起来”,打造党建知识科普新体验

随着现在工作、生活的信息化、网络化持续加深,传统的党建科普对年轻党员的吸引力日益降低,不管是面授讲课还是实地观摩的方式,都会受到时间和空间上的限制。因此,VR数字党建的出现为党建知识科普提供了新的可能,VR党建…

STM32 USB CDC协议的应用与优化技巧

STM32微控制器提供了使用USB CDC(Communications Device Class)协议来实现虚拟串口通信的功能。USB CDC协议可以将STM32设备模拟为一个虚拟串口设备,并通过USB接口与计算机进行通信。在本文中,我们将介绍USB CDC协议的应用与优化技…

elment-plus如何引入scss文件实现自定义主题色

elment-plus如何引入scss文件实现自定义主题色!如果您想修改elementPlus的默认主题色调,使用自定义的色调,可以考虑使用官方提供的解决办法。 第一步你需要在项目内安装sass插件包。 npm i sass -D 如图,安装完成后,你…

[pytorch入门] 6. 神经网络

基本介绍 torch.nn: Containers:基本骨架Convolution Layers: 卷积层Pooling layers:池化层Non-linear Activations (weighted sum, nonlinearity):非线性激活Normalization Layers:正则化层 Container…

边缘计算及相关产品历史发展

边缘计算及相关产品历史发展 背景边缘计算的历史CDN(Content Delivery Network)Cloudlet雾计算MEC(Multi-Access Edge Computing,MEC) 边缘计算的现状云计算厂商硬件厂商软件基金会 背景 最近,公司部分业务…

基于springboot+vue的社区医院信息平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

阿赵UE学习笔记——解决UE资源不能正常显示缩略图的问题

阿赵UE学习笔记目录 大家好,我是阿赵。   这里分享一个虚幻引擎使用小技巧。在使用虚幻引擎的过程中,经常会遇到有些资源在重新打开项目的时候,会看不到缩略图,而是显示默认资源的图标: 这个时候,第一种…

应用app的服务器如何增加高并发

增强服务器的高并发能力是现代网络应用非常关键的需求。面对用户数量的不断增长和数据量的膨胀,服务器必须能够处理大量并发请求。以下是一些提高服务器高并发能力的常用方法和具体实施细节: 优化服务器和操作系统配置 服务器和操作系统的默认配置不一定…

快速上手的AI工具-文心一言绘画达人

前言 大家好,现在AI技术的发展,它已经渗透到我们生活的各个层面。对于普通人来说,理解并有效利用AI技术不仅能增强个人竞争力,还能在日常生活中带来便利。无论是提高工作效率,还是优化日常任务,AI工具都可…

【模拟通信】AM、FM等的调制解调

调制相关的概念 调制:控制载波的参数,使载波参数随调制信号的规律变化 已调信号:受调载波,含有调制信号的全部特征 调制的作用: 提高发射效率多路复用,提高信道利用率提高系统抗干扰能力 两种调制方式 线性调制&a…

网络协议与攻击模拟_08DHCP协议

技术学习要了解某项技术能干什么?它的详细内容?发展走向? 一、DHCP协议 1、DHCP基本概念 dhcp动态主机配置协议,广泛应用于局域网内部 主要是为客户机提供TCP/IP 参数(IP地址、子网掩码、网关、DNS等)…

STL第四讲

第四讲 万用Hash Function 左侧的是设计为类并重载调用运算符,右侧是一般函数的形势; 但是右侧形势在创建容器时更麻烦; 具体例子: 第三种形势:struct hash 偏特化形式 tuple 自C03引入; 关于源码解读的…

Linux服务器系统修改SSH端口教程

修改端口号是通过修改SSH的配置文件实现的,在服务器终端先激活root用户,然后输入: vim /etc/ssh/sshd_config找到#Port 22这个位置 键盘按i进入编辑模式 删除掉Port 22前面的#,然后键盘按一下回车键(如果没有#可不必…