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.
This commit is contained in:
Jean-Paul Chaput 2018-07-16 11:32:40 +02:00
parent 094cb8a132
commit 55a29488c9
11 changed files with 470 additions and 583 deletions

View File

@ -1,6 +1,7 @@
# -*- Mode:Python; explicit-buffer-name: "kite.conf<scmos_deep_018>" -*- # -*- Mode:Python; explicit-buffer-name: "kite.conf<scmos_deep_018>" -*-
import helpers import helpers
from helpers import l, u, n
# Contains the layout (shared by all technologies). # Contains the layout (shared by all technologies).
execfile( helpers.sysConfDir+'/common/kite.conf' ) execfile( helpers.sysConfDir+'/common/kite.conf' )
@ -43,17 +44,17 @@ parametersTable = \
routingGaugesTable = {} routingGaugesTable = {}
routingGaugesTable['msxlib'] = \ routingGaugesTable['msxlib'] = \
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 10, 2, 2, 7 ) ) ( ( '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, 0, 10, 4, 2, 8 ) ) , ( '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, 0, 10, 4, 2, 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, 0, 10, 4, 2, 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, 0, 10, 4, 2, 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, 0, 10,10, 2, 8 ) ) #, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(10), l(10), l(2), l(8) ) )
) )
routingGaugesTable['msxlib-2M'] = \ routingGaugesTable['msxlib-2M'] = \
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, 0, 10, 2, 2, 7 ) ) ( ( '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, 0, 10, 4, 2, 8 ) ) , ( '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 ) # ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
cellGaugesTable = {} cellGaugesTable = {}
cellGaugesTable['msxlib'] = ('metal2', 10, 100, 10) cellGaugesTable['msxlib'] = ('metal2', l(10), l(100), l(10))

View File

@ -1,7 +1,9 @@
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scn6m_deep>" -*- # -*- Mode:Python; explicit-buffer-name: "technology.conf<scn6m_deep>" -*-
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, # The informations here are extracted from the Alliance ".rds" file,
# and must be consistent with it. # and must be consistent with it.
@ -12,8 +14,6 @@ from Hurricane import DbU
# - <compositeLayersTable> # - <compositeLayersTable>
# - <symbolicLayersTable> # - <symbolicLayersTable>
execfile( helpers.sysConfDir+'/common/technology.conf' )
# MOSIS SCN6M_DEEP is a portable technology where lengths are expresseds # 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 # 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. # We set the foundry grid to .005um and set the gridsPerLambda to 18.
technoConfig = { 'name' : 'scn6m_deep' initTechno( { 'name' : 'scn6m_deep'
, 'precision' : 2 , 'precision' : 2
, 'gridValue' : 0.005 , 'gridValue' : 0.005
, 'gridUnit' : DbU.UnitPowerMicro , 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda' : 18 , 'gridsPerLambda' : 18
, 'symbolicGridStep': 1.0 , 'symbolicGridStep': 1.0
, 'polygonStep' : 9.0 , 'polygonStep' : 9.0
} } )
execfile( sysConfDir+'/common/technology.conf' )
# Format of <layersExtensionsTable>: # Format of <layersExtensionsTable>:
@ -37,165 +39,187 @@ technoConfig = { 'name' : 'scn6m_deep'
# * string: a synthetic way to designate the real or symbolic layer on # * string: a synthetic way to designate the real or symbolic layer on
# which it applies, an optional sub layer (BasicLayer) in case # which it applies, an optional sub layer (BasicLayer) in case
# where there is more than one, and the dimension name. # where there is more than one, and the dimension name.
# * value : the rule (dimension) value. If the main layer is symbolic it # * value : the rule (dimension) value.
# must be expressed in lambda, if it is for a real layers it # Values/dimensions must be given using one of the following conversion
# must be expressed in microns. # 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 = \ layersExtensionsTable = \
( ('METAL1.minimalSpacing' , 6.0) ( ('METAL1.minimalSpacing' , l( 6.0))
, ('METAL2.minimalSpacing' , 6.0) , ('METAL2.minimalSpacing' , l( 6.0))
, ('METAL3.minimalSpacing' , 6.0) , ('METAL3.minimalSpacing' , l( 6.0))
, ('METAL4.minimalSpacing' , 6.0) , ('METAL4.minimalSpacing' , l( 6.0))
, ('METAL5.minimalSpacing' , 6.0) , ('METAL5.minimalSpacing' , l( 6.0))
, ('METAL6.minimalSpacing' , 6.0) , ('METAL6.minimalSpacing' , l( 6.0))
, ('NWELL.nWell.extention.cap' , 4.0) , ('NWELL.nWell.extention.cap' , l( 4.0))
, ('PWELL.pWell.extention.cap' , 4.0) , ('PWELL.pWell.extention.cap' , l( 4.0))
, ('NTIE.minimum.width' , 3.0) , ('NTIE.minimum.width' , l( 3.0))
, ('NTIE.nWell.extention.cap' , 3.0) , ('NTIE.nWell.extention.cap' , l( 3.0))
, ('NTIE.nWell.extention.width' , 2.0) , ('NTIE.nWell.extention.width' , l( 2.0))
, ('NTIE.nImplant.extention.cap' , 2.5) , ('NTIE.nImplant.extention.cap' , l( 2.5))
, ('NTIE.nImplant.extention.width' , 1.5) , ('NTIE.nImplant.extention.width' , l( 1.5))
, ('NTIE.active.extention.cap' , 0.5) , ('NTIE.active.extention.cap' , l( 0.5))
, ('NTIE.active.extention.width' , -0.5) , ('NTIE.active.extention.width' , l(-0.5))
, ('PTIE.minimum.width' , 3.0) , ('PTIE.minimum.width' , l( 3.0))
, ('PTIE.pWell.extention.cap' , 3.0) , ('PTIE.pWell.extention.cap' , l( 3.0))
, ('PTIE.pWell.extention.width' , 2.0) , ('PTIE.pWell.extention.width' , l( 2.0))
, ('PTIE.pImplant.extention.cap' , 2.5) , ('PTIE.pImplant.extention.cap' , l( 2.5))
, ('PTIE.pImplant.extention.width' , 1.5) , ('PTIE.pImplant.extention.width' , l( 1.5))
, ('PTIE.active.extention.cap' , 0.5) , ('PTIE.active.extention.cap' , l( 0.5))
, ('PTIE.active.extention.width' , -0.5) , ('PTIE.active.extention.width' , l(-0.5))
, ('NDIF.minimum.width' , 3.0) , ('NDIF.minimum.width' , l( 3.0))
, ('NDIF.nImplant.extention.cap' , 4.0) , ('NDIF.nImplant.extention.cap' , l( 4.0))
, ('NDIF.nImplant.extention.width' , 2.0) , ('NDIF.nImplant.extention.width' , l( 2.0))
, ('NDIF.active.extention.cap' , 2.0) , ('NDIF.active.extention.cap' , l( 2.0))
, ('NDIF.active.extention.width' , 0.0) , ('NDIF.active.extention.width' , l( 0.0))
, ('PDIF.minimum.width' , 3.0) , ('PDIF.minimum.width' , l( 3.0))
, ('PDIF.pImplant.extention.cap' , 4.0) , ('PDIF.pImplant.extention.cap' , l( 4.0))
, ('PDIF.pImplant.extention.width' , 2.0) , ('PDIF.pImplant.extention.width' , l( 2.0))
, ('PDIF.active.extention.cap' , 2.0) , ('PDIF.active.extention.cap' , l( 2.0))
, ('PDIF.active.extention.width' , 0.0) , ('PDIF.active.extention.width' , l( 0.0))
, ('GATE.minimum.width' , 2.0) , ('GATE.minimum.width' , l( 2.0))
, ('GATE.poly.extention.cap' , 2.5) , ('GATE.poly.extention.cap' , l( 2.5))
, ('NTRANS.minimum.width' , 2.0) , ('NTRANS.minimum.width' , l( 2.0))
, ('NTRANS.nImplant.extention.cap' , 2.0) , ('NTRANS.nImplant.extention.cap' , l( 2.0))
, ('NTRANS.nImplant.extention.width' , 7.0) , ('NTRANS.nImplant.extention.width' , l( 7.0))
, ('NTRANS.active.extention.cap' , 0.0) , ('NTRANS.active.extention.cap' , l( 0.0))
, ('NTRANS.active.extention.width' , 3.0) , ('NTRANS.active.extention.width' , l( 3.0))
, ('NTRANS.poly.extention.cap' , 3.0) , ('NTRANS.poly.extention.cap' , l( 3.0))
, ('NTRANS.poly.extention.width' , 0.0) , ('NTRANS.poly.extention.width' , l( 0.0))
, ('PTRANS.minimum.width' , 2.0) , ('PTRANS.minimum.width' , l( 2.0))
, ('PTRANS.nWell.extention.cap' , 2.5) , ('PTRANS.nWell.extention.cap' , l( 2.5))
, ('PTRANS.nWell.extention.width' , 7.5) , ('PTRANS.nWell.extention.width' , l( 7.5))
, ('PTRANS.pImplant.extention.cap' , 2.0) , ('PTRANS.pImplant.extention.cap' , l( 2.0))
, ('PTRANS.pImplant.extention.width' , 7.0) , ('PTRANS.pImplant.extention.width' , l( 7.0))
, ('PTRANS.active.extention.cap' , 0.0) , ('PTRANS.active.extention.cap' , l( 0.0))
, ('PTRANS.active.extention.width' , 3.0) , ('PTRANS.active.extention.width' , l( 3.0))
, ('PTRANS.poly.extention.cap' , 3.0) , ('PTRANS.poly.extention.cap' , l( 3.0))
, ('PTRANS.poly.extention.width' , 0.0) , ('PTRANS.poly.extention.width' , l( 0.0))
, ('POLY.minimum.width' , 2.0) , ('POLY.minimum.width' , l( 2.0))
, ('POLY.poly.extention.cap' , 1.0) , ('POLY.poly.extention.cap' , l( 1.0))
, ('POLY2.minimum.width' , 2.0) , ('POLY2.minimum.width' , l( 2.0))
, ('POLY2.poly2.extention.cap' , 2.0) , ('POLY2.poly2.extention.cap' , l( 2.0))
# Routing Layers (symbolic). # Routing Layers (symbolic).
, ('METAL1.minimum.width' , 2.0) , ('METAL1.minimum.width' , l( 2.0))
, ('METAL1.metal1.extention.cap' , 2.0) , ('METAL1.metal1.extention.cap' , l( 2.0))
, ('METAL1.metal1.extention.width' , 1.0) , ('METAL1.metal1.extention.width' , l( 1.0))
, ('METAL2.minimum.width' , 4.0) , ('METAL2.minimum.width' , l( 4.0))
, ('METAL2.metal2.extention.cap' , 2.0) , ('METAL2.metal2.extention.cap' , l( 2.0))
, ('METAL3.minimum.width' , 4.0) , ('METAL3.minimum.width' , l( 4.0))
, ('METAL3.metal3.extention.cap' , 2.0) , ('METAL3.metal3.extention.cap' , l( 2.0))
, ('METAL4.minimum.width' , 4.0) , ('METAL4.minimum.width' , l( 4.0))
, ('METAL4.metal4.extention.cap' , 2.0) , ('METAL4.metal4.extention.cap' , l( 2.0))
, ('METAL5.minimum.width' , 4.0) , ('METAL5.minimum.width' , l( 4.0))
, ('METAL5.metal5.extention.cap' , 2.0) , ('METAL5.metal5.extention.cap' , l( 2.0))
, ('METAL6.minimum.width' , 10.0) , ('METAL6.minimum.width' , l(10.0))
, ('METAL6.metal6.extention.cap' , 5.0) , ('METAL6.metal6.extention.cap' , l( 5.0))
#, ('METAL7.minimum.width' , 2.0) #, ('METAL7.minimum.width' , l( 2.0))
#, ('METAL7.metal7.extention.cap' , 2.5) #, ('METAL7.metal7.extention.cap' , l( 2.5))
#, ('METAL8.minimum.width' , 2.0) #, ('METAL8.minimum.width' , l( 2.0))
#, ('METAL8.metal8.extention.cap' , 2.5) #, ('METAL8.metal8.extention.cap' , l( 2.5))
# Blockages (symbolic). # Blockages (symbolic).
, ('BLOCKAGE1.minimum.width' , 4.0) , ('BLOCKAGE1.minimum.width' , l( 4.0))
, ('BLOCKAGE1.blockage1.extention.cap' , 2.0) , ('BLOCKAGE1.blockage1.extention.cap' , l( 2.0))
, ('BLOCKAGE1.blockage1.extention.width', 0.5) , ('BLOCKAGE1.blockage1.extention.width', l( 0.5))
, ('BLOCKAGE2.minimum.width' , 4.0) , ('BLOCKAGE2.minimum.width' , l( 4.0))
, ('BLOCKAGE2.blockage2.extention.cap' , 2.0) , ('BLOCKAGE2.blockage2.extention.cap' , l( 2.0))
, ('BLOCKAGE3.minimum.width' , 4.0) , ('BLOCKAGE3.minimum.width' , l( 4.0))
, ('BLOCKAGE3.blockage3.extention.cap' , 2.0) , ('BLOCKAGE3.blockage3.extention.cap' , l( 2.0))
, ('BLOCKAGE4.minimum.width' , 4.0) , ('BLOCKAGE4.minimum.width' , l( 4.0))
, ('BLOCKAGE4.blockage4.extention.cap' , 2.0) , ('BLOCKAGE4.blockage4.extention.cap' , l( 2.0))
, ('BLOCKAGE5.minimum.width' , 4.0) , ('BLOCKAGE5.minimum.width' , l( 4.0))
, ('BLOCKAGE5.blockage5.extention.cap' , 2.0) , ('BLOCKAGE5.blockage5.extention.cap' , l( 2.0))
, ('BLOCKAGE6.minimum.width' , 8.0) , ('BLOCKAGE6.minimum.width' , l( 8.0))
, ('BLOCKAGE6.blockage6.extention.cap' , 2.5) , ('BLOCKAGE6.blockage6.extention.cap' , l( 2.5))
#, ('BLOCKAGE7.minimum.width' , 2.0) #, ('BLOCKAGE7.minimum.width' , l( 2.0))
#, ('BLOCKAGE7.blockage6.extention.cap' , 4.0) #, ('BLOCKAGE7.blockage6.extention.cap' , l( 4.0))
#, ('BLOCKAGE8.minimum.width' , 2.0) #, ('BLOCKAGE8.minimum.width' , l( 2.0))
#, ('BLOCKAGE8.blockage6.extention.cap' , 4.0) #, ('BLOCKAGE8.blockage6.extention.cap' , l( 4.0))
# Contacts (i.e. Active <--> Metal) (symbolic). # Contacts (i.e. Active <--> Metal) (symbolic).
, ('CONT_BODY_N.minimum.side' , 2.0) , ('CONT_BODY_N.minimum.side' , l( 2.0))
, ('CONT_BODY_N.nWell.enclosure' , 4.0) , ('CONT_BODY_N.nWell.enclosure' , l( 4.0))
, ('CONT_BODY_N.nImplant.enclosure' , 3.5) , ('CONT_BODY_N.nImplant.enclosure' , l( 3.5))
, ('CONT_BODY_N.active.enclosure' , 1.5) , ('CONT_BODY_N.active.enclosure' , l( 1.5))
, ('CONT_BODY_N.metal1.enclosure' , 1.0) , ('CONT_BODY_N.metal1.enclosure' , l( 1.0))
, ('CONT_BODY_P.minimum.side' , 2.0) , ('CONT_BODY_P.minimum.side' , l( 2.0))
, ('CONT_BODY_P.pWell.enclosure' , 4.0) , ('CONT_BODY_P.pWell.enclosure' , l( 4.0))
, ('CONT_BODY_P.pImplant.enclosure' , 3.5) , ('CONT_BODY_P.pImplant.enclosure' , l( 3.5))
, ('CONT_BODY_P.active.enclosure' , 1.5) , ('CONT_BODY_P.active.enclosure' , l( 1.5))
, ('CONT_BODY_P.metal1.enclosure' , 1.0) , ('CONT_BODY_P.metal1.enclosure' , l( 1.0))
, ('CONT_DIF_N.minimum.side' , 2.0) , ('CONT_DIF_N.minimum.side' , l( 2.0))
, ('CONT_DIF_N.nImplant.enclosure' , 4.0) , ('CONT_DIF_N.nImplant.enclosure' , l( 4.0))
, ('CONT_DIF_N.active.enclosure' , 2.0) , ('CONT_DIF_N.active.enclosure' , l( 2.0))
, ('CONT_DIF_N.metal1.enclosure' , 1.0) , ('CONT_DIF_N.metal1.enclosure' , l( 1.0))
, ('CONT_DIF_P.minimum.side' , 2.0) , ('CONT_DIF_P.minimum.side' , l( 2.0))
, ('CONT_DIF_P.pImplant.enclosure' , 4.0) , ('CONT_DIF_P.pImplant.enclosure' , l( 4.0))
, ('CONT_DIF_P.active.enclosure' , 2.0) , ('CONT_DIF_P.active.enclosure' , l( 2.0))
, ('CONT_DIF_P.metal1.enclosure' , 1.0) , ('CONT_DIF_P.metal1.enclosure' , l( 1.0))
, ('CONT_POLY.minimum.width' , 2.0) , ('CONT_POLY.minimum.width' , l( 2.0))
, ('CONT_POLY.poly.enclosure' , 2.0) , ('CONT_POLY.poly.enclosure' , l( 2.0))
, ('CONT_POLY.metal1.enclosure' , 1.0) , ('CONT_POLY.metal1.enclosure' , l( 1.0))
# VIAs (i.e. Metal <--> Metal) (symbolic). # VIAs (i.e. Metal <--> Metal) (symbolic).
, ('VIA12.minimum.side' , 2.0) , ('VIA12.minimum.side' , l( 2.0))
, ('VIA12.metal1.enclosure' , 1.0) , ('VIA12.metal1.enclosure' , l( 1.0))
, ('VIA12.metal2.enclosure' , 1.0) , ('VIA12.metal2.enclosure' , l( 1.0))
, ('VIA23.minimum.side' , 2.0) , ('VIA23.minimum.side' , l( 2.0))
, ('VIA23.metal2.enclosure' , 1.0) , ('VIA23.metal2.enclosure' , l( 1.0))
, ('VIA23.metal3.enclosure' , 1.0) , ('VIA23.metal3.enclosure' , l( 1.0))
, ('VIA34.minimum.side' , 2.0) , ('VIA34.minimum.side' , l( 2.0))
, ('VIA34.metal3.enclosure' , 1.0) , ('VIA34.metal3.enclosure' , l( 1.0))
, ('VIA34.metal4.enclosure' , 1.0) , ('VIA34.metal4.enclosure' , l( 1.0))
, ('VIA45.minimum.side' , 2.0) , ('VIA45.minimum.side' , l( 2.0))
, ('VIA45.metal4.enclosure' , 1.0) , ('VIA45.metal4.enclosure' , l( 1.0))
, ('VIA45.metal5.enclosure' , 1.0) , ('VIA45.metal5.enclosure' , l( 1.0))
, ('VIA56.minimum.side' , 5.0) , ('VIA56.minimum.side' , l( 5.0))
, ('VIA56.metal5.enclosure' , 1.0) , ('VIA56.metal5.enclosure' , l( 1.0))
, ('VIA56.metal6.enclosure' , 1.5) , ('VIA56.metal6.enclosure' , l( 1.5))
#, ('VIA67.minimum.side' , 2.0) #, ('VIA67.minimum.side' , l( 2.0))
#, ('VIA67.metal6.enclosure' , 3.0) #, ('VIA67.metal6.enclosure' , l( 3.0))
#, ('VIA67.metal7.enclosure' , 3.0) #, ('VIA67.metal7.enclosure' , l( 3.0))
#, ('VIA78.minimum.side' , 2.0) #, ('VIA78.minimum.side' , l( 2.0))
#, ('VIA78.metal7.enclosure' , 3.0) #, ('VIA78.metal7.enclosure' , l( 3.0))
#, ('VIA78.metal8.enclosure' , 3.0) #, ('VIA78.metal8.enclosure' , l( 3.0))
) )
for entry in layersExtensionsTable:
print entry
# Format of an entry in the table: # Format of an entry in the table:
# (Symbolic_Name, CIF_Name, GDSII_Number) # (Symbolic_Name, CIF_Name, GDSII_Number)
gdsLayersTable = \ gdsLayersTable = \

View File

@ -1,12 +1,11 @@
# -*- Mode:Python; explicit-buffer-name: "kite.conf<freepdk_45>" -*- # -*- Mode:Python; explicit-buffer-name: "kite.conf<freepdk_45>" -*-
import helpers import helpers
from helpers import l, u, n
# Contains the layout (shared by all technologies). # Contains the layout (shared by all technologies).
execfile( helpers.sysConfDir+'/common/kite.conf' ) execfile( helpers.sysConfDir+'/common/kite.conf' )
helpers.micronsMode()
parametersTable = \ parametersTable = \
( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 ) ( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 )
@ -48,16 +47,16 @@ routingGaugesTable = {}
routingGaugesTable['gscl45'] = \ routingGaugesTable['gscl45'] = \
( ( 'symbolic', False ) ( ( 'symbolic', False )
, ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, 0, 0.190, 0.065, 0.065, 7 ) ) , ( '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, 0, 0.190, 0.070, 0.070, 8 ) ) , ( '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, 0, 0.190, 0.070, 0.070, 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, 0, 0.285, 0.140, 0.140, 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, 0, 0.285, 0.140, 0.140, 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, 0, 0.285, 0.140, 0.140, 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, 0, 0.855, 0.400, 0.400, 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, 0, 0.855, 0.400, 0.400, 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, 0, 1.710, 0.800, 0.800, 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, 0, 1.710, 0.800, 0.800, 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 ) # ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
cellGaugesTable = {} cellGaugesTable = {}
cellGaugesTable['gscl45'] = ('metal2', 0.38, 2.47, 0.38) cellGaugesTable['gscl45'] = ('metal2', u(0.38), u(2.47), u(0.38))

View File

@ -9,21 +9,21 @@
# - <symbolicLayersTable> # - <symbolicLayersTable>
from Hurricane import DbU from Hurricane import DbU
from helpers import sysConfDir
from helpers import l, u, n
from helpers.Technology import initTechno
# Contains the layers initTechno( { 'name' : 'freepdk_45'
execfile( helpers.sysConfDir+'/common/technology.conf' )
helpers.micronsMode()
technoConfig = { 'name' : 'freepdk_45'
, 'precision' : 2 , 'precision' : 2
, 'gridValue' : 0.0025 , 'gridValue' : 0.0025
, 'gridUnit' : DbU.UnitPowerMicro , 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda' : 18 , 'gridsPerLambda' : 18
, 'symbolicGridStep' : 1.0 , 'symbolicGridStep' : 1.0
, 'polygonStep' : 1.0 , 'polygonStep' : 1.0
} } )
# Contains the layers
execfile( helpers.sysConfDir+'/common/technology.conf' )
# Format of <layersExtensionsTable>: # Format of <layersExtensionsTable>:
@ -31,206 +31,56 @@ technoConfig = { 'name' : 'freepdk_45'
# * string: a synthetic way to designate the real or symbolic layer on # * string: a synthetic way to designate the real or symbolic layer on
# which it applies, an optional sub layer (BasicLayer) in case # which it applies, an optional sub layer (BasicLayer) in case
# where there is more than one, and the dimension name. # where there is more than one, and the dimension name.
# * value : the rule (dimension) value. If the main layer is symbolic it # * value : the rule (dimension) value.
# must be expressed in lambda, if it is for a real layers it # Values/dimensions must be given using one of the following conversion
# must be expressed in microns. # function:
# * l(value) : value expressed in lambda (symbolic).
# * u(value) : value is expressed in microns.
# * n(value) : value is expressed in nanometers.
layersExtensionsTable = \ layersExtensionsTable = symbolicLayersExtensionsTable + \
( ('metal1.minimalSpacing' , 0.065) [ ('metal1.minimalSpacing' , u( 0.065))
, ('metal2.minimalSpacing' , 0.075) , ('metal2.minimalSpacing' , u( 0.075))
, ('metal3.minimalSpacing' , 0.07 ) , ('metal3.minimalSpacing' , u( 0.07 ))
, ('metal4.minimalSpacing' , 0.14 ) , ('metal4.minimalSpacing' , u( 0.14 ))
, ('metal5.minimalSpacing' , 0.14 ) , ('metal5.minimalSpacing' , u( 0.14 ))
, ('metal6.minimalSpacing' , 0.14 ) , ('metal6.minimalSpacing' , u( 0.14 ))
, ('metal7.minimalSpacing' , 0.4 ) , ('metal7.minimalSpacing' , u( 0.4 ))
, ('metal8.minimalSpacing' , 0.4 ) , ('metal8.minimalSpacing' , u( 0.4 ))
, ('metal9.minimalSpacing' , 0.8 ) , ('metal9.minimalSpacing' , u( 0.8 ))
, ('metal10.minimalSpacing' , 0.8 ) , ('metal10.minimalSpacing' , u( 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)
# VIAs (i.e. Metal <--> Metal) (real). # 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. # This is the rule as defined in LEF, but seems wrong to me.
#, ('via12.metal1.enclosure' , (0.035 , 0.0 ) ) #, ('via12.metal1.enclosure' , (u(0.035 ), u(0.0 )) )
, ('via12.metal1.enclosure' , (0.0 , 0.035) ) , ('via12.metal1.enclosure' , (u(0.0 ), u(0.035)) )
, ('via12.metal2.enclosure' , (0.0025, 0.035) ) , ('via12.metal2.enclosure' , (u(0.0025), u(0.035)) )
, ('via23.minimum.side' , 0.070) , ('via23.minimum.side' , u(0.070 ))
, ('via23.metal2.enclosure' , (0.0 , 0.035) ) , ('via23.metal2.enclosure' , (u(0.0 ), u(0.035)) )
, ('via23.metal3.enclosure' , (0.035 , 0.0 ) ) , ('via23.metal3.enclosure' , (u(0.035 ), u(0.0 )) )
, ('via34.minimum.side' , 0.070) , ('via34.minimum.side' , u(0.070 ))
, ('via34.metal3.enclosure' , (0.035, 0.0 ) ) , ('via34.metal3.enclosure' , (u(0.035 ), u(0.0 )) )
, ('via34.metal4.enclosure' , 0.035) , ('via34.metal4.enclosure' , u(0.035 ))
, ('via45.minimum.side' , 0.140) , ('via45.minimum.side' , u(0.140 ))
, ('via45.metal4.enclosure' , 0.0 ) , ('via45.metal4.enclosure' , u(0.0 ))
, ('via45.metal5.enclosure' , 0.0 ) , ('via45.metal5.enclosure' , u(0.0 ))
, ('via56.minimum.side' , 0.140) , ('via56.minimum.side' , u(0.140 ))
, ('via56.metal5.enclosure' , 0.0 ) , ('via56.metal5.enclosure' , u(0.0 ))
, ('via56.metal6.enclosure' , 0.0 ) , ('via56.metal6.enclosure' , u(0.0 ))
, ('via67.minimum.side' , 0.140) , ('via67.minimum.side' , u(0.140 ))
, ('via67.metal6.enclosure' , 0.0 ) , ('via67.metal6.enclosure' , u(0.0 ))
, ('via67.metal7.enclosure' , 0.130) , ('via67.metal7.enclosure' , u(0.130 ))
, ('via78.minimum.side' , 0.200) , ('via78.minimum.side' , u(0.200 ))
, ('via78.metal7.enclosure' , 0.0 ) , ('via78.metal7.enclosure' , u(0.0 ))
, ('via78.metal8.enclosure' , 0.0 ) , ('via78.metal8.enclosure' , u(0.0 ))
, ('via89.minimum.side' , 0.200) , ('via89.minimum.side' , u(0.200 ))
, ('via89.metal8.enclosure' , 0.0 ) , ('via89.metal8.enclosure' , u(0.0 ))
, ('via89.metal9.enclosure' , 0.200) , ('via89.metal9.enclosure' , u(0.200 ))
, ('via910.minimum.side' , 0.400) , ('via910.minimum.side' , u(0.400 ))
, ('via910.metal9.enclosure' , 0.0 ) , ('via910.metal9.enclosure' , u(0.0 ))
, ('via910.metal10.enclosure' , 0.0 ) , ('via910.metal10.enclosure' , u(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)
)
# Table guessed from the Cadence configuration files: # Table guessed from the Cadence configuration files:

View File

@ -3,6 +3,7 @@
# Those settings are common to all the symbolic technologies. # Those settings are common to all the symbolic technologies.
from Hurricane import BasicLayer from Hurricane import BasicLayer
from helpers import l, u, n
from helpers.Technology import TypeRegular from helpers.Technology import TypeRegular
from helpers.Technology import TypeDiffusion from helpers.Technology import TypeDiffusion
from helpers.Technology import TypeTransistor from helpers.Technology import TypeTransistor
@ -163,3 +164,171 @@ symbolicLayersTable = \
, 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910' , 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910'
, 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact' , 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact'
] ]
# Format of <layersExtensionsTable>:
# 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))
]

View File

@ -1,6 +1,7 @@
# -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos>" -*- # -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos>" -*-
import helpers import helpers
from helpers import l, n, u
# Contains the layout (shared by all technologies). # Contains the layout (shared by all technologies).
execfile( helpers.sysConfDir+'/common/kite.conf' ) execfile( helpers.sysConfDir+'/common/kite.conf' )
@ -43,18 +44,18 @@ parametersTable = \
routingGaugesTable = {} routingGaugesTable = {}
routingGaugesTable['sxlib'] = \ routingGaugesTable['sxlib'] = \
( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 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, 0, 5, 2, 1, 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, 0, 5, 2, 1, 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, 0, 5, 2, 1, 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, 0, 5, 2, 1, 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, 0, 5, 2, 1, 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, 0, 5, 2, 1, 4 ) ) #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, l(0), l(5), l(2), l(1), l(4) ) )
) )
routingGaugesTable['sxlib-2M'] = \ routingGaugesTable['sxlib-2M'] = \
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 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, 0, 5, 2, 1, 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 ) # ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
cellGaugesTable = {} cellGaugesTable = {}
cellGaugesTable['sxlib'] = ('metal2', 5.0, 50.0, 5.0) cellGaugesTable['sxlib'] = ('metal2', l(5.0), l(50.0), l(5.0))

