Whoscored(中国·中文)官网-专注足球数据分析的专业平台

解决方案
PhotoCAD应用—助力快速构建光栅结构

本文旨在使用智能版图设计工具PhotoCAD帮助用户快速创建基于光栅的链路结构,通过工具创建的版图文件支持多种形式导出,从而方便用户后续导入仿真软件作进一步结构验证。并且生成的结构,可以通过脚本快速实现参数修改,真正意义上实现一次创建全流程受益。


1. 光栅简介

光子晶体由周期性结构构成,可以建立光子带隙,从而实现操纵光。目前被广泛应用于微波、光子学等领域,值得关注的是,拓扑光子学就是以光子晶体为基础的热门研究领域。其中,光栅结构作为一维光子晶体结构,其具有结构理论清晰简单、物理理论健全等优势,得到许多科研人员的青睐。光栅结构是由两种折射率不同的材料进行周期性键合从而形成的微腔结构,通过调整两种材料的占空比可以调节有效折射率,为新型的光子器件提供了新的设计思路,并进一步提高了设计纬度。其中,亚波长光栅是指微腔小于波长的光栅结构。


2. 常见光栅结构的版图实现

光栅是一种重要的光学元件,它在各种应用场景中发挥着重要的作用。为了满足不同的需求,光栅的结构设计也有多种类型。本文将介绍三种常见光栅结构的设计方案,包括两端过渡型光栅、常规光栅以及Taper型光栅结构。

 

2.1 两端过渡型光栅

两端过渡型光栅是一种特殊的光栅结构,它通过在光栅的两端引入渐变结构,使得光栅在两端具有平滑的过渡。这种设计可以有效地减少光栅在端面的反射和散射,提高光栅的透过率和成像质量。同时,两端过渡型光栅还可以有效地抑制光学噪声和干扰,提高光学系统的稳定性。两端过渡型光栅结构如图2-1所示。

 

图2-1 两端过渡型光栅结构

  • import mathfrom fnpcell import all as fpfrom typing_extensions import Tuple, List, castfrom gpdk import all as pdkfrom gpdk.technology import get_technologyfrom gpdk.technology.wg.types import CoreCladdingWaveguideTypeclass SWG(fp.PCell):
        """
        Attributes:
            w_length_init default=480
            w_length default=880
            swg_segments default=63
            trans_segments default=9
            swg_width default=120
            swg_period default=232

        Examples:
        SWG = SWG(w_length_init=480, w_length=880, swg_segments=63,trans_segments=9, swg_width=120, swg_period=232)
        """    ## init parameters    swg_segments: int = fp.IntParam(default=63, min=0)
        trans_segments: int = fp.IntParam(default=9, min=0)
        swg_width: float = fp.PositiveFloatParam(default=120)
        w_length: float = fp.PositiveFloatParam(default=880)
        w_length_init: float = fp.PositiveFloatParam(default=480)
        swg_period: float = fp.PositiveFloatParam(default=232)
        wavegide_type: CoreCladdingWaveguideType = fp.WaveguideTypeParam(
            type=CoreCladdingWaveguideType, default=get_technology().WG.FWG.C.WIRE
        )

        def build(self):
            ## initial        insts, elems, ports = super().build()

            ## trans parameters        swg_length = self.swg_period * self.swg_segments + self.swg_width
            trans_length = self.trans_segments * self.swg_period
            swg_dutycycle = self.swg_width / self.swg_period
            w_steplength = (self.w_length - self.w_length_init) / (self.trans_segments - 1)
            w_lengthlist = []
            for i in range(self.trans_segments):
                w_lengthlist.append(self.w_length_init + w_steplength * i)
            for i in range(self.swg_segments):
                w_lengthlist.append(self.w_length)
            for i in range(self.trans_segments):
                w_lengthlist.append(self.w_length - w_steplength * i)

            ## define core area        for i in range(len(w_lengthlist)):
                swg_polygon = fp.el.Rect(
                    width=self.swg_width,
                    height=w_lengthlist[i],
                    layer=self.wavegide_type.core_layer,
                    center=((-(swg_length / 2) - trans_length) + i * self.swg_period, 0),
                )
                elems += swg_polygon

            return insts, elems, ports

2.2 常规光栅

常规光栅是一种常见的光栅结构,它由一系列平行且等间距的狭缝组成。常规光栅具有较高的透过率和分辨率,适用于各种光学应用场景。然而,常规光栅也存在一些缺点,如衍射效应较强、光谱分辨率较低等。为了克服这些缺点,人们不断尝试对常规光栅进行改进和优化。常规光栅结构如图2-2所示,这类光栅可以理解为没有两端过渡的光栅,直接调用上述代码将过渡区段数设置为0即可实现。


