PhotoCAD
  • Introduction
    • PhotoCAD Introduction
      • fnpcell
      • link
  • Installation
    • Installing PhotoCAD
      • System Requirement
      • Install Python IDE and Python package
      • Install PhotoCAD
      • PhotoCAD file structure
  • PhotoCAD Hands-on
  • gpdk (generic PDK)
    • Components: gpdk built-in components
      • Passive components
      • Active components
    • Examples: gpdk built-in examples
    • Routing: gpdk built-in routing method
    • Technology: gpdk-related process setting
      • Default process
      • Customized process
      • Waveguide information
    • layout01: Project Development
  • fnpcell
    • Definition of each component class in fnpcell
      • Full script
      • Section Script Description
    • The use of classes in fnpcell (generating components)
      • Section Script Description
    • Example of using fnpcell to build class
      • Example1: bend_bezier.py
        • Full script
        • Section Script Definition
      • Example2: bend_circular.py
        • Full script
        • Section Script Definition
    • Design Rule Check(DRC)
      • Generate SVRFTM template
      • Generate DRC template files using SVRFTM templates
        • Full script
        • Section Script Definition
      • Using DRC template files
      • Format instructions
    • Writing a user-defined PCell in PhotoCAD
      • Import module
      • Define RingResonator
      • Define RingResonator2
      • Create examples(layout units) using classes RingResonator and RingResonator2
      • GDS Layout

