Add support for GF180MCU, borrowed from Chips4Makers.
Original source: https://gitlab.com/Chips4Makers/c4m-pdk-gf180mcu.git Duplicated because I needed to do some patches and combine it with the vendor I/O pads.
This commit is contained in:
parent
8dc13eab5b
commit
2c32dbbf67
|
@ -25,7 +25,7 @@ def _setup_techno():
|
|||
tech = Technology.create( db, 'GF180MCU' )
|
||||
|
||||
DbU.setPrecision( 2 )
|
||||
DbU.setPhysicalsPerGrid( 0.005, DbU.UnitPowerMicro )
|
||||
DbU.setPhysicalsPerGrid( 0.0005, DbU.UnitPowerMicro )
|
||||
with CfgCache(priority=Cfg.Parameter.Priority.ConfigurationFile) as cfg:
|
||||
cfg.gdsDriver.metricDbu = 1e-09
|
||||
cfg.gdsDriver.dbuPerUu = 0.001
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,76 @@
|
|||
|
||||
import sys
|
||||
import os.path
|
||||
from coriolis import Cfg
|
||||
from coriolis.Hurricane import Technology, DataBase, DbU, Library, Layer, \
|
||||
BasicLayer, Cell, Net, Horizontal, Vertical, Contact, \
|
||||
Rectilinear, Box, Point, Instance, Transformation, \
|
||||
NetExternalComponents, Pad, Path, Query
|
||||
import coriolis.Viewer
|
||||
from coriolis.CRL import AllianceFramework, Gds, LefImport, CellGauge, \
|
||||
RoutingGauge, RoutingLayerGauge
|
||||
from coriolis.Anabatic import StyleFlags
|
||||
from coriolis.helpers import trace, l, u, n, overlay, io, ndaTopDir
|
||||
from coriolis.helpers.overlay import CfgCache, UpdateSession
|
||||
|
||||
|
||||
__all__ = [ 'setup' ]
|
||||
|
||||
|
||||
def _routing ():
|
||||
"""
|
||||
Define the routing gauge for I/O cells along with the various P&R tool parameters.
|
||||
"""
|
||||
with CfgCache(priority=Cfg.Parameter.Priority.ConfigurationFile) as cfg:
|
||||
cfg.chip.block.rails.count = 2
|
||||
cfg.chip.block.rails.hWidth = u(30.0)
|
||||
cfg.chip.block.rails.vWidth = u(30.0)
|
||||
cfg.chip.block.rails.hSpacing = u( 6.0)
|
||||
cfg.chip.block.rails.vSpacing = u( 6.0)
|
||||
cfg.chip.padCorner = 'gf180mcu_fd_io__cor_5lm'
|
||||
cfg.chip.padSpacers = 'gf180mcu_fd_io__fill10_5lm,gf180mcu_fd_io__fill5_5lm,gf180mcu_fd_io__fill1_5lm'
|
||||
af = AllianceFramework.get()
|
||||
cg = CellGauge.create( 'LEF.GF_IO_Site'
|
||||
, 'Metal2' # pin layer name.
|
||||
, u( 1.0) # pitch.
|
||||
, u(350.0) # cell slice height.
|
||||
, u( 75.0) # cell slice step.
|
||||
)
|
||||
af.addCellGauge( cg )
|
||||
|
||||
|
||||
def _loadIoLib ( pdkDir ):
|
||||
"""
|
||||
Load the I/O cells from the LEF+GDS files.
|
||||
"""
|
||||
af = AllianceFramework.get()
|
||||
db = DataBase.getDB()
|
||||
tech = db.getTechnology()
|
||||
rootlib = db.getRootLibrary()
|
||||
ioLib = Library.create( rootlib, 'iolib' )
|
||||
LefImport.setMergeLibrary( ioLib )
|
||||
LefImport.load( (pdkDir / 'libraries'
|
||||
/ 'gf180mcu_fd_sc_mcu9t5v0'
|
||||
/ 'latest'
|
||||
/ 'tech'
|
||||
/ 'gf180mcu_6LM_1TM_9K_9t_tech.lef').as_posix() )
|
||||
print( ' o Setup GF180MCU I/O library in {}.'.format( ioLib.getName() ))
|
||||
io.vprint( 1, ' o Setup GF180MCU I/O library in {}.'.format( ioLib.getName() ))
|
||||
cellsDir = pdkDir / 'libraries' / 'gf180mcu_fd_io' / 'latest' / 'cells'
|
||||
print( cellsDir )
|
||||
for lefFile in cellsDir.glob( '*/*_5lm.lef' ):
|
||||
print( lefFile )
|
||||
gdsFile = lefFile.with_suffix( '.gds' )
|
||||
if gdsFile.is_file():
|
||||
Gds.setTopCellName( gdsFile.stem[:-4] )
|
||||
Gds.load( ioLib, gdsFile.as_posix(), Gds.Layer_0_IsBoundary|Gds.NoBlockages )
|
||||
LefImport.load( lefFile.as_posix() )
|
||||
af.wrapLibrary( ioLib, 1 )
|
||||
|
||||
|
||||
def setup ( pdkDir ):
|
||||
#with overlay.CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
|
||||
# cfg.misc.minTraceLevel = 100
|
||||
# cfg.misc.maxTraceLevel = 102
|
||||
_routing()
|
||||
_loadIoLib( pdkDir )
|
|
@ -0,0 +1,403 @@
|
|||
|
||||
# Autogenerated file
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later OR AGPL-3.0-or-later OR CERN-OHL-S-2.0+
|
||||
# Autogenerated file. Changes will be overwritten.
|
||||
|
||||
try:
|
||||
import coriolis
|
||||
except ImportError:
|
||||
import CRL, Hurricane, Viewer, Cfg
|
||||
from Hurricane import (
|
||||
Technology, DataBase, DbU, Library,
|
||||
Layer, BasicLayer,
|
||||
Cell, Net, Horizontal, Vertical, Rectilinear, Box, Point,
|
||||
NetExternalComponents,
|
||||
)
|
||||
from common.colors import toRGB
|
||||
from common.patterns import toHexa
|
||||
from helpers import u
|
||||
from helpers.technology import createBL, createVia
|
||||
from helpers.overlay import CfgCache
|
||||
from helpers.analogtechno import Length, Area, Unit, Asymmetric, loadAnalogTechno
|
||||
else:
|
||||
from coriolis import CRL, Hurricane, Viewer, Cfg
|
||||
from coriolis.Hurricane import (
|
||||
Technology, DataBase, DbU, Library,
|
||||
Layer, BasicLayer,
|
||||
Cell, Net, Horizontal, Vertical, Rectilinear, Box, Point,
|
||||
NetExternalComponents,
|
||||
)
|
||||
from coriolis.technos.common.colors import toRGB
|
||||
from coriolis.technos.common.patterns import toHexa
|
||||
from coriolis.helpers import u
|
||||
from coriolis.helpers.technology import createBL, createVia
|
||||
from coriolis.helpers.overlay import CfgCache
|
||||
from coriolis.helpers.analogtechno import Length, Area, Unit, Asymmetric, loadAnalogTechno
|
||||
|
||||
__all__ = ["analogTechnologyTable", "setup"]
|
||||
|
||||
analogTechnologyTable = (
|
||||
('Header', 'gf180mcu', DbU.UnitPowerMicro, 'alpha'),
|
||||
('PhysicalGrid', 0.005, Length, ''),
|
||||
|
||||
('minWidth', 'Nwell', 0.86, Length, ''),
|
||||
('minSpacing', 'Nwell', 1.7, Length, ''),
|
||||
('minWidth', 'Nplus', 0.4, Length, ''),
|
||||
('minSpacing', 'Nplus', 0.4, Length, ''),
|
||||
('minArea', 'Nplus', 0.35, Area, ''),
|
||||
('minWidth', 'Pplus', 0.4, Length, ''),
|
||||
('minSpacing', 'Pplus', 0.4, Length, ''),
|
||||
('minArea', 'Pplus', 0.35, Area, ''),
|
||||
('minWidth', 'Dualgate', 0.7, Length, ''),
|
||||
('minSpacing', 'Dualgate', 0.44, Length, ''),
|
||||
('minWidth', 'COMP', 0.3, Length, ''),
|
||||
('minSpacing', 'COMP', 0.28, Length, ''),
|
||||
('minArea', 'COMP', 0.2025, Area, ''),
|
||||
('minEnclosure', 'Nwell', 'COMP', (0.6, 0.6), Length|Asymmetric, ''),
|
||||
('minSpacing', 'Nwell', 'COMP', (0.6, 0.6), Length|Asymmetric, ''),
|
||||
# TODO for COMP:
|
||||
# allow_in_substrate, implant_abut, allow_contactless_implant, allow_well_crossing
|
||||
('minWidth', 'Poly2', 0.28, Length, ''),
|
||||
('minSpacing', 'Poly2', 0.24, Length, ''),
|
||||
('minWidth', 'Metal1', 0.23, Length, ''),
|
||||
('minSpacing', 'Metal1', 0.23, Length, ''),
|
||||
('minArea', 'Metal1', 0.1444, Area, ''),
|
||||
('minDensity', 'Metal1', 0.3, Unit, ''),
|
||||
('minWidth', 'Metal2', 0.28, Length, ''),
|
||||
('minSpacing', 'Metal2', 0.28, Length, ''),
|
||||
('minArea', 'Metal2', 0.1444, Area, ''),
|
||||
('minDensity', 'Metal2', 0.3, Unit, ''),
|
||||
('minWidth', 'Metal3', 0.28, Length, ''),
|
||||
('minSpacing', 'Metal3', 0.28, Length, ''),
|
||||
('minArea', 'Metal3', 0.1444, Area, ''),
|
||||
('minDensity', 'Metal3', 0.3, Unit, ''),
|
||||
('minWidth', 'Metal4', 0.28, Length, ''),
|
||||
('minSpacing', 'Metal4', 0.28, Length, ''),
|
||||
('minArea', 'Metal4', 0.1444, Area, ''),
|
||||
('minDensity', 'Metal4', 0.3, Unit, ''),
|
||||
('minWidth', 'Metal5', 0.28, Length, ''),
|
||||
('minSpacing', 'Metal5', 0.28, Length, ''),
|
||||
('minArea', 'Metal5', 0.1444, Area, ''),
|
||||
('minDensity', 'Metal5', 0.3, Unit, ''),
|
||||
('minWidth', 'MetalTop', 0.44, Length, ''),
|
||||
('minSpacing', 'MetalTop', 0.436, Length, ''),
|
||||
('minArea', 'MetalTop', 0.5625, Area, ''),
|
||||
('minDensity', 'MetalTop', 0.3, Unit, ''),
|
||||
('minWidth', 'Contact', 0.22, Length, ''),
|
||||
('maxWidth', 'Contact', 0.22, Length, ''),
|
||||
('minSpacing', 'Contact', 0.28, Length, ''),
|
||||
('minEnclosure', 'COMP', 'Contact', (0.07, 0.07), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Poly2', 'Contact', (0.07, 0.07), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Metal1', 'Contact', (0.06, 0.005), Length|Asymmetric, ''),
|
||||
('minWidth', 'Via1', 0.26, Length, ''),
|
||||
('maxWidth', 'Via1', 0.26, Length, ''),
|
||||
('minSpacing', 'Via1', 0.36, Length, ''),
|
||||
('minEnclosure', 'Metal1', 'Via1', (0.06, 0.0), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Metal2', 'Via1', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minWidth', 'Via2', 0.26, Length, ''),
|
||||
('maxWidth', 'Via2', 0.26, Length, ''),
|
||||
('minSpacing', 'Via2', 0.36, Length, ''),
|
||||
('minEnclosure', 'Metal2', 'Via2', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Metal3', 'Via2', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minWidth', 'Via3', 0.26, Length, ''),
|
||||
('maxWidth', 'Via3', 0.26, Length, ''),
|
||||
('minSpacing', 'Via3', 0.36, Length, ''),
|
||||
('minEnclosure', 'Metal3', 'Via3', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Metal4', 'Via3', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minWidth', 'Via4', 0.26, Length, ''),
|
||||
('maxWidth', 'Via4', 0.26, Length, ''),
|
||||
('minSpacing', 'Via4', 0.36, Length, ''),
|
||||
('minEnclosure', 'Metal4', 'Via4', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'Metal5', 'Via4', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minWidth', 'Via5', 0.26, Length, ''),
|
||||
('maxWidth', 'Via5', 0.26, Length, ''),
|
||||
('minSpacing', 'Via5', 0.36, Length, ''),
|
||||
('minEnclosure', 'Metal5', 'Via5', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
('minEnclosure', 'MetalTop', 'Via5', (0.06, 0.01), Length|Asymmetric, ''),
|
||||
# ('minTransistorL', 'fet33gate', 0.28, Length, ''),
|
||||
# ('minTransistorW', 'fet33gate', 0.22, Length, ''),
|
||||
# ('minGateExtension', 'COMP', 'fet33gate', 0.3, Length|Asymmetric, ''),
|
||||
# ('minGateExtension', 'Poly2', 'fet33gate', 0.22, Length|Asymmetric, ''),
|
||||
# ('minGateSpacing', 'Contact', 'fet33gate', 0.15, Length|Asymmetric, ''),
|
||||
# ('minTransistorL', 'fet5gate', 0.5, Length, ''),
|
||||
# ('minGateExtension', 'COMP', 'fet5gate', 0.4, Length|Asymmetric, ''),
|
||||
# ('minGateExtension', 'Poly2', 'fet5gate', 0.22, Length|Asymmetric, ''),
|
||||
# ('minGateSpacing', 'Contact', 'fet5gate', 0.15, Length|Asymmetric, ''),
|
||||
# ('minGateEnclosure', 'Nplus', 'nfet_03v3', (0.23, 0.23), Length|Asymmetric, ''),
|
||||
# ('minTransistorL', 'nfet_05v0', 0.6, Length, ''),
|
||||
# ('minGateEnclosure', 'Nplus', 'nfet_05v0', (0.23, 0.23), Length|Asymmetric, ''),
|
||||
# ('minGateEnclosure', 'Pplus', 'pfet_03v3', (0.23, 0.23), Length|Asymmetric, ''),
|
||||
# ('minGateEnclosure', 'Pplus', 'pfet_05v0', (0.23, 0.23), Length|Asymmetric, ''),
|
||||
# ('minWidth', 'intersect(Poly2,Dualgate)', '0.2', Length, ''),
|
||||
('minSpacing', 'COMP', 'Poly2', 0.3, Length|Asymmetric, ''),
|
||||
# ('minWidth', 'intersect(COMP,Dualgate)', '0.3', Length, ''),
|
||||
# ('minSpacing', 'intersect(COMP,Dualgate)', 0.36, Length, ''),
|
||||
('minSpacing', 'COMP', 'Nwell', 0.6, Length|Asymmetric, ''),
|
||||
)
|
||||
|
||||
def _setup_techno():
|
||||
db = DataBase.create()
|
||||
CRL.System.get()
|
||||
|
||||
tech = Technology.create(db, 'gf180mcu')
|
||||
|
||||
DbU.setPrecision(2)
|
||||
DbU.setPhysicalsPerGrid(0.005, DbU.UnitPowerMicro)
|
||||
with CfgCache(priority=Cfg.Parameter.Priority.ConfigurationFile) as cfg:
|
||||
cfg.gdsDriver.metricDbu = 1e-09
|
||||
cfg.gdsDriver.dbuPerUu = 0.001
|
||||
DbU.setGridsPerLambda(56)
|
||||
DbU.setSymbolicSnapGridStep(DbU.fromGrid(1.0))
|
||||
DbU.setPolygonStep(DbU.fromGrid(1.0))
|
||||
DbU.setStringMode(DbU.StringModePhysical, DbU.UnitPowerMicro)
|
||||
|
||||
createBL(
|
||||
tech, 'Nwell', BasicLayer.Material.nWell,
|
||||
size=u(0.86), spacing=u(1.7), gds2Layer=21, gds2DataType=0,
|
||||
)
|
||||
createBL(
|
||||
tech, 'Nplus', BasicLayer.Material.nImplant,
|
||||
size=u(0.4), spacing=u(0.4), area=0.35, gds2Layer=32, gds2DataType=0,
|
||||
)
|
||||
createBL(
|
||||
tech, 'Pplus', BasicLayer.Material.pImplant,
|
||||
size=u(0.4), spacing=u(0.4), area=0.35, gds2Layer=31, gds2DataType=0,
|
||||
)
|
||||
createBL(
|
||||
tech, 'Dualgate', BasicLayer.Material.other,
|
||||
gds2Layer=55, gds2DataType=0,
|
||||
)
|
||||
createBL( tech, 'Metal1_Label', BasicLayer.Material.other, gds2Layer=34, gds2DataType=10 )
|
||||
createBL( tech, 'Metal2_Label', BasicLayer.Material.other, gds2Layer=36, gds2DataType=10 )
|
||||
createBL( tech, 'Metal3_Label', BasicLayer.Material.other, gds2Layer=42, gds2DataType=10 )
|
||||
createBL( tech, 'Metal4_Label', BasicLayer.Material.other, gds2Layer=46, gds2DataType=10 )
|
||||
createBL( tech, 'Metal5_Label', BasicLayer.Material.other, gds2Layer=81, gds2DataType=10 )
|
||||
createBL( tech, 'MetalTop_Label', BasicLayer.Material.other, gds2Layer=53, gds2DataType=10 )
|
||||
createBL(
|
||||
tech, 'COMP', BasicLayer.Material.active,
|
||||
size=u(0.3), spacing=u(0.28), area=0.2025, gds2Layer=22, gds2DataType=0,
|
||||
)
|
||||
createBL(
|
||||
tech, 'Poly2', BasicLayer.Material.poly,
|
||||
size=u(0.28), spacing=u(0.24), gds2Layer=30, gds2DataType=0,
|
||||
)
|
||||
createBL(
|
||||
tech, 'Contact', BasicLayer.Material.cut,
|
||||
size=u(0.22), spacing=u(0.28), gds2Layer=33, gds2DataType=0,
|
||||
)
|
||||
Metal1 = createBL( tech, 'Metal1' , BasicLayer.Material.metal, size=u(0.23), spacing=u(0.23 ), area=0.1444, gds2Layer=34, gds2DataType=0, )
|
||||
Via1 = createBL( tech, 'Via1' , BasicLayer.Material.cut , size=u(0.26), spacing=u(0.36 ), gds2Layer=35, gds2DataType=0, )
|
||||
Metal2 = createBL( tech, 'Metal2' , BasicLayer.Material.metal, size=u(0.28), spacing=u(0.28 ), area=0.1444, gds2Layer=36, gds2DataType=0, )
|
||||
Via2 = createBL( tech, 'Via2' , BasicLayer.Material.cut , size=u(0.26), spacing=u(0.36 ), gds2Layer=38, gds2DataType=0, )
|
||||
Metal3 = createBL( tech, 'Metal3' , BasicLayer.Material.metal, size=u(0.28), spacing=u(0.28 ), area=0.1444, gds2Layer=42, gds2DataType=0, )
|
||||
Via3 = createBL( tech, 'Via3' , BasicLayer.Material.cut , size=u(0.26), spacing=u(0.36 ), gds2Layer=40, gds2DataType=0, )
|
||||
Metal4 = createBL( tech, 'Metal4' , BasicLayer.Material.metal, size=u(0.28), spacing=u(0.28 ), area=0.1444, gds2Layer=46, gds2DataType=0, )
|
||||
Via4 = createBL( tech, 'Via4' , BasicLayer.Material.cut , size=u(0.26), spacing=u(0.36 ), gds2Layer=41, gds2DataType=0, )
|
||||
Metal5 = createBL( tech, 'Metal5' , BasicLayer.Material.metal, size=u(0.28), spacing=u(0.28 ), area=0.1444, gds2Layer=81, gds2DataType=0, )
|
||||
Via5 = createBL( tech, 'Via5' , BasicLayer.Material.cut , size=u(0.26), spacing=u(0.36 ), gds2Layer=82, gds2DataType=0, )
|
||||
MetalTop = createBL( tech, 'MetalTop', BasicLayer.Material.metal, size=u(0.44), spacing=u(0.436), area=0.5625, gds2Layer=53, gds2DataType=0, )
|
||||
|
||||
createBL(
|
||||
tech, 'V5_XTOR', BasicLayer.Material.other,
|
||||
gds2Layer=112, gds2DataType=1,
|
||||
)
|
||||
|
||||
# ViaLayers
|
||||
# Metal1<>Via1<>Metal2
|
||||
createVia(
|
||||
tech, 'Metal1_Via1_Metal2', 'Metal1', 'Via1', 'Metal2',
|
||||
u(0.26),
|
||||
)
|
||||
# Metal2<>Via2<>Metal3
|
||||
createVia(
|
||||
tech, 'Metal2_Via2_Metal3', 'Metal2', 'Via2', 'Metal3',
|
||||
u(0.26),
|
||||
)
|
||||
# Metal3<>Via3<>Metal4
|
||||
createVia(
|
||||
tech, 'Metal3_Via3_Metal4', 'Metal3', 'Via3', 'Metal4',
|
||||
u(0.26),
|
||||
)
|
||||
# Metal4<>Via4<>Metal5
|
||||
createVia(
|
||||
tech, 'Metal4_Via4_Metal5', 'Metal4', 'Via4', 'Metal5',
|
||||
u(0.26),
|
||||
)
|
||||
# Metal5<>Via5<>MetalTop
|
||||
createVia(
|
||||
tech, 'Metal5_Via5_MetalTop', 'Metal5', 'Via5', 'MetalTop',
|
||||
u(0.26),
|
||||
)
|
||||
|
||||
# Blockages
|
||||
Metal1_BLK = createBL( tech, 'Metal1_BLK', BasicLayer.Material.blockage, gds2Layer=34, gds2DataType=5 )
|
||||
Metal2_BLK = createBL( tech, 'Metal2_BLK', BasicLayer.Material.blockage, gds2Layer=36, gds2DataType=5 )
|
||||
Metal3_BLK = createBL( tech, 'Metal3_BLK', BasicLayer.Material.blockage, gds2Layer=42, gds2DataType=5 )
|
||||
Metal4_BLK = createBL( tech, 'Metal4_BLK', BasicLayer.Material.blockage, gds2Layer=46, gds2DataType=5 )
|
||||
Metal5_BLK = createBL( tech, 'Metal5_BLK', BasicLayer.Material.blockage, gds2Layer=81, gds2DataType=5 )
|
||||
MetalT_BLK = createBL( tech, 'MetalT_BLK', BasicLayer.Material.blockage, gds2Layer=53, gds2DataType=5 )
|
||||
|
||||
Via1_BLK = createBL( tech, 'Via1_BLK', BasicLayer.Material.blockage, gds2Layer=35, gds2DataType=5 )
|
||||
Via2_BLK = createBL( tech, 'Via2_BLK', BasicLayer.Material.blockage, gds2Layer=38, gds2DataType=5 )
|
||||
Via3_BLK = createBL( tech, 'Via3_BLK', BasicLayer.Material.blockage, gds2Layer=40, gds2DataType=5 )
|
||||
Via4_BLK = createBL( tech, 'Via4_BLK', BasicLayer.Material.blockage, gds2Layer=41, gds2DataType=5 )
|
||||
Via5_BLK = createBL( tech, 'Via5_BLK', BasicLayer.Material.blockage, gds2Layer=82, gds2DataType=5 )
|
||||
|
||||
Metal1.setBlockageLayer( Metal1_BLK )
|
||||
Metal2.setBlockageLayer( Metal2_BLK )
|
||||
Metal3.setBlockageLayer( Metal3_BLK )
|
||||
Metal4.setBlockageLayer( Metal4_BLK )
|
||||
Metal5.setBlockageLayer( Metal5_BLK )
|
||||
MetalTop.setBlockageLayer( MetalT_BLK )
|
||||
Via1.setBlockageLayer( Via1_BLK )
|
||||
Via2.setBlockageLayer( Via2_BLK )
|
||||
Via3.setBlockageLayer( Via3_BLK )
|
||||
Via4.setBlockageLayer( Via4_BLK )
|
||||
Via5.setBlockageLayer( Via5_BLK )
|
||||
|
||||
createBL( tech, 'Text_Label', BasicLayer.Material.other, gds2Layer=58 )
|
||||
createBL( tech, 'Border' , BasicLayer.Material.other, gds2Layer=63 )
|
||||
|
||||
# Coriolis internal layers
|
||||
createBL(
|
||||
tech, 'text.cell', BasicLayer.Material.other,
|
||||
)
|
||||
createBL(
|
||||
tech, 'text.instance', BasicLayer.Material.other,
|
||||
)
|
||||
createBL(
|
||||
tech, 'SPL1', BasicLayer.Material.other,
|
||||
)
|
||||
createBL(
|
||||
tech, 'AutoLayer', BasicLayer.Material.other,
|
||||
)
|
||||
createBL(
|
||||
tech, 'gmetalh', BasicLayer.Material.metal,
|
||||
)
|
||||
createBL(
|
||||
tech, 'gcontact', BasicLayer.Material.cut,
|
||||
)
|
||||
createBL(
|
||||
tech, 'gmetalv', BasicLayer.Material.metal,
|
||||
)
|
||||
|
||||
# Resistors
|
||||
|
||||
# Capacitors
|
||||
|
||||
# Transistors
|
||||
# GateLayer.create(tech, 'fet33gate', 'COMP', 'Poly2')
|
||||
# GateLayer.create(tech, 'fet5gate', 'COMP', 'Poly2', 'Dualgate')
|
||||
# TransistorLayer.create(tech, 'nfet_03v3', 'fet33gate', 'Nplus')
|
||||
# TransistorLayer.create(tech, 'nfet_05v0', 'fet5gate', 'Nplus')
|
||||
# TransistorLayer.create(tech, 'pfet_03v3', 'fet33gate', 'Pplus', 'Nwell')
|
||||
# TransistorLayer.create(tech, 'pfet_05v0', 'fet5gate', 'Pplus', 'Nwell')
|
||||
|
||||
# Bipolars
|
||||
|
||||
def _setup_display():
|
||||
# ----------------------------------------------------------------------
|
||||
# Style: Alliance.Classic [black]
|
||||
|
||||
threshold = 0.2 if Viewer.Graphics.isHighDpi() else 0.1
|
||||
|
||||
style = Viewer.DisplayStyle( 'Alliance.Classic [black]' )
|
||||
style.setDescription( 'Alliance Classic Look - black background' )
|
||||
style.setDarkening ( Viewer.DisplayStyle.HSVr(1.0, 3.0, 2.5) )
|
||||
|
||||
# Viewer.
|
||||
style.addDrawingStyle( group='Viewer', name='fallback' , color=toRGB('Gray238' ), border=1, pattern='55AA55AA55AA55AA' )
|
||||
style.addDrawingStyle( group='Viewer', name='background' , color=toRGB('Gray50' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='foreground' , color=toRGB('White' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='rubber' , color=toRGB('192,0,192' ), border=4, threshold=0.02 )
|
||||
style.addDrawingStyle( group='Viewer', name='phantom' , color=toRGB('Seashell4' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='boundaries' , color=toRGB('wheat1' ), border=2, pattern='0000000000000000', threshold=0 )
|
||||
style.addDrawingStyle( group='Viewer', name='marker' , color=toRGB('80,250,80' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='selectionDraw' , color=toRGB('White' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='selectionFill' , color=toRGB('White' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='grid' , color=toRGB('White' ), border=1, threshold=2.0 )
|
||||
style.addDrawingStyle( group='Viewer', name='spot' , color=toRGB('White' ), border=2, threshold=6.0 )
|
||||
style.addDrawingStyle( group='Viewer', name='ghost' , color=toRGB('White' ), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='text.ruler' , color=toRGB('White' ), border=1, threshold= 0.0 )
|
||||
style.addDrawingStyle( group='Viewer', name='text.instance' , color=toRGB('White' ), border=1, threshold=400.0 )
|
||||
style.addDrawingStyle( group='Viewer', name='text.reference', color=toRGB('White' ), border=1, threshold=200.0 )
|
||||
style.addDrawingStyle( group='Viewer', name='undef' , color=toRGB('Violet' ), border=0, pattern='2244118822441188' )
|
||||
|
||||
# Active Layers.
|
||||
style.addDrawingStyle(group='Active Layers', name='Nwell', color=toRGB('Tan'), pattern=toHexa('urgo.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Active Layers', name='Nplus', color=toRGB('LawnGreen'), pattern=toHexa('antihash0.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Active Layers', name='Pplus', color=toRGB('Yellow'), pattern=toHexa('antihash0.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Active Layers', name='COMP', color=toRGB('White'), pattern=toHexa('antihash0.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Active Layers', name='Poly2', color=toRGB('Red'), pattern=toHexa('antihash0.8'), border=1, threshold=threshold)
|
||||
|
||||
# Routing Layers.
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal1', color=toRGB('Blue'), pattern=toHexa('slash.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal1_Label', color=toRGB('Blue'), pattern=toHexa('slash.8'), border=2, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal2', color=toRGB('Aqua'), pattern=toHexa('poids4.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal2_Label', color=toRGB('Aqua'), pattern=toHexa('poids4.8'), border=2, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal3', color=toRGB('LightPink'), pattern=toHexa('poids4.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal3_Label', color=toRGB('LightPink'), pattern=toHexa('poids4.8'), border=2, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal4', color=toRGB('Green'), pattern=toHexa('poids4.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal4_Label', color=toRGB('Green'), pattern=toHexa('poids4.8'), border=2, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal5', color=toRGB('Yellow'), pattern=toHexa('poids4.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='Metal5_Label', color=toRGB('Yellow'), pattern=toHexa('poids4.8'), border=2, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='MetalTop', color=toRGB('Violet'), pattern=toHexa('poids4.8'), border=1, threshold=threshold)
|
||||
style.addDrawingStyle(group='Routing Layers', name='MetalTop_Label', color=toRGB('Violet'), pattern=toHexa('poids4.8'), border=2, threshold=threshold)
|
||||
|
||||
# Cuts (VIA holes).
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Contact', color=toRGB('0,150,150'), threshold=threshold)
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Via1' , color=toRGB('Aqua' ), threshold=threshold)
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Via2' , color=toRGB('LightPink'), threshold=threshold)
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Via3' , color=toRGB('Green' ), threshold=threshold)
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Via4' , color=toRGB('Yellow' ), threshold=threshold)
|
||||
style.addDrawingStyle(group='Cuts (VIA holes)', name='Via5' , color=toRGB('Violet' ), threshold=threshold)
|
||||
|
||||
# Group: Blockages.
|
||||
style.addDrawingStyle( group='Blockages', name='Metal1_BLK' , color=toRGB('Blue' ), pattern='006070381c0e0703' , threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Metal2_BLK' , color=toRGB('Aqua' ), pattern='8103060c183060c0' , threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Metal3_BLK' , color=toRGB('LightPink'), pattern=toHexa('poids4.8' ), threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Metal4_BLK' , color=toRGB('Green' ), pattern=toHexa('light_antihash2.8'), threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Metal5_BLK' , color=toRGB('Yellow' ), pattern='1144114411441144' , threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='MetalTop_BLK', color=toRGB('Violet' ), pattern=toHexa('light_antihash0.8'), threshold=0.80, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Via1_BLK' , color=toRGB('Aqua' ), threshold=threshold, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Via2_BLK' , color=toRGB('LightPink'), threshold=threshold, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Via3_BLK' , color=toRGB('Green' ), threshold=threshold, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Via4_BLK' , color=toRGB('Yellow' ), threshold=threshold, border=2 )
|
||||
style.addDrawingStyle( group='Blockages', name='Via5_BLK' , color=toRGB('Violet' ), threshold=threshold, border=2 )
|
||||
|
||||
# Knick & Kite.
|
||||
style.addDrawingStyle( group='Knik & Kite', name='SPL1' , color=toRGB('Red' ) )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='AutoLayer' , color=toRGB('Magenta' ) )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='gmetalh' , color=toRGB('128,255,200'), pattern=toHexa('antislash2.32' ), border=1 )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='gmetalv' , color=toRGB('200,200,255'), pattern=toHexa('light_antihash1.8'), border=1 )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='gcontact' , color=toRGB('255,255,190'), border=1 )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='Anabatic::Edge' , color=toRGB('255,255,190'), pattern='0000000000000000' , border=4, threshold=0.02 )
|
||||
style.addDrawingStyle( group='Knik & Kite', name='Anabatic::GCell', color=toRGB('255,255,190'), pattern='0000000000000000' , border=2, threshold=threshold )
|
||||
|
||||
Viewer.Graphics.addStyle( style )
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Style: Alliance.Classic [white].
|
||||
|
||||
style = Viewer.DisplayStyle( 'Alliance.Classic [white]' )
|
||||
style.inheritFrom( 'Alliance.Classic [black]' )
|
||||
style.setDescription( 'Alliance Classic Look - white background' )
|
||||
style.setDarkening ( Viewer.DisplayStyle.HSVr(1.0, 3.0, 2.5) )
|
||||
|
||||
style.addDrawingStyle( group='Viewer', name='background', color=toRGB('White'), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='foreground', color=toRGB('Black'), border=1 )
|
||||
style.addDrawingStyle( group='Viewer', name='boundaries', color=toRGB('Black'), border=1, pattern='0000000000000000' )
|
||||
Viewer.Graphics.addStyle( style )
|
||||
|
||||
Viewer.Graphics.setStyle( 'Alliance.Classic [black]' )
|
||||
|
||||
def setup():
|
||||
_setup_techno()
|
||||
_setup_display()
|
||||
loadAnalogTechno(analogTechnologyTable, __file__)
|
||||
try:
|
||||
from .techno_fix import fix
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
fix()
|
|
@ -244,6 +244,58 @@ def setupSky130_c4m ( checkToolkit=None, pdkMasterTop=None ):
|
|||
ShellEnv.CHECK_TOOLKIT = Where.checkToolkit.as_posix()
|
||||
|
||||
|
||||
def setupGf180mcu_c4m ( checkToolkit=None
|
||||
, pdkMasterTop=Path('/usr/share/open_pdks/C4M.gf180mcu') ):
|
||||
from .. import Cfg
|
||||
from .. import Viewer
|
||||
from .. import CRL
|
||||
from ..helpers import overlay, l, u, n
|
||||
from .yosys import Yosys
|
||||
|
||||
if isinstance(pdkMasterTop,str):
|
||||
pdkMasterTop = Path( pdkMasterTop )
|
||||
if not pdkMasterTop.is_dir():
|
||||
print( '[ERROR] technos.setupGf180mcu_c4m(): pdkMasterTop directory do *not* exists:' )
|
||||
print( ' "{}"'.format(pdkMasterTop.as_posix()) )
|
||||
#sys.path.append( (pdkMasterTop / 'libs.tech'
|
||||
# / 'coriolis'
|
||||
# / 'techno'
|
||||
# / 'etc'
|
||||
# / 'coriolis2').resolve().as_posix() )
|
||||
|
||||
Where( checkToolkit )
|
||||
|
||||
from ..technos.node180.gf180mcu_c4m import techno, StdCell3V3Lib, iolib
|
||||
techno.setup()
|
||||
StdCell3V3Lib.setup()
|
||||
iolib.setup( Where.checkToolkit / '..' / 'gf180mcu-pdk' )
|
||||
|
||||
liberty = pdkMasterTop / 'libs.ref' / 'StdCell3V3Lib' / 'liberty' / 'StdCell3V3Lib_nom.lib'
|
||||
|
||||
with overlay.CfgCache(priority=Cfg.Parameter.Priority.UserFile) as cfg:
|
||||
cfg.misc.catchCore = False
|
||||
cfg.misc.minTraceLevel = 12300
|
||||
cfg.misc.maxTraceLevel = 12400
|
||||
cfg.misc.info = False
|
||||
cfg.misc.paranoid = False
|
||||
cfg.misc.bug = False
|
||||
cfg.misc.logMode = True
|
||||
cfg.misc.verboseLevel1 = True
|
||||
cfg.misc.verboseLevel2 = True
|
||||
cfg.etesian.graphics = 3
|
||||
cfg.etesian.spaceMargin = 0.10
|
||||
cfg.anabatic.topRoutingLayer = 'metal6'
|
||||
cfg.katana.eventsLimit = 4000000
|
||||
af = CRL.AllianceFramework.get()
|
||||
lg5 = af.getRoutingGauge('StdCell3V3Lib').getLayerGauge( 5 )
|
||||
lg5.setType( CRL.RoutingLayerGauge.PowerSupply )
|
||||
env = af.getEnvironment()
|
||||
env.setCLOCK( '^sys_clk$|^ck|^jtag_tck$' )
|
||||
|
||||
Yosys.setLiberty( liberty )
|
||||
ShellEnv.CHECK_TOOLKIT = Where.checkToolkit.as_posix()
|
||||
|
||||
|
||||
def setupFreePDK45_c4m ( checkToolkit=None, pdkMasterTop=None ):
|
||||
from .. import Cfg
|
||||
from .. import Viewer
|
||||
|
|
Loading…
Reference in New Issue