Reorganisation of technology configuration files.
* Change: In CRL Core, in coriolis2/etc the file an directory structure describing the technonolies is modified. Before, one technology was split in two: the symbolic part that may be shared across multiple real technology and the real technology itself. To configure this we needed in ".coriolis2/techno.py" two variables: * symbolicTechnology. * realTechnology. After, we duplicate the symbolic technology in each real ones, so to configure we only have to refer to one technology with the variable: * technology. Pure sympolic technologies are still availables, associated with a dummy real one. We provides: * 180/scn6m_deep_09 for MOSIS 180nm * 45/freepdk_45 for FreePDK 45nm (work in progress). * symbolic/cmos for classical Alliance symbolic. * Change: In CRL Core python/helpers, SymbolicTechnology.py and RealTechnology.py are now grouped under Technology.py.
This commit is contained in:
parent
bed79c0156
commit
bc1c7838d1
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scmos_deep_018>" -*-
|
||||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<scn6m_deep>" -*-
|
||||
|
||||
import helpers
|
||||
from Hurricane import DbU
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be consistent with it.
|
||||
|
@ -14,6 +15,20 @@ import helpers
|
|||
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
|
||||
# the value of the technology, that is 180nm gives 90nm. We have no information
|
||||
# about the foundry grid.
|
||||
#
|
||||
# We set the foundry grid to .005um and set the gridsPerLambda to 18.
|
||||
|
||||
technoConfig = { 'name' : 'scn6m_deep'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 18
|
||||
}
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
|
@ -167,3 +182,28 @@ symbolicRulesTable = \
|
|||
#, ('VIA78.metal7.enclosure' , 3.0)
|
||||
#, ('VIA78.metal8.enclosure' , 3.0)
|
||||
)
|
||||
|
||||
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 41)
|
||||
, ("nWell" , "CWP" , 42)
|
||||
, ("active" , "CAA" , 43)
|
||||
, ("pImplant", "CSP" , 44)
|
||||
, ("nImplant", "CSN" , 45)
|
||||
, ("poly" , "CPG" , 46)
|
||||
, ("poly2" , "CM1" , 49) # poly2 is in fact metal1.
|
||||
, ("cut0" , "CCC" , 25)
|
||||
, ("metal1" , "CM1" , 49)
|
||||
, ("cut1" , "CV1" , 50)
|
||||
, ("metal2" , "CM2" , 51)
|
||||
, ("cut2" , "CV2" , 61)
|
||||
, ("metal3" , "CM3" , 62)
|
||||
, ("cut3" , "CV3" , 30)
|
||||
, ("metal4" , "CM4" , 31)
|
||||
, ("cut4" , "CV4" , 32)
|
||||
, ("metal5" , "CM5" , 33)
|
||||
, ("cut5" , "CV5" , 36)
|
||||
, ("metal6" , "CM6" , 37)
|
||||
)
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "alliance.conf<freepdk_45>" -*-
|
||||
|
||||
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,11 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "display.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/etesian.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/hMetis.conf' )
|
|
@ -0,0 +1,63 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
||||
helpers.micronsMode()
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
|
||||
, ("katabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'METAL5')
|
||||
# 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.edgeLength" ,TypeInt ,24 )
|
||||
, ("anabatic.edgeWidth" ,TypeInt ,4 )
|
||||
, ("anabatic.edgeCostH" ,TypeDouble ,9.0 )
|
||||
, ("anabatic.edgeCostK" ,TypeDouble ,-10.0 )
|
||||
, ("anabatic.gcell.displayMode" ,TypeEnumerate ,1
|
||||
, { 'values':( ("Boundary" , 1)
|
||||
, ("Density" , 2) ) }
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# 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['gscl45'] = \
|
||||
( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 0.190, 0.065, 0.650, 7 ) )
|
||||
, ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, 0, 0.190, 0.075, 0.700, 8 ) )
|
||||
, ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 0.190, 0.070, 0.700, 8 ) )
|
||||
, ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 0.285, 0.140, 0.140, 8 ) )
|
||||
, ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 0.285, 0.140, 0.140, 8 ) )
|
||||
, ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 0.285, 0.140, 0.140, 8 ) )
|
||||
#, ( 'METAL7' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, 0, 0.855, 0.400, 0.400, 8 ) )
|
||||
#, ( 'METAL8' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 0.855, 0.400, 0.400, 8 ) )
|
||||
#, ( 'METAL9' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, 0, 1.710, 0.800, 0.800, 8 ) )
|
||||
#, ( 'METAL10' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 1.710, 0.800, 0.800, 8 ) )
|
||||
)
|
||||
|
||||
|
||||
# Format of cellGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['gscl45'] = ('metal2', 0.38, 2.47, 0.38)
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/mauka.conf' )
|
|
@ -0,0 +1,9 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "misc.conf<freepdk_45>" -*-
|
||||
|
||||
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<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/nimbus.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/patterns.conf' )
|
|
@ -0,0 +1,27 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "plugins.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# 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 , 5 )
|
||||
, ("chip.block.rails.hWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.vWidth" , TypeInt , 24 )
|
||||
, ("chip.block.rails.hSpacing" , TypeInt , 12 )
|
||||
, ("chip.block.rails.vSpacing" , TypeInt , 12 )
|
||||
, ('chip.pad.pck' , TypeString, 'pck_mpx')
|
||||
, ('chip.pad.pvddick' , TypeString, 'pvddick_mpx')
|
||||
, ('chip.pad.pvssick' , TypeString, 'pvssick_mpx')
|
||||
, ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx')
|
||||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx')
|
||||
, ('clockTree.minimumSide' , TypeInt , 1000)
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Etesian')
|
||||
)
|
|
@ -0,0 +1,13 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "stratus1.conf<freepdk_45>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
# Status1 parameters.
|
||||
parametersTable = \
|
||||
( ("stratus1.format" , TypeString, "vst")
|
||||
, ("stratus1.simulator" , TypeString, "asimut")
|
||||
,)
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/stratus1.conf' )
|
|
@ -0,0 +1,234 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<freepdk_45>" -*-
|
||||
#
|
||||
# FreePDK 45 nanometers.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
# - <workingLayersTable>
|
||||
|
||||
from Hurricane import DbU
|
||||
|
||||
|
||||
# Contains the layers
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
technoConfig = { 'name' : 'freepdk_45'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 18
|
||||
}
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
# it applies, an optional real layer in case where there is
|
||||
# more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value expressed in lambda.
|
||||
symbolicRulesTable = \
|
||||
( ('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' , 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).
|
||||
, ('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).
|
||||
, ('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)
|
||||
|
||||
# Blockages.
|
||||
, ('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)
|
||||
)
|
||||
|
||||
|
||||
gdsLayersTable = \
|
||||
( ("nWell" , "NTUB" , 5)
|
||||
, ("nImplant", "NPLUS" , 23)
|
||||
, ("pImplant", "PPLUS" , 24)
|
||||
, ("active" , "DIFF" , 10)
|
||||
, ("poly" , "POLY1" , 20)
|
||||
, ("cut0" , "CONT" , 34)
|
||||
, ("metal1" , "MET1" , 35)
|
||||
, ("cut1" , "VIA1" , 36)
|
||||
, ("metal2" , "MET2" , 37)
|
||||
, ("metcap" , "METCAP" , 55)
|
||||
, ("cut2" , "VIA2" , 38)
|
||||
, ("metal3" , "MET3" , 39)
|
||||
, ("cut3" , "VIA3" , 41)
|
||||
, ("metal4" , "MET4" , 42)
|
||||
)
|
||||
|
||||
|
||||
# Format of an entry in the table:
|
||||
# (Symbolic_Name, CIF_Name, GDSII_Number)
|
||||
gdsLayersTable = \
|
||||
( ("pWell" , "CWN" , 2)
|
||||
, ("nWell" , "CWP" , 3)
|
||||
, ("active" , "CAA" , 1)
|
||||
, ("pImplant", "CSP" , 5)
|
||||
, ("nImplant", "CSN" , 4)
|
||||
, ("poly" , "CPG" , 9)
|
||||
, ("cut0" , "CCC" , 10)
|
||||
, ("metal1" , "CM1" , 11)
|
||||
, ("cut1" , "CV1" , 12)
|
||||
, ("metal2" , "CM2" , 13)
|
||||
, ("cut2" , "CV2" , 14)
|
||||
, ("metal3" , "CM3" , 15)
|
||||
, ("cut3" , "CV3" , 16)
|
||||
, ("metal4" , "CM4" , 17)
|
||||
, ("cut4" , "CV4" , 18)
|
||||
, ("metal5" , "CM5" , 19)
|
||||
, ("cut5" , "CV5" , 20)
|
||||
, ("metal6" , "CM6" , 21)
|
||||
, ("cut6" , "CV6" , 22)
|
||||
, ("metal7" , "CM7" , 23)
|
||||
, ("cut7" , "CV7" , 24)
|
||||
, ("metal8" , "CM8" , 25)
|
||||
, ("cut8" , "CV8" , 26)
|
||||
, ("metal9" , "CM9" , 27)
|
||||
, ("cut9" , "CV9" , 28)
|
||||
, ("metal10" , "CM10" , 29)
|
||||
)
|
|
@ -1,10 +1,7 @@
|
|||
|
||||
install ( FILES techno.conf DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY common DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY cmos DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY ispd05 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY vsc200 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY scmos_deep_018 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY 180 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY 130 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install( FILES techno.conf DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install( DIRECTORY common DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install( DIRECTORY symbolic DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install( DIRECTORY 180 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install( DIRECTORY 45 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import helpers
|
||||
|
||||
if helpers.symbolicTechno == 'vsc200':
|
||||
if helpers.techno == 'symbolic/vsc200':
|
||||
poly2Color = 'Magenta4'
|
||||
else:
|
||||
poly2Color = 'Orange'
|
||||
|
@ -51,6 +51,10 @@ stylesTable = \
|
|||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal7' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal8' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal9' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal10', { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
|
||||
# Group: Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA Holes)')
|
||||
|
@ -60,6 +64,10 @@ stylesTable = \
|
|||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut8', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut9', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
|
||||
# Group: MIM6.
|
||||
, (Group , 'MIM6')
|
||||
|
@ -70,12 +78,16 @@ stylesTable = \
|
|||
|
||||
# Group: Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage1' , { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2' , { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3' , { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage7' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage8' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage9' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage10', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
|
||||
# Group: Knik & Kite.
|
||||
, (Group , 'Knik & Kite')
|
||||
|
@ -144,16 +156,18 @@ stylesTable = \
|
|||
|
||||
# Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
#, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':00*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metcap', { 'color':'DarkTurquoise', 'pattern':'poids2.8' , 'border':2, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal7', { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal8', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
#, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':00*scale })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metcap' , { 'color':'DarkTurquoise', 'pattern':'poids2.8' , 'border':2, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal7' , { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal8' , { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal9' , { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal10', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
|
||||
# Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
|
@ -165,6 +179,8 @@ stylesTable = \
|
|||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Blue' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut8', { 'color':'Blue' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut9', { 'color':'Blue' , 'threshold':0.0*scale })
|
||||
|
||||
# MIM6.
|
||||
, (Group , 'MIM6')
|
||||
|
@ -175,14 +191,16 @@ stylesTable = \
|
|||
|
||||
# Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage7', { 'color':'Red' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage8', { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage1' , { 'color':'Blue' , 'pattern':'light_antislash0.8', 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage2' , { 'color':'Aqua' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage3' , { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage4' , { 'color':'Green' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage5' , { 'color':'Yellow' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage6' , { 'color':'Violet' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage7' , { 'color':'Red' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage8' , { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage9' , { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
, (Drawing, 'blockage10', { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':4 })
|
||||
|
||||
# Knick & Kite.
|
||||
, (Group , 'Knick & Kite')
|
||||
|
@ -258,6 +276,10 @@ stylesTable = \
|
|||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal7' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal8' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal9' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal10' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
|
||||
# Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
|
@ -267,6 +289,10 @@ stylesTable = \
|
|||
, (Drawing, 'cut3' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut4' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut5' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut6' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut7' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut8' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut9' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
@ -325,13 +351,17 @@ stylesTable = \
|
|||
|
||||
# Group: Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.32' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metcap', { 'color':'DarkTurquoise', 'pattern':'poids2.32' , 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink' , 'pattern':'antislash3.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'antislash4.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'antislash5.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'slash.32' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metcap' , { 'color':'DarkTurquoise', 'pattern':'poids2.32' , 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink' , 'pattern':'antislash3.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'antislash4.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'antislash5.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal7' , { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal8' , { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal9' , { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal10', { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
|
||||
# Group: Cuts (VIA holes)
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
|
@ -341,6 +371,10 @@ stylesTable = \
|
|||
, (Drawing, 'cut3', { 'color':'Green' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'pattern':'poids2.8' , 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut8', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'cut9', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.02*scale })
|
||||
|
||||
# Group: MIM6.
|
||||
, (Group , 'MIM6')
|
||||
|
@ -351,12 +385,16 @@ stylesTable = \
|
|||
|
||||
# Group: Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage1' , { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2' , { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3' , { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage7' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage8' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage9' , { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage10', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
|
||||
# Group: Knik & Kite.
|
||||
, (Group , 'Knik & Kite')
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
#
|
||||
# Those settings are common to all the symbolic technologies.
|
||||
|
||||
from Hurricane import BasicLayer
|
||||
from helpers.SymbolicTechnology import TypeRegular
|
||||
from helpers.SymbolicTechnology import TypeDiffusion
|
||||
from helpers.SymbolicTechnology import TypeTransistor
|
||||
from helpers.SymbolicTechnology import TypeContact
|
||||
from helpers.SymbolicTechnology import TypeVia
|
||||
from Hurricane import BasicLayer
|
||||
from helpers.Technology import TypeRegular
|
||||
from helpers.Technology import TypeDiffusion
|
||||
from helpers.Technology import TypeTransistor
|
||||
from helpers.Technology import TypeContact
|
||||
from helpers.Technology import TypeVia
|
||||
|
||||
|
||||
viewerConfig = { 'precision':2, 'gridstep':1.0 }
|
||||
|
@ -53,6 +53,10 @@ realLayersTable = \
|
|||
, ('metal7' , BasicLayer.Material.metal )
|
||||
, ('cut7' , BasicLayer.Material.cut )
|
||||
, ('metal8' , BasicLayer.Material.metal )
|
||||
, ('cut8' , BasicLayer.Material.cut )
|
||||
, ('metal9' , BasicLayer.Material.metal )
|
||||
, ('cut9' , BasicLayer.Material.cut )
|
||||
, ('metal10' , BasicLayer.Material.metal )
|
||||
#, ('topmim6' , BasicLayer.Material.other ) # For Capacitances & Pads.
|
||||
, ('metbot_r' , BasicLayer.Material.other )
|
||||
#, ('padopen' , BasicLayer.Material.other )
|
||||
|
@ -70,6 +74,8 @@ realLayersTable = \
|
|||
, ('blockage6' , BasicLayer.Material.blockage, 'metal6')
|
||||
, ('blockage7' , BasicLayer.Material.blockage, 'metal7')
|
||||
, ('blockage8' , BasicLayer.Material.blockage, 'metal8')
|
||||
, ('blockage9' , BasicLayer.Material.blockage, 'metal9')
|
||||
, ('blockage10' , BasicLayer.Material.blockage, 'metal10')
|
||||
, ('gmetalh' , BasicLayer.Material.metal ) # Special BasicLayers for Knik & Kite Routers.
|
||||
, ('gcut' , BasicLayer.Material.cut ) # *Must be after all others*
|
||||
, ('gmetalv' , BasicLayer.Material.metal )
|
||||
|
@ -105,28 +111,34 @@ symbolicLayersTable = \
|
|||
, ('METAL6' , TypeRegular , ('metal6' ,))
|
||||
, ('METAL7' , TypeRegular , ('metal7' ,))
|
||||
, ('METAL8' , TypeRegular , ('metal8' ,))
|
||||
, ('METAL9' , TypeRegular , ('metal9' ,))
|
||||
, ('METAL10' , TypeRegular , ('metal10' ,))
|
||||
, ('CONT_BODY_N', TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', 'nWell'))
|
||||
, ('CONT_BODY_P', TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', 'pWell'))
|
||||
, ('CONT_DIF_N' , TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', None ))
|
||||
, ('CONT_DIF_P' , TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', None ))
|
||||
, ('CONT_POLY' , TypeVia , ( 'poly' , 'cut0', 'metal1'))
|
||||
, ('VIA12' , TypeVia , ( 'metal1', 'cut1', 'metal2'))
|
||||
, ('VIA23' , TypeVia , ( 'metal2', 'cut2', 'metal3'))
|
||||
, ('VIA23cap' , TypeVia , ( 'metcap', 'cut2', 'metal3'))
|
||||
, ('VIA34' , TypeVia , ( 'metal3', 'cut3', 'metal4'))
|
||||
, ('VIA45' , TypeVia , ( 'metal4', 'cut4', 'metal5'))
|
||||
, ('VIA56' , TypeVia , ( 'metal5', 'cut5', 'metal6'))
|
||||
, ('VIA67' , TypeVia , ( 'metal6', 'cut6', 'metal7'))
|
||||
, ('VIA78' , TypeVia , ( 'metal7', 'cut7', 'metal8'))
|
||||
, ('BLOCKAGE1' , TypeRegular , ('blockage1', ))
|
||||
, ('BLOCKAGE2' , TypeRegular , ('blockage2', ))
|
||||
, ('BLOCKAGE3' , TypeRegular , ('blockage3', ))
|
||||
, ('BLOCKAGE4' , TypeRegular , ('blockage4', ))
|
||||
, ('BLOCKAGE5' , TypeRegular , ('blockage5', ))
|
||||
, ('BLOCKAGE6' , TypeRegular , ('blockage6', ))
|
||||
, ('BLOCKAGE7' , TypeRegular , ('blockage7', ))
|
||||
, ('BLOCKAGE8' , TypeRegular , ('blockage8', ))
|
||||
, ('gcontact' , TypeVia , ('gmetalh' , 'gcut', 'gmetalv'))
|
||||
, ('CONT_POLY' , TypeVia , ( 'poly' , 'cut0', 'metal1' ))
|
||||
, ('VIA12' , TypeVia , ( 'metal1', 'cut1', 'metal2' ))
|
||||
, ('VIA23' , TypeVia , ( 'metal2', 'cut2', 'metal3' ))
|
||||
, ('VIA23cap' , TypeVia , ( 'metcap', 'cut2', 'metal3' ))
|
||||
, ('VIA34' , TypeVia , ( 'metal3', 'cut3', 'metal4' ))
|
||||
, ('VIA45' , TypeVia , ( 'metal4', 'cut4', 'metal5' ))
|
||||
, ('VIA56' , TypeVia , ( 'metal5', 'cut5', 'metal6' ))
|
||||
, ('VIA67' , TypeVia , ( 'metal6', 'cut6', 'metal7' ))
|
||||
, ('VIA78' , TypeVia , ( 'metal7', 'cut7', 'metal8' ))
|
||||
, ('VIA89' , TypeVia , ( 'metal8', 'cut8', 'metal9' ))
|
||||
, ('VIA910' , TypeVia , ( 'metal9', 'cut9', 'metal10'))
|
||||
, ('BLOCKAGE1' , TypeRegular , ('blockage1' , ))
|
||||
, ('BLOCKAGE2' , TypeRegular , ('blockage2' , ))
|
||||
, ('BLOCKAGE3' , TypeRegular , ('blockage3' , ))
|
||||
, ('BLOCKAGE4' , TypeRegular , ('blockage4' , ))
|
||||
, ('BLOCKAGE5' , TypeRegular , ('blockage5' , ))
|
||||
, ('BLOCKAGE6' , TypeRegular , ('blockage6' , ))
|
||||
, ('BLOCKAGE7' , TypeRegular , ('blockage7' , ))
|
||||
, ('BLOCKAGE8' , TypeRegular , ('blockage8' , ))
|
||||
, ('BLOCKAGE9' , TypeRegular , ('blockage9' , ))
|
||||
, ('BLOCKAGE10' , TypeRegular , ('blockage10', ))
|
||||
, ('gcontact' , TypeVia , ('gmetalh' , 'gcut', 'gmetalv'))
|
||||
)
|
||||
|
||||
|
||||
|
@ -134,10 +146,10 @@ symbolicLayersTable = \
|
|||
# This is a simple list of Real & Symbolic layers.
|
||||
|
||||
workingLayersTable = \
|
||||
[ 'cut0', 'cut1' , 'cut2' , 'cut3' , 'cut4' , 'cut5' , 'cut6'
|
||||
[ 'cut0', 'cut1' , 'cut2' , 'cut3' , 'cut4' , 'cut5' , 'cut6' , 'cut7' , 'cut8' , 'cut9'
|
||||
, 'POLY', 'POLY2'
|
||||
, 'METAL1' , 'METAL2' , 'METAL3' , 'METAL4' , 'METAL5' , 'METAL6' , 'METAL7' , 'METAL8'
|
||||
, 'BLOCKAGE1', 'BLOCKAGE2', 'BLOCKAGE3', 'BLOCKAGE4', 'BLOCKAGE5', 'BLOCKAGE6', 'BLOCKAGE7', 'BLOCKAGE8'
|
||||
, 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56'
|
||||
, 'METAL1' , 'METAL2' , 'METAL3' , 'METAL4' , 'METAL5' , 'METAL6' , 'METAL7' , 'METAL8' , 'METAL9' , 'METAL10'
|
||||
, 'BLOCKAGE1', 'BLOCKAGE2', 'BLOCKAGE3', 'BLOCKAGE4', 'BLOCKAGE5', 'BLOCKAGE6', 'BLOCKAGE7', 'BLOCKAGE8', 'BLOCKAGE9', 'BLOCKAGE10'
|
||||
, 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910'
|
||||
, 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact'
|
||||
]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
from Hurricane import DbU
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be coherent with it.
|
||||
|
@ -14,6 +15,13 @@ import helpers
|
|||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
technoConfig = { 'name' : 'hcmos9gp'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 24
|
||||
}
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
|
@ -160,3 +168,24 @@ symbolicRulesTable = \
|
|||
, ('BLOCKAGE8.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE8.blockage6.extention.cap' , 1.0)
|
||||
)
|
||||
|
||||
|
||||
gdsLayersTable = \
|
||||
( ("nWell" , "NWELL" , 3)
|
||||
, ("nImplant", "NPLUS" , 26)
|
||||
, ("pImplant", "PPLUS" , 25)
|
||||
, ("active" , "ACTIVE" , 6)
|
||||
, ("poly" , "POLY" , 17)
|
||||
, ("cut0" , "CONTACT", 30)
|
||||
, ("metal1" , "METAL1" , 31)
|
||||
, ("cut1" , "VIA1" , 51)
|
||||
, ("metal2" , "METAL2" , 32)
|
||||
, ("cut2" , "VIA2" , 52)
|
||||
, ("metal3" , "METAL3" , 33)
|
||||
, ("cut3" , "VIA3" , 53)
|
||||
, ("metal4" , "METAL4" , 34)
|
||||
, ("cut4" , "VIA4" , 54)
|
||||
, ("metal5" , "METAL5" , 35)
|
||||
, ("cut5" , "VIA5" , 55)
|
||||
, ("metal6" , "METAL6" , 36)
|
||||
)
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*-
|
||||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<ispd05>" -*-
|
||||
|
||||
import helpers
|
||||
from Hurricane import DbU
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be coherent with it.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
|
@ -14,6 +12,13 @@ import helpers
|
|||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
technoConfig = { 'name' : 'hcmos9gp'
|
||||
, 'gridValue' : 0.005
|
||||
, 'gridUnit' : DbU.UnitPowerMicro
|
||||
, 'gridsPerLambda': 24
|
||||
}
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
|
@ -160,3 +165,24 @@ symbolicRulesTable = \
|
|||
, ('BLOCKAGE8.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE8.blockage6.extention.cap' , 1.0)
|
||||
)
|
||||
|
||||
|
||||
gdsLayersTable = \
|
||||
( ("nWell" , "NWELL" , 3)
|
||||
, ("nImplant", "NPLUS" , 26)
|
||||
, ("pImplant", "PPLUS" , 25)
|
||||
, ("active" , "ACTIVE" , 6)
|
||||
, ("poly" , "POLY" , 17)
|
||||
, ("cut0" , "CONTACT", 30)
|
||||
, ("metal1" , "METAL1" , 31)
|
||||
, ("cut1" , "VIA1" , 51)
|
||||
, ("metal2" , "METAL2" , 32)
|
||||
, ("cut2" , "VIA2" , 52)
|
||||
, ("metal3" , "METAL3" , 33)
|
||||
, ("cut3" , "VIA3" , 53)
|
||||
, ("metal4" , "METAL4" , 34)
|
||||
, ("cut4" , "VIA4" , 54)
|
||||
, ("metal5" , "METAL5" , 35)
|
||||
, ("cut5" , "VIA5" , 55)
|
||||
, ("metal6" , "METAL6" , 36)
|
||||
)
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
# -*- Mode:Python -*-
|
||||
|
||||
symbolicTechno = 'cmos'
|
||||
realTechno = '130/hcmos9gp'
|
||||
technology = 'symbolic/cmos'
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
|
||||
install ( FILES coriolisInit.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore )
|
||||
install ( FILES helpers/__init__.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/Configuration.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/Alliance.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/Display.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/Patterns.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/SymbolicTechnology.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/RealTechnology.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install ( FILES helpers/Debug.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES coriolisInit.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore )
|
||||
install( FILES helpers/__init__.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Configuration.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Alliance.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Display.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Patterns.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Technology.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
install( FILES helpers/Debug.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
|
||||
|
|
|
@ -32,18 +32,18 @@ try:
|
|||
from helpers.Display import Group
|
||||
from helpers.Display import Drawing
|
||||
from helpers import Alliance
|
||||
from helpers import SymbolicTechnology
|
||||
from helpers import RealTechnology
|
||||
from helpers import Technology
|
||||
import helpers.Display
|
||||
except ImportError, e:
|
||||
serror = str(e)
|
||||
if serror.startswith('No module named'):
|
||||
if serror.startswith('No module named') \
|
||||
or serror.startswith('cannot import name') :
|
||||
module = serror.split()[-1]
|
||||
print '[ERROR] The <%s> python module or symbol cannot be loaded.' % module
|
||||
print ' Please check the integrity of the <coriolis> package.'
|
||||
if str(e).find('cannot open shared object file'):
|
||||
print '[ERROR] The "%s" python module or symbol cannot be loaded.' % module
|
||||
print ' Please check the integrity of the Coriolis package.'
|
||||
if serror.find('cannot open shared object file') != -1:
|
||||
library = serror.split(':')[0]
|
||||
print '[ERROR] The <%s> shared library cannot be loaded.' % library
|
||||
print '[ERROR] The "%s" shared library cannot be loaded.' % library
|
||||
print ' Under RHEL 6, you must be under devtoolset-2.'
|
||||
print ' (scl enable devtoolset-2 bash)'
|
||||
sys.exit(1)
|
||||
|
@ -59,15 +59,13 @@ moduleGlobals = globals()
|
|||
|
||||
SystemFile = 0x0001
|
||||
AllianceHelper = 0x0002
|
||||
SymbolicHelper = 0x0004
|
||||
RealHelper = 0x0008
|
||||
TechnologyHelper = 0x0004
|
||||
PatternsHelper = 0x0010
|
||||
DisplayHelper = 0x0020
|
||||
ConfigurationHelper = 0x0040
|
||||
KiteHelper = 0x0080
|
||||
HelpersMask = AllianceHelper \
|
||||
| SymbolicHelper \
|
||||
| RealHelper \
|
||||
| TechnologyHelper \
|
||||
| PatternsHelper \
|
||||
| DisplayHelper \
|
||||
| ConfigurationHelper \
|
||||
|
@ -77,23 +75,21 @@ SystemMandatory = 0x0100
|
|||
|
||||
|
||||
def coriolisConfigure():
|
||||
global symbolicTechno
|
||||
|
||||
confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper)
|
||||
, ('routingGaugesTable' , Alliance.loadRoutingGaugesTable , SystemMandatory|KiteHelper)
|
||||
, ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper)
|
||||
, ('viewerConfig' , SymbolicTechnology.loadViewerConfig , SystemMandatory|SymbolicHelper)
|
||||
, ('realLayersTable' , SymbolicTechnology.loadRealLayers , SystemMandatory|SymbolicHelper)
|
||||
, ('symbolicLayersTable', SymbolicTechnology.loadSymbolicLayers, SystemMandatory|SymbolicHelper)
|
||||
, ('symbolicRulesTable' , SymbolicTechnology.loadSymbolicRules , SystemMandatory|SymbolicHelper)
|
||||
, ('workingLayersTable' , SymbolicTechnology.loadWorkingLayers , SystemMandatory|SymbolicHelper)
|
||||
, ('technoConfig' , RealTechnology.loadTechnoConfig , SystemMandatory|RealHelper)
|
||||
, ('gdsLayersTable' , RealTechnology.loadGdsLayers , SystemMandatory|RealHelper)
|
||||
, ('patternsTable' , Patterns.loadPatterns , SystemMandatory|PatternsHelper)
|
||||
, ('stylesTable' , Display.loadStyles , SystemMandatory|DisplayHelper)
|
||||
, ('defaultStyle' , Display.loadDefaultStyle , SystemMandatory|DisplayHelper)
|
||||
, ('parametersTable' , Configuration.loadParameters , ConfigurationHelper)
|
||||
, ('layoutTable' , Configuration.loadLayout , ConfigurationHelper)
|
||||
confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper)
|
||||
, ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper)
|
||||
, ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper)
|
||||
, ('viewerConfig' , Technology.loadViewerConfig , SystemMandatory|TechnologyHelper)
|
||||
, ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper)
|
||||
, ('symbolicLayersTable', Technology.loadSymbolicLayers , SystemMandatory|TechnologyHelper)
|
||||
, ('symbolicRulesTable' , Technology.loadSymbolicRules , SystemMandatory|TechnologyHelper)
|
||||
, ('workingLayersTable' , Technology.loadWorkingLayers , SystemMandatory|TechnologyHelper)
|
||||
, ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper)
|
||||
, ('gdsLayersTable' , Technology.loadGdsLayers , SystemMandatory|TechnologyHelper)
|
||||
, ('patternsTable' , Patterns.loadPatterns , SystemMandatory|PatternsHelper)
|
||||
, ('stylesTable' , Display.loadStyles , SystemMandatory|DisplayHelper)
|
||||
, ('defaultStyle' , Display.loadDefaultStyle , SystemMandatory|DisplayHelper)
|
||||
, ('parametersTable' , Configuration.loadParameters , ConfigurationHelper)
|
||||
, ('layoutTable' , Configuration.loadLayout , ConfigurationHelper)
|
||||
)
|
||||
|
||||
print ' o Running configuration hook: coriolisConfigure().'
|
||||
|
@ -101,16 +97,15 @@ def coriolisConfigure():
|
|||
|
||||
Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.ConfigurationFile )
|
||||
|
||||
confFiles = [ (helpers.symbolicDir+'/alliance.conf' , SystemFile|AllianceHelper)
|
||||
, (helpers.symbolicDir+'/technology.conf', SystemFile|SymbolicHelper)
|
||||
, (helpers.realDir +'/technology.conf', SystemFile|RealHelper)
|
||||
, (helpers.symbolicDir+'/patterns.conf' , SystemFile|PatternsHelper)
|
||||
, (helpers.symbolicDir+'/display.conf' , SystemFile|DisplayHelper)
|
||||
, (helpers.symbolicDir+'/misc.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.symbolicDir+'/etesian.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.symbolicDir+'/kite.conf' , SystemFile|ConfigurationHelper|KiteHelper)
|
||||
, (helpers.symbolicDir+'/stratus1.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.symbolicDir+'/plugins.conf' , SystemFile|ConfigurationHelper)
|
||||
confFiles = [ (helpers.technoDir+'/alliance.conf' , SystemFile|AllianceHelper)
|
||||
, (helpers.technoDir+'/technology.conf', SystemFile|TechnologyHelper)
|
||||
, (helpers.technoDir+'/patterns.conf' , SystemFile|PatternsHelper)
|
||||
, (helpers.technoDir+'/display.conf' , SystemFile|DisplayHelper)
|
||||
, (helpers.technoDir+'/misc.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.technoDir+'/etesian.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.technoDir+'/kite.conf' , SystemFile|ConfigurationHelper|KiteHelper)
|
||||
, (helpers.technoDir+'/stratus1.conf' , SystemFile|ConfigurationHelper)
|
||||
, (helpers.technoDir+'/plugins.conf' , SystemFile|ConfigurationHelper)
|
||||
]
|
||||
if os.getenv('HOME'):
|
||||
confFiles += [ (os.getenv('HOME')+'/.coriolis2/settings.py', 0) ]
|
||||
|
@ -161,8 +156,8 @@ def coriolisConfigure():
|
|||
#sys.stdout.write(CRL.AllianceFramework.get().getEnvironment().getPrint())
|
||||
|
||||
if not Cfg.getParamString('stratus1.mappingName').asString():
|
||||
vendorTech = helpers.realTechno.split('/')[-1]
|
||||
mappingFile = os.path.join( helpers.realDir, 'stratus.xml' )
|
||||
vendorTech = helpers.techno.split('/')[-1]
|
||||
mappingFile = os.path.join( helpers.technoDir, 'stratus.xml' )
|
||||
if not os.path.isfile(mappingFile):
|
||||
mappingFile = os.path.join( helpers.sysConfDir, 'stratus2sxlib.xml' )
|
||||
|
||||
|
|
|
@ -164,11 +164,11 @@ def loadRoutingGaugesTable ( routingGaugesTable, fromFile ):
|
|||
, Gauge.toRlGauge(entry[1][1]) # Type.
|
||||
, entry[1][2] # Depth.
|
||||
, entry[1][3] # Density.
|
||||
, DbU.fromLambda(entry[1][4]) # Offset.
|
||||
, DbU.fromLambda(entry[1][5]) # Pitch.
|
||||
, DbU.fromLambda(entry[1][6]) # Wire width.
|
||||
, DbU.fromLambda(entry[1][7]) # Via width.
|
||||
, DbU.fromLambda(entry[1][8]) # Obstacle dW.
|
||||
, 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.
|
||||
) )
|
||||
|
||||
except Exception, e:
|
||||
|
@ -196,10 +196,10 @@ def loadCellGaugesTable ( cellGaugesTable, fromFile ):
|
|||
,str(gaugeDatas)
|
||||
])
|
||||
gauge = CellGauge.create( gaugeName
|
||||
, gaugeDatas[0] # pinLayerName.
|
||||
, DbU.fromLambda(gaugeDatas[1]) # pitch.
|
||||
, DbU.fromLambda(gaugeDatas[2]) # sliceHeight.
|
||||
, DbU.fromLambda(gaugeDatas[3]) # sliceStep.
|
||||
, gaugeDatas[0] # pinLayerName.
|
||||
, helpers.toDbU(gaugeDatas[1]) # pitch.
|
||||
, helpers.toDbU(gaugeDatas[2]) # sliceHeight.
|
||||
, helpers.toDbU(gaugeDatas[3]) # sliceStep.
|
||||
)
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo))
|
||||
|
|
|
@ -1,98 +0,0 @@
|
|||
|
||||
# -*- mode:Python -*-
|
||||
|
||||
import sys
|
||||
import os.path
|
||||
import string
|
||||
import traceback
|
||||
import Hurricane
|
||||
from Hurricane import DbU
|
||||
from Hurricane import DataBase
|
||||
from Hurricane import BasicLayer
|
||||
from helpers import ErrorMessage
|
||||
|
||||
|
||||
realFile = '<No real file specified>'
|
||||
|
||||
|
||||
def loadGdsLayers ( realLayersTable, confFile ):
|
||||
realFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for entry in realLayersTable:
|
||||
entryNo += 1
|
||||
|
||||
try:
|
||||
if len(entry) != 3:
|
||||
raise ErrorMessage(1,['Malformed entry in <realLayersTable>.'
|
||||
,'Must have exactly three fields: (symb_name,real_name,GDSII_extnb).'
|
||||
,str(entry)
|
||||
])
|
||||
symbName, realName, gdsiiExtractNumber = entry
|
||||
if not isinstance(gdsiiExtractNumber,int):
|
||||
raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
|
||||
,'GDSII exctract number is not of int type (%s).' \
|
||||
% helpers.stype(gdsiiExtractNumber)
|
||||
,str(entry)
|
||||
])
|
||||
|
||||
basicLayer = technology.getBasicLayer(symbName)
|
||||
if not basicLayer:
|
||||
raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
|
||||
,'The real layer "%s" associated to the GDSII "%s" do not exists.' \
|
||||
% (symbName,realName)
|
||||
,str(entry)
|
||||
])
|
||||
basicLayer.setRealName ( realName )
|
||||
basicLayer.setExtractNumber( gdsiiExtractNumber )
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<realLayersTable> at index %d.' % (realFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadTechnoConfig ( technoConfig, confFile ):
|
||||
realFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
gridValue = 1
|
||||
gridUnit = DbU.UnitPowerMicro
|
||||
for key in [ 'gridUnit', 'gridValue', 'gridsPerLambda' ]:
|
||||
try:
|
||||
if key == 'gridUnit':
|
||||
if technoConfig.has_key(key):
|
||||
gridUnit = technoConfig[key]
|
||||
if gridUnit != DbU.UnitPowerPico and \
|
||||
gridUnit != DbU.UnitPowerNano and \
|
||||
gridUnit != DbU.UnitPowerMicro and \
|
||||
gridUnit != DbU.UnitPowerMilli and \
|
||||
gridUnit != DbU.UnitPowerUnity and \
|
||||
gridUnit != DbU.UnitPowerKilo:
|
||||
raise ErrorMessage(1,'In <technoConfig>, invalid DbU unit power for gridUnit, reseting to Micro.')
|
||||
else:
|
||||
raise ErrorMessage(1,'<technoConfig> has no <gridUnit> defined, assuming Micro.')
|
||||
|
||||
elif key == 'gridValue':
|
||||
if technoConfig.has_key('gridValue'):
|
||||
gridValue = technoConfig['gridValue']
|
||||
if not isinstance(gridUnit,float) and not isinstance(gridUnit,int):
|
||||
raise ErrorMessage(1,['In <technoConfig>, <gridValue> must be of type float (and not: %s).'
|
||||
% helpers.stype(gridValue)
|
||||
])
|
||||
DbU.setPhysicalsPerGrid(gridValue,gridUnit)
|
||||
else:
|
||||
raise ErrorMessage(1,'<technoConfig> has no <gridValue> defined.')
|
||||
|
||||
elif key == 'gridsPerLambda':
|
||||
if technoConfig.has_key('gridsPerLambda'):
|
||||
gridsPerLambda = technoConfig['gridsPerLambda']
|
||||
if not isinstance(gridsPerLambda,int):
|
||||
raise ErrorMessage(1,['In <technoConfig>, <gridsPerLambda> must be of type int (and not: %s).'
|
||||
% helpers.stype(gridsPerLambda)
|
||||
])
|
||||
DbU.setGridsPerLambda(gridsPerLambda)
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e)
|
||||
return
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
# -*- mode:Python -*-
|
||||
|
||||
import sys
|
||||
|
@ -19,7 +18,7 @@ from CRL import AllianceFramework
|
|||
from helpers import ErrorMessage
|
||||
|
||||
|
||||
symbolicFile = '<No symbolic file specified>'
|
||||
technologyFile = '<No technology file specified>'
|
||||
|
||||
|
||||
class SymbolicLayerType ( object ):
|
||||
|
@ -97,9 +96,9 @@ layersLUT = LayersLUT()
|
|||
|
||||
|
||||
def loadRealLayers ( realLayersTable, confFile ):
|
||||
global symbolicFile
|
||||
symbolicFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
global technologyFile
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for entry in realLayersTable:
|
||||
|
@ -132,14 +131,14 @@ def loadRealLayers ( realLayersTable, confFile ):
|
|||
routingLayer.setBlockageLayer(basicLayer)
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicLayersTable> at index %d.' % (symbolicFile,entryNo))
|
||||
ErrorMessage.wrapPrint(e,'In %s:<realLayersTable> at entry %d.' % (technologyFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadSymbolicLayers ( symbolicLayersData, confFile ):
|
||||
global symbolicFile
|
||||
symbolicFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
global technologyFile
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for entry in symbolicLayersData:
|
||||
|
@ -197,14 +196,14 @@ def loadSymbolicLayers ( symbolicLayersData, confFile ):
|
|||
layersLUT.add( symbolicLayer )
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicLayersTable> at index %d.' % (symbolicFile,entryNo))
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicLayersTable> at entry %d.' % (technologyFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadSymbolicRules ( symbolicRulesTable, confFile ):
|
||||
global symbolicFile
|
||||
symbolicFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
global technologyFile
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for rule in symbolicRulesTable:
|
||||
|
@ -253,14 +252,14 @@ def loadSymbolicRules ( symbolicRulesTable, confFile ):
|
|||
])
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicRulesTable> at index %d.' % (symbolicFile,entryNo))
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicRulesTable> at entry %d.' % (technologyFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadWorkingLayers ( workingLayersTable, confFile ):
|
||||
global symbolicFile
|
||||
symbolicFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
global technologyFile
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for layerName in workingLayersTable:
|
||||
|
@ -270,15 +269,98 @@ def loadWorkingLayers ( workingLayersTable, confFile ):
|
|||
layersLUT.lookup(layerName,LayersLUT.Real|LayersLUT.Symbolic|LayersLUT.MissingError)
|
||||
technology.setWorkingLayer(layerName)
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<symbolicRulesTable> at index %d.' % (symbolicFile,entryNo))
|
||||
ErrorMessage.wrapPrint(e,'In %s:<workingLayersTable> at entry %d.' % (technologyFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadViewerConfig ( viewerConfig, confFile ):
|
||||
global symbolicFile
|
||||
symbolicFile = confFile
|
||||
global technologyFile
|
||||
technologyFile = confFile
|
||||
try:
|
||||
if viewerConfig.has_key('precision'): DbU.setPrecision(viewerConfig['precision'])
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<viewerConfig>.')
|
||||
return
|
||||
|
||||
|
||||
def loadGdsLayers ( realLayersTable, confFile ):
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
entryNo = 0
|
||||
for entry in realLayersTable:
|
||||
entryNo += 1
|
||||
|
||||
try:
|
||||
if len(entry) != 3:
|
||||
raise ErrorMessage(1,['Malformed entry in <realLayersTable>.'
|
||||
,'Must have exactly three fields: (symb_name,real_name,GDSII_extnb).'
|
||||
,str(entry)
|
||||
])
|
||||
symbName, realName, gdsiiExtractNumber = entry
|
||||
if not isinstance(gdsiiExtractNumber,int):
|
||||
raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
|
||||
,'GDSII exctract number is not of int type (%s).' \
|
||||
% helpers.stype(gdsiiExtractNumber)
|
||||
,str(entry)
|
||||
])
|
||||
|
||||
basicLayer = technology.getBasicLayer(symbName)
|
||||
if not basicLayer:
|
||||
raise ErrorMessage(1,['Incoherency in <realLayersTable> entry.'
|
||||
,'The real layer "%s" associated to the GDSII "%s" do not exists.' \
|
||||
% (symbName,realName)
|
||||
,str(entry)
|
||||
])
|
||||
basicLayer.setRealName ( realName )
|
||||
basicLayer.setExtractNumber( gdsiiExtractNumber )
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e,'In %s:<gdsLayersTable> at entry %d.' % (technologyFile,entryNo))
|
||||
return
|
||||
|
||||
|
||||
def loadTechnoConfig ( technoConfig, confFile ):
|
||||
technologyFile = confFile
|
||||
technology = DataBase.getDB().getTechnology()
|
||||
|
||||
gridValue = 1
|
||||
gridUnit = DbU.UnitPowerMicro
|
||||
for key in [ 'gridUnit', 'gridValue', 'gridsPerLambda' ]:
|
||||
try:
|
||||
if key == 'gridUnit':
|
||||
if technoConfig.has_key(key):
|
||||
gridUnit = technoConfig[key]
|
||||
if gridUnit != DbU.UnitPowerPico and \
|
||||
gridUnit != DbU.UnitPowerNano and \
|
||||
gridUnit != DbU.UnitPowerMicro and \
|
||||
gridUnit != DbU.UnitPowerMilli and \
|
||||
gridUnit != DbU.UnitPowerUnity and \
|
||||
gridUnit != DbU.UnitPowerKilo:
|
||||
raise ErrorMessage(1,'In <technoConfig>, invalid DbU unit power for gridUnit, reseting to Micro.')
|
||||
else:
|
||||
raise ErrorMessage(1,'<technoConfig> has no <gridUnit> defined, assuming Micro.')
|
||||
|
||||
elif key == 'gridValue':
|
||||
if technoConfig.has_key('gridValue'):
|
||||
gridValue = technoConfig['gridValue']
|
||||
if not isinstance(gridUnit,float) and not isinstance(gridUnit,int):
|
||||
raise ErrorMessage(1,['In <technoConfig>, <gridValue> must be of type float (and not: %s).'
|
||||
% helpers.stype(gridValue)
|
||||
])
|
||||
DbU.setPhysicalsPerGrid(gridValue,gridUnit)
|
||||
else:
|
||||
raise ErrorMessage(1,'<technoConfig> has no <gridValue> defined.')
|
||||
|
||||
elif key == 'gridsPerLambda':
|
||||
if technoConfig.has_key('gridsPerLambda'):
|
||||
gridsPerLambda = technoConfig['gridsPerLambda']
|
||||
if not isinstance(gridsPerLambda,int):
|
||||
raise ErrorMessage(1,['In <technoConfig>, <gridsPerLambda> must be of type int (and not: %s).'
|
||||
% helpers.stype(gridsPerLambda)
|
||||
])
|
||||
DbU.setGridsPerLambda(gridsPerLambda)
|
||||
|
||||
except Exception, e:
|
||||
ErrorMessage.wrapPrint(e)
|
||||
return
|
|
@ -28,10 +28,9 @@ import Hurricane
|
|||
quiet = False
|
||||
sysConfDir = None
|
||||
ndaConfDir = None
|
||||
symbolicTechno = 'cmos'
|
||||
symbolicDir = None
|
||||
realTechno = '130/hcmos9gp'
|
||||
realDir = None
|
||||
techno = 'symbolic/cmos'
|
||||
technoDir = None
|
||||
unitsLambda = True
|
||||
tab = None
|
||||
_trace = None
|
||||
moduleGlobals = globals()
|
||||
|
@ -280,13 +279,29 @@ def setTraceLevel ( level ):
|
|||
return
|
||||
|
||||
|
||||
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 initTechno ( argQuiet ):
|
||||
global quiet
|
||||
global ndaConfDir
|
||||
global realDir
|
||||
global realTechno
|
||||
global symbolicDir
|
||||
global symbolicTechno
|
||||
global technoDir
|
||||
global techno
|
||||
|
||||
quiet = argQuiet
|
||||
|
||||
|
@ -301,36 +316,32 @@ def initTechno ( argQuiet ):
|
|||
if not quiet: print ' - Loading \"%s\".' % truncPath(technoFile)
|
||||
execfile(technoFile,moduleGlobals)
|
||||
break
|
||||
if moduleGlobals.has_key('symbolicTechnology'):
|
||||
symbolicTechno = symbolicTechnology
|
||||
if moduleGlobals.has_key('technology'):
|
||||
techno = technology
|
||||
else:
|
||||
print '[WARNING] The symbolic technology name is not set. Using <%s>.' % symbolicTechno
|
||||
if moduleGlobals.has_key('realTechnology'):
|
||||
realTechno = realTechnology
|
||||
else:
|
||||
print '[WARNING] The real technology name is not set. Using <%s>.' % realTechno
|
||||
print '[WARNING] The technology is not set. Using <%s>.' % techno
|
||||
|
||||
if moduleGlobals.has_key('NdaDirectory'):
|
||||
ndaConfDir = os.path.join( NdaDirectory, 'etc/coriolis2' )
|
||||
else:
|
||||
ndaConfDir = sysConfDir
|
||||
|
||||
symbolicDir = os.path.join( sysConfDir, symbolicTechno )
|
||||
realDir = os.path.join( ndaConfDir, realTechno )
|
||||
if not quiet: print ' - Technologies: %s+%s.' % (symbolicTechno,realTechno)
|
||||
technoDir = os.path.join( ndaConfDir, techno )
|
||||
if not quiet: print ' - Technology: %s.' % techno
|
||||
|
||||
|
||||
def staticInitialization ( quiet=False ):
|
||||
global sysConfDir
|
||||
global symbolicDir
|
||||
global realDir
|
||||
global technoDir
|
||||
global tab
|
||||
global _trace
|
||||
global unitsLambda
|
||||
|
||||
if sysConfDir != None: return
|
||||
|
||||
tab = Tab()
|
||||
_trace = Trace()
|
||||
unitsLamba = True
|
||||
tab = Tab()
|
||||
_trace = Trace()
|
||||
|
||||
reSysConfDir = re.compile(r'.*etc\/coriolis2')
|
||||
if not quiet: print ' o Locating configuration directory:'
|
||||
|
|
|
@ -30,6 +30,7 @@ Cfg.getParamInt ("kite.longGlobalRipupLimit").setInt (5 )
|
|||
Cfg.getParamInt ("kite.longGlobalRipupLimit").setMin (1 )
|
||||
|
||||
Cfg.getParamInt ("kite.strapRipupLimit" ).setInt (16 )
|
||||
|
||||
Cfg.getParamInt ("kite.strapRipupLimit" ).setMin (1 )
|
||||
|
||||
Cfg.getParamDouble ("kite.metal1MinBreak" ).setDouble (100 )
|
||||
|
|
Loading…
Reference in New Issue