Correct handling of lambdas & microns in configuration files.

* Bug: In CRL/etc/NODE/VENDOR/Technology.conf, the database must be configured
    as early has possible so the functions ensuring length conversions can
    work correctly (l(v), u(v)). So we can no longer rely on a table to be
    read after the execution of the file. We perform a direct call to the
    helpers.Technology.initTechno() function. And it must be made first
    thing.
      In all tables taking dimensions, we must use one of the converter
    function helpers.l(v), helpers.u(v) or helpers.n(v) so the the value v
    get converted in lambda, microns or nanometer (resp.). Make the
    modifications in all technology.conf and kite.conf files.
* Change: In CRL/coriolisInit.py, remove the technoConfig variable that has
    been replaced by a direct call to helpers.Technology.initTechno().
* Change: In CRL/helpers.Alliance.loadRoutingGaugesTable(), no longer try to
    convert coordinates, they must already be in DbU.
* Change: In CRL/helpers.__init__.py, remove lambdaMode() and micronsMode()
    they could not be made to work as expected. Create l(), u(), n() as
    replacement.
This commit is contained in:
Jean-Paul Chaput 2018-07-16 11:32:40 +02:00
parent 094cb8a132
commit 55a29488c9
11 changed files with 470 additions and 583 deletions

View File

@ -1,6 +1,7 @@
# -*- Mode:Python; explicit-buffer-name: "kite.conf<scmos_deep_018>" -*-
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))

View File

@ -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 = \

View File

@ -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))

View File

@ -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:

View File

@ -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))
]

View File

@ -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))

View File

@ -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 = \

View File

@ -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

View File

@ -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))

View File

@ -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'

View File

@ -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 ):