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:
parent
094cb8a132
commit
55a29488c9
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<scmos_deep_018>" -*-
|
||||
|
||||
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))
|
||||
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# -*- 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,
|
||||
# and must be consistent with it.
|
||||
|
@ -12,8 +14,6 @@ from Hurricane import DbU
|
|||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
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 <layersExtensionsTable>:
|
||||
|
@ -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 = \
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<freepdk_45>" -*-
|
||||
|
||||
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))
|
||||
|
||||
|
|
|
@ -8,229 +8,79 @@
|
|||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
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 <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. 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:
|
||||
|
|
|
@ -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 <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))
|
||||
]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos>" -*-
|
||||
|
||||
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))
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
# -*- 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,
|
||||
# and must be coherent with it.
|
||||
|
@ -12,17 +14,16 @@ from Hurricane import DbU
|
|||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
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 <layersExtensionsTable>:
|
||||
|
@ -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 = \
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo))
|
||||
|
|
|
@ -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 = '<No technology file specified>'
|
||||
|
@ -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 <layersExtensionsTable>.'
|
||||
|
@ -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'
|
||||
|
|
|
@ -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 ):
|
||||
|
|
Loading…
Reference in New Issue