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:
Jean-Paul Chaput 2017-11-17 11:10:32 +01:00
parent bed79c0156
commit bc1c7838d1
26 changed files with 831 additions and 279 deletions

View File

@ -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 import helpers
from Hurricane import DbU
# The informations here are extracted from the Alliance ".rds" file, # The informations here are extracted from the Alliance ".rds" file,
# and must be consistent with it. # and must be consistent with it.
@ -14,6 +15,20 @@ import helpers
execfile( helpers.sysConfDir+'/common/technology.conf' ) 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>: # Format of <symbolicRulesTable>:
# Each entry is a pair of (string, value). # Each entry is a pair of (string, value).
# * string: a synthetic way to designate the symbolic layer on which # * string: a synthetic way to designate the symbolic layer on which
@ -167,3 +182,28 @@ symbolicRulesTable = \
#, ('VIA78.metal7.enclosure' , 3.0) #, ('VIA78.metal7.enclosure' , 3.0)
#, ('VIA78.metal8.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)
)

View File

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

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "etesian.conf<freepdk_45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/etesian.conf' )

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<freepdk_45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/hMetis.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<freepdk_45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/mauka.conf' )

View File

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

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<freepdk_45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/nimbus.conf' )

View File

@ -0,0 +1,5 @@
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<freepdk_45>" -*-
import helpers
execfile( helpers.sysConfDir+'/common/patterns.conf' )

View File

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

View File

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

View File

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

View File