View File

@ -1,7 +1,9 @@
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*- # -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*-
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, # The informations here are extracted from the Alliance ".rds" file,
# and must be coherent with it. # and must be coherent with it.
@ -12,17 +14,16 @@ from Hurricane import DbU
# - <compositeLayersTable> # - <compositeLayersTable>
# - <symbolicLayersTable> # - <symbolicLayersTable>
execfile( helpers.sysConfDir+'/common/technology.conf' ) initTechno( { 'name' : 'cmos'
technoConfig = { 'name' : 'hcmos9gp'
, 'precision' : 2 , 'precision' : 2
, 'gridValue' : 0.005 , 'gridValue' : 0.005
, 'gridUnit' : DbU.UnitPowerMicro , 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda' : 24 , 'gridsPerLambda' : 24
, 'symbolicGridStep' : 1.0 , 'symbolicGridStep' : 1.0
, 'polygonStep' : 24.0 , 'polygonStep' : 24.0
} } )
execfile( sysConfDir+'/common/technology.conf' )
# Format of <layersExtensionsTable>: # Format of <layersExtensionsTable>:
@ -30,150 +31,14 @@ technoConfig = { 'name' : 'hcmos9gp'
# * string: a synthetic way to designate the real or symbolic layer on # * string: a synthetic way to designate the real or symbolic layer on
# which it applies, an optional sub layer (BasicLayer) in case # which it applies, an optional sub layer (BasicLayer) in case
# where there is more than one, and the dimension name. # where there is more than one, and the dimension name.
# * value : the rule (dimension) value. If the main layer is symbolic it # * value : the rule (dimension) value.
# must be expressed in lambda, if it is for a real layers it # Values/dimensions must be given using one of the following conversion
# must be expressed in microns. # function:
# * l(value) : value expressed in lambda (symbolic).
# * u(value) : value is expressed in microns.
# * n(value) : value is expressed in nanometers.
layersExtensionsTable = \ layersExtensionsTable = symbolicLayersExtensionsTable
( ('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)
)
gdsLayersTable = \ gdsLayersTable = \

View File

@ -75,8 +75,7 @@ SystemMandatory = 0x0100
def coriolisConfigure(): def coriolisConfigure():
confHelpers = ( ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper)
, ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper)
, ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper) , ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper)
, ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper) , ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper)
, ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper) , ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper)
@ -91,6 +90,8 @@ def coriolisConfigure():
, ('layoutTable' , Configuration.loadLayout , ConfigurationHelper) , ('layoutTable' , Configuration.loadLayout , ConfigurationHelper)
) )
# ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper)
print ' o Running configuration hook: coriolisConfigure().' print ' o Running configuration hook: coriolisConfigure().'
#print ' - sysConfDir: <%s>' % helpers.sysConfDir #print ' - sysConfDir: <%s>' % helpers.sysConfDir