Guides

  • Create a Parametrized Cell(PCell)
    • Create shapes and boundaries
      • fp.el API
        • fp.el
      • fp.g API
        • fp.g
    • Default values for PCell Parameters
      • Ways to implement default values for PCell parameter
    • Define Ports/Pins
      • Ports/Pins from existing PCells
      • Manually adding Ports/Pins
        • Full Script
        • Section Script Description
        • View the layout
    • Generate array of cells
      • new_array
        • Full script
        • Section Script Description
        • Export GDS Layout
    • List of gpdk components
      • BendEuler
        • Full script
        • Section Script Description
        • Extend PCells from BendEuler
        • Export GDS Layout
      • Taper
        • Full script
        • Section Script Description
        • Extension of the taper ports
      • Splitter
        • Full Script
        • Section Script Description
        • Run the script and view the layout
      • Directional Coupler Bend
        • Full script
        • Parameter description
      • Ring filter
        • Full script
        • Parameters and testing descriptions
      • Elliptical Rings
        • Full script
        • fp.el.Ring Description
        • fp.el.EllipticalRing Description
      • Phase Shifter
        • Full script
        • Segment Description
          • 1. Import function module
          • 2. Main function
          • 3. Define function
      • Sampler Periodic
        • Full script
        • Left graph
        • Right graph
      • Mach-Zehnder modulator
        • Full Script
        • Section Script Description
        • Export GDS Layout
      • Grating Coupler with linecap
        • Full script
          • Section Script Description
          • Run the script and view the layout
  • Create a CUSTOM PDK
    • technology
      • layers.csv
      • waveguide factory.py
        • Straight
        • CircularBend
        • Implementation
      • wg.py
        • waveguide configuration
        • Define parameters in each waveguide types
        • Generate waveguide class
        • Generate wg information to csv file
      • auto_transition.py
        • Create transition components
        • Set up transition settings
        • Example
      • auto_link.py
        • LESS_TRANS
        • MAX_SWG
        • Usage
      • linker.py
    • components
      • Straight
      • bend_circular
      • Taper
      • Transition
      • grating_coupler
      • MMI
    • Standard Procedure
      • technology
        • layers.csv
        • waveguide factory.py
          • Straight
          • CircularBend
          • Implementation
        • wg.py
          • waveguide configuration
          • Define parameters in each waveguide types
          • Generate waveguide class
          • Generate wg information to csv file
        • auto_transition.py
          • Create transition components
          • Set up transition settings
          • Example
        • auto_link.py
          • LESS_TRANS
          • MAX_SWG
          • Usage
        • linker.py
      • components
        • Straight
        • bend_circular
        • Taper
        • Transition
        • grating_coupler
        • MMI
  • Design a circuit
    • Common used transformation
      • place
      • translated
      • scaled
      • rotated
      • mirrored
    • Waveguide Routing
      • Single-port to Single-port
        • Examples
      • Multi-port to Multi-port
        • fp.Linked example ( Recommendation★★★ )
        • fp.create_links example ( Recommendation★★★★★ )
      • Routing Path Selection
        • waylines
          • Absolute control points provided
          • Relative control points provided
        • waypoints
        • target_length
    • Electrical wire Routing
      • Link Electrical Pad
        • Full script
        • Parameters and testing descriptions
        • Connections
          • Top connection
          • Middle connection
          • Bottom connection
      • Link Electrical pad with turning angle
        • Full script
        • Parameters and testing description
          • Components positioning
    • Advanced Waveguide Routing
      • Routing in batch form
        • Components Scan
          • Full script
          • Section Script Definition
        • Importing python libraries and functional modules of PhotoCAD
        • Define device adaptation, fiber coupling, constant fiber coupler and several other classes
        • Define the batch class Block
        • Define Alignment
        • Define Title
        • Define Blank
        • Define method to get the port center
        • Define methods for obtaining module content
        • Define CompScan
        • Define CompScanBuilder
        • Create the component and export the layout
          • Script Description
          • GDS Layout
      • Extension of the ports
      • Extended
        • Full script
        • Section Script Definition
          • Create extended ports and export layout
        • GDS Layout
      • Expand the footprint for downstream devices
      • HFanout
        • Full script
        • Section Script Definition
          • Importing libraries and modules
          • Define HFanout
          • Create components and export layouts
        • GDS Layout
      • Horizontalization of device ports
      • Horizontalized
        • Full script
        • Section Script Definition
          • Create horizontalized components ports and export layouts
        • GDS Layout
      • LinkBetween
        • Import function module
        • Main function
        • Define function
        • Test for waypoints in LinkBetween
      • Routing automation between components ports
        • Linked
          • Full Script
          • Section Script Description
        • AutoTransitioned
      • LinkSmooth
        • Full script
    • Design rule check(DRC)
      • What is DRC?
        • Exclusion
        • Inclusion
        • Minimum_width
      • DRC check in KLayout
        • View designs in KLayout
        • Import DRC file to KLayout
        • View design rule errors
        • Make adjustments or waive the error
      • Examples files to test your knowledge
  • Post Layout Simulation
    • Component level simulation model
      • WGModel class
      • Script description
      • Other simulation models
    • MZI post-simulation
      • Full script
      • Build simulation models for WG, DC
      • Implement simulation models to components
      • Build MZI circuit and define poet-simulation functions
      • Generate GDS file and run post-simulation
  • Useful function when scripting PhotoCAD
    • Placing PCell ports
    • Get PCell information
      • Get PCell name
      • Get PCell region
      • Get ports information
      • Get two points relative information
    • Boolean operations between elements and layers
      • Boolean with different layers
      • Boolean with elements
    • Importing/Exporting GDS/Json file
      • Import GDS file
      • Export GDS file
      • Export Json file
    • Simplify layout by fp.use_sketch_view
      • Implement fp.use_sketch_view
      • Different usage of fp.use_sketch_view
      • GDS file build-time results
      • Example Scripts
    • Manually add ports/pins on PCells
    • Get the coordinates of the cell
    • Change the cell name in GDS file
      • Cell naming rules
    • Pytest: Prevent unexpected changes to the layout
      • Accidental modification of PCell with completed design
      • Accidental modification of other shared methods
    • Max-Optics simulation interface: runner.py
      • Interface usage:
      • Interface script description:
  • Quick Start: Create a Circuit
    • Step 1: Build basic building blocks
      • Bend
      • Straight
      • Taper
    • Step 2: Build basic circuits with basic building blocks
      • DirectionalCoupler
      • MMI
    • Step 3: Build complex circuits using basic building blocks
      • target_length
      • waypoints
      • waylines
    • Step 4: Drawing of common shapes and layout design by Boolean operations
      • Commonly_used_shape
        • Rectangle
        • Circle
        • Polygon
        • Ring
        • Regular_Polygon
      • Boolean_operation
        • OR
        • AND
        • NOT
        • XOR
        • Examples
    • Step 5: Example(MMI Tree)

