Source code for qiskit_metal.designs.design_multiplanar
# -*- coding: utf-8 -*-# This code is part of Qiskit.## (C) Copyright IBM 2017, 2021.## This code is licensed under the Apache License, Version 2.0. You may# obtain a copy of this license in the LICENSE.txt file in the root directory# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.## Any modifications or derivative works of this code must retain this# copyright notice, and modified files need to carry a notice indicating# that they have been altered from the originals."""Module containing Multi-Planar design for CPW typegeometry. Supports tek file approach for layer stack definitions."""#from typing import Tuplefromqiskit_metal.designs.design_baseimportQDesignfromqiskit_metal.toolbox_metal.layer_stack_handlerimportLayerStackHandlerfromaddictimportDictfromtypingimportTuple__all__=['MultiPlanar']
[docs]classMultiPlanar(QDesign):"""Metal class for a multiple planar design, consisting of either single or multiple chips. Typically assumed to have some CPW geometries. Inherits QDesign class. """def__init__(self,metadata:dict=None,overwrite_enabled:bool=False,enable_renderers:bool=True,layer_stack_filename:str=None):"""Pass metadata to QDesign. Args: metadata (dict, optional): Pass to QDesign. Defaults to {}. overwrite_enabled (bool, optional): Passed to QDesign base class. Defaults to False. enable_renderers (bool, optional): Passed to QDesign base class. Defaults to True. """super().__init__(metadata=metadata,overwrite_enabled=overwrite_enabled,enable_renderers=enable_renderers)#just using the single planar approach for the moment#still have the different chips, or just all via layers?self._add_chip_info()#generates the table for the layer informationself.ls_filename=layer_stack_filename# Note: layers numbers can be repeated since there can be datatypes.self.ls=self._add_layer_stack()self._uwave_package=Dict()self._populate_uwave_values()def_populate_uwave_values(self):"""Can be updated by user. """self._uwave_package['sample_holder_top']='890um'# how tall is the vacuum above center_zself._uwave_package['sample_holder_bottom']='1650um'# how tall is the vacuum below z=0def_add_layer_stack(self)->LayerStackHandler:"""Adds the data structure for the "layer_stack file" in the design for defining the layer stack. Simple initial layer is generated (to support the default layer used in all components). """returnLayerStackHandler(self)def_add_chip_info(self):"""Used to determine size of fill box by either 'size' data or box_plus_buffer. GDSTK is using numbers based on 1 meter unit. When the gds file is exported, data is converted to "user-selected" units. centered at (0,0) and 9 by 6 size. NOTE: self._chips dict comes from QDesign base class. """self._chips['main']=Dict()self._chips['main']['size']=Dict(center_x='0.0mm',center_y='0.0mm',size_x='9mm',size_y='7mm',)
[docs]defget_x_y_for_chip(self,chip_name:str)->Tuple[tuple,int]:"""If the chip_name is in self.chips, along with entry for size information then return a tuple=(minx, miny, maxx, maxy). Used for subtraction while exporting design. Args: chip_name (str): Name of chip that you want the size of. Returns: Tuple[tuple, int]: tuple: The exact placement on rectangle coordinate (minx, miny, maxx, maxy). int: 0=all is good 1=chip_name not in self._chips 2=size information missing or no good """x_y_location=tuple()ifchip_nameinself._chips:if'size'inself._chips[chip_name]:size=self.parse_value(self.chips[chip_name]['size'])if'center_x'insize \
and'center_y'insize \
and'size_x'insize \
and'size_y'insize:iftype(size.center_x)in[int,float]and \
type(size.center_y)in[int,float]and \
type(size.size_x)in[int,float]and \
type(size.size_y)in[int,float]:x_y_location=(size['center_x']-(size['size_x']/2.0),size['center_y']-(size['size_y']/2.0),size['center_x']+(size['size_x']/2.0),size['center_y']+(size['size_y']/2.0))returnx_y_location,0self.logger.warning(f'Size information within self.chips[{chip_name}]["size"]'f' is NOT an int or float.')returnx_y_location,2self.logger.warning('center_x or center_y or size_x or size_y 'f' NOT in self._chips[{chip_name}]["size"]')returnx_y_location,2self.logger.warning(f'Information for size in NOT in self._chips[{chip_name}]'' dict. Return "None" in tuple.')returnx_y_location,2self.logger.warning(f'Chip name "{chip_name}" is not in self._chips dict. Return "None" in tuple.')returnx_y_location,1