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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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