2014-05-21 17:13:17 -05:00
|
|
|
# -*- Mode:Python; explicit-buffer-name: "technology.conf<common>" -*-
|
|
|
|
#
|
|
|
|
# Those settings are common to all the symbolic technologies.
|
|
|
|
|
2017-11-17 04:10:32 -06:00
|
|
|
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
|
New coriolis launcher. Configuration files cleanup.
* Change: In CRL Core, simplify the loading sequence. The technology,
both symbolic and real is now loaded directly from coriolisInit.py
and not through the Alliance loader. This was a leftover from the
time configuration was in XML. Remove others traces of XML loading.
Remove SYMB_TECHNO_NAME, REAL_TECHNO_NAME & DISPLAY from the Alliance
environement, as they was no longer used.
Note that technology *still* need to be loader *after* Alliance
framework has been initialized.
Gauge information is moved from <alliance.conf> to <kite.conf>.
* Bug: In Coloquinte, in optimization_subproblems.cxx static variables
must not be inlined. Generate a problem when linking in debug mode
(seems the symbol gets optimised out).
* Bug: In Katabatic, in Grid::getGCell(), when the coordinate is *outside*
the area, do not try to find a GCell, directly return NULL.
* New: In Unicorn, create a generic command launcher named "coriolis" which
automatically take cares of all environement setup, then run a command
by default, it's <cgt>, but it can be anything. For example: <zsh>.
2015-04-13 11:54:09 -05:00
|
|
|
|
|
|
|
|
2018-05-04 10:06:41 -05:00
|
|
|
#viewerConfig = { 'precision':2, 'gridstep':1.0 }
|
2014-05-21 17:13:17 -05:00
|
|
|
|
|
|
|
# The informations here are extracted from the Alliance ".rds" file,
|
|
|
|
# and must be coherent with it.
|
|
|
|
#
|
|
|
|
# Format of <realLayerTable>:
|
|
|
|
# The third parameter must be present only for blockage material.
|
|
|
|
# ('layer_name' , MATERIAL , ASSOCIATED ROUTING)
|
|
|
|
#
|
|
|
|
# Note: concerning the LayerMask, real layers are implementeds as BasicLayer,
|
|
|
|
# and are associated to exactly one bit of the mask. Symbolic layers
|
|
|
|
# then combine BasicLayer to create composite objects, an thus can have
|
|
|
|
# a mask which have multiple bits set. Getting the mask from a layer
|
|
|
|
# is straigthforward, but the reverse is not true. One mask may match
|
|
|
|
# multiple symbolic layers. To overcome this ambiguity we introduce the
|
|
|
|
# concept of "working layer", which, for one given mask tells the layer
|
|
|
|
# that will be returned (generally the symbolic one).
|
|
|
|
|
|
|
|
realLayersTable = \
|
|
|
|
( ('nWell' , BasicLayer.Material.nWell ) # Non-Routing Layers.
|
|
|
|
, ('pWell' , BasicLayer.Material.pWell )
|
|
|
|
, ('nImplant' , BasicLayer.Material.nImplant)
|
|
|
|
, ('pImplant' , BasicLayer.Material.pImplant)
|
|
|
|
, ('active' , BasicLayer.Material.active )
|
|
|
|
, ('poly' , BasicLayer.Material.poly )
|
|
|
|
, ('poly2' , BasicLayer.Material.poly )
|
|
|
|
, ('cut0' , BasicLayer.Material.cut ) # Routing Layers & VIA Cuts.
|
|
|
|
, ('metal1' , BasicLayer.Material.metal ) # WARNING: order *is* meaningful.
|
|
|
|
, ('cut1' , BasicLayer.Material.cut )
|
|
|
|
, ('metal2' , BasicLayer.Material.metal )
|
2016-03-06 05:40:23 -06:00
|
|
|
, ('metcap' , BasicLayer.Material.other )
|
2014-05-21 17:13:17 -05:00
|
|
|
, ('cut2' , BasicLayer.Material.cut )
|
|
|
|
, ('metal3' , BasicLayer.Material.metal )
|
|
|
|
, ('cut3' , BasicLayer.Material.cut )
|
|
|
|
, ('metal4' , BasicLayer.Material.metal )
|
|
|
|
, ('cut4' , BasicLayer.Material.cut )
|
|
|
|
, ('metal5' , BasicLayer.Material.metal )
|
|
|
|
, ('cut5' , BasicLayer.Material.cut )
|
|
|
|
, ('metal6' , BasicLayer.Material.metal )
|
|
|
|
, ('cut6' , BasicLayer.Material.cut )
|
|
|
|
, ('metal7' , BasicLayer.Material.metal )
|
|
|
|
, ('cut7' , BasicLayer.Material.cut )
|
|
|
|
, ('metal8' , BasicLayer.Material.metal )
|
2017-11-17 04:10:32 -06:00
|
|
|
, ('cut8' , BasicLayer.Material.cut )
|
|
|
|
, ('metal9' , BasicLayer.Material.metal )
|
|
|
|
, ('cut9' , BasicLayer.Material.cut )
|
|
|
|
, ('metal10' , BasicLayer.Material.metal )
|
2016-06-03 10:19:46 -05:00
|
|
|
#, ('topmim6' , BasicLayer.Material.other ) # For Capacitances & Pads.
|
2016-12-15 12:25:05 -06:00
|
|
|
, ('metbot_r' , BasicLayer.Material.other )
|
2016-06-03 10:19:46 -05:00
|
|
|
#, ('padopen' , BasicLayer.Material.other )
|
|
|
|
#, ('alucap' , BasicLayer.Material.other )
|
2014-05-21 17:13:17 -05:00
|
|
|
|
|
|
|
, ('text.cell' , BasicLayer.Material.other ) # Misc. non-physical layers.
|
|
|
|
, ('text.instance', BasicLayer.Material.other ) # Used by the software for visualization
|
|
|
|
, ('SPL1' , BasicLayer.Material.other ) # purposes only.
|
|
|
|
, ('AutoLayer' , BasicLayer.Material.other )
|
|
|
|
, ('blockage1' , BasicLayer.Material.blockage, 'metal1') # Blockages
|
|
|
|
, ('blockage2' , BasicLayer.Material.blockage, 'metal2')
|
|
|
|
, ('blockage3' , BasicLayer.Material.blockage, 'metal3')
|
|
|
|
, ('blockage4' , BasicLayer.Material.blockage, 'metal4')
|
|
|
|
, ('blockage5' , BasicLayer.Material.blockage, 'metal5')
|
|
|
|
, ('blockage6' , BasicLayer.Material.blockage, 'metal6')
|
|
|
|
, ('blockage7' , BasicLayer.Material.blockage, 'metal7')
|
|
|
|
, ('blockage8' , BasicLayer.Material.blockage, 'metal8')
|
2017-11-17 04:10:32 -06:00
|
|
|
, ('blockage9' , BasicLayer.Material.blockage, 'metal9')
|
|
|
|
, ('blockage10' , BasicLayer.Material.blockage, 'metal10')
|
2014-05-21 17:13:17 -05:00
|
|
|
, ('gmetalh' , BasicLayer.Material.metal ) # Special BasicLayers for Knik & Kite Routers.
|
|
|
|
, ('gcut' , BasicLayer.Material.cut ) # *Must be after all others*
|
|
|
|
, ('gmetalv' , BasicLayer.Material.metal )
|
|
|
|
)
|
|
|
|
|
|
|
|
|
Cleaner support for real technologies (Hurricane, CRL Core configuration).
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
2017-12-27 06:13:29 -06:00
|
|
|
# Format of <compositeLayersTable>:
|
2014-05-21 17:13:17 -05:00
|
|
|
# The length of the list of real layers depends on the type.
|
|
|
|
# In some case, the last of the list may be optional, it must be
|
|
|
|
# sets to None and not left empty.
|
|
|
|
#
|
|
|
|
# ('SYMB_LAYER' , Type , (LIST_OF_REAL_LAYERS) )
|
|
|
|
|
Cleaner support for real technologies (Hurricane, CRL Core configuration).
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
2017-12-27 06:13:29 -06:00
|
|
|
compositeLayersTable = \
|
2014-05-21 17:13:17 -05:00
|
|
|
( ('NWELL' , TypeRegular , ('nWell' ,))
|
|
|
|
, ('PWELL' , TypeRegular , ('pWell' ,))
|
|
|
|
, ('NTIE' , TypeDiffusion , ('nImplant' , 'active', 'nWell'))
|
|
|
|
, ('PTIE' , TypeDiffusion , ('pImplant' , 'active', 'pWell'))
|
|
|
|
, ('NDIF' , TypeDiffusion , ('nImplant' , 'active', None ))
|
|
|
|
, ('PDIF' , TypeDiffusion , ('pImplant' , 'active', None ))
|
|
|
|
, ('GATE' , TypeDiffusion , ('poly' , 'active', None ))
|
|
|
|
, ('NTRANS' , TypeTransistor, ('nImplant' , 'active', 'poly', None ))
|
|
|
|
, ('PTRANS' , TypeTransistor, ('pImplant' , 'active', 'poly', 'nWell'))
|
|
|
|
, ('POLY' , TypeRegular , ('poly' ,))
|
|
|
|
, ('POLY2' , TypeRegular , ('poly2' ,))
|
|
|
|
, ('METAL1' , TypeRegular , ('metal1' ,))
|
|
|
|
, ('METAL2' , TypeRegular , ('metal2' ,))
|
2016-03-06 05:40:23 -06:00
|
|
|
, ('metcapdum' , TypeRegular , ('metcap' ,))
|
|
|
|
, ('metbot' , TypeRegular , ('metal2' ,))
|
2014-05-21 17:13:17 -05:00
|
|
|
, ('METAL3' , TypeRegular , ('metal3' ,))
|
|
|
|
, ('METAL4' , TypeRegular , ('metal4' ,))
|
|
|
|
, ('METAL5' , TypeRegular , ('metal5' ,))
|
|
|
|
, ('METAL6' , TypeRegular , ('metal6' ,))
|
|
|
|
, ('METAL7' , TypeRegular , ('metal7' ,))
|
|
|
|
, ('METAL8' , TypeRegular , ('metal8' ,))
|
2017-11-17 04:10:32 -06:00
|
|
|
, ('METAL9' , TypeRegular , ('metal9' ,))
|
|
|
|
, ('METAL10' , TypeRegular , ('metal10' ,))
|
2014-05-21 17:13:17 -05:00
|
|
|
, ('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 ))
|
2017-11-17 04:10:32 -06:00
|
|
|
, ('CONT_POLY' , TypeVia , ( 'poly' , 'cut0', 'metal1' ))
|
Cleaner support for real technologies (Hurricane, CRL Core configuration).
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
2017-12-27 06:13:29 -06:00
|
|
|
# VIAs for real technologies.
|
|
|
|
, ('via12' , TypeVia , ( 'metal1', 'cut1', 'metal2' ))
|
|
|
|
, ('via23' , TypeVia , ( 'metal2', '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'))
|
|
|
|
# VIAs for symbolic technologies.
|
2017-11-17 04:10:32 -06:00
|
|
|
, ('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'))
|
2014-05-21 17:13:17 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
|
Cleaner support for real technologies (Hurricane, CRL Core configuration).
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
2017-12-27 06:13:29 -06:00
|
|
|
# Format of <symbolicLayersTable>:
|
|
|
|
# This is a simple list of Symbolic layers.
|
2014-05-21 17:13:17 -05:00
|
|
|
|
Cleaner support for real technologies (Hurricane, CRL Core configuration).
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
2017-12-27 06:13:29 -06:00
|
|
|
symbolicLayersTable = \
|
|
|
|
[ 'POLY', 'POLY2'
|
2017-11-17 04:10:32 -06:00
|
|
|
, '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'
|
2016-03-06 05:40:23 -06:00
|
|
|
, 'gcut' , 'gmetalh' , 'gmetalv' , 'gcontact'
|
2014-05-21 17:13:17 -05:00
|
|
|
]
|