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>" -*-
|
# -*- 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))
|
||||||
|
|
||||||
|
|
|
@ -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 = \
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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))
|
||||||
|
]
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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 = \
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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 ):
|
||||||
|
|
Loading…
Reference in New Issue