Migrating the initialisation system to be completely Python-like.
* New: In bootstrap/coriolisEnv.py, add the "etc" directory to the
PYTHONPATH as initialization are now Python modules.
* New: In Hurricane/analogic, first groundwork for the integration of
PIP/MIM/MOM multi-capacitors. Add C++ and Python interface for the
allocation matrix and the list of capacities values.
* Change: In Hurricane::RegularLayer, add a layer parameter to the
constructor so the association between the RegularLayer and it's
BasicLayer can readily be done.
* Change: In Hurricane::Layer, add a new getCut() accessor to get the
cut layer in ViaLayer.
* Change: In Hurricane::DataBase::get(), the Python wrapper should no
longer consider an error if the data-base has not been created yet.
Just return None.
* Bug: In Isobar::PyLayer::getEnclosure() wrapper, if the overall
enclosure is requested, pass the right parameter to the C++ function.
* Change: In AllianceFramework, make public _bindLibraries() and export
it to the Python interface.
* Change: In AllianceFramework::create(), do not longer call bindLibraries().
This now must be done explicitely and afterwards.
* Change: In AllianceFramework::createLibrary() and
Environement::addSYSTEM_LIBRARY(), minor bug corrections that I don't
recall.
* Change: In SearchPath::prepend(), set the selected index to zero and
return it.
* Change: In CRL::System CTOR, add "etc" to the PYTHONPATH as the
configuration files are now organized as Python modules.
* New: In PyCRL, export the CRL::System singleton, it's creation is no
longer triggered by the one of AllianceFramework.
* New: In CRL/etc/, convert most of the configuration files into the
Python module format. For now, keep the old ".conf", but that are no
longer used.
For the real technologies, we cannot keep the directory name as
"180" or "45" as it not allowed by Python syntax, so we create "node180"
or "node45" instead.
Most of the helpers and coriolisInit.py are no longer used now.
To be removed in future commits after being sure that everything
works...
* Bug: In AutoSegment::makeDogleg(AutoContact*), the layer of the contacts
where badly computed when one end of the original segment was attached
to a non-preferred direction segment (mostly on terminal contacts).
Now use the new AutoContact::updateLayer() method.
* Bug: In Dijkstra::load(), limit symetric search area only if the net
is a symmetric one !
* Change: In Katana/python/katanaInit.py, comply with the new initialisation
scheme.
* Change: In Unicorn/cgt.py, comply to the new inititalization scheme.
* Change: In cumulus various Python scripts remove the call to
helpers.staticInitialization() as they are not needed now (we run in
only *one* interpreter, so we correctly share all init).
In plugins/__init__.py, read the new NDA directory variable.
* Bug: In cumulus/plugins/Chip.doCoronafloorplan(), self.railsNb was not
correctly managed when there was no clock.
* Change: In cumulus/plugins/Configuration.coronaContactArray(), compute
the viaPitch from the technology instead of the hard-coded 4.0 lambdas.
In Configuration.loadConfiguration(), read the "ioring.py" from
the new user's settings module.
* Bug: In stratus.dpgen_ADSB2F, gives coordinates translated into DbU to
the XY functions.
In st_model.Save(), use the VstUseConcat flag to get correct VST files.
In st_net.hur_net(), when a net is POWER/GROUND or CLOCK also make it
global.
* Change: In Oroshi/python/WIP_Transistor.py, encapsulate the generator
inside a try/except block to get prettier error (and stop at the first).
2019-10-28 12:09:14 -05:00
|
|
|
|
|
|
|
# This file is part of the Coriolis Software.
|
|
|
|
# Copyright (c) UPMC 2019-2019, All Rights Reserved
|
|
|
|
#
|
|
|
|
# +-----------------------------------------------------------------+
|
|
|
|
# | C O R I O L I S |
|
|
|
|
# | Alliance / Hurricane Interface |
|
|
|
|
# | |
|
|
|
|
# | Author : Jean-Paul CHAPUT |
|
|
|
|
# | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
|
|
# | =============================================================== |
|
|
|
|
# | Python : "./etc/common/technology.py" |
|
|
|
|
# +-----------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
from helpers import l, u, n
|
|
|
|
from Hurricane import DataBase
|
|
|
|
from Hurricane import Technology
|
|
|
|
from Hurricane import Layer
|
|
|
|
from Hurricane import BasicLayer
|
|
|
|
from Hurricane import DiffusionLayer
|
|
|
|
from Hurricane import TransistorLayer
|
|
|
|
from Hurricane import RegularLayer
|
|
|
|
from Hurricane import ContactLayer
|
|
|
|
from Hurricane import ViaLayer
|
|
|
|
|
|
|
|
|
|
|
|
tech = DataBase.getDB().getTechnology()
|
|
|
|
|
|
|
|
|
|
|
|
def createBL ( layerName, material ):
|
|
|
|
global tech
|
|
|
|
return BasicLayer.create( tech, layerName, BasicLayer.Material(material) )
|
|
|
|
|
|
|
|
|
|
|
|
nWell = createBL( 'nWell' , BasicLayer.Material.nWell ) # Non-Routing Layers.
|
|
|
|
pWell = createBL( 'pWell' , BasicLayer.Material.pWell )
|
|
|
|
nImplant = createBL( 'nImplant' , BasicLayer.Material.nImplant )
|
|
|
|
pImplant = createBL( 'pImplant' , BasicLayer.Material.pImplant )
|
|
|
|
active = createBL( 'active' , BasicLayer.Material.active )
|
|
|
|
poly = createBL( 'poly' , BasicLayer.Material.poly )
|
|
|
|
poly2 = createBL( 'poly2' , BasicLayer.Material.poly )
|
|
|
|
cut0 = createBL( 'cut0' , BasicLayer.Material.cut ) # Routing Layers & VIA Cuts.
|
|
|
|
metal1 = createBL( 'metal1' , BasicLayer.Material.metal ) # WARNING: order *is* meaningful.
|
|
|
|
cut1 = createBL( 'cut1' , BasicLayer.Material.cut )
|
|
|
|
metal2 = createBL( 'metal2' , BasicLayer.Material.metal )
|
|
|
|
metcap = createBL( 'metcap' , BasicLayer.Material.other )
|
|
|
|
cut2 = createBL( 'cut2' , BasicLayer.Material.cut )
|
|
|
|
metal3 = createBL( 'metal3' , BasicLayer.Material.metal )
|
|
|
|
cut3 = createBL( 'cut3' , BasicLayer.Material.cut )
|
|
|
|
metal4 = createBL( 'metal4' , BasicLayer.Material.metal )
|
|
|
|
cut4 = createBL( 'cut4' , BasicLayer.Material.cut )
|
|
|
|
metal5 = createBL( 'metal5' , BasicLayer.Material.metal )
|
|
|
|
cut5 = createBL( 'cut5' , BasicLayer.Material.cut )
|
|
|
|
metal6 = createBL( 'metal6' , BasicLayer.Material.metal )
|
|
|
|
cut6 = createBL( 'cut6' , BasicLayer.Material.cut )
|
|
|
|
metal7 = createBL( 'metal7' , BasicLayer.Material.metal )
|
|
|
|
cut7 = createBL( 'cut7' , BasicLayer.Material.cut )
|
|
|
|
metal8 = createBL( 'metal8' , BasicLayer.Material.metal )
|
|
|
|
cut8 = createBL( 'cut8' , BasicLayer.Material.cut )
|
|
|
|
metal9 = createBL( 'metal9' , BasicLayer.Material.metal )
|
|
|
|
cut9 = createBL( 'cut9' , BasicLayer.Material.cut )
|
|
|
|
metal10 = createBL( 'metal10' , BasicLayer.Material.metal )
|
|
|
|
|
|
|
|
blockage1 = createBL( 'blockage1' , BasicLayer.Material.blockage )
|
|
|
|
blockage2 = createBL( 'blockage2' , BasicLayer.Material.blockage )
|
|
|
|
blockage3 = createBL( 'blockage3' , BasicLayer.Material.blockage )
|
|
|
|
blockage4 = createBL( 'blockage4' , BasicLayer.Material.blockage )
|
|
|
|
blockage5 = createBL( 'blockage5' , BasicLayer.Material.blockage )
|
|
|
|
blockage6 = createBL( 'blockage6' , BasicLayer.Material.blockage )
|
|
|
|
blockage7 = createBL( 'blockage7' , BasicLayer.Material.blockage )
|
|
|
|
blockage8 = createBL( 'blockage8' , BasicLayer.Material.blockage )
|
|
|
|
blockage9 = createBL( 'blockage9' , BasicLayer.Material.blockage )
|
|
|
|
blockage10 = createBL( 'blockage10', BasicLayer.Material.blockage )
|
|
|
|
|
|
|
|
metal1 .setBlockageLayer( blockage1 )
|
|
|
|
metal2 .setBlockageLayer( blockage2 )
|
|
|
|
metal3 .setBlockageLayer( blockage3 )
|
|
|
|
metal4 .setBlockageLayer( blockage4 )
|
|
|
|
metal5 .setBlockageLayer( blockage5 )
|
|
|
|
metal6 .setBlockageLayer( blockage6 )
|
|
|
|
metal7 .setBlockageLayer( blockage7 )
|
|
|
|
metal8 .setBlockageLayer( blockage8 )
|
|
|
|
metal9 .setBlockageLayer( blockage9 )
|
|
|
|
metal10.setBlockageLayer( blockage10 )
|
|
|
|
|
|
|
|
textCell = createBL( 'text.cell' , BasicLayer.Material.other ) # Misc. non-physical layers.
|
|
|
|
textInst = createBL( 'text.instance', BasicLayer.Material.other ) # Used by the software for visualization
|
|
|
|
SPL1 = createBL( 'SPL1' , BasicLayer.Material.other ) # purposes only.
|
|
|
|
AutoLayer = createBL( 'AutoLayer' , BasicLayer.Material.other )
|
|
|
|
gmetalh = createBL( 'gmetalh' , BasicLayer.Material.metal ) # Special BasicLayers for Knik & Kite Routers.
|
|
|
|
gcut = createBL( 'gcut' , BasicLayer.Material.cut ) # *Must be after all others*
|
|
|
|
gmetalv = createBL( 'gmetalv' , BasicLayer.Material.metal )
|
|
|
|
|
|
|
|
# VIAs for real technologies.
|
Bug fix, restore the FreePDK 45 (real) support.
* Change: In CRL::LefParser::_macroCbk(), create a Catalog entry for the
newly read MACRO (that is Cell) and sets the Logical, Physical,
InMemory and TerminalNetlist flags.
* Bug: In CRL::LefParser::_siteCbk(), check for NULL cell gauge.
* New: In CRL::AllianceFramework, add setCellGauge(), to set the default
cell gauge. Exported to Python.
* Change: In CRL/etc/common/technology.py, create variables for VIA
layers, so we can modify their properties afterwards.
* New: In CRL/etc/node45/freepdk45, port the configuration files to the
new Python "importable" format.
Note: in kite.py, all the gauges (Routing & Cells) must be named
"LEF.CoreSite" to please my LEF parser, so it can match the gauge
name with the SITE name for standard cells.
* Bug: In Anabatic::NetBuilderVH::_do_2G(), forgotten to be reimplemented
from the base class. Simply redirect to _do_xG().
* Change: In Katana::PowerRailsPlanes::PowerRailsplanes(), create plane
from the layers in the RoutingGauge and their associated blockages
instead of sweeping through all the basic layers.
Allow to distinguish bewteen "METAL" (symbolic) and "metal" (real).
2020-04-27 03:34:19 -05:00
|
|
|
via12 = ViaLayer.create( tech, 'via12' , metal1, cut1, metal2 )
|
|
|
|
via23 = ViaLayer.create( tech, 'via23' , metal2, cut2, metal3 )
|
|
|
|
via34 = ViaLayer.create( tech, 'via34' , metal3, cut3, metal4 )
|
|
|
|
via45 = ViaLayer.create( tech, 'via45' , metal4, cut4, metal5 )
|
|
|
|
via56 = ViaLayer.create( tech, 'via56' , metal5, cut5, metal6 )
|
|
|
|
via67 = ViaLayer.create( tech, 'via67' , metal6, cut6, metal7 )
|
|
|
|
via78 = ViaLayer.create( tech, 'via78' , metal7, cut7, metal8 )
|
|
|
|
via89 = ViaLayer.create( tech, 'via89' , metal8, cut8, metal9 )
|
|
|
|
via910 = ViaLayer.create( tech, 'via910', metal9, cut9, metal10 )
|
Migrating the initialisation system to be completely Python-like.
* New: In bootstrap/coriolisEnv.py, add the "etc" directory to the
PYTHONPATH as initialization are now Python modules.
* New: In Hurricane/analogic, first groundwork for the integration of
PIP/MIM/MOM multi-capacitors. Add C++ and Python interface for the
allocation matrix and the list of capacities values.
* Change: In Hurricane::RegularLayer, add a layer parameter to the
constructor so the association between the RegularLayer and it's
BasicLayer can readily be done.
* Change: In Hurricane::Layer, add a new getCut() accessor to get the
cut layer in ViaLayer.
* Change: In Hurricane::DataBase::get(), the Python wrapper should no
longer consider an error if the data-base has not been created yet.
Just return None.
* Bug: In Isobar::PyLayer::getEnclosure() wrapper, if the overall
enclosure is requested, pass the right parameter to the C++ function.
* Change: In AllianceFramework, make public _bindLibraries() and export
it to the Python interface.
* Change: In AllianceFramework::create(), do not longer call bindLibraries().
This now must be done explicitely and afterwards.
* Change: In AllianceFramework::createLibrary() and
Environement::addSYSTEM_LIBRARY(), minor bug corrections that I don't
recall.
* Change: In SearchPath::prepend(), set the selected index to zero and
return it.
* Change: In CRL::System CTOR, add "etc" to the PYTHONPATH as the
configuration files are now organized as Python modules.
* New: In PyCRL, export the CRL::System singleton, it's creation is no
longer triggered by the one of AllianceFramework.
* New: In CRL/etc/, convert most of the configuration files into the
Python module format. For now, keep the old ".conf", but that are no
longer used.
For the real technologies, we cannot keep the directory name as
"180" or "45" as it not allowed by Python syntax, so we create "node180"
or "node45" instead.
Most of the helpers and coriolisInit.py are no longer used now.
To be removed in future commits after being sure that everything
works...
* Bug: In AutoSegment::makeDogleg(AutoContact*), the layer of the contacts
where badly computed when one end of the original segment was attached
to a non-preferred direction segment (mostly on terminal contacts).
Now use the new AutoContact::updateLayer() method.
* Bug: In Dijkstra::load(), limit symetric search area only if the net
is a symmetric one !
* Change: In Katana/python/katanaInit.py, comply with the new initialisation
scheme.
* Change: In Unicorn/cgt.py, comply to the new inititalization scheme.
* Change: In cumulus various Python scripts remove the call to
helpers.staticInitialization() as they are not needed now (we run in
only *one* interpreter, so we correctly share all init).
In plugins/__init__.py, read the new NDA directory variable.
* Bug: In cumulus/plugins/Chip.doCoronafloorplan(), self.railsNb was not
correctly managed when there was no clock.
* Change: In cumulus/plugins/Configuration.coronaContactArray(), compute
the viaPitch from the technology instead of the hard-coded 4.0 lambdas.
In Configuration.loadConfiguration(), read the "ioring.py" from
the new user's settings module.
* Bug: In stratus.dpgen_ADSB2F, gives coordinates translated into DbU to
the XY functions.
In st_model.Save(), use the VstUseConcat flag to get correct VST files.
In st_net.hur_net(), when a net is POWER/GROUND or CLOCK also make it
global.
* Change: In Oroshi/python/WIP_Transistor.py, encapsulate the generator
inside a try/except block to get prettier error (and stop at the first).
2019-10-28 12:09:14 -05:00
|
|
|
|
|
|
|
# Composite/Symbolic layers.
|
|
|
|
NWELL = RegularLayer .create( tech, 'NWELL' , nWell )
|
|
|
|
PWELL = RegularLayer .create( tech, 'PWELL' , pWell )
|
|
|
|
NTIE = DiffusionLayer .create( tech, 'NTIE' , nImplant , active, nWell)
|
|
|
|
PTIE = DiffusionLayer .create( tech, 'PTIE' , pImplant , active, pWell)
|
|
|
|
NDIF = DiffusionLayer .create( tech, 'NDIF' , nImplant , active, None )
|
|
|
|
PDIF = DiffusionLayer .create( tech, 'PDIF' , pImplant , active, None )
|
|
|
|
GATE = DiffusionLayer .create( tech, 'GATE' , poly , active, None )
|
|
|
|
NTRANS = TransistorLayer.create( tech, 'NTRANS' , nImplant , active, poly, None )
|
|
|
|
PTRANS = TransistorLayer.create( tech, 'PTRANS' , pImplant , active, poly, nWell )
|
|
|
|
POLY = RegularLayer .create( tech, 'POLY' , poly )
|
|
|
|
POLY2 = RegularLayer .create( tech, 'POLY2' , poly2 )
|
|
|
|
METAL1 = RegularLayer .create( tech, 'METAL1' , metal1 )
|
|
|
|
METAL2 = RegularLayer .create( tech, 'METAL2' , metal2 )
|
|
|
|
metcapdum = RegularLayer .create( tech, 'metcapdum' , metcap )
|
|
|
|
metbot = RegularLayer .create( tech, 'metbot' , metal2 )
|
|
|
|
METAL3 = RegularLayer .create( tech, 'METAL3' , metal3 )
|
|
|
|
METAL4 = RegularLayer .create( tech, 'METAL4' , metal4 )
|
|
|
|
METAL5 = RegularLayer .create( tech, 'METAL5' , metal5 )
|
|
|
|
METAL6 = RegularLayer .create( tech, 'METAL6' , metal6 )
|
|
|
|
METAL7 = RegularLayer .create( tech, 'METAL7' , metal7 )
|
|
|
|
METAL8 = RegularLayer .create( tech, 'METAL8' , metal8 )
|
|
|
|
METAL9 = RegularLayer .create( tech, 'METAL9' , metal9 )
|
|
|
|
METAL10 = RegularLayer .create( tech, 'METAL10' , metal10 )
|
|
|
|
CONT_BODY_N = ContactLayer .create( tech, 'CONT_BODY_N', nImplant , active, cut0, metal1, nWell )
|
|
|
|
CONT_BODY_P = ContactLayer .create( tech, 'CONT_BODY_P', pImplant , active, cut0, metal1, pWell )
|
|
|
|
CONT_DIF_N = ContactLayer .create( tech, 'CONT_DIF_N' , nImplant , active, cut0, metal1, None )
|
|
|
|
CONT_DIF_P = ContactLayer .create( tech, 'CONT_DIF_P' , pImplant , active, cut0, metal1, None )
|
|
|
|
CONT_POLY = ViaLayer .create( tech, 'CONT_POLY' , poly, cut0, metal1 )
|
|
|
|
|
|
|
|
# VIAs for symbolic technologies.
|
|
|
|
VIA12 = ViaLayer .create( tech, 'VIA12' , metal1, cut1, metal2 )
|
|
|
|
VIA23 = ViaLayer .create( tech, 'VIA23' , metal2, cut2, metal3 )
|
|
|
|
VIA23cap = ViaLayer .create( tech, 'VIA23cap' , metcap, cut2, metal3 )
|
|
|
|
VIA34 = ViaLayer .create( tech, 'VIA34' , metal3, cut3, metal4 )
|
|
|
|
VIA45 = ViaLayer .create( tech, 'VIA45' , metal4, cut4, metal5 )
|
|
|
|
VIA56 = ViaLayer .create( tech, 'VIA56' , metal5, cut5, metal6 )
|
|
|
|
VIA67 = ViaLayer .create( tech, 'VIA67' , metal6, cut6, metal7 )
|
|
|
|
VIA78 = ViaLayer .create( tech, 'VIA78' , metal7, cut7, metal8 )
|
|
|
|
VIA89 = ViaLayer .create( tech, 'VIA89' , metal8, cut8, metal9 )
|
|
|
|
VIA910 = ViaLayer .create( tech, 'VIA910' , metal9, cut9, metal10 )
|
|
|
|
BLOCKAGE1 = RegularLayer.create( tech, 'BLOCKAGE1' , blockage1 )
|
|
|
|
BLOCKAGE2 = RegularLayer.create( tech, 'BLOCKAGE2' , blockage2 )
|
|
|
|
BLOCKAGE3 = RegularLayer.create( tech, 'BLOCKAGE3' , blockage3 )
|
|
|
|
BLOCKAGE4 = RegularLayer.create( tech, 'BLOCKAGE4' , blockage4 )
|
|
|
|
BLOCKAGE5 = RegularLayer.create( tech, 'BLOCKAGE5' , blockage5 )
|
|
|
|
BLOCKAGE6 = RegularLayer.create( tech, 'BLOCKAGE6' , blockage6 )
|
|
|
|
BLOCKAGE7 = RegularLayer.create( tech, 'BLOCKAGE7' , blockage7 )
|
|
|
|
BLOCKAGE8 = RegularLayer.create( tech, 'BLOCKAGE8' , blockage8 )
|
|
|
|
BLOCKAGE9 = RegularLayer.create( tech, 'BLOCKAGE9' , blockage9 )
|
|
|
|
BLOCKAGE10 = RegularLayer.create( tech, 'BLOCKAGE10', blockage10 )
|
|
|
|
gcontact = ViaLayer .create( tech, 'gcontact' , gmetalh , gcut, gmetalv )
|
|
|
|
|
|
|
|
tech.setSymbolicLayer( POLY .getName() )
|
|
|
|
tech.setSymbolicLayer( POLY2 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL1 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL2 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL3 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL4 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL5 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL6 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL7 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL8 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL9 .getName() )
|
|
|
|
tech.setSymbolicLayer( METAL10 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE1 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE2 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE3 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE4 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE5 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE6 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE7 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE8 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE9 .getName() )
|
|
|
|
tech.setSymbolicLayer( BLOCKAGE10.getName() )
|
|
|
|
tech.setSymbolicLayer( VIA12 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA23 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA34 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA45 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA56 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA67 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA78 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA89 .getName() )
|
|
|
|
tech.setSymbolicLayer( VIA910 .getName() )
|
|
|
|
tech.setSymbolicLayer( gcut .getName() )
|
|
|
|
tech.setSymbolicLayer( gmetalh .getName() )
|
|
|
|
tech.setSymbolicLayer( gmetalv .getName() )
|
|
|
|
tech.setSymbolicLayer( gcontact .getName() )
|
|
|
|
|
|
|
|
NWELL.setExtentionCap( nWell, l(0.0) )
|
|
|
|
PWELL.setExtentionCap( pWell, l(0.0) )
|
|
|
|
|
|
|
|
NTIE.setMinimalSize ( l(3.0) )
|
|
|
|
NTIE.setExtentionCap ( nWell , l(1.5) )
|
|
|
|
NTIE.setExtentionWidth( nWell , l(0.5) )
|
|
|
|
NTIE.setExtentionCap ( nImplant, l(1.0) )
|
|
|
|
NTIE.setExtentionWidth( nImplant, l(0.5) )
|
|
|
|
NTIE.setExtentionCap ( active , l(0.5) )
|
|
|
|
NTIE.setExtentionWidth( active , l(0.0) )
|
|
|
|
|
|
|
|
PTIE.setMinimalSize ( l(3.0) )
|
|
|
|
PTIE.setExtentionCap ( nWell , l(1.5) )
|
|
|
|
PTIE.setExtentionWidth( nWell , l(0.5) )
|
|
|
|
PTIE.setExtentionCap ( nImplant, l(1.0) )
|
|
|
|
PTIE.setExtentionWidth( nImplant, l(0.5) )
|
|
|
|
PTIE.setExtentionCap ( active , l(0.5) )
|
|
|
|
PTIE.setExtentionWidth( active , l(0.0) )
|
|
|
|
|
|
|
|
NDIF.setMinimalSize ( l(3.0) )
|
|
|
|
NDIF.setExtentionCap ( nImplant, l(1.0) )
|
|
|
|
NDIF.setExtentionWidth( nImplant, l(0.5) )
|
|
|
|
NDIF.setExtentionCap ( active , l(0.5) )
|
|
|
|
NDIF.setExtentionWidth( active , l(0.0) )
|
|
|
|
|
|
|
|
PDIF.setMinimalSize ( l(3.0) )
|
|
|
|
PDIF.setExtentionCap ( pImplant, l(1.0) )
|
|
|
|
PDIF.setExtentionWidth( pImplant, l(0.5) )
|
|
|
|
PDIF.setExtentionCap ( active , l(0.5) )
|
|
|
|
PDIF.setExtentionWidth( active , l(0.0) )
|
|
|
|
|
|
|
|
GATE.setMinimalSize ( l(1.0) )
|
|
|
|
GATE.setExtentionCap ( poly , l(1.5) )
|
|
|
|
|
|
|
|
NTRANS.setMinimalSize ( l( 1.0) )
|
|
|
|
NTRANS.setExtentionCap ( nImplant, l(-1.0) )
|
|
|
|
NTRANS.setExtentionWidth( nImplant, l( 2.5) )
|
|
|
|
NTRANS.setExtentionCap ( active , l(-1.5) )
|
|
|
|
NTRANS.setExtentionWidth( active , l( 2.0) )
|
|
|
|
|
|
|
|
PTRANS.setMinimalSize ( l( 1.0) )
|
|
|
|
PTRANS.setExtentionCap ( nWell , l(-1.0) )
|
|
|
|
PTRANS.setExtentionWidth( nWell , l( 4.5) )
|
|
|
|
PTRANS.setExtentionCap ( pImplant, l(-1.0) )
|
|
|
|
PTRANS.setExtentionWidth( pImplant, l( 4.0) )
|
|
|
|
PTRANS.setExtentionCap ( active , l(-1.5) )
|
|
|
|
PTRANS.setExtentionWidth( active , l( 3.0) )
|
|
|
|
|
|
|
|
POLY .setMinimalSize ( l(1.0) )
|
|
|
|
POLY .setExtentionCap ( poly , l(0.5) )
|
|
|
|
POLY2.setMinimalSize ( l(1.0) )
|
|
|
|
POLY2.setExtentionCap ( poly , l(0.5) )
|
|
|
|
|
|
|
|
METAL1 .setMinimalSize ( l(1.0) )
|
|
|
|
METAL1 .setExtentionCap ( metal1 , l(0.5) )
|
|
|
|
METAL2 .setMinimalSize ( l(1.0) )
|
|
|
|
METAL2 .setExtentionCap ( metal2 , l(1.0) )
|
|
|
|
METAL3 .setMinimalSize ( l(1.0) )
|
|
|
|
METAL3 .setExtentionCap ( metal3 , l(1.0) )
|
|
|
|
METAL4 .setMinimalSize ( l(1.0) )
|
|
|
|
METAL4 .setExtentionCap ( metal4 , l(1.0) )
|
|
|
|
METAL4 .setMinimalSpacing( l(3.0) )
|
|
|
|
METAL5 .setMinimalSize ( l(2.0) )
|
|
|
|
METAL5 .setExtentionCap ( metal5 , l(1.0) )
|
|
|
|
METAL6 .setMinimalSize ( l(2.0) )
|
|
|
|
METAL6 .setExtentionCap ( metal6 , l(1.0) )
|
|
|
|
METAL7 .setMinimalSize ( l(2.0) )
|
|
|
|
METAL7 .setExtentionCap ( metal7 , l(1.0) )
|
|
|
|
METAL8 .setMinimalSize ( l(2.0) )
|
|
|
|
METAL8 .setExtentionCap ( metal8 , l(1.0) )
|
|
|
|
METAL9 .setMinimalSize ( l(2.0) )
|
|
|
|
METAL9 .setExtentionCap ( metal9 , l(1.0) )
|
|
|
|
METAL10.setMinimalSize ( l(2.0) )
|
|
|
|
METAL10.setExtentionCap ( metal10 , l(1.0) )
|
|
|
|
|
|
|
|
# Contacts (i.e. Active <--> Metal) (symbolic).
|
|
|
|
CONT_BODY_N.setMinimalSize( l( 1.0) )
|
|
|
|
CONT_BODY_N.setEnclosure ( nWell , l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_N.setEnclosure ( nImplant, l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_N.setEnclosure ( active , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_N.setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
|
|
|
|
CONT_BODY_P.setMinimalSize( l( 1.0) )
|
|
|
|
CONT_BODY_P.setEnclosure ( pWell , l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_P.setEnclosure ( pImplant, l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_P.setEnclosure ( active , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_P.setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
|
|
|
|
CONT_DIF_N.setMinimalSize( l( 1.0) )
|
|
|
|
CONT_DIF_N.setEnclosure ( nImplant, l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_N.setEnclosure ( active , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_N.setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
|
|
|
|
CONT_DIF_P.setMinimalSize( l( 1.0) )
|
|
|
|
CONT_DIF_P.setEnclosure ( pImplant, l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_P.setEnclosure ( active , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_P.setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
|
|
|
|
CONT_POLY.setMinimalSize( l( 1.0) )
|
|
|
|
CONT_POLY.setEnclosure ( poly , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_POLY.setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
|
|
|
|
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
|
|
|
VIA12 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA12 .setEnclosure ( metal1 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA12 .setEnclosure ( metal2 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA12 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA23 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA23 .setEnclosure ( metal2 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA23 .setEnclosure ( metal3 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA23 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA34 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA34 .setEnclosure ( metal3 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA34 .setEnclosure ( metal4 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA34 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA45 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA45 .setEnclosure ( metal4 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA45 .setEnclosure ( metal5 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA45 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA56 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA56 .setEnclosure ( metal5 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA56 .setEnclosure ( metal6 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA56 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA67 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA67 .setEnclosure ( metal6 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA67 .setEnclosure ( metal7 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA67 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA78 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA78 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA78 .setEnclosure ( metal7 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA78 .setEnclosure ( metal8 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA78 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA89 .setMinimalSize ( l( 1.0) )
|
|
|
|
VIA89 .setEnclosure ( metal8 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA89 .setEnclosure ( metal9 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA89 .setMinimalSpacing( l( 4.0) )
|
|
|
|
VIA910.setMinimalSize ( l( 1.0) )
|
|
|
|
VIA910.setEnclosure ( metal9 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA910.setEnclosure ( metal10 , l( 0.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
VIA910.setMinimalSpacing( l( 4.0) )
|
|
|
|
|
|
|
|
# Blockages (symbolic).
|
|
|
|
BLOCKAGE1 .setMinimalSize ( l( 1.0) )
|
|
|
|
BLOCKAGE1 .setExtentionCap( blockage1 , l( 0.5) )
|
|
|
|
BLOCKAGE2 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE2 .setExtentionCap( blockage2 , l( 0.5) )
|
|
|
|
BLOCKAGE3 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE3 .setExtentionCap( blockage3 , l( 0.5) )
|
|
|
|
BLOCKAGE4 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE4 .setExtentionCap( blockage4 , l( 0.5) )
|
|
|
|
BLOCKAGE5 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE5 .setExtentionCap( blockage5 , l( 1.0) )
|
|
|
|
BLOCKAGE6 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE6 .setExtentionCap( blockage6 , l( 1.0) )
|
|
|
|
BLOCKAGE7 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE7 .setExtentionCap( blockage7 , l( 1.0) )
|
|
|
|
BLOCKAGE8 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE8 .setExtentionCap( blockage8 , l( 1.0) )
|
|
|
|
BLOCKAGE9 .setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE9 .setExtentionCap( blockage9 , l( 1.0) )
|
|
|
|
BLOCKAGE10.setMinimalSize ( l( 2.0) )
|
|
|
|
BLOCKAGE10.setExtentionCap( blockage10, l( 1.0) )
|
|
|
|
|