View File

@ -151,11 +151,11 @@ def loadRoutingGaugesTable ( routingGaugesTable, fromFile ):
, Gauge.toRlGauge(entry[1][1]) # Type. , Gauge.toRlGauge(entry[1][1]) # Type.
, entry[1][2] # Depth. , entry[1][2] # Depth.
, entry[1][3] # Density. , entry[1][3] # Density.
, helpers.toDbU(entry[1][4]) # Offset. , entry[1][4] # Offset.
, helpers.toDbU(entry[1][5]) # Pitch. , entry[1][5] # Pitch.
, helpers.toDbU(entry[1][6]) # Wire width. , entry[1][6] # Wire width.
, helpers.toDbU(entry[1][7]) # Via width. , entry[1][7] # Via width.
, helpers.toDbU(entry[1][8]) # Obstacle dW. , entry[1][8] # Obstacle dW.
) ) ) )
except Exception, e: except Exception, e:
@ -184,9 +184,9 @@ def loadCellGaugesTable ( cellGaugesTable, fromFile ):
]) ])
gauge = CellGauge.create( gaugeName gauge = CellGauge.create( gaugeName
, gaugeDatas[0] # pinLayerName. , gaugeDatas[0] # pinLayerName.
, helpers.toDbU(gaugeDatas[1]) # pitch. , gaugeDatas[1] # pitch.
, helpers.toDbU(gaugeDatas[2]) # sliceHeight. , gaugeDatas[2] # sliceHeight.
, helpers.toDbU(gaugeDatas[3]) # sliceStep. , gaugeDatas[3] # sliceStep.
) )
except Exception, e: except Exception, e:
ErrorMessage.wrapPrint(e,'In %s:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo)) ErrorMessage.wrapPrint(e,'In %s:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo))

