From f7364f551c10af67d644867baf55b95780a81592 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Wed, 27 Jul 2022 16:25:10 -0400 Subject: [PATCH 1/7] Register the layer stack handler within a new design called Multiplanar. --- qiskit_metal/designs/design_multiplanar.py | 102 ++++++++++++++++++ .../toolbox_metal/layer_stack_handler.py | 16 +-- .../resources/layer_stack_data_example.csv | 4 +- 3 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 qiskit_metal/designs/design_multiplanar.py diff --git a/qiskit_metal/designs/design_multiplanar.py b/qiskit_metal/designs/design_multiplanar.py new file mode 100644 index 000000000..883048e6e --- /dev/null +++ b/qiskit_metal/designs/design_multiplanar.py @@ -0,0 +1,102 @@ +# -*- 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 type +geometry. Supports tek file approach for layer stack definitions.""" + +#from typing import Tuple + +from qiskit_metal.designs.design_base import QDesign +from qiskit_metal.toolbox_metal.layer_stack_handler import LayerStackHandler +from addict import Dict + +__all__ = ['DesignMulti'] + + +class MultiPlanar(QDesign): + """Metal class for a planar (2D) design, consisting of a single plane chip. + 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 information + self.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_z + self._uwave_package[ + 'sample_holder_bottom'] = '1650um' # how tall is the vacuum below z=0 + + def _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). + """ + return LayerStackHandler(self) + + def _add_chip_info(self): + """ + + # GDSPY 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['qubit_chip'] = Dict() + self._chips.qubit_chip.size = Dict( + center_x='0.0mm', + center_y='0.0mm', + size_x='9mm', + size_y='7mm', + ) + + self._chips['main'] = Dict() + + self._chips['main']['size'] = Dict( + center_x='0.0mm', + center_y='0.0mm', + size_x='9mm', + size_y='7mm', + ) diff --git a/qiskit_metal/toolbox_metal/layer_stack_handler.py b/qiskit_metal/toolbox_metal/layer_stack_handler.py index 1d89954ea..40fa78fb0 100644 --- a/qiskit_metal/toolbox_metal/layer_stack_handler.py +++ b/qiskit_metal/toolbox_metal/layer_stack_handler.py @@ -51,13 +51,13 @@ def __init__(self, # 'chip_name', 'layer', 'datatype', 'material', 'thickness', # 'z_coord', 'fill' # ] - self.layer_stack_default = Dict(chip_name=['main'], - layer=[1], - datatype=[0], - material=['pec'], - thickness=['2um'], - z_coord=['0um'], - fill=['true']) + self.layer_stack_default = Dict(chip_name=['main', 'main'], + layer=[1, 3], + datatype=[0, 0], + material=['pec', 'silicon'], + thickness=['2um', '-750um'], + z_coord=['0um', '0um'], + fill=['true', 'true']) self._init_dataframe() @@ -166,6 +166,8 @@ def is_layer_unique(self) -> bool: This method is not so relevant, since layers can have datatype entries. Thus there can be rows with same layer number. """ + + #TODO Check for each layer, confirm that every datatype is unique. return self.ls_df['layer'].is_unique def _read_csv_df(self, abs_path: str) -> None: diff --git a/tutorials/resources/layer_stack_data_example.csv b/tutorials/resources/layer_stack_data_example.csv index 808d8412d..4bde6db87 100644 --- a/tutorials/resources/layer_stack_data_example.csv +++ b/tutorials/resources/layer_stack_data_example.csv @@ -1,5 +1,3 @@ chip_name,layer,datatype,material,thickness,z_coord,fill 'main',1,0,'pec','2um','0um','True' -'main',3,0,'silicon','-500um','0um','True' -'qubit_chip',2,0,'pec','2um','100um','True' -'qubit_chip',4,0,'silicon','500um','102um','True' \ No newline at end of file +'main',3,0,'silicon','-500um','0um','True' \ No newline at end of file From 8b04a71e410bd290e5f6aa906fb52340857904f6 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Wed, 27 Jul 2022 17:07:13 -0400 Subject: [PATCH 2/7] Add error checking for sane data in the input file. --- .../toolbox_metal/layer_stack_handler.py | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/qiskit_metal/toolbox_metal/layer_stack_handler.py b/qiskit_metal/toolbox_metal/layer_stack_handler.py index 40fa78fb0..06a6511bf 100644 --- a/qiskit_metal/toolbox_metal/layer_stack_handler.py +++ b/qiskit_metal/toolbox_metal/layer_stack_handler.py @@ -161,14 +161,22 @@ def get_properties_for_layer_datatype( result.append(props[item]) return tuple(result) - def is_layer_unique(self) -> bool: - """Check to sort on layer number make sure they are unique. - This method is not so relevant, since layers can have datatype entries. - Thus there can be rows with same layer number. + def is_layer_data_unique(self) -> bool: + """For each layer number make sure the datatypes are unique. A layers can + #have multiple datatypes. + + Returns: + bool: True if empty dataframe, True if for each layer, there is ONLY one datatype. Otherwise, False. """ + layer_nums = self.get_unique_layer_ints() + if layer_nums: + for num in layer_nums: + mask = self.ls_df['layer'] == num + search_result_num = self.ls_df[mask] + if not search_result_num.datatype.is_unique: + return False - #TODO Check for each layer, confirm that every datatype is unique. - return self.ls_df['layer'].is_unique + return True def _read_csv_df(self, abs_path: str) -> None: #ASSUME that self.filename_csv_df is valid file path and name. @@ -192,6 +200,15 @@ def get_unique_chip_names(self) -> set: result = set(names.str.strip('\'')) return result + def get_unique_layer_ints(self) -> set: + """Get a set of unique layer ints used in the layer_stack dataframe. + + Returns: + set: Unique layer numbers used in the layer stack used as either default or provided by user. + """ + layers = self.ls_df['layer'] + return set(layers.unique()) + def _warning_properties(self, properties: list): """_Give warning if the properties is From 2906fb8500f9e47fc7963e6bac8500f0d1922bb7 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Wed, 27 Jul 2022 17:25:59 -0400 Subject: [PATCH 3/7] Force a check during init for sane data. --- qiskit_metal/designs/__init__.py | 11 +++++++++++ qiskit_metal/toolbox_metal/layer_stack_handler.py | 2 ++ 2 files changed, 13 insertions(+) diff --git a/qiskit_metal/designs/__init__.py b/qiskit_metal/designs/__init__.py index 7c3322129..a8b65eabe 100644 --- a/qiskit_metal/designs/__init__.py +++ b/qiskit_metal/designs/__init__.py @@ -41,6 +41,16 @@ DesignPlanar + +MultiPlanar +--------------- + +.. autosummary:: + :toctree: ../stubs/ + + MultiPlanar + + DesignFlipChip --------------- @@ -71,6 +81,7 @@ from .. import is_design from .design_base import QDesign from .design_planar import DesignPlanar +from .design_multiplanar import MultiPlanar from .design_flipchip import DesignFlipChip from .net_info import QNet from .interface_components import Components diff --git a/qiskit_metal/toolbox_metal/layer_stack_handler.py b/qiskit_metal/toolbox_metal/layer_stack_handler.py index 06a6511bf..013171975 100644 --- a/qiskit_metal/toolbox_metal/layer_stack_handler.py +++ b/qiskit_metal/toolbox_metal/layer_stack_handler.py @@ -60,6 +60,7 @@ def __init__(self, fill=['true', 'true']) self._init_dataframe() + self.is_layer_data_unique() def _init_dataframe(self) -> None: """Must check if filename for layerstack is valid before trying to import to a pandas table. @@ -174,6 +175,7 @@ def is_layer_data_unique(self) -> bool: mask = self.ls_df['layer'] == num search_result_num = self.ls_df[mask] if not search_result_num.datatype.is_unique: + self.logger.warning(f'There WILL BE PROBLEMS since layer {num} does not have unique datatypes.') return False return True From 0a31ad9b82708f3f3e7ec4e1234b3e75d83459d4 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Wed, 27 Jul 2022 17:43:44 -0400 Subject: [PATCH 4/7] Use yapf formattting. --- qiskit_metal/toolbox_metal/layer_stack_handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qiskit_metal/toolbox_metal/layer_stack_handler.py b/qiskit_metal/toolbox_metal/layer_stack_handler.py index 013171975..82a5e8f57 100644 --- a/qiskit_metal/toolbox_metal/layer_stack_handler.py +++ b/qiskit_metal/toolbox_metal/layer_stack_handler.py @@ -175,7 +175,9 @@ def is_layer_data_unique(self) -> bool: mask = self.ls_df['layer'] == num search_result_num = self.ls_df[mask] if not search_result_num.datatype.is_unique: - self.logger.warning(f'There WILL BE PROBLEMS since layer {num} does not have unique datatypes.') + self.logger.warning( + f'There WILL BE PROBLEMS since layer {num} does not have unique datatypes.' + ) return False return True From 8311c380b1d218605445347b01cb64d17939ed9f Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Thu, 28 Jul 2022 14:01:29 -0400 Subject: [PATCH 5/7] Update docstring and have chip information match example in resources directory. --- qiskit_metal/designs/design_multiplanar.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/qiskit_metal/designs/design_multiplanar.py b/qiskit_metal/designs/design_multiplanar.py index 883048e6e..428698531 100644 --- a/qiskit_metal/designs/design_multiplanar.py +++ b/qiskit_metal/designs/design_multiplanar.py @@ -24,7 +24,7 @@ class MultiPlanar(QDesign): - """Metal class for a planar (2D) design, consisting of a single plane chip. + """Metal class for a multiple planar design, consisting of either single or multiple chips. Typically assumed to have some CPW geometries. Inherits QDesign class. @@ -84,14 +84,6 @@ def _add_chip_info(self): NOTE: self._chips dict comes from QDesign base class. """ - self._chips['qubit_chip'] = Dict() - self._chips.qubit_chip.size = Dict( - center_x='0.0mm', - center_y='0.0mm', - size_x='9mm', - size_y='7mm', - ) - self._chips['main'] = Dict() self._chips['main']['size'] = Dict( From 2b4d2dc6ad2ef57485136e3c78fc1a26b8533774 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Fri, 29 Jul 2022 12:42:34 -0400 Subject: [PATCH 6/7] Improve doc-strings syntax. --- qiskit_metal/designs/design_multiplanar.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qiskit_metal/designs/design_multiplanar.py b/qiskit_metal/designs/design_multiplanar.py index 428698531..8fda4f962 100644 --- a/qiskit_metal/designs/design_multiplanar.py +++ b/qiskit_metal/designs/design_multiplanar.py @@ -76,11 +76,11 @@ def _add_layer_stack(self) -> LayerStackHandler: return LayerStackHandler(self) def _add_chip_info(self): - """ + """Used to determine size of fill box by either 'size' data or box_plus_buffer. - # GDSPY 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. + GDSPY 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. """ From 6271cf6b89142416bcd2f80fb98c0bdb3e2e27f6 Mon Sep 17 00:00:00 2001 From: Priti A Shah Date: Mon, 1 Aug 2022 14:07:05 -0400 Subject: [PATCH 7/7] Update name to reflect the name of class. --- qiskit_metal/designs/design_multiplanar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit_metal/designs/design_multiplanar.py b/qiskit_metal/designs/design_multiplanar.py index 8fda4f962..176045760 100644 --- a/qiskit_metal/designs/design_multiplanar.py +++ b/qiskit_metal/designs/design_multiplanar.py @@ -20,7 +20,7 @@ from qiskit_metal.toolbox_metal.layer_stack_handler import LayerStackHandler from addict import Dict -__all__ = ['DesignMulti'] +__all__ = ['MultiPlanar'] class MultiPlanar(QDesign):