Examples

  • Programmable Photonic Integrated Circuit
    • Part I. Building a Rectangular Network
    • Part II. Parameter Description
    • Part III. Test Description
    • Part IV. Summary
  • Triangle MZI mesh
    • Part I. Build MZI units
    • Part II. Build programmable triangular MZI mesh
      • MZI Mesh with 8 external optical ports (MZI_triangle_mesh)
      • MZI Mesh with 8 Grating Couplers (MZI_triangle_mesh_with_GC)
      • Triangle MZI array (MZI_triangle_array)
  • Demultiplexer
    • Full script
    • View GDS layout file
    • Instantiation of components
    • Testing and Analysis
    • Get Pcells information via get
    • Summary
  • Cascaded Mach-Zehnder (CMZ) wavelength filter
    • Implement simulation models for auto-link
    • Wavelength Splitters
    • CMZ wavelength demultiplexer
  • Visualize in Jupyter Notebook
    • MZI circuit layout generation in Jupyter notebook
      • Create a Jupyter Notebook
      • Code cell & Markdown cell
      • Generate MZI layout

Support and Changelog

  • fnpcell API
    • Commonly used interface
      • Graphics
      • Routing
      • Transform
      • Information
    • PCell Parameters
      • Classes
      • AnchorParam
      • BooleanParam
      • DegreeParam
      • DeviceParam
      • FloatParam
      • IParam
      • IntParam
      • LayerParam
      • ListParam
      • MappingParam
      • MetalLineTypeParam
      • NameListParam
      • NameParam
      • NonNegFloatParam
      • NonNegIntParam
      • Param
      • PointsParam
      • PortOptionsParam
      • PositionParam
      • PositiveFloatParam
      • PositiveIntParam
      • SetParam
      • TextParam
      • TransformParam
      • WaveguideTypeParam
  • Release notes
    • PhotoCAD V1.5.0
    • PhotoCAD V1.6.0
  • Frequently Asked Questions
    • Data Compression
    • Smooth curve for routing using bend_factory
    • Differences between __post_pcell_init__ & __post_init__
  • About Us
PhotoCAD
  • Design a circuit
  • Electrical wire Routing
  • Link Electrical pad with turning angle
  • View page source

Link Electrical pad with turning angle

Full script

from fnpcell import all as fp
from gpdk import all as pdk
from gpdk.technology import get_technology

@dataclass(frozen=True)
class CircularBendFactory:
    radius: float = 80
    def __call__(self, central_angle: float):
        bend = fp.g.CircularBend(radius=self.radius, radians=central_angle)
        return bend, self.radius

@fp.pcell_class()