图2-2 常规光栅结构

2.3 Taper型光栅

Taper型光栅结构是一种新型的光栅结构,它通过在光栅的一侧引入渐变结构,使得光栅在横向方向上逐渐变窄。这种设计可以有效地抑制衍射效应和提高光谱分辨率。同时,Taper型光栅结构还可以有效地改善光学系统的成像质量,提高光学系统的稳定性。Taper型光栅如图2-3所示,实现手段类似上述方法,不过仅有过渡区。


图2-3 Taper型光栅

  • class TaperSWG(fp.PCell):
        """
        Attributes:
            w_length_init default=480
            w_length default=880
            trans_segments default=20
            swg_width default=120
            swg_period default=232
        Examples:
            TaperSWG=TaperSWG(w_length_init=480, w_length=880, trans_segments=20, swg_width=120, swg_period=232)
        """    ## init parameters    trans_segments: int = fp.IntParam(default=20, min=0)
        swg_width: float = fp.PositiveFloatParam(default=120)
        w_length: float = fp.PositiveFloatParam(default=880)
        w_length_init: float = fp.PositiveFloatParam(default=480)
        swg_period: float = fp.PositiveFloatParam(default=232)
        wavegide_type: CoreCladdingWaveguideType = fp.WaveguideTypeParam(
            type=CoreCladdingWaveguideType, default=get_technology().WG.FWG.C.WIRE
        )

        def build(self):
            ## initial        insts, elems, ports = super().build()

            ## trans parameters        trans_length = self.trans_segments * self.swg_period
            swg_dutycycle = self.swg_width / self.swg_period
            w_steplength = (self.w_length - self.w_length_init) / (self.trans_segments - 1)
            w_lengthlist = []
            for i in range(self.trans_segments):
                w_lengthlist.append(self.w_length_init + w_steplength * i)

            ## define core area        for i in range(len(w_lengthlist)):
                swg_polygon = fp.el.Rect(
                    width=self.swg_width,
                    height=w_lengthlist[i],
                    layer=self.wavegide_type.core_layer,
                    center=((-trans_length) + i * self.swg_period, 0),
                )
                elems += swg_polygon

            return insts, elems, ports

三种常见光栅结构的设计方案各有优缺点,适用于不同的应用场景。在实际应用中,需要根据具体需求选择合适的光栅结构类型,以达到最佳的应用效果。


3. 基于亚波长光栅的偏振分束器

3.1 论文结构展示

为了验证上述光栅结构的通用便捷性,下面以基于亚波长结构光栅的偏振分束器为例,利用 PhotoCAD 工具设计了其版图。其结构示意图如图3-1所示,实际光栅结构过渡区周期为18,稳态周期为63。

 

图3-1 基于SWG的PBS结构示意图[1]

