232 lines
10 KiB
Python
232 lines
10 KiB
Python
|
|
# 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/symbolic/cmos/technology.py" |
|
|
# +-----------------------------------------------------------------+
|
|
|
|
|
|
import helpers.io
|
|
helpers.io.vprint( 2, ' - "%s".' % helpers.truncPath(__file__) )
|
|
|
|
from helpers import l, u, n
|
|
from Hurricane import DbU
|
|
from Hurricane import DataBase
|
|
from Hurricane import Technology
|
|
|
|
|
|
tech = DataBase.getDB().getTechnology()
|
|
if tech:
|
|
print WarningMessage( 'cmos.technology: Technology already exists, "%s"' % tech.getName() )
|
|
else:
|
|
tech = Technology.create( DataBase.getDB(), 'cmos45' )
|
|
|
|
DbU.setPrecision ( 2 )
|
|
DbU.setPhysicalsPerGrid ( 0.0025, DbU.UnitPowerMicro )
|
|
DbU.setGridsPerLambda ( 10 )
|
|
DbU.setSymbolicSnapGridStep( DbU.fromLambda( 1.0) )
|
|
DbU.setPolygonStep ( DbU.fromGrid (10.0) )
|
|
|
|
|
|
import common
|
|
from common.technology import *
|
|
|
|
# Redefine all size from the "cmos" common part.
|
|
NWELL.setExtentionCap( nWell, l(4.0) )
|
|
PWELL.setExtentionCap( pWell, l(4.0) )
|
|
|
|
NTIE.setMinimalSize ( l( 3.0) )
|
|
NTIE.setExtentionCap ( nWell , l( 3.0) )
|
|
NTIE.setExtentionWidth( nWell , l( 2.0) )
|
|
NTIE.setExtentionCap ( nImplant, l( 2.5) )
|
|
NTIE.setExtentionWidth( nImplant, l( 1.5) )
|
|
NTIE.setExtentionCap ( active , l( 0.5) )
|
|
NTIE.setExtentionWidth( active , l(-0.5) )
|
|
|
|
PTIE.setMinimalSize ( l( 3.0) )
|
|
PTIE.setExtentionCap ( nWell , l( 3.0) )
|
|
PTIE.setExtentionWidth( nWell , l( 2.0) )
|
|
PTIE.setExtentionCap ( nImplant, l( 2.5) )
|
|
PTIE.setExtentionWidth( nImplant, l( 1.5) )
|
|
PTIE.setExtentionCap ( active , l( 0.5) )
|
|
PTIE.setExtentionWidth( active , l(-0.5) )
|
|
|
|
NDIF.setMinimalSize ( l(3.0) )
|
|
NDIF.setExtentionCap ( nImplant, l(4.0) )
|
|
NDIF.setExtentionWidth( nImplant, l(2.0) )
|
|
NDIF.setExtentionCap ( active , l(2.0) )
|
|
NDIF.setExtentionWidth( active , l(0.0) )
|
|
|
|
PDIF.setMinimalSize ( l(3.0) )
|
|
PDIF.setExtentionCap ( pImplant, l(4.0) )
|
|
PDIF.setExtentionWidth( pImplant, l(2.0) )
|
|
PDIF.setExtentionCap ( active , l(2.0) )
|
|
PDIF.setExtentionWidth( active , l(0.0) )
|
|
|
|
GATE.setMinimalSize ( l(2.0) )
|
|
GATE.setExtentionCap ( poly , l(2.5) )
|
|
|
|
NTRANS.setMinimalSize ( l( 2.0) )
|
|
NTRANS.setExtentionCap ( nImplant, l( 2.0) )
|
|
NTRANS.setExtentionWidth( nImplant, l( 7.0) )
|
|
NTRANS.setExtentionCap ( active , l( 0.0) )
|
|
NTRANS.setExtentionWidth( active , l( 3.0) )
|
|
NTRANS.setExtentionCap ( poly , l( 3.0) )
|
|
NTRANS.setExtentionWidth( poly , l( 0.0) )
|
|
|
|
PTRANS.setMinimalSize ( l( 2.0) )
|
|
PTRANS.setExtentionCap ( nWell , l( 2.5) )
|
|
PTRANS.setExtentionWidth( nWell , l( 7.5) )
|
|
PTRANS.setExtentionCap ( pImplant, l( 2.0) )
|
|
PTRANS.setExtentionWidth( pImplant, l( 7.0) )
|
|
PTRANS.setExtentionCap ( active , l( 0.0) )
|
|
PTRANS.setExtentionWidth( active , l( 3.0) )
|
|
PTRANS.setExtentionCap ( poly , l( 3.0) )
|
|
PTRANS.setExtentionWidth( poly , l( 0.0) )
|
|
|
|
POLY .setMinimalSize ( l(2.0) )
|
|
POLY .setExtentionCap ( poly , l(1.0) )
|
|
POLY2.setMinimalSize ( l(2.0) )
|
|
POLY2.setExtentionCap ( poly , l(1.0) )
|
|
|
|
# Routing Layers (symbolic).
|
|
METAL1 .setMinimalSize ( l( 2.0) )
|
|
METAL1 .setExtentionCap ( metal1 , l( 2.0) )
|
|
METAL1 .setExtentionWidth( metal1 , l( 1.0) )
|
|
METAL1 .setMinimalSpacing( l( 6.0) )
|
|
METAL2 .setMinimalSize ( l( 4.0) )
|
|
METAL2 .setExtentionCap ( metal2 , l( 2.0) )
|
|
METAL2 .setMinimalSpacing( l( 6.0) )
|
|
METAL3 .setMinimalSize ( l( 4.0) )
|
|
METAL3 .setExtentionCap ( metal3 , l( 2.0) )
|
|
METAL3 .setMinimalSpacing( l( 6.0) )
|
|
METAL4 .setMinimalSize ( l( 4.0) )
|
|
METAL4 .setExtentionCap ( metal4 , l( 2.0) )
|
|
METAL4 .setMinimalSpacing( l( 6.0) )
|
|
METAL5 .setMinimalSize ( l( 4.0) )
|
|
METAL5 .setExtentionCap ( metal5 , l( 2.0) )
|
|
METAL5 .setMinimalSpacing( l( 6.0) )
|
|
METAL6 .setMinimalSize ( l(10.0) )
|
|
METAL6 .setExtentionCap ( metal6 , l( 5.0) )
|
|
METAL6 .setMinimalSpacing( l( 6.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( 2.0) )
|
|
CONT_BODY_N.setEnclosure ( nWell , l( 4.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_N.setEnclosure ( nImplant, l( 3.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_N.setEnclosure ( active , l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_N.setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_BODY_P.setMinimalSize( l( 2.0) )
|
|
CONT_BODY_P.setEnclosure ( pWell , l( 4.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_P.setEnclosure ( pImplant, l( 3.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_P.setEnclosure ( active , l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_BODY_P.setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_N.setMinimalSize( l( 2.0) )
|
|
CONT_DIF_N.setEnclosure ( nImplant, l( 4.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_DIF_N.setEnclosure ( active , l( 2.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_DIF_N.setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_DIF_P.setMinimalSize( l( 2.0) )
|
|
CONT_DIF_P.setEnclosure ( pImplant, l( 4.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_DIF_P.setEnclosure ( active , l( 2.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_DIF_P.setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
CONT_POLY.setMinimalSize( l( 2.0) )
|
|
CONT_POLY.setEnclosure ( poly , l( 2.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
CONT_POLY.setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
|
|
# VIAs (i.e. Metal <--> Metal) (symbolic).
|
|
VIA12 .setMinimalSize( l( 2.0) )
|
|
VIA12 .setEnclosure ( metal1 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA12 .setEnclosure ( metal2 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA23 .setMinimalSize( l( 2.0) )
|
|
VIA23 .setEnclosure ( metal2 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA23 .setEnclosure ( metal3 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA34 .setMinimalSize( l( 2.0) )
|
|
VIA34 .setEnclosure ( metal3 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA34 .setEnclosure ( metal4 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA45 .setMinimalSize( l( 2.0) )
|
|
VIA45 .setEnclosure ( metal4 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA45 .setEnclosure ( metal5 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA56 .setMinimalSize( l( 5.0) )
|
|
VIA56 .setEnclosure ( metal5 , l( 1.0), Layer.EnclosureH|Layer.EnclosureV )
|
|
VIA56 .setEnclosure ( metal6 , l( 1.5), Layer.EnclosureH|Layer.EnclosureV )
|
|
#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 )
|
|
#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 )
|
|
#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 )
|
|
#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 )
|
|
|
|
# Blockages (symbolic).
|
|
BLOCKAGE1 .setMinimalSize ( l( 4.0) )
|
|
BLOCKAGE1 .setExtentionCap ( blockage1 , l( 2.0) )
|
|
BLOCKAGE1 .setExtentionWidth( blockage1 , l( 0.5) )
|
|
BLOCKAGE2 .setMinimalSize ( l( 4.0) )
|
|
BLOCKAGE2 .setExtentionCap ( blockage2 , l( 2.0) )
|
|
BLOCKAGE3 .setMinimalSize ( l( 4.0) )
|
|
BLOCKAGE3 .setExtentionCap ( blockage3 , l( 2.0) )
|
|
BLOCKAGE4 .setMinimalSize ( l( 4.0) )
|
|
BLOCKAGE4 .setExtentionCap ( blockage4 , l( 2.0) )
|
|
BLOCKAGE5 .setMinimalSize ( l( 4.0) )
|
|
BLOCKAGE5 .setExtentionCap ( blockage5 , l( 2.0) )
|
|
BLOCKAGE6 .setMinimalSize ( l( 8.0) )
|
|
BLOCKAGE6 .setExtentionCap ( blockage6 , l( 2.5) )
|
|
#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) )
|
|
|
|
|
|
gdsLayersTable = \
|
|
[ ("pWell" , "CWN" , 41, 0)
|
|
, ("nWell" , "CWP" , 42, 0)
|
|
, ("active" , "CAA" , 43, 0)
|
|
, ("pImplant", "CSP" , 44, 0)
|
|
, ("nImplant", "CSN" , 45, 0)
|
|
, ("poly" , "CPG" , 46, 0)
|
|
, ("poly2" , "CM1" , 49, 0) # poly2 is in fact metal1.
|
|
, ("cut0" , "CCC" , 25, 0)
|
|
, ("metal1" , "CM1" , 49, 0)
|
|
, ("cut1" , "CV1" , 50, 0)
|
|
, ("metal2" , "CM2" , 51, 0)
|
|
, ("cut2" , "CV2" , 61, 0)
|
|
, ("metal3" , "CM3" , 62, 0)
|
|
, ("cut3" , "CV3" , 30, 0)
|
|
, ("metal4" , "CM4" , 31, 0)
|
|
, ("cut4" , "CV4" , 32, 0)
|
|
, ("metal5" , "CM5" , 33, 0)
|
|
, ("cut5" , "CV5" , 36, 0)
|
|
, ("metal6" , "CM6" , 37, 0)
|
|
]
|
|
|
|
|
|
common.loadGdsLayers( gdsLayersTable )
|