From 81522e73a256b957b6d68fe923c52dc83d317eab Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sun, 25 Oct 2020 11:42:25 +0100 Subject: [PATCH] New technology helpers createBL & setEnclosures. --- crlcore/python/CMakeLists.txt | 5 +- crlcore/python/helpers/technology.py | 86 ++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 crlcore/python/helpers/technology.py diff --git a/crlcore/python/CMakeLists.txt b/crlcore/python/CMakeLists.txt index 0cf5d1b9..a4735263 100644 --- a/crlcore/python/CMakeLists.txt +++ b/crlcore/python/CMakeLists.txt @@ -1,6 +1,7 @@ install( FILES helpers/__init__.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) install( FILES helpers/io.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) - install( FILES helpers/analogtechno.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) - install( FILES helpers/overlay.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) install( FILES helpers/utils.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) + install( FILES helpers/overlay.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) + install( FILES helpers/analogtechno.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) + install( FILES helpers/technology.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) diff --git a/crlcore/python/helpers/technology.py b/crlcore/python/helpers/technology.py new file mode 100644 index 00000000..c718860f --- /dev/null +++ b/crlcore/python/helpers/technology.py @@ -0,0 +1,86 @@ +# -*- mode:Python -*- +# +# This file is part of the Coriolis Software. +# Copyright (c) SU 2020-2020, All Rights Reserved +# +# +-----------------------------------------------------------------+ +# | C O R I O L I S | +# | Alliance / Hurricane Interface | +# | | +# | Author : Jean-Paul Chaput | +# | E-mail : Jean-Paul.Chaput@lip6.fr | +# | =============================================================== | +# | Python : "./crlcore/helpers/technology.py" | +# +-----------------------------------------------------------------+ + +""" +Some helpers to create or load a technology and it's libraries. +""" + +from __future__ import print_function +from Hurricane import DataBase, Library, BasicLayer + + +__all__ = [ 'safeGetLibrary', 'createBL', 'setEnclosures' ] + + +def safeGetLibrary ( frameworkName, libName ): + """ + Return the library named ``libName`` if it already exists, + or create it if needed. To avoid potential collision, design + kits libraries should not be created directly under the DataBase + root library but be grouped under a common technology library, + in this case ``CM018``. + """ + db = DataBase.getDB() + tech = db.getTechnology() + frameLib = db.getRootLibrary().getLibrary( frameworkName ) + if frameLib is None: + frameLib = Library.create( db.getRootLibrary(), frameworkName ) + lib = frameLib.getLibrary( libName ) + if lib is None: + lib = Library.create( frameLib, libName ) + return lib + + +def createBL ( tech, layerName, material, size=None, spacing=None, gds2Layer=None, gds2DataType=0 ): + """ + Create a new BasicLayer. Parameters ``tech``, ``layerName`` and ``material`` + are mandatory. + + :param tech: The technology the basic layer will be part of. + :param layerName: The name of the layer. + :param material: The kind of layer, see BasicLayer.Material. + :param size: The minimal size (i.e. width). + :param spacing: The minimal distance, edge to edge between two wires. + :param gds2layer: The GDSII layer number (for the GDSII driver). + :param gds2DataType: The GDSII DataType (i.e purpose). + """ + layer = BasicLayer.create( tech, layerName, BasicLayer.Material(material) ) + if size is not None: + layer.setMinimalSize( size ) + if spacing is not None: + layer.setMinimalSpacing( spacing ) + if gds2Layer is not None: + layer.setGds2Layer ( gds2Layer ) + layer.setGds2Datatype( gds2DataType ) + return layer + + +def setEnclosures ( layer, subLayer, enclosures ): + """ + Set horizontal & vertical enclosure for a given ``subLayer`` in a + composite ``layer`` (typically a ViaLayer). If ``enclosures`` is a + number, both H/V will be set to that same value. If it is a tuple + (a pair), then the first value is horizontal and the seconf is + vertical. + """ + if isinstance(enclosures,tuple): + henclosure = enclosures[0] + venclosure = enclosures[1] + else: + henclosure = enclosures + venclosure = enclosures + layer.setEnclosure( subLayer, henclosure, Layer.EnclosureH ) + layer.setEnclosure( subLayer, venclosure, Layer.EnclosureV ) + return