From bc1c7838d145452e4631fc89503418e20aac82cc Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 17 Nov 2017 11:10:32 +0100 Subject: [PATCH] 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. --- crlcore/etc/180/scn6m_deep_09/technology.conf | 42 +++- crlcore/etc/45/freepdk_45/alliance.conf | 39 +++ crlcore/etc/45/freepdk_45/display.conf | 11 + crlcore/etc/45/freepdk_45/etesian.conf | 5 + crlcore/etc/45/freepdk_45/hMetis.conf | 5 + crlcore/etc/45/freepdk_45/kite.conf | 63 +++++ crlcore/etc/45/freepdk_45/mauka.conf | 5 + crlcore/etc/45/freepdk_45/misc.conf | 9 + crlcore/etc/45/freepdk_45/nimbus.conf | 5 + crlcore/etc/45/freepdk_45/patterns.conf | 5 + crlcore/etc/45/freepdk_45/plugins.conf | 27 ++ crlcore/etc/45/freepdk_45/stratus1.conf | 13 + crlcore/etc/45/freepdk_45/technology.conf | 234 ++++++++++++++++++ crlcore/etc/CMakeLists.txt | 13 +- crlcore/etc/common/display.conf | 114 ++++++--- crlcore/etc/common/technology.conf | 68 ++--- crlcore/etc/symbolic/cmos/technology.conf | 29 +++ crlcore/etc/symbolic/ispd05/technology.conf | 34 ++- crlcore/etc/techno.conf | 3 +- crlcore/python/CMakeLists.txt | 17 +- crlcore/python/coriolisInit.py | 75 +++--- crlcore/python/helpers/Alliance.py | 18 +- crlcore/python/helpers/RealTechnology.py | 98 -------- .../{SymbolicTechnology.py => Technology.py} | 122 +++++++-- crlcore/python/helpers/__init__.py | 55 ++-- crlcore/python/helpers/kite.py | 1 + 26 files changed, 831 insertions(+), 279 deletions(-) create mode 100644 crlcore/etc/45/freepdk_45/alliance.conf create mode 100644 crlcore/etc/45/freepdk_45/display.conf create mode 100644 crlcore/etc/45/freepdk_45/etesian.conf create mode 100644 crlcore/etc/45/freepdk_45/hMetis.conf create mode 100644 crlcore/etc/45/freepdk_45/kite.conf create mode 100644 crlcore/etc/45/freepdk_45/mauka.conf create mode 100644 crlcore/etc/45/freepdk_45/misc.conf create mode 100644 crlcore/etc/45/freepdk_45/nimbus.conf create mode 100644 crlcore/etc/45/freepdk_45/patterns.conf create mode 100644 crlcore/etc/45/freepdk_45/plugins.conf create mode 100644 crlcore/etc/45/freepdk_45/stratus1.conf create mode 100644 crlcore/etc/45/freepdk_45/technology.conf delete mode 100644 crlcore/python/helpers/RealTechnology.py rename crlcore/python/helpers/{SymbolicTechnology.py => Technology.py} (69%) diff --git a/crlcore/etc/180/scn6m_deep_09/technology.conf b/crlcore/etc/180/scn6m_deep_09/technology.conf index 059d339b..964fd4d4 100644 --- a/crlcore/etc/180/scn6m_deep_09/technology.conf +++ b/crlcore/etc/180/scn6m_deep_09/technology.conf @@ -1,6 +1,7 @@ -# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- +# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- 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 : # 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) + ) diff --git a/crlcore/etc/45/freepdk_45/alliance.conf b/crlcore/etc/45/freepdk_45/alliance.conf new file mode 100644 index 00000000..b6e796ad --- /dev/null +++ b/crlcore/etc/45/freepdk_45/alliance.conf @@ -0,0 +1,39 @@ +# -*- Mode:Python; explicit-buffer-name: "alliance.conf" -*- + +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') + ) diff --git a/crlcore/etc/45/freepdk_45/display.conf b/crlcore/etc/45/freepdk_45/display.conf new file mode 100644 index 00000000..756c5f1d --- /dev/null +++ b/crlcore/etc/45/freepdk_45/display.conf @@ -0,0 +1,11 @@ +# -*- Mode:Python; explicit-buffer-name: "display.conf" -*- + +import helpers + +# Provides standard settings for: +# - +# - + +scale = 0.5 + +execfile( helpers.sysConfDir+'/common/display.conf' ) diff --git a/crlcore/etc/45/freepdk_45/etesian.conf b/crlcore/etc/45/freepdk_45/etesian.conf new file mode 100644 index 00000000..60954b3c --- /dev/null +++ b/crlcore/etc/45/freepdk_45/etesian.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/etesian.conf' ) diff --git a/crlcore/etc/45/freepdk_45/hMetis.conf b/crlcore/etc/45/freepdk_45/hMetis.conf new file mode 100644 index 00000000..a473fecd --- /dev/null +++ b/crlcore/etc/45/freepdk_45/hMetis.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "hMetis.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/hMetis.conf' ) diff --git a/crlcore/etc/45/freepdk_45/kite.conf b/crlcore/etc/45/freepdk_45/kite.conf new file mode 100644 index 00000000..d1554e33 --- /dev/null +++ b/crlcore/etc/45/freepdk_45/kite.conf @@ -0,0 +1,63 @@ +# -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- + +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) + diff --git a/crlcore/etc/45/freepdk_45/mauka.conf b/crlcore/etc/45/freepdk_45/mauka.conf new file mode 100644 index 00000000..ff69e31b --- /dev/null +++ b/crlcore/etc/45/freepdk_45/mauka.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "mauka.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/mauka.conf' ) diff --git a/crlcore/etc/45/freepdk_45/misc.conf b/crlcore/etc/45/freepdk_45/misc.conf new file mode 100644 index 00000000..80eb0c07 --- /dev/null +++ b/crlcore/etc/45/freepdk_45/misc.conf @@ -0,0 +1,9 @@ +# -*- Mode:Python; explicit-buffer-name: "misc.conf" -*- + +import helpers + +# Provides standard settings for: +# # - +# # - +# +execfile( helpers.sysConfDir+'/common/misc.conf' ) diff --git a/crlcore/etc/45/freepdk_45/nimbus.conf b/crlcore/etc/45/freepdk_45/nimbus.conf new file mode 100644 index 00000000..80299e54 --- /dev/null +++ b/crlcore/etc/45/freepdk_45/nimbus.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "nimbus.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/nimbus.conf' ) diff --git a/crlcore/etc/45/freepdk_45/patterns.conf b/crlcore/etc/45/freepdk_45/patterns.conf new file mode 100644 index 00000000..e9a6174c --- /dev/null +++ b/crlcore/etc/45/freepdk_45/patterns.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "patterns.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/patterns.conf' ) diff --git a/crlcore/etc/45/freepdk_45/plugins.conf b/crlcore/etc/45/freepdk_45/plugins.conf new file mode 100644 index 00000000..3160d3d7 --- /dev/null +++ b/crlcore/etc/45/freepdk_45/plugins.conf @@ -0,0 +1,27 @@ +# -*- Mode:Python; explicit-buffer-name: "plugins.conf" -*- + +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') + ) diff --git a/crlcore/etc/45/freepdk_45/stratus1.conf b/crlcore/etc/45/freepdk_45/stratus1.conf new file mode 100644 index 00000000..37f27e2f --- /dev/null +++ b/crlcore/etc/45/freepdk_45/stratus1.conf @@ -0,0 +1,13 @@ +# -*- Mode:Python; explicit-buffer-name: "stratus1.conf" -*- + +import helpers + + +# Status1 parameters. +parametersTable = \ + ( ("stratus1.format" , TypeString, "vst") + , ("stratus1.simulator" , TypeString, "asimut") + ,) + + +execfile( helpers.sysConfDir+'/common/stratus1.conf' ) diff --git a/crlcore/etc/45/freepdk_45/technology.conf b/crlcore/etc/45/freepdk_45/technology.conf new file mode 100644 index 00000000..951c2fde --- /dev/null +++ b/crlcore/etc/45/freepdk_45/technology.conf @@ -0,0 +1,234 @@ +# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- +# +# FreePDK 45 nanometers. +# +# Provides standard settings for: +# - +# - +# - +# - + +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 : +# 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) + ) diff --git a/crlcore/etc/CMakeLists.txt b/crlcore/etc/CMakeLists.txt index bf6b0ab6..f7840428 100644 --- a/crlcore/etc/CMakeLists.txt +++ b/crlcore/etc/CMakeLists.txt @@ -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 ) diff --git a/crlcore/etc/common/display.conf b/crlcore/etc/common/display.conf index 990eec9b..cde60d96 100644 --- a/crlcore/etc/common/display.conf +++ b/crlcore/etc/common/display.conf @@ -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') diff --git a/crlcore/etc/common/technology.conf b/crlcore/etc/common/technology.conf index cde97b73..0c99d6ac 100644 --- a/crlcore/etc/common/technology.conf +++ b/crlcore/etc/common/technology.conf @@ -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' ] diff --git a/crlcore/etc/symbolic/cmos/technology.conf b/crlcore/etc/symbolic/cmos/technology.conf index 1371a43d..5f95579e 100644 --- a/crlcore/etc/symbolic/cmos/technology.conf +++ b/crlcore/etc/symbolic/cmos/technology.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- 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 : # 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) + ) diff --git a/crlcore/etc/symbolic/ispd05/technology.conf b/crlcore/etc/symbolic/ispd05/technology.conf index 1371a43d..2e12efd9 100644 --- a/crlcore/etc/symbolic/ispd05/technology.conf +++ b/crlcore/etc/symbolic/ispd05/technology.conf @@ -1,10 +1,8 @@ -# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- +# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- 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: # - # - @@ -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 : # 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) + ) diff --git a/crlcore/etc/techno.conf b/crlcore/etc/techno.conf index 67f51417..46e14249 100644 --- a/crlcore/etc/techno.conf +++ b/crlcore/etc/techno.conf @@ -1,4 +1,3 @@ # -*- Mode:Python -*- -symbolicTechno = 'cmos' -realTechno = '130/hcmos9gp' +technology = 'symbolic/cmos' diff --git a/crlcore/python/CMakeLists.txt b/crlcore/python/CMakeLists.txt index b4e2dd88..1d4681c6 100644 --- a/crlcore/python/CMakeLists.txt +++ b/crlcore/python/CMakeLists.txt @@ -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 ) diff --git a/crlcore/python/coriolisInit.py b/crlcore/python/coriolisInit.py index 7253ec14..c5cc34d4 100644 --- a/crlcore/python/coriolisInit.py +++ b/crlcore/python/coriolisInit.py @@ -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 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' ) diff --git a/crlcore/python/helpers/Alliance.py b/crlcore/python/helpers/Alliance.py index 1a196ef1..b107236e 100644 --- a/crlcore/python/helpers/Alliance.py +++ b/crlcore/python/helpers/Alliance.py @@ -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: at index %d.' % (allianceFile,gaugeDatasNo)) diff --git a/crlcore/python/helpers/RealTechnology.py b/crlcore/python/helpers/RealTechnology.py deleted file mode 100644 index ba061a2d..00000000 --- a/crlcore/python/helpers/RealTechnology.py +++ /dev/null @@ -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 = '' - - -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 .' - ,'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 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 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: 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 , invalid DbU unit power for gridUnit, reseting to Micro.') - else: - raise ErrorMessage(1,' has no 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 , must be of type float (and not: %s).' - % helpers.stype(gridValue) - ]) - DbU.setPhysicalsPerGrid(gridValue,gridUnit) - else: - raise ErrorMessage(1,' has no defined.') - - elif key == 'gridsPerLambda': - if technoConfig.has_key('gridsPerLambda'): - gridsPerLambda = technoConfig['gridsPerLambda'] - if not isinstance(gridsPerLambda,int): - raise ErrorMessage(1,['In , must be of type int (and not: %s).' - % helpers.stype(gridsPerLambda) - ]) - DbU.setGridsPerLambda(gridsPerLambda) - - except Exception, e: - ErrorMessage.wrapPrint(e) - return diff --git a/crlcore/python/helpers/SymbolicTechnology.py b/crlcore/python/helpers/Technology.py similarity index 69% rename from crlcore/python/helpers/SymbolicTechnology.py rename to crlcore/python/helpers/Technology.py index d0b28f01..79f08d74 100644 --- a/crlcore/python/helpers/SymbolicTechnology.py +++ b/crlcore/python/helpers/Technology.py @@ -1,4 +1,3 @@ - # -*- mode:Python -*- import sys @@ -19,7 +18,7 @@ from CRL import AllianceFramework from helpers import ErrorMessage -symbolicFile = '' +technologyFile = '' 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: at index %d.' % (symbolicFile,entryNo)) + ErrorMessage.wrapPrint(e,'In %s: 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: at index %d.' % (symbolicFile,entryNo)) + ErrorMessage.wrapPrint(e,'In %s: 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: at index %d.' % (symbolicFile,entryNo)) + ErrorMessage.wrapPrint(e,'In %s: 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: at index %d.' % (symbolicFile,entryNo)) + ErrorMessage.wrapPrint(e,'In %s: 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:.') 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 .' + ,'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 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 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: 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 , invalid DbU unit power for gridUnit, reseting to Micro.') + else: + raise ErrorMessage(1,' has no 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 , must be of type float (and not: %s).' + % helpers.stype(gridValue) + ]) + DbU.setPhysicalsPerGrid(gridValue,gridUnit) + else: + raise ErrorMessage(1,' has no defined.') + + elif key == 'gridsPerLambda': + if technoConfig.has_key('gridsPerLambda'): + gridsPerLambda = technoConfig['gridsPerLambda'] + if not isinstance(gridsPerLambda,int): + raise ErrorMessage(1,['In , must be of type int (and not: %s).' + % helpers.stype(gridsPerLambda) + ]) + DbU.setGridsPerLambda(gridsPerLambda) + + except Exception, e: + ErrorMessage.wrapPrint(e) + return diff --git a/crlcore/python/helpers/__init__.py b/crlcore/python/helpers/__init__.py index 6f076f1d..96f8d72d 100644 --- a/crlcore/python/helpers/__init__.py +++ b/crlcore/python/helpers/__init__.py @@ -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:' diff --git a/crlcore/python/helpers/kite.py b/crlcore/python/helpers/kite.py index 60f9291e..d082ad6e 100644 --- a/crlcore/python/helpers/kite.py +++ b/crlcore/python/helpers/kite.py @@ -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 )