class LinkedElec2(fp.PCell):
    # fmt: off

    def build(self):
        insts, elems, ports = super().build()
        TECH = get_technology()
        pad_w = pdk.BondPad(pad_width=120, pad_height=60)
        pad = pdk.BondPad(pad_width=60, pad_height=60)
        start_pads_0 = [
            pad_w.translated(-110, -30),
            pad_w.translated(20, -30),
            pad_w.translated(260, -30),
            pad.translated(560, -30),
            pad_w.translated(660, -30),
            pad.translated(760, -30),
            pad.translated(830, -30),
            pad.translated(900, -30),
            pad.translated(970, -30),
        ]
        start_pads_1 = [
            pad.translated(-70, 120),
            pad.translated(60, 120),
            pad_w.translated(170, 120),
            pad_w.translated(360, 120),
            pad_w.translated(490, 120),
            pad.translated(600, 120),
            pad.translated(720, 120),
            pad.translated(780, 120),
            pad.translated(850, 120),
            pad.translated(920, 120),
            pad.translated(990, 120),
        ]

        end_pads_c0 = [
            # center
            pad_w.translated(1220, 1200),
            pad_w.translated(1680, 1200),
        ]

        end_pads_t0 = [
            # top
            pad.translated(2200, 2210),
            pad.translated(2200, 2140),
            pad.translated(2200, 2070),
            pad.translated(2200, 2000),
        ]

        end_pads_b0 = [
            # bottom
            pad_w.rotated(degrees=90).translated(2340, 840),
            pad_w.rotated(degrees=90).translated(2200, 740),
            pad.translated(2270, 645),
            pad.translated(2200, 610),
            pad.translated(2270, 575),
            pad.translated(2200, 540),
            pad.translated(2270, 505),
            pad.translated(2340, 470),
            pad.translated(2410, 435),
            pad.translated(2480, 400),
            pad.translated(2270, 365),
            pad.translated(2340, 330),
            pad.translated(2410, 295),
            pad.translated(2480, 260),

        ]

        to = fp.Waypoint
        MT = "ep_0"
        M2_20 = TECH.METAL.M2.W20
        MT_20 = TECH.METAL.MT.W20
        M2_40 = TECH.METAL.M2.W40
        MT_40 = TECH.METAL.MT.W40
        M2_80 = TECH.METAL.M2.W80
        MT_80 = TECH.METAL.MT.W80

        # fitting_function_80 = None
        # fitting_function_20 = None
        fitting_function_80 = TECH.FITTING_FUNCTION.Stubbed(stub_width=80, stub_right_angle=False)
        fitting_function_20 = TECH.FITTING_FUNCTION.Stubbed(stub_width=20, stub_right_angle=False)
        # fitting_function_80 = TECH.FITTING_FUNCTION.Stubbed(stub_width=80, stub_right_angle=True)
        # fitting_function_20 = TECH.FITTING_FUNCTION.Stubbed(stub_width=20, stub_right_angle=True)
        # fitting_function_80 = TECH.FITTING_FUNCTION.SmoothCircular(radius=80)
        # fitting_function_20 = TECH.FITTING_FUNCTION.SmoothCircular(radius=20)
        device = fp.Linked(
            metal_min_distance=150,
            metal_start_distance=150,
            metal_end_distance=150,
            metal_fitting_function=fitting_function_80,
            links=[
                # top
                fp.LinkBetween(
                    start_pads_0[0][MT].with_orientation(degrees=90), end_pads_t0[0][MT].with_orientation(degrees=180),
                    # waypoints=[to(400, 1840, 0), to(500, 1940, 90)],
                    waypoints=[fp.Offset.until_y(1840), fp.Offset.until_x(500)],
                    min_distance=40,
                    metal_line_type=[(0, M2_40), (300, MT_40)],
                ),
                fp.LinkBetween(
                    start_pads_1[0][MT].with_orientation(degrees=90), end_pads_t0[1][MT].with_orientation(degrees=180),
                    waypoints=[to(500, 1780, 0), to(600, 1880, 90)],
                    min_distance=20,
                    metal_line_type=[(0, MT_20)],
                ),
                fp.LinkBetween(
                    start_pads_0[1][MT].with_orientation(degrees=90), end_pads_t0[2][MT].with_orientation(degrees=180),
                    waypoints=[to(600, 1720, 0), to(700, 1820, 90)],
                    min_distance=20,
                    metal_line_type=[(0, M2_40), (300, MT_40)],
                ),
                fp.LinkBetween(
                    start_pads_1[1][MT].with_orientation(degrees=90), end_pads_t0[3][MT].with_orientation(degrees=180),
                    waypoints=[to(700, 1680, 0), to(800, 1780, 90) ],
                    min_distance=20,
                    metal_line_type=[(0, MT_20)],
                ),
                # center
                fp.LinkBetween(
                    start_pads_1[2][MT].with_orientation(degrees=90), end_pads_c0[0][MT].with_orientation(degrees=180),
                    metal_line_type=[(0, MT_80)],
                ),
                fp.LinkBetween(
                    start_pads_0[2][MT].with_orientation(degrees=90), end_pads_c0[1][MT].with_orientation(degrees=-90),
                    start_distance=1140,
                    metal_line_type=[(0, M2_80), (300, MT_80)],
                ),
                # bottom
                fp.LinkBetween(
                    start_pads_1[3][MT].with_orientation(degrees=90), end_pads_b0[0][MT].with_orientation(degrees=90),
                    metal_line_type=[(0, MT_80), (-200, M2_80)],
                ),
                fp.LinkBetween(
                    start_pads_1[4][MT].with_orientation(degrees=90), end_pads_b0[1][MT].with_orientation(degrees=90),
                    metal_line_type=[(0, MT_80)],
                ),
                fp.LinkBetween(
                    start_pads_0[3][MT].with_orientation(degrees=90), end_pads_b0[2][MT].with_orientation(degrees=180),
                    metal_line_type=[(0, M2_40), (300, MT_40), (-200, M2_40)],
                ),
                fp.LinkBetween(
                    start_pads_1[5][MT].with_orientation(degrees=90), end_pads_b0[3][MT].with_orientation(degrees=180),
                    metal_line_type=[(0, MT_20)],
                ),
                fp.LinkBetween(
                    start_pads_0[4][MT].with_orientation(degrees=90), end_pads_b0[4][MT].with_orientation(degrees=180),
                    metal_line_type=[(0, M2_40), (300, MT_40), (-200, M2_40)],
                ),
                #
                fp.LinkBetween(
                    start_pads_1[6][MT].with_orientation(degrees=90), end_pads_b0[5][MT].with_orientation(degrees=180),
                    metal_line_type=[(-240, M2_20)],
                ),
                fp.LinkBetween(
                    start_pads_1[7][MT].with_orientation(degrees=90), end_pads_b0[6][MT].with_orientation(degrees=180),
                    # start_distance=90,
                    metal_line_type=[(-200, M2_20)],
                ),
                fp.LinkBetween(
                    start_pads_1[8][MT].with_orientation(degrees=90), end_pads_b0[7][MT].with_orientation(degrees=180),
                    # start_distance=60,
                    metal_line_type=[(-200, M2_20)],
                ),
                fp.LinkBetween(
                    start_pads_1[9][MT].with_orientation(degrees=90), end_pads_b0[8][MT].with_orientation(degrees=180),
                    # start_distance=30,
                    metal_line_type=[(-200, M2_20)],
                ),
                fp.LinkBetween(
                    start_pads_1[10][MT].with_orientation(degrees=90), end_pads_b0[9][MT].with_orientation(degrees=180),
                    metal_line_type=[(-270, M2_20)],
                ),
                #
                fp.LinkBetween(
                    start_pads_0[5][MT].with_orientation(degrees=90), end_pads_b0[10][MT].with_orientation(degrees=-90),
                    start_distance=90,
                    metal_line_type=[(0, M2_20)],
                    fitting_function=fitting_function_20,
                ),
                fp.LinkBetween(
                    start_pads_0[6][MT].with_orientation(degrees=90), end_pads_b0[11][MT].with_orientation(degrees=-90),
                    start_distance=60,
                    metal_line_type=[(0, M2_20)],
                    fitting_function=fitting_function_20,
                ),
                fp.LinkBetween(
                    start_pads_0[7][MT].with_orientation(degrees=90), end_pads_b0[12][MT].with_orientation(degrees=-90),
                    start_distance=30,
                    metal_line_type=[(0, M2_20)],
                    fitting_function=fitting_function_20,
                ),
                fp.LinkBetween(
                    start_pads_0[8][MT].with_orientation(degrees=0), end_pads_b0[13][MT].with_orientation(degrees=-90),
                    start_distance=0,
                    metal_line_type=[(0, M2_20)],
                    fitting_function=fitting_function_20,
                ),
            ],
            ports=[] #[sb10["op_0"], s40["op_1"]],
        )
        insts += device
        # fmt: on
        return insts, elems, ports