View File

@ -17,7 +17,6 @@ from Hurricane import ContactLayer
from Hurricane import ViaLayer from Hurricane import ViaLayer
from CRL import AllianceFramework from CRL import AllianceFramework
from helpers import ErrorMessage from helpers import ErrorMessage
from helpers import toDbU
technologyFile = '<No technology file specified>' technologyFile = '<No technology file specified>'
@ -217,7 +216,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
,'Must contains exactly two fields: ( rule_path, value ).' ,'Must contains exactly two fields: ( rule_path, value ).'
,str(rule) ,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],float) \
and not isinstance(rule[1],tuple): and not isinstance(rule[1],tuple):
raise ErrorMessage(1,['Invalid entry in <layersExtensionsTable>.' raise ErrorMessage(1,['Invalid entry in <layersExtensionsTable>.'
@ -240,16 +240,8 @@ def loadLayersExtensions ( layersExtensionsTable, confFile ):
,str(rule) ,str(rule)
]) ])
if elements[0].startswith('via') or elements[0].startswith('metal'): if isinstance(rule[1],tuple): value = ( rule[1][0], rule[1][1] )
if isinstance(rule[1],tuple): else: value = rule[1]
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 subLayer: ruleTag = string.join(elements[2:],'.') if subLayer: ruleTag = string.join(elements[2:],'.')
else: ruleTag = string.join(elements[1:],'.') else: ruleTag = string.join(elements[1:],'.')
@ -343,8 +335,7 @@ def loadGdsLayers ( realLayersTable, confFile ):
return return
def loadTechnoConfig ( technoConfig, confFile ): def initTechno ( technoConfig ):
technologyFile = confFile
technology = DataBase.getDB().getTechnology() technology = DataBase.getDB().getTechnology()
if not technology: if not technology:
name = 'Unknown' name = 'Unknown'

View File

@ -295,23 +295,9 @@ def overload ( defaultParameters, parameters ):
return tuple(overloadParameters) return tuple(overloadParameters)
def l ( value ): return Hurricane.DbU.fromLambda( value )
def lambdaMode (): def u ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerMicro )
global unitsLambda def n ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPowerNano )
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 initTechno ( argQuiet ): def initTechno ( argQuiet ):