@ -1,10 +1,7 @@
install ( FILES techno.conf DESTINATION ${SYS_CONF_DIR}/coriolis2 ) install( FILES techno.conf DESTINATION ${SYS_CONF_DIR}/coriolis2 )
install ( DIRECTORY common DESTINATION ${SYS_CONF_DIR}/coriolis2 ) install( DIRECTORY common DESTINATION ${SYS_CONF_DIR}/coriolis2 )
install ( DIRECTORY cmos DESTINATION ${SYS_CONF_DIR}/coriolis2 ) install( DIRECTORY symbolic DESTINATION ${SYS_CONF_DIR}/coriolis2 )
install ( DIRECTORY ispd05 DESTINATION ${SYS_CONF_DIR}/coriolis2 ) install( DIRECTORY 180 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
install ( DIRECTORY vsc200 DESTINATION ${SYS_CONF_DIR}/coriolis2 ) install( DIRECTORY 45 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 )

View File

@ -2,7 +2,7 @@
import helpers import helpers
if helpers.symbolicTechno == 'vsc200': if helpers.techno == 'symbolic/vsc200':
poly2Color = 'Magenta4' poly2Color = 'Magenta4'
else: else:
poly2Color = 'Orange' poly2Color = 'Orange'
@ -51,6 +51,10 @@ stylesTable = \
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.02*scale }) , (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.02*scale })
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , '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, '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).
, (Group , 'Cuts (VIA Holes)') , (Group , 'Cuts (VIA Holes)')
@ -60,6 +64,10 @@ stylesTable = \
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale }) , (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale })
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale }) , (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale })
, (Drawing, 'cut5', { 'color':'Violet' , '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.
, (Group , 'MIM6') , (Group , 'MIM6')
@ -70,12 +78,16 @@ stylesTable = \
# Group: Blockages. # Group: Blockages.
, (Group , 'Blockages') , (Group , 'Blockages')
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , '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, '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, '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, '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, '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, '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.
, (Group , 'Knik & Kite') , (Group , 'Knik & Kite')
@ -144,16 +156,18 @@ stylesTable = \
# Routing Layers. # Routing Layers.
, (Group , 'Routing Layers') , (Group , 'Routing Layers')
#, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80*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, '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, '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, '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, '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, '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, '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, '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, '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, '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). # Cuts (VIA holes).
, (Group , 'Cuts (VIA holes)') , (Group , 'Cuts (VIA holes)')
@ -165,6 +179,8 @@ stylesTable = \
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.0*scale }) , (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.0*scale })
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.0*scale }) , (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.0*scale })
, (Drawing, 'cut7', { 'color':'Blue' , '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. # MIM6.
, (Group , 'MIM6') , (Group , 'MIM6')
@ -175,14 +191,16 @@ stylesTable = \
# Blockages. # Blockages.
, (Group , 'Blockages') , (Group , 'Blockages')
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'light_antislash0.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, '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, '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, '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, '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, '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, '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, '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. # Knick & Kite.
, (Group , 'Knick & Kite') , (Group , 'Knick & Kite')
@ -258,6 +276,10 @@ stylesTable = \
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 }) , (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, 'metal5' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
, (Drawing, 'metal6' , { 'color':'Violet' , '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). # Cuts (VIA holes).
, (Group , '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, 'cut3' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
, (Drawing, 'cut4' , { 'color':'Yellow' , '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, '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.
, (Group , 'Routing Layers') , (Group , 'Routing Layers')
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.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, '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, '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, '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, '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, '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, '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)
, (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, '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, '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, '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.
, (Group , 'MIM6') , (Group , 'MIM6')
@ -351,12 +385,16 @@ stylesTable = \
# Group: Blockages. # Group: Blockages.
, (Group , 'Blockages') , (Group , 'Blockages')
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , '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, '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, '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, '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, '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, '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.
, (Group , 'Knik & Kite') , (Group , 'Knik & Kite')

View File

@ -2,12 +2,12 @@
# #
# Those settings are common to all the symbolic technologies. # Those settings are common to all the symbolic technologies.
from Hurricane import BasicLayer from Hurricane import BasicLayer
from helpers.SymbolicTechnology import TypeRegular from helpers.Technology import TypeRegular
from helpers.SymbolicTechnology import TypeDiffusion from helpers.Technology import TypeDiffusion
from helpers.SymbolicTechnology import TypeTransistor from helpers.Technology import TypeTransistor
from helpers.SymbolicTechnology import TypeContact from helpers.Technology import TypeContact
from helpers.SymbolicTechnology import TypeVia from helpers.Technology import TypeVia
viewerConfig = { 'precision':2, 'gridstep':1.0 } viewerConfig = { 'precision':2, 'gridstep':1.0 }
@ -53,6 +53,10 @@ realLayersTable = \
, ('metal7' , BasicLayer.Material.metal ) , ('metal7' , BasicLayer.Material.metal )
, ('cut7' , BasicLayer.Material.cut ) , ('cut7' , BasicLayer.Material.cut )
, ('metal8' , BasicLayer.Material.metal ) , ('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. #, ('topmim6' , BasicLayer.Material.other ) # For Capacitances & Pads.
, ('metbot_r' , BasicLayer.Material.other ) , ('metbot_r' , BasicLayer.Material.other )
#, ('padopen' , BasicLayer.Material.other ) #, ('padopen' , BasicLayer.Material.other )
@ -70,6 +74,8 @@ realLayersTable = \
, ('blockage6' , BasicLayer.Material.blockage, 'metal6') , ('blockage6' , BasicLayer.Material.blockage, 'metal6')
, ('blockage7' , BasicLayer.Material.blockage, 'metal7') , ('blockage7' , BasicLayer.Material.blockage, 'metal7')
, ('blockage8' , BasicLayer.Material.blockage, 'metal8') , ('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. , ('gmetalh' , BasicLayer.Material.metal ) # Special BasicLayers for Knik & Kite Routers.
, ('gcut' , BasicLayer.Material.cut ) # *Must be after all others* , ('gcut' , BasicLayer.Material.cut ) # *Must be after all others*
, ('gmetalv' , BasicLayer.Material.metal ) , ('gmetalv' , BasicLayer.Material.metal )
@ -105,28 +111,34 @@ symbolicLayersTable = \
, ('METAL6' , TypeRegular , ('metal6' ,)) , ('METAL6' , TypeRegular , ('metal6' ,))
, ('METAL7' , TypeRegular , ('metal7' ,)) , ('METAL7' , TypeRegular , ('metal7' ,))
, ('METAL8' , TypeRegular , ('metal8' ,)) , ('METAL8' , TypeRegular , ('metal8' ,))
, ('METAL9' , TypeRegular , ('metal9' ,))
, ('METAL10' , TypeRegular , ('metal10' ,))
, ('CONT_BODY_N', TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', 'nWell')) , ('CONT_BODY_N', TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', 'nWell'))
, ('CONT_BODY_P', TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', 'pWell')) , ('CONT_BODY_P', TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', 'pWell'))
, ('CONT_DIF_N' , TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', None )) , ('CONT_DIF_N' , TypeContact , ('nImplant' , 'active', 'cut0', 'metal1', None ))
, ('CONT_DIF_P' , TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', None )) , ('CONT_DIF_P' , TypeContact , ('pImplant' , 'active', 'cut0', 'metal1', None ))
, ('CONT_POLY' , TypeVia , ( 'poly' , 'cut0', 'metal1')) , ('CONT_POLY' , TypeVia , ( 'poly' , 'cut0', 'metal1' ))
, ('VIA12' , TypeVia , ( 'metal1', 'cut1', 'metal2')) , ('VIA12' , TypeVia , ( 'metal1', 'cut1', 'metal2' ))
, ('VIA23' , TypeVia , ( 'metal2', 'cut2', 'metal3')) , ('VIA23' , TypeVia , ( 'metal2', 'cut2', 'metal3' ))
, ('VIA23cap' , TypeVia , ( 'metcap', 'cut2', 'metal3')) , ('VIA23cap' , TypeVia , ( 'metcap', 'cut2', 'metal3' ))
, ('VIA34' , TypeVia , ( 'metal3', 'cut3', 'metal4')) , ('VIA34' , TypeVia , ( 'metal3', 'cut3', 'metal4' ))
, ('VIA45' , TypeVia , ( 'metal4', 'cut4', 'metal5')) , ('VIA45' , TypeVia , ( 'metal4', 'cut4', 'metal5' ))
, ('VIA56' , TypeVia , ( 'metal5', 'cut5', 'metal6')) , ('VIA56' , TypeVia , ( 'metal5', 'cut5', 'metal6' ))
, ('VIA67' , TypeVia , ( 'metal6', 'cut6', 'metal7')) , ('VIA67' , TypeVia , ( 'metal6', 'cut6', 'metal7' ))
, ('VIA78' , TypeVia , ( 'metal7', 'cut7', 'metal8')) , ('VIA78' , TypeVia , ( 'metal7', 'cut7', 'metal8' ))
, ('BLOCKAGE1' , TypeRegular , ('blockage1', )) , ('VIA89' , TypeVia , ( 'metal8', 'cut8', 'metal9' ))
, ('BLOCKAGE2' , TypeRegular , ('blockage2', )) , ('VIA910' , TypeVia , ( 'metal9', 'cut9', 'metal10'))
, ('BLOCKAGE3' , TypeRegular , ('blockage3', )) , ('BLOCKAGE1' , TypeRegular , ('blockage1' , ))
, ('BLOCKAGE4' , TypeRegular , ('blockage4', )) , ('BLOCKAGE2' , TypeRegular , ('blockage2' , ))
, ('BLOCKAGE5' , TypeRegular , ('blockage5', )) , ('BLOCKAGE3' , TypeRegular , ('blockage3' , ))
, ('BLOCKAGE6' , TypeRegular , ('blockage6', )) , ('BLOCKAGE4' , TypeRegular , ('blockage4' , ))
, ('BLOCKAGE7' , TypeRegular , ('blockage7', )) , ('BLOCKAGE5' , TypeRegular , ('blockage5' , ))
, ('BLOCKAGE8' , TypeRegular , ('blockage8', )) , ('BLOCKAGE6' , TypeRegular , ('blockage6' , ))
, ('gcontact' , TypeVia , ('gmetalh' , 'gcut', 'gmetalv')) , ('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. # This is a simple list of Real & Symbolic layers.
workingLayersTable = \ workingLayersTable = \
[ 'cut0', 'cut1' , 'cut2' , 'cut3' , 'cut4' , 'cut5' , 'cut6' [ 'cut0', 'cut1' , 'cut2' , 'cut3' , 'cut4' , 'cut5' , 'cut6' , 'cut7' , 'cut8' , 'cut9'
, 'POLY', 'POLY2' , 'POLY', 'POLY2'
, 'METAL1' , 'METAL2' , 'METAL3' , 'METAL4' , 'METAL5' , 'METAL6' , 'METAL7' , 'METAL8' , 'METAL1' , 'METAL2' , 'METAL3' , 'METAL4' , 'METAL5' , 'METAL6' , 'METAL7' , 'METAL8' , 'METAL9' , 'METAL10'
, 'BLOCKAGE1', 'BLOCKAGE2', 'BLOCKAGE3', 'BLOCKAGE4', 'BLOCKAGE5', 'BLOCKAGE6', 'BLOCKAGE7', 'BLOCKAGE8' , 'BLOCKAGE1', 'BLOCKAGE2', 'BLOCKAGE3', 'BLOCKAGE4', 'BLOCKAGE5', 'BLOCKAGE6', 'BLOCKAGE7', 'BLOCKAGE8', 'BLOCKAGE9', 'BLOCKAGE10'
, 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA12' , 'VIA23' , 'VIA34' , 'VIA45' , 'VIA56' , 'VIA67' , 'VIA78' , 'VIA89' , 'VIA910'
, 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact' , 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact'
] ]

View File

@ -1,6 +1,7 @@
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*- # -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*-
import helpers import helpers
from Hurricane import DbU
# The informations here are extracted from the Alliance ".rds" file, # The informations here are extracted from the Alliance ".rds" file,
# and must be coherent with it. # and must be coherent with it.
@ -14,6 +15,13 @@ import helpers
execfile( helpers.sysConfDir+'/common/technology.conf' ) execfile( helpers.sysConfDir+'/common/technology.conf' )
technoConfig = { 'name' : 'hcmos9gp'
, 'gridValue' : 0.005
, 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda': 24
}
# Format of <symbolicRulesTable>: # Format of <symbolicRulesTable>:
# Each entry is a pair of (string, value). # Each entry is a pair of (string, value).
# * string: a synthetic way to designate the symbolic layer on which # * string: a synthetic way to designate the symbolic layer on which
@ -160,3 +168,24 @@ symbolicRulesTable = \
, ('BLOCKAGE8.minimum.width' , 2.0) , ('BLOCKAGE8.minimum.width' , 2.0)
, ('BLOCKAGE8.blockage6.extention.cap' , 1.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)
)

View File

@ -1,10 +1,8 @@
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*- # -*- Mode:Python; explicit-buffer-name: "technology.conf<ispd05>" -*-
import helpers 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: # Provides standard settings for:
# - <viewerConfig> # - <viewerConfig>
# - <realLayersTable> # - <realLayersTable>
@ -14,6 +12,13 @@ import helpers
execfile( helpers.sysConfDir+'/common/technology.conf' ) execfile( helpers.sysConfDir+'/common/technology.conf' )
technoConfig = { 'name' : 'hcmos9gp'
, 'gridValue' : 0.005
, 'gridUnit' : DbU.UnitPowerMicro
, 'gridsPerLambda': 24
}
# Format of <symbolicRulesTable>: # Format of <symbolicRulesTable>:
# Each entry is a pair of (string, value). # Each entry is a pair of (string, value).
# * string: a synthetic way to designate the symbolic layer on which # * string: a synthetic way to designate the symbolic layer on which
@ -160,3 +165,24 @@ symbolicRulesTable = \
, ('BLOCKAGE8.minimum.width' , 2.0) , ('BLOCKAGE8.minimum.width' , 2.0)
, ('BLOCKAGE8.blockage6.extention.cap' , 1.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)
)

View File

@ -1,4 +1,3 @@
# -*- Mode:Python -*- # -*- Mode:Python -*-
symbolicTechno = 'cmos' technology = 'symbolic/cmos'
realTechno = '130/hcmos9gp'

View File

@ -1,10 +1,9 @@
install ( FILES coriolisInit.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore ) install( FILES coriolisInit.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore )
install ( FILES helpers/__init__.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers ) 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/Configuration.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
install ( FILES helpers/Alliance.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/Display.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )
install ( FILES helpers/Patterns.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/Technology.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 helpers/Debug.py DESTINATION ${PYTHON_SITE_PACKAGES}/crlcore/helpers )

View File

@ -32,18 +32,18 @@ try:
from helpers.Display import Group from helpers.Display import Group
from helpers.Display import Drawing from helpers.Display import Drawing
from helpers import Alliance from helpers import Alliance
from helpers import SymbolicTechnology from helpers import Technology
from helpers import RealTechnology
import helpers.Display import helpers.Display
except ImportError, e: except ImportError, e:
serror = str(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] module = serror.split()[-1]
print '[ERROR] The <%s> python module or symbol cannot be loaded.' % module print '[ERROR] The "%s" python module or symbol cannot be loaded.' % module
print ' Please check the integrity of the <coriolis> package.' print ' Please check the integrity of the Coriolis package.'
if str(e).find('cannot open shared object file'): if serror.find('cannot open shared object file') != -1:
library = serror.split(':')[0] 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 ' Under RHEL 6, you must be under devtoolset-2.'
print ' (scl enable devtoolset-2 bash)' print ' (scl enable devtoolset-2 bash)'
sys.exit(1) sys.exit(1)
@ -59,15 +59,13 @@ moduleGlobals = globals()
SystemFile = 0x0001 SystemFile = 0x0001
AllianceHelper = 0x0002 AllianceHelper = 0x0002
SymbolicHelper = 0x0004 TechnologyHelper = 0x0004
RealHelper = 0x0008
PatternsHelper = 0x0010 PatternsHelper = 0x0010
DisplayHelper = 0x0020 DisplayHelper = 0x0020
ConfigurationHelper = 0x0040 ConfigurationHelper = 0x0040
KiteHelper = 0x0080 KiteHelper = 0x0080
HelpersMask = AllianceHelper \ HelpersMask = AllianceHelper \
| SymbolicHelper \ | TechnologyHelper \
| RealHelper \
| PatternsHelper \ | PatternsHelper \
| DisplayHelper \ | DisplayHelper \
| ConfigurationHelper \ | ConfigurationHelper \
@ -77,23 +75,21 @@ SystemMandatory = 0x0100
def coriolisConfigure(): def coriolisConfigure():
global symbolicTechno confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper)
, ('routingGaugesTable' , Alliance.loadRoutingGaugesTable, SystemMandatory|KiteHelper)
confHelpers = ( ('allianceConfig' , Alliance.loadAllianceConfig , SystemMandatory|AllianceHelper) , ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper)
, ('routingGaugesTable' , Alliance.loadRoutingGaugesTable , SystemMandatory|KiteHelper) , ('viewerConfig' , Technology.loadViewerConfig , SystemMandatory|TechnologyHelper)
, ('cellGaugesTable' , Alliance.loadCellGaugesTable , SystemMandatory|KiteHelper) , ('realLayersTable' , Technology.loadRealLayers , SystemMandatory|TechnologyHelper)
, ('viewerConfig' , SymbolicTechnology.loadViewerConfig , SystemMandatory|SymbolicHelper) , ('symbolicLayersTable', Technology.loadSymbolicLayers , SystemMandatory|TechnologyHelper)
, ('realLayersTable' , SymbolicTechnology.loadRealLayers , SystemMandatory|SymbolicHelper) , ('symbolicRulesTable' , Technology.loadSymbolicRules , SystemMandatory|TechnologyHelper)
, ('symbolicLayersTable', SymbolicTechnology.loadSymbolicLayers, SystemMandatory|SymbolicHelper) , ('workingLayersTable' , Technology.loadWorkingLayers , SystemMandatory|TechnologyHelper)
, ('symbolicRulesTable' , SymbolicTechnology.loadSymbolicRules , SystemMandatory|SymbolicHelper) , ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper)
, ('workingLayersTable' , SymbolicTechnology.loadWorkingLayers , SystemMandatory|SymbolicHelper) , ('gdsLayersTable' , Technology.loadGdsLayers , SystemMandatory|TechnologyHelper)
, ('technoConfig' , RealTechnology.loadTechnoConfig , SystemMandatory|RealHelper) , ('patternsTable' , Patterns.loadPatterns , SystemMandatory|PatternsHelper)
, ('gdsLayersTable' , RealTechnology.loadGdsLayers , SystemMandatory|RealHelper) , ('stylesTable' , Display.loadStyles , SystemMandatory|DisplayHelper)
, ('patternsTable' , Patterns.loadPatterns , SystemMandatory|PatternsHelper) , ('defaultStyle' , Display.loadDefaultStyle , SystemMandatory|DisplayHelper)
, ('stylesTable' , Display.loadStyles , SystemMandatory|DisplayHelper) , ('parametersTable' , Configuration.loadParameters , ConfigurationHelper)
, ('defaultStyle' , Display.loadDefaultStyle , SystemMandatory|DisplayHelper) , ('layoutTable' , Configuration.loadLayout , ConfigurationHelper)
, ('parametersTable' , Configuration.loadParameters , ConfigurationHelper)
, ('layoutTable' , Configuration.loadLayout , ConfigurationHelper)
) )
print ' o Running configuration hook: coriolisConfigure().' print ' o Running configuration hook: coriolisConfigure().'
@ -101,16 +97,15 @@ def coriolisConfigure():
Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.ConfigurationFile ) Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.ConfigurationFile )
confFiles = [ (helpers.symbolicDir+'/alliance.conf' , SystemFile|AllianceHelper) confFiles = [ (helpers.technoDir+'/alliance.conf' , SystemFile|AllianceHelper)
, (helpers.symbolicDir+'/technology.conf', SystemFile|SymbolicHelper) , (helpers.technoDir+'/technology.conf', SystemFile|TechnologyHelper)
, (helpers.realDir +'/technology.conf', SystemFile|RealHelper) , (helpers.technoDir+'/patterns.conf' , SystemFile|PatternsHelper)
, (helpers.symbolicDir+'/patterns.conf' , SystemFile|PatternsHelper) , (helpers.technoDir+'/display.conf' , SystemFile|DisplayHelper)
, (helpers.symbolicDir+'/display.conf' , SystemFile|DisplayHelper) , (helpers.technoDir+'/misc.conf' , SystemFile|ConfigurationHelper)
, (helpers.symbolicDir+'/misc.conf' , SystemFile|ConfigurationHelper) , (helpers.technoDir+'/etesian.conf' , SystemFile|ConfigurationHelper)
, (helpers.symbolicDir+'/etesian.conf' , SystemFile|ConfigurationHelper) , (helpers.technoDir+'/kite.conf' , SystemFile|ConfigurationHelper|KiteHelper)
, (helpers.symbolicDir+'/kite.conf' , SystemFile|ConfigurationHelper|KiteHelper) , (helpers.technoDir+'/stratus1.conf' , SystemFile|ConfigurationHelper)
, (helpers.symbolicDir+'/stratus1.conf' , SystemFile|ConfigurationHelper) , (helpers.technoDir+'/plugins.conf' , SystemFile|ConfigurationHelper)
, (helpers.symbolicDir+'/plugins.conf' , SystemFile|ConfigurationHelper)
] ]
if os.getenv('HOME'): if os.getenv('HOME'):
confFiles += [ (os.getenv('HOME')+'/.coriolis2/settings.py', 0) ] confFiles += [ (os.getenv('HOME')+'/.coriolis2/settings.py', 0) ]
@ -161,8 +156,8 @@ def coriolisConfigure():
#sys.stdout.write(CRL.AllianceFramework.get().getEnvironment().getPrint()) #sys.stdout.write(CRL.AllianceFramework.get().getEnvironment().getPrint())
if not Cfg.getParamString('stratus1.mappingName').asString(): if not Cfg.getParamString('stratus1.mappingName').asString():
vendorTech = helpers.realTechno.split('/')[-1] vendorTech = helpers.techno.split('/')[-1]
mappingFile = os.path.join( helpers.realDir, 'stratus.xml' ) mappingFile = os.path.join( helpers.technoDir, 'stratus.xml' )
if not os.path.isfile(mappingFile): if not os.path.isfile(mappingFile):
mappingFile = os.path.join( helpers.sysConfDir, 'stratus2sxlib.xml' ) mappingFile = os.path.join( helpers.sysConfDir, 'stratus2sxlib.xml' )

View File

@ -164,11 +164,11 @@ def loadRoutingGaugesTable ( routingGaugesTable, fromFile ):
, Gauge.toRlGauge(entry[1][1]) # Type. , Gauge.toRlGauge(entry[1][1]) # Type.
, entry[1][2] # Depth. , entry[1][2] # Depth.
, entry[1][3] # Density. , entry[1][3] # Density.
, DbU.fromLambda(entry[1][4]) # Offset. , helpers.toDbU(entry[1][4]) # Offset.
, DbU.fromLambda(entry[1][5]) # Pitch. , helpers.toDbU(entry[1][5]) # Pitch.
, DbU.fromLambda(entry[1][6]) # Wire width. , helpers.toDbU(entry[1][6]) # Wire width.
, DbU.fromLambda(entry[1][7]) # Via width. , helpers.toDbU(entry[1][7]) # Via width.
, DbU.fromLambda(entry[1][8]) # Obstacle dW. , helpers.toDbU(entry[1][8]) # Obstacle dW.
) ) ) )
except Exception, e: except Exception, e:
@ -196,10 +196,10 @@ def loadCellGaugesTable ( cellGaugesTable, fromFile ):
,str(gaugeDatas) ,str(gaugeDatas)
]) ])
gauge = CellGauge.create( gaugeName gauge = CellGauge.create( gaugeName
, gaugeDatas[0] # pinLayerName. , gaugeDatas[0] # pinLayerName.
, DbU.fromLambda(gaugeDatas[1]) # pitch. , helpers.toDbU(gaugeDatas[1]) # pitch.
, DbU.fromLambda(gaugeDatas[2]) # sliceHeight. , helpers.toDbU(gaugeDatas[2]) # sliceHeight.
, DbU.fromLambda(gaugeDatas[3]) # sliceStep. , helpers.toDbU(gaugeDatas[3]) # sliceStep.
) )
except Exception, e: except Exception, e:
ErrorMessage.wrapPrint(e,'In %s:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo)) ErrorMessage.wrapPrint(e,'In %s:<cellGaugesTable> at index %d.' % (allianceFile,gaugeDatasNo))

View File

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

View File

@ -1,4 +1,3 @@
# -*- mode:Python -*- # -*- mode:Python -*-
import sys import sys
@ -19,7 +18,7 @@ from CRL import AllianceFramework
from helpers import ErrorMessage from helpers import ErrorMessage
symbolicFile = '<No symbolic file specified>' technologyFile = '<No technology file specified>'
class SymbolicLayerType ( object ): class SymbolicLayerType ( object ):
@ -97,9 +96,9 @@ layersLUT = LayersLUT()
def loadRealLayers ( realLayersTable, confFile ): def loadRealLayers ( realLayersTable, confFile ):
global symbolicFile global technologyFile
symbolicFile = confFile technologyFile = confFile
technology = DataBase.getDB().getTechnology() technology = DataBase.getDB().getTechnology()
entryNo = 0 entryNo = 0
for entry in realLayersTable: for entry in realLayersTable:
@ -132,14 +131,14 @@ def loadRealLayers ( realLayersTable, confFile ):
routingLayer.setBlockageLayer(basicLayer) routingLayer.setBlockageLayer(basicLayer)
except Exception, e: 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 return
def loadSymbolicLayers ( symbolicLayersData, confFile ): def loadSymbolicLayers ( symbolicLayersData, confFile ):
global symbolicFile global technologyFile
symbolicFile = confFile technologyFile = confFile
technology = DataBase.getDB().getTechnology() technology = DataBase.getDB().getTechnology()
entryNo = 0 entryNo = 0
for entry in symbolicLayersData: for entry in symbolicLayersData:
@ -197,14 +196,14 @@ def loadSymbolicLayers ( symbolicLayersData, confFile ):
layersLUT.add( symbolicLayer ) layersLUT.add( symbolicLayer )
except Exception, e: 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 return
def loadSymbolicRules ( symbolicRulesTable, confFile ): def loadSymbolicRules ( symbolicRulesTable, confFile ):
global symbolicFile global technologyFile
symbolicFile = confFile technologyFile = confFile
technology = DataBase.getDB().getTechnology() technology = DataBase.getDB().getTechnology()
entryNo = 0 entryNo = 0
for rule in symbolicRulesTable: for rule in symbolicRulesTable:
@ -253,14 +252,14 @@ def loadSymbolicRules ( symbolicRulesTable, confFile ):
]) ])
except Exception, e: 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 return
def loadWorkingLayers ( workingLayersTable, confFile ): def loadWorkingLayers ( workingLayersTable, confFile ):
global symbolicFile global technologyFile
symbolicFile = confFile technologyFile = confFile
technology = DataBase.getDB().getTechnology() technology = DataBase.getDB().getTechnology()
entryNo = 0 entryNo = 0
for layerName in workingLayersTable: for layerName in workingLayersTable:
@ -270,15 +269,98 @@ def loadWorkingLayers ( workingLayersTable, confFile ):
layersLUT.lookup(layerName,LayersLUT.Real|LayersLUT.Symbolic|LayersLUT.MissingError) layersLUT.lookup(layerName,LayersLUT.Real|LayersLUT.Symbolic|LayersLUT.MissingError)
technology.setWorkingLayer(layerName) technology.setWorkingLayer(layerName)
except Exception, e: 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 return
def loadViewerConfig ( viewerConfig, confFile ): def loadViewerConfig ( viewerConfig, confFile ):
global symbolicFile global technologyFile
symbolicFile = confFile technologyFile = confFile
try: try:
if viewerConfig.has_key('precision'): DbU.setPrecision(viewerConfig['precision']) if viewerConfig.has_key('precision'): DbU.setPrecision(viewerConfig['precision'])
except Exception, e: except Exception, e:
ErrorMessage.wrapPrint(e,'In %s:<viewerConfig>.') ErrorMessage.wrapPrint(e,'In %s:<viewerConfig>.')
return 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

