From 55a29488c9e23a01803f89324b9887b14ed5c11d Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 16 Jul 2018 11:32:40 +0200 Subject: [PATCH] Correct handling of lambdas & microns in configuration files. * Bug: In CRL/etc/NODE/VENDOR/Technology.conf, the database must be configured as early has possible so the functions ensuring length conversions can work correctly (l(v), u(v)). So we can no longer rely on a table to be read after the execution of the file. We perform a direct call to the helpers.Technology.initTechno() function. And it must be made first thing. In all tables taking dimensions, we must use one of the converter function helpers.l(v), helpers.u(v) or helpers.n(v) so the the value v get converted in lambda, microns or nanometer (resp.). Make the modifications in all technology.conf and kite.conf files. * Change: In CRL/coriolisInit.py, remove the technoConfig variable that has been replaced by a direct call to helpers.Technology.initTechno(). * Change: In CRL/helpers.Alliance.loadRoutingGaugesTable(), no longer try to convert coordinates, they must already be in DbU. * Change: In CRL/helpers.__init__.py, remove lambdaMode() and micronsMode() they could not be made to work as expected. Create l(), u(), n() as replacement. --- crlcore/etc/180/scn6m_deep_09/kite.conf | 19 +- crlcore/etc/180/scn6m_deep_09/technology.conf | 314 ++++++++++-------- crlcore/etc/45/freepdk_45/kite.conf | 25 +- crlcore/etc/45/freepdk_45/technology.conf | 268 ++++----------- crlcore/etc/common/technology.conf | 169 ++++++++++ crlcore/etc/symbolic/cmos/kite.conf | 21 +- crlcore/etc/symbolic/cmos/technology.conf | 175 ++-------- crlcore/python/coriolisInit.py | 5 +- crlcore/python/helpers/Alliance.py | 18 +- crlcore/python/helpers/Technology.py | 19 +- crlcore/python/helpers/__init__.py | 20 +- 11 files changed, 470 insertions(+), 583 deletions(-) diff --git a/crlcore/etc/180/scn6m_deep_09/kite.conf b/crlcore/etc/180/scn6m_deep_09/kite.conf index 64ebd8ba..d3bf7717 100644 --- a/crlcore/etc/180/scn6m_deep_09/kite.conf +++ b/crlcore/etc/180/scn6m_deep_09/kite.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, u, n # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) @@ -43,17 +44,17 @@ parametersTable = \ routingGaugesTable = {} routingGaugesTable['msxlib'] = \ - ( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 10, 2, 2, 7 ) ) - , ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 10, 4, 2, 8 ) ) - , ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 10, 4, 2, 8 ) ) - #, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 10,10, 2, 8 ) ) + ( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l( 2), l(2), l(7) ) ) + , ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + , ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(10), l( 4), l(2), l(8) ) ) + #, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(10), l(10), l(2), l(8) ) ) ) routingGaugesTable['msxlib-2M'] = \ - ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 10, 2, 2, 7 ) ) - , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 10, 4, 2, 8 ) ) + ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(10), l(2), l(2), l(7) ) ) + , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(10), l(4), l(2), l(8) ) ) ) @@ -62,5 +63,5 @@ routingGaugesTable['msxlib-2M'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['msxlib'] = ('metal2', 10, 100, 10) +cellGaugesTable['msxlib'] = ('metal2', l(10), l(100), l(10)) diff --git a/crlcore/etc/180/scn6m_deep_09/technology.conf b/crlcore/etc/180/scn6m_deep_09/technology.conf index 070c8e57..83b4459d 100644 --- a/crlcore/etc/180/scn6m_deep_09/technology.conf +++ b/crlcore/etc/180/scn6m_deep_09/technology.conf @@ -1,7 +1,9 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- -import helpers -from Hurricane import DbU +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno # The informations here are extracted from the Alliance ".rds" file, # and must be consistent with it. @@ -12,8 +14,6 @@ from Hurricane import DbU # - # - -execfile( helpers.sysConfDir+'/common/technology.conf' ) - # MOSIS SCN6M_DEEP is a portable technology where lengths are expresseds # in symbolic unit (lambda). We only know that the lambda is equal to half @@ -22,14 +22,16 @@ execfile( helpers.sysConfDir+'/common/technology.conf' ) # # We set the foundry grid to .005um and set the gridsPerLambda to 18. -technoConfig = { 'name' : 'scn6m_deep' - , 'precision' : 2 - , 'gridValue' : 0.005 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 18 - , 'symbolicGridStep': 1.0 - , 'polygonStep' : 9.0 - } +initTechno( { 'name' : 'scn6m_deep' + , 'precision' : 2 + , 'gridValue' : 0.005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 18 + , 'symbolicGridStep': 1.0 + , 'polygonStep' : 9.0 + } ) + +execfile( sysConfDir+'/common/technology.conf' ) # Format of : @@ -37,165 +39,187 @@ technoConfig = { 'name' : 'scn6m_deep' # * string: a synthetic way to designate the real or symbolic layer on # which it applies, an optional sub layer (BasicLayer) in case # where there is more than one, and the dimension name. -# * value : the rule (dimension) value. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. + +def scaleUp ( extensionsTable ): + scaled = [] + for entry in extensionsTable: + scaled.append( ( entry[0], 2*entry[1] ) ) + return scaled + +#layersExtensionsTable = \ +# [ ('METAL1.minimalSpacing' , l( 6.0)) +# , ('METAL2.minimalSpacing' , l( 6.0)) +# , ('METAL3.minimalSpacing' , l( 6.0)) +# , ('METAL4.minimalSpacing' , l( 6.0)) +# , ('METAL5.minimalSpacing' , l( 6.0)) +# , ('METAL6.minimalSpacing' , l( 6.0)) +# ] + \ +# scaleUp( symbolicLayersExtensionsTable ) layersExtensionsTable = \ - ( ('METAL1.minimalSpacing' , 6.0) - , ('METAL2.minimalSpacing' , 6.0) - , ('METAL3.minimalSpacing' , 6.0) - , ('METAL4.minimalSpacing' , 6.0) - , ('METAL5.minimalSpacing' , 6.0) - , ('METAL6.minimalSpacing' , 6.0) + ( ('METAL1.minimalSpacing' , l( 6.0)) + , ('METAL2.minimalSpacing' , l( 6.0)) + , ('METAL3.minimalSpacing' , l( 6.0)) + , ('METAL4.minimalSpacing' , l( 6.0)) + , ('METAL5.minimalSpacing' , l( 6.0)) + , ('METAL6.minimalSpacing' , l( 6.0)) - , ('NWELL.nWell.extention.cap' , 4.0) - , ('PWELL.pWell.extention.cap' , 4.0) + , ('NWELL.nWell.extention.cap' , l( 4.0)) + , ('PWELL.pWell.extention.cap' , l( 4.0)) - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 3.0) - , ('NTIE.nWell.extention.width' , 2.0) - , ('NTIE.nImplant.extention.cap' , 2.5) - , ('NTIE.nImplant.extention.width' , 1.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , -0.5) + , ('NTIE.minimum.width' , l( 3.0)) + , ('NTIE.nWell.extention.cap' , l( 3.0)) + , ('NTIE.nWell.extention.width' , l( 2.0)) + , ('NTIE.nImplant.extention.cap' , l( 2.5)) + , ('NTIE.nImplant.extention.width' , l( 1.5)) + , ('NTIE.active.extention.cap' , l( 0.5)) + , ('NTIE.active.extention.width' , l(-0.5)) - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 3.0) - , ('PTIE.pWell.extention.width' , 2.0) - , ('PTIE.pImplant.extention.cap' , 2.5) - , ('PTIE.pImplant.extention.width' , 1.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , -0.5) + , ('PTIE.minimum.width' , l( 3.0)) + , ('PTIE.pWell.extention.cap' , l( 3.0)) + , ('PTIE.pWell.extention.width' , l( 2.0)) + , ('PTIE.pImplant.extention.cap' , l( 2.5)) + , ('PTIE.pImplant.extention.width' , l( 1.5)) + , ('PTIE.active.extention.cap' , l( 0.5)) + , ('PTIE.active.extention.width' , l(-0.5)) - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 4.0) - , ('NDIF.nImplant.extention.width' , 2.0) - , ('NDIF.active.extention.cap' , 2.0) - , ('NDIF.active.extention.width' , 0.0) + , ('NDIF.minimum.width' , l( 3.0)) + , ('NDIF.nImplant.extention.cap' , l( 4.0)) + , ('NDIF.nImplant.extention.width' , l( 2.0)) + , ('NDIF.active.extention.cap' , l( 2.0)) + , ('NDIF.active.extention.width' , l( 0.0)) - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 4.0) - , ('PDIF.pImplant.extention.width' , 2.0) - , ('PDIF.active.extention.cap' , 2.0) - , ('PDIF.active.extention.width' , 0.0) + , ('PDIF.minimum.width' , l( 3.0)) + , ('PDIF.pImplant.extention.cap' , l( 4.0)) + , ('PDIF.pImplant.extention.width' , l( 2.0)) + , ('PDIF.active.extention.cap' , l( 2.0)) + , ('PDIF.active.extention.width' , l( 0.0)) - , ('GATE.minimum.width' , 2.0) - , ('GATE.poly.extention.cap' , 2.5) + , ('GATE.minimum.width' , l( 2.0)) + , ('GATE.poly.extention.cap' , l( 2.5)) - , ('NTRANS.minimum.width' , 2.0) - , ('NTRANS.nImplant.extention.cap' , 2.0) - , ('NTRANS.nImplant.extention.width' , 7.0) - , ('NTRANS.active.extention.cap' , 0.0) - , ('NTRANS.active.extention.width' , 3.0) - , ('NTRANS.poly.extention.cap' , 3.0) - , ('NTRANS.poly.extention.width' , 0.0) + , ('NTRANS.minimum.width' , l( 2.0)) + , ('NTRANS.nImplant.extention.cap' , l( 2.0)) + , ('NTRANS.nImplant.extention.width' , l( 7.0)) + , ('NTRANS.active.extention.cap' , l( 0.0)) + , ('NTRANS.active.extention.width' , l( 3.0)) + , ('NTRANS.poly.extention.cap' , l( 3.0)) + , ('NTRANS.poly.extention.width' , l( 0.0)) - , ('PTRANS.minimum.width' , 2.0) - , ('PTRANS.nWell.extention.cap' , 2.5) - , ('PTRANS.nWell.extention.width' , 7.5) - , ('PTRANS.pImplant.extention.cap' , 2.0) - , ('PTRANS.pImplant.extention.width' , 7.0) - , ('PTRANS.active.extention.cap' , 0.0) - , ('PTRANS.active.extention.width' , 3.0) - , ('PTRANS.poly.extention.cap' , 3.0) - , ('PTRANS.poly.extention.width' , 0.0) + , ('PTRANS.minimum.width' , l( 2.0)) + , ('PTRANS.nWell.extention.cap' , l( 2.5)) + , ('PTRANS.nWell.extention.width' , l( 7.5)) + , ('PTRANS.pImplant.extention.cap' , l( 2.0)) + , ('PTRANS.pImplant.extention.width' , l( 7.0)) + , ('PTRANS.active.extention.cap' , l( 0.0)) + , ('PTRANS.active.extention.width' , l( 3.0)) + , ('PTRANS.poly.extention.cap' , l( 3.0)) + , ('PTRANS.poly.extention.width' , l( 0.0)) - , ('POLY.minimum.width' , 2.0) - , ('POLY.poly.extention.cap' , 1.0) - , ('POLY2.minimum.width' , 2.0) - , ('POLY2.poly2.extention.cap' , 2.0) + , ('POLY.minimum.width' , l( 2.0)) + , ('POLY.poly.extention.cap' , l( 1.0)) + , ('POLY2.minimum.width' , l( 2.0)) + , ('POLY2.poly2.extention.cap' , l( 2.0)) # Routing Layers (symbolic). - , ('METAL1.minimum.width' , 2.0) - , ('METAL1.metal1.extention.cap' , 2.0) - , ('METAL1.metal1.extention.width' , 1.0) - , ('METAL2.minimum.width' , 4.0) - , ('METAL2.metal2.extention.cap' , 2.0) - , ('METAL3.minimum.width' , 4.0) - , ('METAL3.metal3.extention.cap' , 2.0) - , ('METAL4.minimum.width' , 4.0) - , ('METAL4.metal4.extention.cap' , 2.0) - , ('METAL5.minimum.width' , 4.0) - , ('METAL5.metal5.extention.cap' , 2.0) - , ('METAL6.minimum.width' , 10.0) - , ('METAL6.metal6.extention.cap' , 5.0) - #, ('METAL7.minimum.width' , 2.0) - #, ('METAL7.metal7.extention.cap' , 2.5) - #, ('METAL8.minimum.width' , 2.0) - #, ('METAL8.metal8.extention.cap' , 2.5) + , ('METAL1.minimum.width' , l( 2.0)) + , ('METAL1.metal1.extention.cap' , l( 2.0)) + , ('METAL1.metal1.extention.width' , l( 1.0)) + , ('METAL2.minimum.width' , l( 4.0)) + , ('METAL2.metal2.extention.cap' , l( 2.0)) + , ('METAL3.minimum.width' , l( 4.0)) + , ('METAL3.metal3.extention.cap' , l( 2.0)) + , ('METAL4.minimum.width' , l( 4.0)) + , ('METAL4.metal4.extention.cap' , l( 2.0)) + , ('METAL5.minimum.width' , l( 4.0)) + , ('METAL5.metal5.extention.cap' , l( 2.0)) + , ('METAL6.minimum.width' , l(10.0)) + , ('METAL6.metal6.extention.cap' , l( 5.0)) + #, ('METAL7.minimum.width' , l( 2.0)) + #, ('METAL7.metal7.extention.cap' , l( 2.5)) + #, ('METAL8.minimum.width' , l( 2.0)) + #, ('METAL8.metal8.extention.cap' , l( 2.5)) # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 4.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 2.0) - , ('BLOCKAGE1.blockage1.extention.width', 0.5) - , ('BLOCKAGE2.minimum.width' , 4.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 2.0) - , ('BLOCKAGE3.minimum.width' , 4.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 2.0) - , ('BLOCKAGE4.minimum.width' , 4.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 2.0) - , ('BLOCKAGE5.minimum.width' , 4.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 2.0) - , ('BLOCKAGE6.minimum.width' , 8.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 2.5) - #, ('BLOCKAGE7.minimum.width' , 2.0) - #, ('BLOCKAGE7.blockage6.extention.cap' , 4.0) - #, ('BLOCKAGE8.minimum.width' , 2.0) - #, ('BLOCKAGE8.blockage6.extention.cap' , 4.0) + , ('BLOCKAGE1.minimum.width' , l( 4.0)) + , ('BLOCKAGE1.blockage1.extention.cap' , l( 2.0)) + , ('BLOCKAGE1.blockage1.extention.width', l( 0.5)) + , ('BLOCKAGE2.minimum.width' , l( 4.0)) + , ('BLOCKAGE2.blockage2.extention.cap' , l( 2.0)) + , ('BLOCKAGE3.minimum.width' , l( 4.0)) + , ('BLOCKAGE3.blockage3.extention.cap' , l( 2.0)) + , ('BLOCKAGE4.minimum.width' , l( 4.0)) + , ('BLOCKAGE4.blockage4.extention.cap' , l( 2.0)) + , ('BLOCKAGE5.minimum.width' , l( 4.0)) + , ('BLOCKAGE5.blockage5.extention.cap' , l( 2.0)) + , ('BLOCKAGE6.minimum.width' , l( 8.0)) + , ('BLOCKAGE6.blockage6.extention.cap' , l( 2.5)) + #, ('BLOCKAGE7.minimum.width' , l( 2.0)) + #, ('BLOCKAGE7.blockage6.extention.cap' , l( 4.0)) + #, ('BLOCKAGE8.minimum.width' , l( 2.0)) + #, ('BLOCKAGE8.blockage6.extention.cap' , l( 4.0)) # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 2.0) - , ('CONT_BODY_N.nWell.enclosure' , 4.0) - , ('CONT_BODY_N.nImplant.enclosure' , 3.5) - , ('CONT_BODY_N.active.enclosure' , 1.5) - , ('CONT_BODY_N.metal1.enclosure' , 1.0) + , ('CONT_BODY_N.minimum.side' , l( 2.0)) + , ('CONT_BODY_N.nWell.enclosure' , l( 4.0)) + , ('CONT_BODY_N.nImplant.enclosure' , l( 3.5)) + , ('CONT_BODY_N.active.enclosure' , l( 1.5)) + , ('CONT_BODY_N.metal1.enclosure' , l( 1.0)) - , ('CONT_BODY_P.minimum.side' , 2.0) - , ('CONT_BODY_P.pWell.enclosure' , 4.0) - , ('CONT_BODY_P.pImplant.enclosure' , 3.5) - , ('CONT_BODY_P.active.enclosure' , 1.5) - , ('CONT_BODY_P.metal1.enclosure' , 1.0) + , ('CONT_BODY_P.minimum.side' , l( 2.0)) + , ('CONT_BODY_P.pWell.enclosure' , l( 4.0)) + , ('CONT_BODY_P.pImplant.enclosure' , l( 3.5)) + , ('CONT_BODY_P.active.enclosure' , l( 1.5)) + , ('CONT_BODY_P.metal1.enclosure' , l( 1.0)) - , ('CONT_DIF_N.minimum.side' , 2.0) - , ('CONT_DIF_N.nImplant.enclosure' , 4.0) - , ('CONT_DIF_N.active.enclosure' , 2.0) - , ('CONT_DIF_N.metal1.enclosure' , 1.0) + , ('CONT_DIF_N.minimum.side' , l( 2.0)) + , ('CONT_DIF_N.nImplant.enclosure' , l( 4.0)) + , ('CONT_DIF_N.active.enclosure' , l( 2.0)) + , ('CONT_DIF_N.metal1.enclosure' , l( 1.0)) - , ('CONT_DIF_P.minimum.side' , 2.0) - , ('CONT_DIF_P.pImplant.enclosure' , 4.0) - , ('CONT_DIF_P.active.enclosure' , 2.0) - , ('CONT_DIF_P.metal1.enclosure' , 1.0) + , ('CONT_DIF_P.minimum.side' , l( 2.0)) + , ('CONT_DIF_P.pImplant.enclosure' , l( 4.0)) + , ('CONT_DIF_P.active.enclosure' , l( 2.0)) + , ('CONT_DIF_P.metal1.enclosure' , l( 1.0)) - , ('CONT_POLY.minimum.width' , 2.0) - , ('CONT_POLY.poly.enclosure' , 2.0) - , ('CONT_POLY.metal1.enclosure' , 1.0) + , ('CONT_POLY.minimum.width' , l( 2.0)) + , ('CONT_POLY.poly.enclosure' , l( 2.0)) + , ('CONT_POLY.metal1.enclosure' , l( 1.0)) # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 2.0) - , ('VIA12.metal1.enclosure' , 1.0) - , ('VIA12.metal2.enclosure' , 1.0) - , ('VIA23.minimum.side' , 2.0) - , ('VIA23.metal2.enclosure' , 1.0) - , ('VIA23.metal3.enclosure' , 1.0) - , ('VIA34.minimum.side' , 2.0) - , ('VIA34.metal3.enclosure' , 1.0) - , ('VIA34.metal4.enclosure' , 1.0) - , ('VIA45.minimum.side' , 2.0) - , ('VIA45.metal4.enclosure' , 1.0) - , ('VIA45.metal5.enclosure' , 1.0) - , ('VIA56.minimum.side' , 5.0) - , ('VIA56.metal5.enclosure' , 1.0) - , ('VIA56.metal6.enclosure' , 1.5) - #, ('VIA67.minimum.side' , 2.0) - #, ('VIA67.metal6.enclosure' , 3.0) - #, ('VIA67.metal7.enclosure' , 3.0) - #, ('VIA78.minimum.side' , 2.0) - #, ('VIA78.metal7.enclosure' , 3.0) - #, ('VIA78.metal8.enclosure' , 3.0) + , ('VIA12.minimum.side' , l( 2.0)) + , ('VIA12.metal1.enclosure' , l( 1.0)) + , ('VIA12.metal2.enclosure' , l( 1.0)) + , ('VIA23.minimum.side' , l( 2.0)) + , ('VIA23.metal2.enclosure' , l( 1.0)) + , ('VIA23.metal3.enclosure' , l( 1.0)) + , ('VIA34.minimum.side' , l( 2.0)) + , ('VIA34.metal3.enclosure' , l( 1.0)) + , ('VIA34.metal4.enclosure' , l( 1.0)) + , ('VIA45.minimum.side' , l( 2.0)) + , ('VIA45.metal4.enclosure' , l( 1.0)) + , ('VIA45.metal5.enclosure' , l( 1.0)) + , ('VIA56.minimum.side' , l( 5.0)) + , ('VIA56.metal5.enclosure' , l( 1.0)) + , ('VIA56.metal6.enclosure' , l( 1.5)) + #, ('VIA67.minimum.side' , l( 2.0)) + #, ('VIA67.metal6.enclosure' , l( 3.0)) + #, ('VIA67.metal7.enclosure' , l( 3.0)) + #, ('VIA78.minimum.side' , l( 2.0)) + #, ('VIA78.metal7.enclosure' , l( 3.0)) + #, ('VIA78.metal8.enclosure' , l( 3.0)) ) +for entry in layersExtensionsTable: + print entry + # Format of an entry in the table: # (Symbolic_Name, CIF_Name, GDSII_Number) gdsLayersTable = \ diff --git a/crlcore/etc/45/freepdk_45/kite.conf b/crlcore/etc/45/freepdk_45/kite.conf index 824a1a5c..0c1cdad5 100644 --- a/crlcore/etc/45/freepdk_45/kite.conf +++ b/crlcore/etc/45/freepdk_45/kite.conf @@ -1,12 +1,11 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, u, n # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) -helpers.micronsMode() - parametersTable = \ ( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 ) @@ -48,16 +47,16 @@ routingGaugesTable = {} routingGaugesTable['gscl45'] = \ ( ( 'symbolic', False ) - , ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, 0, 0.190, 0.065, 0.065, 7 ) ) - , ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 0.190, 0.070, 0.070, 8 ) ) - , ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, 0, 0.190, 0.070, 0.070, 8 ) ) - , ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, 0, 0.285, 0.140, 0.140, 8 ) ) - , ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, 0, 0.855, 0.400, 0.400, 8 ) ) - , ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, 0, 0.855, 0.400, 0.400, 8 ) ) - , ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, 0, 1.710, 0.800, 0.800, 8 ) ) - , ( 'metal10' , ( Gauge.Vertical , Gauge.Default, 9, 0.0, 0, 1.710, 0.800, 0.800, 8 ) ) + , ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, u(0), u(0.190), u(0.065), u(0.065), u(7) ) ) + , ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, u(0), u(0.190), u(0.070), u(0.070), u(8) ) ) + , ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, u(0), u(0.190), u(0.070), u(0.070), u(8) ) ) + , ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, u(0), u(0.285), u(0.140), u(0.140), u(8) ) ) + , ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, u(0), u(0.855), u(0.400), u(0.400), u(8) ) ) + , ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, u(0), u(0.855), u(0.400), u(0.400), u(8) ) ) + , ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, u(0), u(1.710), u(0.800), u(0.800), u(8) ) ) + , ( 'metal10' , ( Gauge.Vertical , Gauge.Default, 9, 0.0, u(0), u(1.710), u(0.800), u(0.800), u(8) ) ) ) @@ -66,5 +65,5 @@ routingGaugesTable['gscl45'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['gscl45'] = ('metal2', 0.38, 2.47, 0.38) +cellGaugesTable['gscl45'] = ('metal2', u(0.38), u(2.47), u(0.38)) diff --git a/crlcore/etc/45/freepdk_45/technology.conf b/crlcore/etc/45/freepdk_45/technology.conf index bc537d9f..f6ab62e9 100644 --- a/crlcore/etc/45/freepdk_45/technology.conf +++ b/crlcore/etc/45/freepdk_45/technology.conf @@ -8,229 +8,79 @@ # - # - -from Hurricane import DbU +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno + +initTechno( { 'name' : 'freepdk_45' + , 'precision' : 2 + , 'gridValue' : 0.0025 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 18 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 1.0 + } ) # Contains the layers execfile( helpers.sysConfDir+'/common/technology.conf' ) -helpers.micronsMode() - - -technoConfig = { 'name' : 'freepdk_45' - , 'precision' : 2 - , 'gridValue' : 0.0025 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 18 - , 'symbolicGridStep' : 1.0 - , 'polygonStep' : 1.0 - } - # Format of : # Each entry is a pair of (string, value). # * string: a synthetic way to designate the real or symbolic layer on # which it applies, an optional sub layer (BasicLayer) in case # where there is more than one, and the dimension name. -# * value : the rule (dimension) value. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. -layersExtensionsTable = \ - ( ('metal1.minimalSpacing' , 0.065) - , ('metal2.minimalSpacing' , 0.075) - , ('metal3.minimalSpacing' , 0.07 ) - , ('metal4.minimalSpacing' , 0.14 ) - , ('metal5.minimalSpacing' , 0.14 ) - , ('metal6.minimalSpacing' , 0.14 ) - , ('metal7.minimalSpacing' , 0.4 ) - , ('metal8.minimalSpacing' , 0.4 ) - , ('metal9.minimalSpacing' , 0.8 ) - , ('metal10.minimalSpacing' , 0.8 ) - - , ('NWELL.nWell.extention.cap' , 0.0) - , ('PWELL.pWell.extention.cap' , 0.0) - - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 1.5) - , ('NTIE.nWell.extention.width' , 0.5) - , ('NTIE.nImplant.extention.cap' , 1.0) - , ('NTIE.nImplant.extention.width' , 0.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , 0.0) - - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 1.5) - , ('PTIE.pWell.extention.width' , 0.5) - , ('PTIE.pImplant.extention.cap' , 1.0) - , ('PTIE.pImplant.extention.width' , 0.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , 0.0) - - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 1.0) - , ('NDIF.nImplant.extention.width' , 0.5) - , ('NDIF.active.extention.cap' , 0.5) - , ('NDIF.active.extention.width' , 0.0) - - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 1.0) - , ('PDIF.pImplant.extention.width' , 0.5) - , ('PDIF.active.extention.cap' , 0.5) - , ('PDIF.active.extention.width' , 0.0) - - , ('GATE.minimum.width' , 1.0) - , ('GATE.poly.extention.cap' , 1.5) - - , ('NTRANS.minimum.width' , 1.0) - , ('NTRANS.nImplant.extention.cap' , -1.0) - , ('NTRANS.nImplant.extention.width' , 2.5) - , ('NTRANS.active.extention.cap' , -1.5) - , ('NTRANS.active.extention.width' , 2.0) - - , ('PTRANS.minimum.width' , 1.0) - , ('PTRANS.nWell.extention.cap' , -1.0) - , ('PTRANS.nWell.extention.width' , 4.5) - , ('PTRANS.pImplant.extention.cap' , -1.0) - , ('PTRANS.pImplant.extention.width' , 4.0) - , ('PTRANS.active.extention.cap' , -1.5) - , ('PTRANS.active.extention.width' , 3.0) - - , ('POLY.minimum.width' , 1.0) - , ('POLY.poly.extention.cap' , 0.5) - , ('POLY2.minimum.width' , 1.0) - , ('POLY2.poly.extention.cap' , 0.5) - - # Routing Layers (symbolic). - , ('METAL1.minimum.width' , 1.0) - , ('METAL1.metal1.extention.cap' , 0.5) - , ('METAL2.minimum.width' , 1.0) - , ('METAL2.metal2.extention.cap' , 1.0) - , ('METAL3.minimum.width' , 1.0) - , ('METAL3.metal3.extention.cap' , 1.0) - , ('METAL4.minimum.width' , 1.0) - , ('METAL4.metal4.extention.cap' , 1.0) - , ('METAL5.minimum.width' , 2.0) - , ('METAL5.metal5.extention.cap' , 1.0) - , ('METAL6.minimum.width' , 2.0) - , ('METAL6.metal6.extention.cap' , 1.0) - , ('METAL7.minimum.width' , 2.0) - , ('METAL7.metal7.extention.cap' , 1.0) - , ('METAL8.minimum.width' , 2.0) - , ('METAL8.metal8.extention.cap' , 1.0) - , ('METAL9.minimum.width' , 2.0) - , ('METAL9.metal9.extention.cap' , 1.0) - , ('METAL10.minimum.width' , 2.0) - , ('METAL10.metal10.extention.cap' , 1.0) - - # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 1.0) - , ('CONT_BODY_N.nWell.enclosure' , 1.5) - , ('CONT_BODY_N.nImplant.enclosure' , 1.5) - , ('CONT_BODY_N.active.enclosure' , 1.0) - , ('CONT_BODY_N.metal1.enclosure' , 0.5) - - , ('CONT_BODY_P.minimum.side' , 1.0) - , ('CONT_BODY_P.pWell.enclosure' , 1.5) - , ('CONT_BODY_P.pImplant.enclosure' , 1.5) - , ('CONT_BODY_P.active.enclosure' , 1.0) - , ('CONT_BODY_P.metal1.enclosure' , 0.5) - - , ('CONT_DIF_N.minimum.side' , 1.0) - , ('CONT_DIF_N.nImplant.enclosure' , 1.0) - , ('CONT_DIF_N.active.enclosure' , 0.5) - , ('CONT_DIF_N.metal1.enclosure' , 0.5) - - , ('CONT_DIF_P.minimum.side' , 1.0) - , ('CONT_DIF_P.pImplant.enclosure' , 1.0) - , ('CONT_DIF_P.active.enclosure' , 0.5) - , ('CONT_DIF_P.metal1.enclosure' , 0.5) - - , ('CONT_POLY.minimum.width' , 1.0) - , ('CONT_POLY.poly.enclosure' , 0.5) - , ('CONT_POLY.metal1.enclosure' , 0.5) - - # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 1.0) - , ('VIA12.metal1.enclosure' , 0.5) - , ('VIA12.metal2.enclosure' , 0.5) - , ('VIA23.minimum.side' , 1.0) - , ('VIA23.metal2.enclosure' , 0.5) - , ('VIA23.metal3.enclosure' , 0.5) - , ('VIA34.minimum.side' , 1.0) - , ('VIA34.metal3.enclosure' , 0.5) - , ('VIA34.metal4.enclosure' , 0.5) - , ('VIA45.minimum.side' , 1.0) - , ('VIA45.metal4.enclosure' , 0.5) - , ('VIA45.metal5.enclosure' , 0.5) - , ('VIA56.minimum.side' , 1.0) - , ('VIA56.metal5.enclosure' , 0.5) - , ('VIA56.metal6.enclosure' , 0.5) - , ('VIA67.minimum.side' , 1.0) - , ('VIA67.metal6.enclosure' , 0.5) - , ('VIA67.metal7.enclosure' , 0.5) - , ('VIA78.minimum.side' , 1.0) - , ('VIA78.metal7.enclosure' , 0.5) - , ('VIA78.metal8.enclosure' , 0.5) - , ('VIA89.minimum.side' , 1.0) - , ('VIA89.metal8.enclosure' , 0.5) - , ('VIA89.metal9.enclosure' , 0.5) - , ('VIA910.minimum.side' , 1.0) - , ('VIA910.metal9.enclosure' , 0.5) - , ('VIA910.metal10.enclosure' , 0.5) +layersExtensionsTable = symbolicLayersExtensionsTable + \ + [ ('metal1.minimalSpacing' , u( 0.065)) + , ('metal2.minimalSpacing' , u( 0.075)) + , ('metal3.minimalSpacing' , u( 0.07 )) + , ('metal4.minimalSpacing' , u( 0.14 )) + , ('metal5.minimalSpacing' , u( 0.14 )) + , ('metal6.minimalSpacing' , u( 0.14 )) + , ('metal7.minimalSpacing' , u( 0.4 )) + , ('metal8.minimalSpacing' , u( 0.4 )) + , ('metal9.minimalSpacing' , u( 0.8 )) + , ('metal10.minimalSpacing' , u( 0.8 )) # VIAs (i.e. Metal <--> Metal) (real). - , ('via12.minimum.side' , 0.065) + , ('via12.minimum.side' , u( 0.065)) # This is the rule as defined in LEF, but seems wrong to me. - #, ('via12.metal1.enclosure' , (0.035 , 0.0 ) ) - , ('via12.metal1.enclosure' , (0.0 , 0.035) ) - , ('via12.metal2.enclosure' , (0.0025, 0.035) ) - , ('via23.minimum.side' , 0.070) - , ('via23.metal2.enclosure' , (0.0 , 0.035) ) - , ('via23.metal3.enclosure' , (0.035 , 0.0 ) ) - , ('via34.minimum.side' , 0.070) - , ('via34.metal3.enclosure' , (0.035, 0.0 ) ) - , ('via34.metal4.enclosure' , 0.035) - , ('via45.minimum.side' , 0.140) - , ('via45.metal4.enclosure' , 0.0 ) - , ('via45.metal5.enclosure' , 0.0 ) - , ('via56.minimum.side' , 0.140) - , ('via56.metal5.enclosure' , 0.0 ) - , ('via56.metal6.enclosure' , 0.0 ) - , ('via67.minimum.side' , 0.140) - , ('via67.metal6.enclosure' , 0.0 ) - , ('via67.metal7.enclosure' , 0.130) - , ('via78.minimum.side' , 0.200) - , ('via78.metal7.enclosure' , 0.0 ) - , ('via78.metal8.enclosure' , 0.0 ) - , ('via89.minimum.side' , 0.200) - , ('via89.metal8.enclosure' , 0.0 ) - , ('via89.metal9.enclosure' , 0.200) - , ('via910.minimum.side' , 0.400) - , ('via910.metal9.enclosure' , 0.0 ) - , ('via910.metal10.enclosure' , 0.0 ) - - # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 1.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 0.5) - , ('BLOCKAGE2.minimum.width' , 2.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 0.5) - , ('BLOCKAGE3.minimum.width' , 2.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 0.5) - , ('BLOCKAGE4.minimum.width' , 2.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 0.5) - , ('BLOCKAGE5.minimum.width' , 2.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 1.0) - , ('BLOCKAGE6.minimum.width' , 2.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE7.minimum.width' , 2.0) - , ('BLOCKAGE7.blockage7.extention.cap' , 1.0) - , ('BLOCKAGE8.minimum.width' , 2.0) - , ('BLOCKAGE8.blockage8.extention.cap' , 1.0) - , ('BLOCKAGE9.minimum.width' , 2.0) - , ('BLOCKAGE9.blockage9.extention.cap' , 1.0) - , ('BLOCKAGE10.minimum.width' , 2.0) - , ('BLOCKAGE10.blockage10.extention.cap', 1.0) - ) + #, ('via12.metal1.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via12.metal1.enclosure' , (u(0.0 ), u(0.035)) ) + , ('via12.metal2.enclosure' , (u(0.0025), u(0.035)) ) + , ('via23.minimum.side' , u(0.070 )) + , ('via23.metal2.enclosure' , (u(0.0 ), u(0.035)) ) + , ('via23.metal3.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via34.minimum.side' , u(0.070 )) + , ('via34.metal3.enclosure' , (u(0.035 ), u(0.0 )) ) + , ('via34.metal4.enclosure' , u(0.035 )) + , ('via45.minimum.side' , u(0.140 )) + , ('via45.metal4.enclosure' , u(0.0 )) + , ('via45.metal5.enclosure' , u(0.0 )) + , ('via56.minimum.side' , u(0.140 )) + , ('via56.metal5.enclosure' , u(0.0 )) + , ('via56.metal6.enclosure' , u(0.0 )) + , ('via67.minimum.side' , u(0.140 )) + , ('via67.metal6.enclosure' , u(0.0 )) + , ('via67.metal7.enclosure' , u(0.130 )) + , ('via78.minimum.side' , u(0.200 )) + , ('via78.metal7.enclosure' , u(0.0 )) + , ('via78.metal8.enclosure' , u(0.0 )) + , ('via89.minimum.side' , u(0.200 )) + , ('via89.metal8.enclosure' , u(0.0 )) + , ('via89.metal9.enclosure' , u(0.200 )) + , ('via910.minimum.side' , u(0.400 )) + , ('via910.metal9.enclosure' , u(0.0 )) + , ('via910.metal10.enclosure' , u(0.0 )) + ] # Table guessed from the Cadence configuration files: diff --git a/crlcore/etc/common/technology.conf b/crlcore/etc/common/technology.conf index 3d258542..7c62d042 100644 --- a/crlcore/etc/common/technology.conf +++ b/crlcore/etc/common/technology.conf @@ -3,6 +3,7 @@ # Those settings are common to all the symbolic technologies. from Hurricane import BasicLayer +from helpers import l, u, n from helpers.Technology import TypeRegular from helpers.Technology import TypeDiffusion from helpers.Technology import TypeTransistor @@ -163,3 +164,171 @@ symbolicLayersTable = \ , 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910' , 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact' ] + + +# Format of : +# Each entry is a pair of (string, value). +# * string: a synthetic way to designate the real or symbolic layer on +# which it applies, an optional sub layer (BasicLayer) in case +# where there is more than one, and the dimension name. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. + +symbolicLayersExtensionsTable = \ + [ ('NWELL.nWell.extention.cap' , l( 0.0)) + , ('PWELL.pWell.extention.cap' , l( 0.0)) + + , ('NTIE.minimum.width' , l( 3.0)) + , ('NTIE.nWell.extention.cap' , l( 1.5)) + , ('NTIE.nWell.extention.width' , l( 0.5)) + , ('NTIE.nImplant.extention.cap' , l( 1.0)) + , ('NTIE.nImplant.extention.width' , l( 0.5)) + , ('NTIE.active.extention.cap' , l( 0.5)) + , ('NTIE.active.extention.width' , l( 0.0)) + + , ('PTIE.minimum.width' , l( 3.0)) + , ('PTIE.pWell.extention.cap' , l( 1.5)) + , ('PTIE.pWell.extention.width' , l( 0.5)) + , ('PTIE.pImplant.extention.cap' , l( 1.0)) + , ('PTIE.pImplant.extention.width' , l( 0.5)) + , ('PTIE.active.extention.cap' , l( 0.5)) + , ('PTIE.active.extention.width' , l( 0.0)) + + , ('NDIF.minimum.width' , l( 3.0)) + , ('NDIF.nImplant.extention.cap' , l( 1.0)) + , ('NDIF.nImplant.extention.width' , l( 0.5)) + , ('NDIF.active.extention.cap' , l( 0.5)) + , ('NDIF.active.extention.width' , l( 0.0)) + + , ('PDIF.minimum.width' , l( 3.0)) + , ('PDIF.pImplant.extention.cap' , l( 1.0)) + , ('PDIF.pImplant.extention.width' , l( 0.5)) + , ('PDIF.active.extention.cap' , l( 0.5)) + , ('PDIF.active.extention.width' , l( 0.0)) + + , ('GATE.minimum.width' , l( 1.0)) + , ('GATE.poly.extention.cap' , l( 1.5)) + + , ('NTRANS.minimum.width' , l( 1.0)) + , ('NTRANS.nImplant.extention.cap' , l(-1.0)) + , ('NTRANS.nImplant.extention.width' , l( 2.5)) + , ('NTRANS.active.extention.cap' , l(-1.5)) + , ('NTRANS.active.extention.width' , l( 2.0)) + + , ('PTRANS.minimum.width' , l( 1.0)) + , ('PTRANS.nWell.extention.cap' , l(-1.0)) + , ('PTRANS.nWell.extention.width' , l( 4.5)) + , ('PTRANS.pImplant.extention.cap' , l(-1.0)) + , ('PTRANS.pImplant.extention.width' , l( 4.0)) + , ('PTRANS.active.extention.cap' , l(-1.5)) + , ('PTRANS.active.extention.width' , l( 3.0)) + + , ('POLY.minimum.width' , l( 1.0)) + , ('POLY.poly.extention.cap' , l( 0.5)) + , ('POLY2.minimum.width' , l( 1.0)) + , ('POLY2.poly.extention.cap' , l( 0.5)) + + # Routing Layers (symbolic). + , ('METAL1.minimum.width' , l( 1.0)) + , ('METAL1.metal1.extention.cap' , l( 0.5)) + , ('METAL2.minimum.width' , l( 1.0)) + , ('METAL2.metal2.extention.cap' , l( 1.0)) + , ('METAL3.minimum.width' , l( 1.0)) + , ('METAL3.metal3.extention.cap' , l( 1.0)) + , ('METAL4.minimum.width' , l( 1.0)) + , ('METAL4.metal4.extention.cap' , l( 1.0)) + , ('METAL5.minimum.width' , l( 2.0)) + , ('METAL5.metal5.extention.cap' , l( 1.0)) + , ('METAL6.minimum.width' , l( 2.0)) + , ('METAL6.metal6.extention.cap' , l( 1.0)) + , ('METAL7.minimum.width' , l( 2.0)) + , ('METAL7.metal7.extention.cap' , l( 1.0)) + , ('METAL8.minimum.width' , l( 2.0)) + , ('METAL8.metal8.extention.cap' , l( 1.0)) + , ('METAL9.minimum.width' , l( 2.0)) + , ('METAL9.metal9.extention.cap' , l( 1.0)) + , ('METAL10.minimum.width' , l( 2.0)) + , ('METAL10.metal10.extention.cap' , l( 1.0)) + + # Contacts (i.e. Active <--> Metal) (symbolic). + , ('CONT_BODY_N.minimum.side' , l( 1.0)) + , ('CONT_BODY_N.nWell.enclosure' , l( 1.5)) + , ('CONT_BODY_N.nImplant.enclosure' , l( 1.5)) + , ('CONT_BODY_N.active.enclosure' , l( 1.0)) + , ('CONT_BODY_N.metal1.enclosure' , l( 0.5)) + + , ('CONT_BODY_P.minimum.side' , l( 1.0)) + , ('CONT_BODY_P.pWell.enclosure' , l( 1.5)) + , ('CONT_BODY_P.pImplant.enclosure' , l( 1.5)) + , ('CONT_BODY_P.active.enclosure' , l( 1.0)) + , ('CONT_BODY_P.metal1.enclosure' , l( 0.5)) + + , ('CONT_DIF_N.minimum.side' , l( 1.0)) + , ('CONT_DIF_N.nImplant.enclosure' , l( 1.0)) + , ('CONT_DIF_N.active.enclosure' , l( 0.5)) + , ('CONT_DIF_N.metal1.enclosure' , l( 0.5)) + + , ('CONT_DIF_P.minimum.side' , l( 1.0)) + , ('CONT_DIF_P.pImplant.enclosure' , l( 1.0)) + , ('CONT_DIF_P.active.enclosure' , l( 0.5)) + , ('CONT_DIF_P.metal1.enclosure' , l( 0.5)) + + , ('CONT_POLY.minimum.width' , l( 1.0)) + , ('CONT_POLY.poly.enclosure' , l( 0.5)) + , ('CONT_POLY.metal1.enclosure' , l( 0.5)) + + # VIAs (i.e. Metal <--> Metal) (symbolic). + , ('VIA12.minimum.side' , l( 1.0)) + , ('VIA12.metal1.enclosure' , l( 0.5)) + , ('VIA12.metal2.enclosure' , l( 0.5)) + , ('VIA23.minimum.side' , l( 1.0)) + , ('VIA23.metal2.enclosure' , l( 0.5)) + , ('VIA23.metal3.enclosure' , l( 0.5)) + , ('VIA34.minimum.side' , l( 1.0)) + , ('VIA34.metal3.enclosure' , l( 0.5)) + , ('VIA34.metal4.enclosure' , l( 0.5)) + , ('VIA45.minimum.side' , l( 1.0)) + , ('VIA45.metal4.enclosure' , l( 0.5)) + , ('VIA45.metal5.enclosure' , l( 0.5)) + , ('VIA56.minimum.side' , l( 1.0)) + , ('VIA56.metal5.enclosure' , l( 0.5)) + , ('VIA56.metal6.enclosure' , l( 0.5)) + , ('VIA67.minimum.side' , l( 1.0)) + , ('VIA67.metal6.enclosure' , l( 0.5)) + , ('VIA67.metal7.enclosure' , l( 0.5)) + , ('VIA78.minimum.side' , l( 1.0)) + , ('VIA78.metal7.enclosure' , l( 0.5)) + , ('VIA78.metal8.enclosure' , l( 0.5)) + , ('VIA89.minimum.side' , l( 1.0)) + , ('VIA89.metal8.enclosure' , l( 0.5)) + , ('VIA89.metal9.enclosure' , l( 0.5)) + , ('VIA910.minimum.side' , l( 1.0)) + , ('VIA910.metal9.enclosure' , l( 0.5)) + , ('VIA910.metal10.enclosure' , l( 0.5)) + + # Blockages (symbolic). + , ('BLOCKAGE1.minimum.width' , l(1.0)) + , ('BLOCKAGE1.blockage1.extention.cap' , l(0.5)) + , ('BLOCKAGE2.minimum.width' , l(2.0)) + , ('BLOCKAGE2.blockage2.extention.cap' , l(0.5)) + , ('BLOCKAGE3.minimum.width' , l(2.0)) + , ('BLOCKAGE3.blockage3.extention.cap' , l(0.5)) + , ('BLOCKAGE4.minimum.width' , l(2.0)) + , ('BLOCKAGE4.blockage4.extention.cap' , l(0.5)) + , ('BLOCKAGE5.minimum.width' , l(2.0)) + , ('BLOCKAGE5.blockage5.extention.cap' , l(1.0)) + , ('BLOCKAGE6.minimum.width' , l(2.0)) + , ('BLOCKAGE6.blockage6.extention.cap' , l(1.0)) + , ('BLOCKAGE7.minimum.width' , l(2.0)) + , ('BLOCKAGE7.blockage7.extention.cap' , l(1.0)) + , ('BLOCKAGE8.minimum.width' , l(2.0)) + , ('BLOCKAGE8.blockage8.extention.cap' , l(1.0)) + , ('BLOCKAGE9.minimum.width' , l(2.0)) + , ('BLOCKAGE9.blockage9.extention.cap' , l(1.0)) + , ('BLOCKAGE10.minimum.width' , l(2.0)) + , ('BLOCKAGE10.blockage10.extention.cap', l(1.0)) + ] diff --git a/crlcore/etc/symbolic/cmos/kite.conf b/crlcore/etc/symbolic/cmos/kite.conf index 6c6821ed..e9c70335 100644 --- a/crlcore/etc/symbolic/cmos/kite.conf +++ b/crlcore/etc/symbolic/cmos/kite.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, n, u # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) @@ -43,18 +44,18 @@ parametersTable = \ routingGaugesTable = {} routingGaugesTable['sxlib'] = \ - ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, 0, 5, 2, 1, 4 ) ) + ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) ) routingGaugesTable['sxlib-2M'] = \ - ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, 0, 5, 2, 1, 4 ) ) + ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) ) @@ -63,4 +64,4 @@ routingGaugesTable['sxlib-2M'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['sxlib'] = ('metal2', 5.0, 50.0, 5.0) +cellGaugesTable['sxlib'] = ('metal2', l(5.0), l(50.0), l(5.0)) diff --git a/crlcore/etc/symbolic/cmos/technology.conf b/crlcore/etc/symbolic/cmos/technology.conf index dd0e59cb..032ea1b7 100644 --- a/crlcore/etc/symbolic/cmos/technology.conf +++ b/crlcore/etc/symbolic/cmos/technology.conf @@ -1,7 +1,9 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- -import helpers -from Hurricane import DbU +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno # The informations here are extracted from the Alliance ".rds" file, # and must be coherent with it. @@ -12,17 +14,16 @@ from Hurricane import DbU # - # - -execfile( helpers.sysConfDir+'/common/technology.conf' ) +initTechno( { 'name' : 'cmos' + , 'precision' : 2 + , 'gridValue' : 0.005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 24 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 24.0 + } ) - -technoConfig = { 'name' : 'hcmos9gp' - , 'precision' : 2 - , 'gridValue' : 0.005 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 24 - , 'symbolicGridStep' : 1.0 - , 'polygonStep' : 24.0 - } +execfile( sysConfDir+'/common/technology.conf' ) # Format of : @@ -30,150 +31,14 @@ technoConfig = { 'name' : 'hcmos9gp' # * string: a synthetic way to designate the real or symbolic layer on # which it applies, an optional sub layer (BasicLayer) in case # where there is more than one, and the dimension name. -# * value : the rule (dimension) value. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. -layersExtensionsTable = \ - ( ('NWELL.nWell.extention.cap' , 0.0) - , ('PWELL.pWell.extention.cap' , 0.0) - - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 1.5) - , ('NTIE.nWell.extention.width' , 0.5) - , ('NTIE.nImplant.extention.cap' , 1.0) - , ('NTIE.nImplant.extention.width' , 0.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , 0.0) - - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 1.5) - , ('PTIE.pWell.extention.width' , 0.5) - , ('PTIE.pImplant.extention.cap' , 1.0) - , ('PTIE.pImplant.extention.width' , 0.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , 0.0) - - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 1.0) - , ('NDIF.nImplant.extention.width' , 0.5) - , ('NDIF.active.extention.cap' , 0.5) - , ('NDIF.active.extention.width' , 0.0) - - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 1.0) - , ('PDIF.pImplant.extention.width' , 0.5) - , ('PDIF.active.extention.cap' , 0.5) - , ('PDIF.active.extention.width' , 0.0) - - , ('GATE.minimum.width' , 1.0) - , ('GATE.poly.extention.cap' , 1.5) - - , ('NTRANS.minimum.width' , 1.0) - , ('NTRANS.nImplant.extention.cap' , -1.0) - , ('NTRANS.nImplant.extention.width' , 2.5) - , ('NTRANS.active.extention.cap' , -1.5) - , ('NTRANS.active.extention.width' , 2.0) - - , ('PTRANS.minimum.width' , 1.0) - , ('PTRANS.nWell.extention.cap' , -1.0) - , ('PTRANS.nWell.extention.width' , 4.5) - , ('PTRANS.pImplant.extention.cap' , -1.0) - , ('PTRANS.pImplant.extention.width' , 4.0) - , ('PTRANS.active.extention.cap' , -1.5) - , ('PTRANS.active.extention.width' , 3.0) - - , ('POLY.minimum.width' , 1.0) - , ('POLY.poly.extention.cap' , 0.5) - , ('POLY2.minimum.width' , 1.0) - , ('POLY2.poly.extention.cap' , 0.5) - - # Routing Layers. - , ('METAL1.minimum.width' , 1.0) - , ('METAL1.metal1.extention.cap' , 0.5) - , ('METAL2.minimum.width' , 2.0) - , ('METAL2.metal2.extention.cap' , 1.0) - , ('METAL3.minimum.width' , 2.0) - , ('METAL3.metal3.extention.cap' , 1.0) - , ('METAL4.minimum.width' , 2.0) - , ('METAL4.metal4.extention.cap' , 1.0) - , ('METAL5.minimum.width' , 2.0) - , ('METAL5.metal5.extention.cap' , 1.0) - , ('METAL6.minimum.width' , 2.0) - , ('METAL6.metal6.extention.cap' , 1.0) - , ('METAL7.minimum.width' , 2.0) - , ('METAL7.metal6.extention.cap' , 1.0) - , ('METAL8.minimum.width' , 2.0) - , ('METAL8.metal6.extention.cap' , 1.0) - - # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 1.0) - , ('CONT_BODY_N.nWell.enclosure' , 1.5) - , ('CONT_BODY_N.nImplant.enclosure' , 1.5) - , ('CONT_BODY_N.active.enclosure' , 1.0) - , ('CONT_BODY_N.metal1.enclosure' , 0.5) - - , ('CONT_BODY_P.minimum.side' , 1.0) - , ('CONT_BODY_P.pWell.enclosure' , 1.5) - , ('CONT_BODY_P.pImplant.enclosure' , 1.5) - , ('CONT_BODY_P.active.enclosure' , 1.0) - , ('CONT_BODY_P.metal1.enclosure' , 0.5) - - , ('CONT_DIF_N.minimum.side' , 1.0) - , ('CONT_DIF_N.nImplant.enclosure' , 1.0) - , ('CONT_DIF_N.active.enclosure' , 0.5) - , ('CONT_DIF_N.metal1.enclosure' , 0.5) - - , ('CONT_DIF_P.minimum.side' , 1.0) - , ('CONT_DIF_P.pImplant.enclosure' , 1.0) - , ('CONT_DIF_P.active.enclosure' , 0.5) - , ('CONT_DIF_P.metal1.enclosure' , 0.5) - - , ('CONT_POLY.minimum.width' , 1.0) - , ('CONT_POLY.poly.enclosure' , 0.5) - , ('CONT_POLY.metal1.enclosure' , 0.5) - - # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 1.0) - , ('VIA12.metal1.enclosure' , 0.5) - , ('VIA12.metal2.enclosure' , 0.5) - , ('VIA23.minimum.side' , 1.0) - , ('VIA23.metal2.enclosure' , 0.5) - , ('VIA23.metal3.enclosure' , 0.5) - , ('VIA34.minimum.side' , 1.0) - , ('VIA34.metal3.enclosure' , 0.5) - , ('VIA34.metal4.enclosure' , 0.5) - , ('VIA45.minimum.side' , 1.0) - , ('VIA45.metal4.enclosure' , 0.5) - , ('VIA45.metal5.enclosure' , 0.5) - , ('VIA56.minimum.side' , 1.0) - , ('VIA56.metal5.enclosure' , 0.5) - , ('VIA56.metal6.enclosure' , 0.5) - , ('VIA67.minimum.side' , 1.0) - , ('VIA67.metal6.enclosure' , 0.5) - , ('VIA67.metal7.enclosure' , 0.5) - , ('VIA78.minimum.side' , 1.0) - , ('VIA78.metal7.enclosure' , 0.5) - , ('VIA78.metal8.enclosure' , 0.5) - - # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 1.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 0.5) - , ('BLOCKAGE2.minimum.width' , 2.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 0.5) - , ('BLOCKAGE3.minimum.width' , 2.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 0.5) - , ('BLOCKAGE4.minimum.width' , 2.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 0.5) - , ('BLOCKAGE5.minimum.width' , 2.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 1.0) - , ('BLOCKAGE6.minimum.width' , 2.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE7.minimum.width' , 2.0) - , ('BLOCKAGE7.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE8.minimum.width' , 2.0) - , ('BLOCKAGE8.blockage6.extention.cap' , 1.0) - ) +layersExtensionsTable = symbolicLayersExtensionsTable gdsLayersTable = \ diff --git a/crlcore/python/coriolisInit.py b/crlcore/python/coriolisInit.py index 299308b2..e6b91d25 100644 --- a/crlcore/python/coriolisInit.py +++ b/crlcore/python/coriolisInit.py @@ -75,8 +75,7 @@ SystemMandatory = 0x0100 def coriolisConfigure(): - confHelpers = ( ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) - , ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper) + confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper) , ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper) , ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper) , ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper) @@ -91,6 +90,8 @@ def coriolisConfigure(): , ('layoutTable' , Configuration.loadLayout , ConfigurationHelper) ) + # ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) + print ' o Running configuration hook: coriolisConfigure().' #print ' - sysConfDir: <%s>' % helpers.sysConfDir diff --git a/crlcore/python/helpers/Alliance.py b/crlcore/python/helpers/Alliance.py index 21f8f96d..058af2a4 100644 --- a/crlcore/python/helpers/Alliance.py +++ b/crlcore/python/helpers/Alliance.py @@ -151,11 +151,11 @@ def loadRoutingGaugesTable ( routingGaugesTable, fromFile ): , Gauge.toRlGauge(entry[1][1]) # Type. , entry[1][2] # Depth. , entry[1][3] # Density. - , helpers.toDbU(entry[1][4]) # Offset. - , helpers.toDbU(entry[1][5]) # Pitch. - , helpers.toDbU(entry[1][6]) # Wire width. - , helpers.toDbU(entry[1][7]) # Via width. - , helpers.toDbU(entry[1][8]) # Obstacle dW. + , entry[1][4] # Offset. + , entry[1][5] # Pitch. + , entry[1][6] # Wire width. + , entry[1][7] # Via width. + , entry[1][8] # Obstacle dW. ) ) except Exception, e: @@ -183,10 +183,10 @@ def loadCellGaugesTable ( cellGaugesTable, fromFile ): ,str(gaugeDatas) ]) gauge = CellGauge.create( gaugeName - , gaugeDatas[0] # pinLayerName. - , helpers.toDbU(gaugeDatas[1]) # pitch. - , helpers.toDbU(gaugeDatas[2]) # sliceHeight. - , helpers.toDbU(gaugeDatas[3]) # sliceStep. + , gaugeDatas[0] # pinLayerName. + , gaugeDatas[1] # pitch. + , gaugeDatas[2] # sliceHeight. + , gaugeDatas[3] # sliceStep. ) except Exception, e: ErrorMessage.wrapPrint(e,'In %s: at index %d.' % (allianceFile,gaugeDatasNo)) diff --git a/crlcore/python/helpers/Technology.py b/crlcore/python/helpers/Technology.py index bf5b5cc7..75821399 100644 --- a/crlcore/python/helpers/Technology.py +++ b/crlcore/python/helpers/Technology.py @@ -17,7 +17,6 @@ from Hurricane import ContactLayer from Hurricane import ViaLayer from CRL import AllianceFramework from helpers import ErrorMessage -from helpers import toDbU technologyFile = '' @@ -217,7 +216,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ): ,'Must contains exactly two fields: ( rule_path, value ).' ,str(rule) ]) - if not isinstance(rule[1],int) \ + if not isinstance(rule[1],int ) \ + and not isinstance(rule[1],long ) \ and not isinstance(rule[1],float) \ and not isinstance(rule[1],tuple): raise ErrorMessage(1,['Invalid entry in .' @@ -240,16 +240,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ): ,str(rule) ]) - if elements[0].startswith('via') or elements[0].startswith('metal'): - if isinstance(rule[1],tuple): - value = ( toDbU(rule[1][0]), toDbU(rule[1][1]) ) - else: - value = toDbU(rule[1]) - else: - if isinstance(rule[1],tuple): - value = ( DbU.fromLambda(rule[1][0]), DbU.fromLambda(rule[1][1]) ) - else: - value = DbU.fromLambda(rule[1]) + if isinstance(rule[1],tuple): value = ( rule[1][0], rule[1][1] ) + else: value = rule[1] if subLayer: ruleTag = string.join(elements[2:],'.') else: ruleTag = string.join(elements[1:],'.') @@ -343,8 +335,7 @@ def loadGdsLayers ( realLayersTable, confFile ): return -def loadTechnoConfig ( technoConfig, confFile ): - technologyFile = confFile +def initTechno ( technoConfig ): technology = DataBase.getDB().getTechnology() if not technology: name = 'Unknown' diff --git a/crlcore/python/helpers/__init__.py b/crlcore/python/helpers/__init__.py index cc92e645..6df1e186 100644 --- a/crlcore/python/helpers/__init__.py +++ b/crlcore/python/helpers/__init__.py @@ -295,23 +295,9 @@ def overload ( defaultParameters, parameters ): return tuple(overloadParameters) - -def lambdaMode (): - global unitsLambda - unitsLambda = true - return - - -def micronsMode (): - global unitsLambda - unitsLambda = False - return - - -def toDbU ( value ): - global unitsLambda - if unitsLambda: return Hurricane.DbU.fromLambda( value ) - return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro ) +def l ( value ): return Hurricane.DbU.fromLambda( value ) +def u ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro ) +def n ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerNano ) def initTechno ( argQuiet ):