Added support for 3 metal layers symbolic Phenitec 0.6um.
* New: In CRL/etc/symbolic/phenitec06, configuration for symbolic layout targeted for Phenitec 0.6um (do not contains any NDA covered informations). Could be used for any 3 metal layers techno. * Bug: In Cumulus/plugins/chip/Configuaration.py, _setStackposition() disable stack error when there is no slave component on the stack (happens when the stack consists only of one contact).
This commit is contained in:
parent
4b9a6ec4a9
commit
d670de4125
|
@ -0,0 +1,39 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "alliance.conf<phenitec06>" -*-
|
||||
|
||||
import os
|
||||
from helpers.Alliance import AddMode
|
||||
from helpers.Alliance import Gauge
|
||||
|
||||
|
||||
allianceTop = None
|
||||
if os.environ.has_key('ALLIANCE_TOP'):
|
||||
allianceTop = os.environ['ALLIANCE_TOP']
|
||||
if not os.path.isdir(allianceTop):
|
||||
allianceTop = None
|
||||
|
||||
if not allianceTop: allianceTop = '/soc/alliance'
|
||||
|
||||
cellsTop = allianceTop+'/cells/'
|
||||
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'/nsxlib' , Environment.Append)
|
||||
, (cellsTop+'/mpxlib' , Environment.Append)) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockage[Nn]et*')
|
||||
, ( 'PAD' , '.*_mpx$')
|
||||
# The following are only read by the Alliance tool wrappers.
|
||||
, ( 'ALLIANCE_TOP' , allianceTop)
|
||||
, ( 'MBK_TARGET_LIB' , cellsTop+'/msxlib')
|
||||
, ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/scn6m_deep_09.rds')
|
||||
, ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds')
|
||||
)
|
|
@ -0,0 +1,6 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "analog.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
execfile( helpers.ndaConfDir+'/common/analog.conf' )
|
|
@ -0,0 +1,6 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "devices.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
execfile( helpers.ndaConfDir+'/common/devices.conf' )
|
|
@ -0,0 +1,11 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "display.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
|
@ -0,0 +1,10 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
||||
|
||||
parametersTable = \
|
||||
( ('etesian.bloat' , TypeString , "nsxlib" )
|
||||
,
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/hMetis.conf' )
|
|
@ -0,0 +1,86 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers import l, u, n
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ('lefImport.minTerminalWidth' ,TypeDouble ,0.0 )
|
||||
, ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
|
||||
, ("katabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'METAL3')
|
||||
# Kite parameters.
|
||||
, ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } )
|
||||
, ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } )
|
||||
, ("kite.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
# Anabatic parameters are temporarily hosted here.
|
||||
, ('anabatic.topRoutingLayer' ,TypeString , 'METAL3')
|
||||
, ("anabatic.routingGauge" ,TypeString ,'msxlib3')
|
||||
, ("anabatic.edgeLength" ,TypeInt ,48 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,8 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,19.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-60.0 )
|
||||
, ("anabatic.edgeHInc" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.edgeHScaling" ,TypeDouble ,1.0 )
|
||||
, ("anabatic.globalIterations" ,TypeInt ,20 , { 'min':1, 'max':100 } )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
, ("katana.hTracksReservedLocal" , TypeInt , 5 )
|
||||
, ("katana.vTracksReservedLocal" , TypeInt , 3 )
|
||||
)
|
||||
|
||||
|
||||
# Format of routingGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width, obs_dw) )
|
||||
|
||||
routingGaugesTable = {}
|
||||
|
||||
routingGaugesTable['msxlib'] = \
|
||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l(3), l(2), l(7) ) )
|
||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(20), l(6), l(4), l(8) ) )
|
||||
)
|
||||
|
||||
routingGaugesTable['msxlib4'] = \
|
||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l(3), l(2), l(7) ) )
|
||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
)
|
||||
|
||||
routingGaugesTable['msxlib3'] = \
|
||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l(3), l(2), l(7) ) )
|
||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l(3), l(2), l(8) ) )
|
||||
)
|
||||
|
||||
routingGaugesTable['msxlib-2M'] = \
|
||||
( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(10), l(3), l(3), l(7) ) )
|
||||
, ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(3), l(8) ) )
|
||||
)
|
||||
|
||||
|
||||
# Format of cellGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['msxlib' ] = ('metal2', l(10), l(100), l(10))
|
||||
cellGaugesTable['msxlib4'] = ('metal2', l(10), l(100), l(10))
|
||||
cellGaugesTable['msxlib3'] = ('metal2', l(10), l(100), l(10))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/mauka.conf' )
|
|
@ -0,0 +1,9 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "misc.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# # - <defaultStyle>
|
||||
# # - <stylesTable>
|
||||
#
|
||||
execfile( helpers.sysConfDir+'/common/misc.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/nimbus.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/patterns.conf' )
|
|
@ -0,0 +1,23 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "plugins.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
from helpers import l, u, n
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
#execfile( helpers.sysConfDir+'/common/plugins.conf' )
|
||||
|
||||
|
||||
# WARNING: Those values have not been adjusted yet for this technologies.
|
||||
# Must be done.
|
||||
#
|
||||
# Parameters for chip plugin.
|
||||
parametersTable = \
|
||||
( ("chip.block.rails.count" , TypeInt , l(5 ) )
|
||||
, ("chip.block.rails.hWidth" , TypeInt , l(24) )
|
||||
, ("chip.block.rails.vWidth" , TypeInt , l(24) )
|
||||
, ("chip.block.rails.hSpacing" , TypeInt , l(12) )
|
||||
, ("chip.block.rails.vSpacing" , TypeInt , l(12) )
|
||||
, ('clockTree.minimumSide' , TypeInt , l(1200))
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Etesian')
|
||||
)
|
|
@ -0,0 +1,13 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "stratus1.conf<phenitec06>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
# Status1 parameters.
|
||||
parametersTable = \
|
||||
( ("stratus1.format" , TypeString, "vst")
|
||||
, ("stratus1.simulator" , TypeString, "asimut")
|
||||
,)
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/stratus1.conf' )
|
|
@ -0,0 +1,242 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<phenitec06>" -*-
|
||||
|
||||
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.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <compositeLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
|
||||
|
||||
# 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
|
||||
# the value of the technology, that is 180nm gives 90nm. We have no information
|
||||
# about the foundry grid.
|
||||
#
|
||||
# We set the foundry grid to .0025um and set the gridsPerLambda to 10.
|
||||
|
||||
initTechno( { 'name' : 'phenitec06'
|
||||
, 'precision' : 2
|
||||
, 'gridValue' : 0.002
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda' : 150
|
||||
, 'symbolicGridStep': 1.0
|
||||
, 'polygonStep' : 10.0
|
||||
} )
|
||||
|
||||
execfile( sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# 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.
|
||||
|
||||
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' , 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' , l( 4.0))
|
||||
, ('PWELL.pWell.extention.cap' , l( 4.0))
|
||||
|
||||
, ('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' , 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' , 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' , 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' , l( 2.0))
|
||||
, ('GATE.poly.extention.cap' , l( 2.5))
|
||||
|
||||
, ('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' , 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' , 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' , 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' , 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' , 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' , 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' , 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' , 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' , 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' , 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))
|
||||
)
|
||||
|
||||
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 41, 0)
|
||||
, ("nWell" , "CWP" , 42, 0)
|
||||
, ("active" , "CAA" , 43, 0)
|
||||
, ("pImplant", "CSP" , 44, 0)
|
||||
, ("nImplant", "CSN" , 45, 0)
|
||||
, ("poly" , "CPG" , 46, 0)
|
||||
#, ("poly2" , "CM1" , 49, 0) # poly2 is in fact metal1.
|
||||
, ("cut0" , "CCC" , 25, 0)
|
||||
, ("metal1" , "CM1" , 49, 0)
|
||||
, ("cut1" , "CV1" , 50, 0)
|
||||
, ("metal2" , "CM2" , 51, 0)
|
||||
, ("cut2" , "CV2" , 61, 0)
|
||||
, ("metal3" , "CM3" , 62, 0)
|
||||
, ("cut3" , "CV3" , 30, 0)
|
||||
#, ("metal4" , "CM4" , 31, 0)
|
||||
#, ("cut4" , "CV4" , 32, 0)
|
||||
#, ("metal5" , "CM5" , 33, 0)
|
||||
#, ("cut5" , "CV5" , 36, 0)
|
||||
#, ("metal6" , "CM6" , 37, 0)
|
||||
)
|
|
@ -444,9 +444,10 @@ class GaugeConf ( object ):
|
|||
for component in topContact.getSlaveComponents():
|
||||
segment = component
|
||||
count += 1
|
||||
if count != 1:
|
||||
if count > 1:
|
||||
raise ErrorMessage( 1, 'GaugeConf::_setStackPosition(): There must be exactly one segment connected to %s, not %d.' % (topContact,count) )
|
||||
|
||||
if count == 1:
|
||||
if isinstance(segment,Horizontal):
|
||||
segment.setY( y )
|
||||
segment.getOppositeAnchor( topContact ).setY( y )
|
||||
|
|
Loading…
Reference in New Issue