if __name__ == "__main__":
    from pathlib import Path
    import gpdk.components.all
    gds_file = Path(__file__).parent / "local" / Path(__file__).with_suffix(".gds").name
    library = fp.Library()
    TECH = get_technology()
    # =============================================================
    # fmt: off
    library += LinkedElec2()
    # fmt: on
    # =============================================================
    fp.export_gds(library, file=gds_file)
    fp.export_pls(library, file=gds_file.with_suffix(".pls"), components=gpdk.components.all)
    fp.plot(library)

Run the full program once to generate the following GDS layout:

../_images/11.1.png

Parameters and testing description

Components positioning

There are a large number of BondPads in the entire layout, but they all consist of two sizes of Bond Pads: pad_w and pad.

pad_w = pdk.BondPad(pad_width=120, pad_height=60)
pad = pdk.BondPad(pad_width=60, pad_height=60)

The following calls to pad_w and pad are made multiple times to generate the BondPad group, and the following comments within the code explain what each part does.

# Create the first set of starting pads
start_pads_0 = [
    pad_w.translated(-110, -30),
    pad_w.translated(20, -30),
    pad_w.translated(260, -30),
    pad.translated(560, -30),
    pad_w.translated(660, -30),
    pad.translated(760, -30),
    pad.translated(830, -30),
    pad.translated(900, -30),
    pad.translated(970, -30),
]
# Create the second set of starting pads
start_pads_1 = [
    pad.translated(-70, 120),
    pad.translated(60, 120),
    pad_w.translated(170, 120),
    pad_w.translated(360, 120),
    pad_w.translated(490, 120),
    pad.translated(600, 120),
    pad.translated(720, 120),
    pad.translated(780, 120),
    pad.translated(850, 120),
    pad.translated(920, 120),
    pad.translated(990, 120),
]
# Create pads for the middle part of the layout
end_pads_c0 = [
    # center
    pad_w.translated(1220, 1200),
    pad_w.translated(1680, 1200),
]
# Create pads for the top part of the layout
end_pads_t0 = [
    # top
    pad.translated(2200, 2210),
    pad.translated(2200, 2140),
    pad.translated(2200, 2070),
    pad.translated(2200, 2000),
]
# Create pads for the bottom part of the layout
end_pads_b0 = [
    # bottom
    pad_w.rotated(degrees=90).translated(2340, 840),
    pad_w.rotated(degrees=90).translated(2200, 740),
    pad.translated(2270, 645),
    pad.translated(2200, 610),
    pad.translated(2270, 575),
    pad.translated(2200, 540),
    pad.translated(2270, 505),
    pad.translated(2340, 470),
    pad.translated(2410, 435),
    pad.translated(2480, 400),
    pad.translated(2270, 365),
    pad.translated(2340, 330),
    pad.translated(2410, 295),
    pad.translated(2480, 260),
]
# Instantiate the waypoint function as to for easy calling
to = fp.Waypoint
# Use MT instead of "ep_0" to facilitate the use of the connection later
MT = "ep_0"
# Call different types and widths of line types for later use when setting metal_line_type
M2_20 = TECH.METAL.M2.W20
MT_20 = TECH.METAL.MT.W20
M2_40 = TECH.METAL.M2.W40
MT_40 = TECH.METAL.MT.W40
M2_80 = TECH.METAL.M2.W80
MT_80 = TECH.METAL.MT.W80