View File

@ -28,10 +28,9 @@ import Hurricane
quiet = False quiet = False
sysConfDir = None sysConfDir = None
ndaConfDir = None ndaConfDir = None
symbolicTechno = 'cmos' techno = 'symbolic/cmos'
symbolicDir = None technoDir = None
realTechno = '130/hcmos9gp' unitsLambda = True
realDir = None
tab = None tab = None
_trace = None _trace = None
moduleGlobals = globals() moduleGlobals = globals()
@ -280,13 +279,29 @@ def setTraceLevel ( level ):
return 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 ): def initTechno ( argQuiet ):
global quiet global quiet
global ndaConfDir global ndaConfDir
global realDir global technoDir
global realTechno global techno
global symbolicDir
global symbolicTechno
quiet = argQuiet quiet = argQuiet
@ -301,36 +316,32 @@ def initTechno ( argQuiet ):
if not quiet: print ' - Loading \"%s\".' % truncPath(technoFile) if not quiet: print ' - Loading \"%s\".' % truncPath(technoFile)
execfile(technoFile,moduleGlobals) execfile(technoFile,moduleGlobals)
break break
if moduleGlobals.has_key('symbolicTechnology'): if moduleGlobals.has_key('technology'):
symbolicTechno = symbolicTechnology techno = technology
else: else:
print '[WARNING] The symbolic technology name is not set. Using <%s>.' % symbolicTechno print '[WARNING] The technology is not set. Using <%s>.' % techno
if moduleGlobals.has_key('realTechnology'):
realTechno = realTechnology
else:
print '[WARNING] The real technology name is not set. Using <%s>.' % realTechno
if moduleGlobals.has_key('NdaDirectory'): if moduleGlobals.has_key('NdaDirectory'):
ndaConfDir = os.path.join( NdaDirectory, 'etc/coriolis2' ) ndaConfDir = os.path.join( NdaDirectory, 'etc/coriolis2' )
else: else:
ndaConfDir = sysConfDir ndaConfDir = sysConfDir
symbolicDir = os.path.join( sysConfDir, symbolicTechno ) technoDir = os.path.join( ndaConfDir, techno )
realDir = os.path.join( ndaConfDir, realTechno ) if not quiet: print ' - Technology: %s.' % techno
if not quiet: print ' - Technologies: %s+%s.' % (symbolicTechno,realTechno)
def staticInitialization ( quiet=False ): def staticInitialization ( quiet=False ):
global sysConfDir global sysConfDir
global symbolicDir global technoDir
global realDir
global tab global tab
global _trace global _trace
global unitsLambda
if sysConfDir != None: return if sysConfDir != None: return
tab = Tab() unitsLamba = True
_trace = Trace() tab = Tab()
_trace = Trace()
reSysConfDir = re.compile(r'.*etc\/coriolis2') reSysConfDir = re.compile(r'.*etc\/coriolis2')
if not quiet: print ' o Locating configuration directory:' if not quiet: print ' o Locating configuration directory:'

View File

@ -30,6 +30,7 @@ Cfg.getParamInt ("kite.longGlobalRipupLimit").setInt (5 )
Cfg.getParamInt ("kite.longGlobalRipupLimit").setMin (1 ) Cfg.getParamInt ("kite.longGlobalRipupLimit").setMin (1 )
Cfg.getParamInt ("kite.strapRipupLimit" ).setInt (16 ) Cfg.getParamInt ("kite.strapRipupLimit" ).setInt (16 )
Cfg.getParamInt ("kite.strapRipupLimit" ).setMin (1 ) Cfg.getParamInt ("kite.strapRipupLimit" ).setMin (1 )
Cfg.getParamDouble ("kite.metal1MinBreak" ).setDouble (100 ) Cfg.getParamDouble ("kite.metal1MinBreak" ).setDouble (100 )