# 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. 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 ) # 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( CONT_BODY_N.getName() ) tech.setSymbolicLayer( CONT_BODY_P.getName() ) tech.setSymbolicLayer( CONT_DIF_N .getName() ) tech.setSymbolicLayer( CONT_DIF_P .getName() ) tech.setSymbolicLayer( CONT_POLY .getName() ) 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) )