3.2 代码实现



  • import math

  • from fnpcell import all as fp

  • from typing_extensions import Tuple, List, cast

  • from gpdk import all as pdk

  • from gpdk.technology import get_technology

  • from gpdk.technology.wg.types import CoreCladdingWaveguideType

  • from SWG import SWG

  • from SWG import Straight

  • from gpdk.technology.waveguide_factory import EulerBendFactory



  • class PBS_SWG(fp.PCell):

  •     """

  •     Lu Liu, Qingzhong Deng, and Zhiping Zhou, "Manipulation of beat length and wavelength dependence of a polarization beam splitter using a subwavelength grating," Opt. Lett. 41, 5126-5129 (2016)

  •     """


  •     def raw_curve(self, length, anchor):

  •         return fp.g.Line(

  •             length=length,

  •             anchor=anchor,

  •         )


  •     def build(self):


  •         insts, elems, ports = super().build()


  •         ## define MainBody

  •         w_length = 1830e-3

  •         w_length_init = 1430e-3

  •         w_width = 120e-3

  •         width = 500e-3

  •         gap = 230e-3

  •         swg_segments = 63

  •         trans_segments = 9

  •         swg_period = 232e-3

  •         ss = SWG(

  •             w_length_init=w_length_init,

  •             w_length=w_length,

  •             swg_segments=swg_segments,

  •             trans_segments=trans_segments,

  •             swg_width=w_width,

  •             swg_period=swg_period,

  •         )

  •         insts += ss

  •         wg_bottom = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(

  •                 curve=self.raw_curve(

  •                     length=((swg_segments + trans_segments * 4) * swg_period),

  •                     anchor=fp.Anchor.CENTER,

  •                 )

  •             )

  •             .with_ports(["port_1", "port_2"])

  •         )

  •         get_position_x = wg_bottom["port_1"].position[0]

  •         get_position_max = wg_bottom["port_2"].position[0]

  •         wg_bottom = (

  •             wg_bottom["port_1"]

  •             .repositioned(at=(get_position_x, -(width + gap) / 2))

  •             .owner

  •         )

  •         insts += wg_bottom

  •         wg_top = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(

  •                 curve=self.raw_curve(

  •                     length=((swg_segments + trans_segments * 4) * swg_period),

  •                     anchor=fp.Anchor.CENTER,

  •                 )

  •             )

  •             .with_ports(["port_0", "port_3"])

  •         )

  •         wg_top = (

  •             wg_top["port_0"].repositioned(at=(get_position_x, (width + gap) / 2)).owner

  •         )

  •         insts += wg_top

  •         g_wg_tl = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(curve=self.raw_curve(length=50e-3, anchor=fp.Anchor.CENTER))

  •             .with_ports(["port_0", "port_1"])

  •         )

  •         g_wg_tr = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(curve=self.raw_curve(length=50e-3, anchor=fp.Anchor.CENTER))

  •             .with_ports(["port_0", "port_1"])

  •         )

  •         g_wg_bl = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(curve=self.raw_curve(length=50e-3, anchor=fp.Anchor.CENTER))

  •             .with_ports(["port_0", "port_1"])

  •         )

  •         g_wg_br = (

  •             get_technology()

  •             .WG.FWG.C.WIRE(curve=self.raw_curve(length=50e-3, anchor=fp.Anchor.CENTER))

  •             .with_ports(["port_0", "port_1"])

  •         )

  •         g_wg_tl = (

  •             g_wg_tl["port_1"]

  •             .repositioned(at=(get_position_x - 15, (width + gap) / 2 + 5))

  •             .owner

  •         )

  •         g_wg_bl = (

  •             g_wg_tl["port_1"]

  •             .repositioned(at=(get_position_x - 15, -(width + gap) / 2 - 5))

  •             .owner

  •         )

  •         g_wg_tr = (

  •             g_wg_tl["port_0"]

  •             .repositioned(at=(get_position_max + 15, (width + gap) / 2 + 5))

  •             .owner

  •         )

  •         g_wg_br = (

  •             g_wg_tl["port_0"]

  •             .repositioned(at=(get_position_max + 15, -(width + gap) / 2 - 5))

  •             .owner

  •         )


  •         insts += g_wg_tl

  •         insts += g_wg_bl

  •         insts += g_wg_br

  •         insts += g_wg_tr


  •         link1 = fp.LinkBetween(

  •             start=wg_top["port_0"],

  •             end=g_wg_tl["port_1"],

  •             bend_factory=EulerBendFactory(

  •                 radius_min=5, l_max=5, waveguide_type=get_technology().WG.FWG.C.WIRE

  •             ),

  •         )

  •         link2 = fp.LinkBetween(

  •             start=wg_bottom["port_1"],

  •             end=g_wg_bl["port_1"],

  •             bend_factory=EulerBendFactory(

  •                 radius_min=5, l_max=5, waveguide_type=get_technology().WG.FWG.C.WIRE

  •             ),

  •         )

  •         link3 = fp.LinkBetween(

  •             start=wg_bottom["port_2"],

  •             end=g_wg_br["port_0"],

  •             bend_factory=EulerBendFactory(

  •                 radius_min=5, l_max=5, waveguide_type=get_technology().WG.FWG.C.WIRE

  •             ),

  •         )

  •         link4 = fp.LinkBetween(

  •             start=wg_top["port_3"],

  •             end=g_wg_tr["port_0"],

  •             bend_factory=EulerBendFactory(

  •                 radius_min=5, l_max=5, waveguide_type=get_technology().WG.FWG.C.WIRE

  •             ),

  •         )

  •         insts += link1

  •         insts += link2

  •         insts += link3

  •         insts += link4

  •         ports += g_wg_tl["port_0"].with_name("p0")

  •         ports += g_wg_bl["port_0"].with_name("p1")

  •         ports += g_wg_br["port_1"].with_name("p2")

  •         ports += g_wg_tr["port_1"].with_name("p3")

  •         return insts, elems, ports


  • 3.3 结果展示


  • 图3-2 基于亚波长结构的偏振分束器版图

  • 4. 参考文献

  • [1] Lu Liu, Qingzhong Deng, and Zhiping Zhou, "Manipulation of beat length and wavelength dependence of a polarization beam splitter using a subwavelength grating," Opt. Lett. 41, 5126-5129 (2016)


  • 5. 结论

  • 本文利用PhotoCAD工具实现了多种形式的光栅结构创建,利用本文提供的模块(模块代码详讯客服),可以帮助用户便捷快速地创建任意光栅结构。此外,并通过实现基于亚波长结构的偏振分束器进一步证明上述模块的通用便捷性。



XML 地图