The code below controls the corner of the wiring: if None, the corner is right angle by default. If TECH.FITTING_FUNCTION.Stubbed, the corner is a 45° angle of the specified length. If set the code to TECH.FITTING_FUNCTION.SmoothCircular, the corner becomes a rounded corner with the specified radius.

fitting_function_80 = None
fitting_function_20 = None
# fitting_function_80 = TECH.FITTING_FUNCTION.Stubbed(stub_width=80, stub_right_angle=False)
# fitting_function_20 = TECH.FITTING_FUNCTION.Stubbed(stub_width=20, stub_right_angle=False)
# fitting_function_80 = TECH.FITTING_FUNCTION.Stubbed(stub_width=80, stub_right_angle=True)
# fitting_function_20 = TECH.FITTING_FUNCTION.Stubbed(stub_width=20, stub_right_angle=True)
# fitting_function_80 = TECH.FITTING_FUNCTION.SmoothCircular(radius=40)
# fitting_function_20 = TECH.FITTING_FUNCTION.SmoothCircular(radius=20)

The default right angle is tested first and the following figure is obtained.

../_images/11.2.png

From the above figure, we can see that the corners are right angles, next comment out the None code, open the following two lines of code and run.

fitting_function_80 = TECH.FITTING_FUNCTION.Stubbed(stub_width=80, stub_right_angle=False)
fitting_function_20 = TECH.FITTING_FUNCTION.Stubbed(stub_width=20, stub_right_angle=False)
../_images/11.2.png ../_images/11.3.png

After running it, we can see that it is still a right angle and nothing has changed because stub_right_angle=False, we change it to True and run it once. From the figure below, we can see that the measured length at the center line of the corner are 80 and 20 as set.

../_images/11.5.png

The code below mainly controls the connection of the four groups of pads at the bottom right of the layout, specifying the direction of the two end lines, the starting distance, the type of metal wire and the fitting function, etc. After running, the layout fragment is intercepted and marked with a description.

fp.LinkBetween(
    start_pads_0[5][MT].with_orientation(degrees=90), end_pads_b0[10][MT].with_orientation(degrees=-90),
    start_distance=90,
    metal_line_type=[(0, M2_20)],
    fitting_function=fitting_function_20,
),
fp.LinkBetween(
    start_pads_0[6][MT].with_orientation(degrees=90), end_pads_b0[11][MT].with_orientation(degrees=-90),
    start_distance=60,
    metal_line_type=[(0, M2_20)],
    fitting_function=fitting_function_20,
),
fp.LinkBetween(
    start_pads_0[7][MT].with_orientation(degrees=90), end_pads_b0[12][MT].with_orientation(degrees=-90),
    start_distance=30,
    metal_line_type=[(0, M2_20)],
    fitting_function=fitting_function_20,
),
fp.LinkBetween(
    start_pads_0[8][MT].with_orientation(degrees=0), end_pads_b0[13][MT].with_orientation(degrees=-90),
    start_distance=0,
    metal_line_type=[(0, M2_20)],
    fitting_function=fitting_function_20,
),
../_images/11.7.png

After the testing of the 45° corner is completed, we next test the rounded corners.

fitting_function_80 = TECH.FITTING_FUNCTION.SmoothCircular(radius=80)
fitting_function_20 = TECH.FITTING_FUNCTION.SmoothCircular(radius=20)

Since the radius value is not set properly, the error is reported after running.

We changed 80 to 40 and ran it again, and took the following part of the corners from the layout, from which we can see that the corners are changed from straight lines to smooth rounded shapes.

../_images/11.8.png ../_images/11.9.png

Finally, as shown in the following image segment, different line types appear in the same linked line. Refer to the relevant instructions in the (Link Electrical pad with turning angle) file for details on how to use it.

../_images/11.10.png ../_images/11.11.png
Previous Next

© Copyright 2024, Latitudeds.com.

Built with Sphinx using a theme provided by Read the Docs.