blob: 649665c22235f5ed72696b965c5a2ab0805ef945 [file] [log] [blame]
# Makefile for Efabless design kits for gf180mcu:
#
# This file supports all the process options including 2 to 6 metals,
# and multiple thicknesses of the top metal. The three PDKs generated by
# the Makefile represent the three backend options for which the I/O library
# has layout, which are, namely, 3-, 4-, and 5- metal options.
#
# Important note about the process: GF180MCU uses the same base process as
# other GF180 processes. However, instead of a thin oxide gate, the base
# oxide is a thick oxide, and the thick oxide mask defines a thicker oxide.
# The process DRC rules then follow the rule sets for thick oxide devices,
# so the minimum length transistor is 280nm, making this much more like a
# 0.28um process than a 0.18um process.
#
# Notes about definitions:
# METALSN means N layers of metal, where N can be 2 to 6.
# THICKMET3P0 means that the top metal is 3.0um thick
# THICKMET1P1 means that the top metal is 1.1um thick
# THICKMET0P9 means that the top metal is 0.9um thick
# Otherwise, the top metal is 0.6um thick
# Always use exactly one "METALSN" option (N = 4 to 6).
#
# NOTE: Using "METALSN" instead of "METALN" because "METALN" are the preferred
# layer names in the technology LEF file.
#
# MIM means that the MiM cap is defined between top metal and the one below.
# The process defines a "MIM OPT A" with the MiM cap between metals 3 and 2.
# Because this option is only available with METALS4 (For METALS3 options A
# and B are the same), it is not being implemented.
#
# MIM caps are mutually-exclusive-selectable 1fF, 1.5fF, or 2fF per um^2.
# For simplicity, this file assumes the 2fF per um^2 value.
#
# HRPOLY1K defines the 1K high sheet rho poly resistor.
#
# Not all combinations of options are valid. Global Foundries defines the
# following combinations as valid (adjusting for the decision not to
# implement MIM OPT A):
#
# METALS2 + THICKMET3P0
#
# METALS3 + MIM
# METALS3 + MIM + THICKMET0P9
# METALS3 + MIM + THICKMET1P1
# METALS3 + MIM + THICKMET3P0
#
# METALS4 + MIM + THICKMET0P9
# METALS4 + MIM + THICKMET1P1
# METALS4 + MIM + THICKMET3P0
#
# METALS5 + MIM + THICKMET0P9
# METALS5 + MIM + THICKMET1P1
#
# METALS6 + MIM + THICKMET0P9
#
#------------------------------------------------------------------------------
#
# The defined options per PDK in this file are:
#
# gf180mcuA = METALS3 | MIM | THICKMET3P0 | HRPOLY1K
# gf180mcuB = METALS4 | MIM | THICKMET1P1 | HRPOLY1K
# gf180mcuC = METALS5 | MIM | THICKMET0P9 | HRPOLY1K
# gf180mcuD = METALS5 | MIM | THICKMET1P1 | HRPOLY1K
#
# Written by Tim Edwards April 2022
# Efabless, Inc.
#
#--------------------------------------------------------------------
# This Makefile contains bash-isms
SHELL := /bin/bash
export SHELL
# We use pipes to save output to files, without pipefail they will always be
# seen by make as having succeeded.
SHELLOPTS := pipefail
export SHELLOPTS
MV = mv
PATCH = patch
SED = @SED@
prefix = @prefix@
datarootdir = @datarootdir@
datadir = @datadir@
# Path to open_pdks root directory (may need changing if it is a symbolic link)
SCRIPTSDIR ?= ..
# Use git revision if this is a cloned repo; otherwise get the revision
# from the VERSION file in the directory above.
GITREV = $(shell git describe --long)
ifeq (${GITREV},)
REVISION = $(shell cat ${SCRIPTSDIR}/VERSION)
else
REVISION = ${GITREV}
endif
TECH = gf180mcu
# The run-time environment uses PDKPATH to override the PDK location,
# so prevent that from happening during PDK install. This will also
# happen with PDK_ROOT, so avoid that as well.
unexport PDKPATH
unexport PDK_ROOT
# If EF_STYLE is set to 1, then efabless naming conventions are
# used, otherwise the generic naming conventions are used.
# Mainly this has to do with where the technology LEF files are
# put (libs.tech/lef/ vs. libs.ref/techLEF).
# EF_STYLE = 0 | 1
EF_STYLE = @EF_STYLE@
# Normally it's fine to keep the staging path in a local directory,
# although /tmp or a dedicated staging area are also fine, as long
# as the install process can write to the path.
STAGING_PATH = $(shell pwd)
SHARED_PDKS_PATH ?= $(datadir)/pdk
# If LINK_TARGETS is set to "none", then files are copied
# from the SkyWater sources to the target. If set to "source",
# symbolic links are made in the target directories pointing
# back to the SkyWater sources. If set to the name of another
# PDK (e.g, "sky130A"), then symbolic links are made to the
# same files in that PDK, where they exist, and are copied
# from source, where they don't.
#
# Behavior is to let the link targets for variant A follow the
# configuration option. Link targets for variant B will always
# be the files of variant A (which may end up being symbolic
# links to symbolic links if "source" was chosen for link-targets
# in the configuration).
# LINK_TARGETS = source | none | gf180mcuA
LINK_TARGETS_A = @GF180MCU_LINK_TARGETS@
LINK_TARGETS_B = gf180mcuA
LINK_TARGETS_C = gf180mcuA
LINK_TARGETS_D = gf180mcuA
# ENABLED_VARIANTS = all | A | B | C | D
ENABLED_VARIANTS = @GF180MCU_ENABLED_VARIANTS@
ifeq (${ENABLED_VARIANTS},)
VARIANTS += A B C D
else
ifeq (${ENABLED_VARIANTS}, all)
VARIANTS += A B C D
else
VARIANTS += ${ENABLED_VARIANTS}
endif
endif
# Paths:
# Path to GF180MCU open PDK sources. If this is specified, then all
# library repositories must be subdirectories of this path.
GF180MCU_PR_PATH = @GF180MCU_FD_PR_PATH@
GF180MCU_PV_PATH = @GF180MCU_FD_PV_PATH@
GF180MCU_IO_PATH = @GF180MCU_FD_IO_PATH@
GF180MCU_SC_7T5V0_PATH = @GF180MCU_FD_SC_MCU7T5V0_PATH@
GF180MCU_SC_9T5V0_PATH = @GF180MCU_FD_SC_MCU9T5V0_PATH@
GF180MCU_SRAM_PATH = @GF180MCU_FD_IP_SRAM_PATH@
GF180MCU_OSU_SC_PATH = @GF180MCU_OSU_SC_PATH@
USE_REFERENCE = @USE_REFERENCE@
ifeq (${USE_REFERENCE}, 1)
REFERENCE_JSON = ${TECH}.json
else
REFERENCE_JSON =
endif
# Path to GF180MCU library sources
PDK_URL = https://github.com/google
OSU_URL = https://github.com/stineje
EF_URL = https://github.com/efabless
# Names of library repositories
# NOTE: Switching PDK_LIB_PR and PDK_LIB_SC_7T5V0 to Efabless versions
# having "quick fixes" under development.
PDK_LIB_PR = ${EF_URL}/globalfoundries-pdk-libs-gf180mcu_fd_pr
PDK_LIB_PV = ${EF_URL}/globalfoundries-pdk-libs-gf180mcu_fd_pv
PDK_LIB_IO = ${PDK_URL}/globalfoundries-pdk-libs-gf180mcu_fd_io
PDK_LIB_SC_7T5V0 = ${EF_URL}/globalfoundries-pdk-libs-gf180mcu_fd_sc_mcu7t5v0
PDK_LIB_SC_9T5V0 = ${EF_URL}/globalfoundries-pdk-libs-gf180mcu_fd_sc_mcu9t5v0
PDK_LIB_SRAM = ${PDK_URL}/globalfoundries-pdk-ip-gf180mcu_fd_ip_sram
PDK_LIB_OSU_SC = ${OSU_URL}/globalfoundries-pdk-libs-gf180mcu_osu_sc
# NOTE: Install destination is the git repository of the technology platform.
# Once updated in git, the git project can be distributed to all hosts.
#
ifeq (${EF_STYLE}, 1)
CONFIG_DIR = .ef-config
REV_DIR = ${REVISION}
else
CONFIG_DIR = .config
REV_DIR = .
endif
# Process nodes created from the master sources
GF180MCUA = gf180mcuA
GF180MCUB = gf180mcuB
GF180MCUC = gf180mcuC
GF180MCUD = gf180mcuD
DIST_LINK_TARGETS_A = ${LINK_TARGETS_A}
DIST_LINK_TARGETS_B = ${SHARED_PDKS_PATH}/${LINK_TARGETS_B}
DIST_LINK_TARGETS_C = ${SHARED_PDKS_PATH}/${LINK_TARGETS_C}
DIST_LINK_TARGETS_D = ${SHARED_PDKS_PATH}/${LINK_TARGETS_D}
# Basic definitions for each process node
GF180MCUA_DEFS = -DTECHNAME=gf180mcuA -DREVISION=${REVISION}
GF180MCUB_DEFS = -DTECHNAME=gf180mcuB -DREVISION=${REVISION}
GF180MCUC_DEFS = -DTECHNAME=gf180mcuC -DREVISION=${REVISION}
GF180MCUD_DEFS = -DTECHNAME=gf180mcuD -DREVISION=${REVISION}
# Module definitions for each process node (see top)
GF180MCUA_DEFS += -DMETALS3 -DMIM -DTHICKMET3P0 -DHRPOLY1K
GF180MCUB_DEFS += -DMETALS4 -DMIM -DTHICKMET1P1 -DHRPOLY1K
GF180MCUC_DEFS += -DMETALS5 -DMIM -DTHICKMET0P9 -DHRPOLY1K
GF180MCUD_DEFS += -DMETALS5 -DMIM -DTHICKMET1P1 -DHRPOLY1K
# Add staging path
GF180MCUA_DEFS += -DSTAGING_PATH=${STAGING_PATH}
GF180MCUB_DEFS += -DSTAGING_PATH=${STAGING_PATH}
GF180MCUC_DEFS += -DSTAGING_PATH=${STAGING_PATH}
GF180MCUD_DEFS += -DSTAGING_PATH=${STAGING_PATH}
# Get the timestamp of the open_pdks commit to use for stamping layouts.
OPEN_PDKS_TIMESTAMP = $(shell git log -1 --format="%ad" --date=raw | cut -d' ' -f1)
TIMESTAMP_OPT = -timestamp ${OPEN_PDKS_TIMESTAMP}
# Record commit numbers for the nodeinfo.json file
OPEN_PDKS_COMMIT = $(shell git rev-parse HEAD)
ifeq (${OPEN_PDKS_COMMIT},)
COMMIT_DEFS = -DOPEN_PDKS_COMMIT=${REVISION}
else
COMMIT_DEFS = -DOPEN_PDKS_COMMIT=${OPEN_PDKS_COMMIT}
endif
ifeq (${GF180MCU_SC_9T5V0_PATH},)
COMMIT_DEFS += -DFD_SC_MCU9T5V0_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_SC_MCU9T5V0_COMMIT=$(shell cd ${GF180MCU_SC_9T5V0_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_SC_7T5V0_PATH},)
COMMIT_DEFS += -DFD_SC_MCU7T5V0_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_SC_MCU7T5V0_COMMIT=$(shell cd ${GF180MCU_SC_7T5V0_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_PR_PATH},)
COMMIT_DEFS += -DFD_PR_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_PR_COMMIT=$(shell cd ${GF180MCU_PR_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_PV_PATH},)
COMMIT_DEFS += -DFD_PV_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_PV_COMMIT=$(shell cd ${GF180MCU_PV_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_IO_PATH},)
COMMIT_DEFS += -DFD_IO_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_IO_COMMIT=$(shell cd ${GF180MCU_IO_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_SRAM_PATH},)
COMMIT_DEFS += -DFD_IP_SRAM_COMMIT="unknown"
else
COMMIT_DEFS += -DFD_IP_SRAM_COMMIT=$(shell cd ${GF180MCU_SRAM_PATH} ; git rev-parse HEAD)
endif
ifeq (${GF180MCU_OSU_SC_PATH},)
COMMIT_DEFS += -DOSU_SC_COMMIT="unknown"
else
COMMIT_DEFS += -DOSU_SC_COMMIT=$(shell cd ${GF180MCU_OSU_SC_PATH} ; git rev-parse HEAD)
endif
COMMIT_DEFS += -DMAGIC_COMMIT=$(shell magic -dnull -noconsole --commit)
COMMIT_DEFS += -DMAGIC_VERSION=$(shell magic -dnull -noconsole --version)
COMMIT_DEFS += -DOPEN_PDKS_VERSION=$(shell cat ${SCRIPTSDIR}/VERSION)
ifeq (${EF_STYLE}, 1)
EF_FORMAT = -ef_format
GF180MCUA_DEFS += -DEF_FORMAT
GF180MCUB_DEFS += -DEF_FORMAT
GF180MCUC_DEFS += -DEF_FORMAT
GF180MCUD_DEFS += -DEF_FORMAT
else
EF_FORMAT = -std_format
endif
MAGICTOP = libs.tech/magic
NETGENTOP = libs.tech/netgen
QFLOWTOP = libs.tech/qflow
IRSIMTOP = libs.tech/irsim
KLAYOUTTOP = libs.tech/klayout
OPENLANETOP = libs.tech/openlane
XSCHEMTOP = libs.tech/xschem
XCIRCUITTOP = libs.tech/xcircuit
NGSPICETOP = libs.tech/ngspice
ifeq (${EF_STYLE}, 1)
MAGICPATH = ${MAGICTOP}/${REVISION}
MAGIC_CURRENT = ${MAGICTOP}/current
else
MAGICPATH = ${MAGICTOP}
MAGIC_CURRENT = ${MAGICTOP}
endif
NETGENPATH = ${NETGENTOP}
IRSIMPATH = ${IRSIMTOP}
QFLOWPATH = ${QFLOWTOP}
KLAYOUTPATH = ${KLAYOUTTOP}
OPENLANEPATH = ${OPENLANETOP}
XSCHEMPATH = ${XSCHEMTOP}
XCIRCUITPATH = ${XCIRCUITTOP}
NGSPICEPATH = ${NGSPICETOP}
MAGICTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${MAGICTOP}
NETGENTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${NETGENTOP}
IRSIMTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${IRSIMTOP}
QFLOWTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${QFLOWTOP}
KLAYOUTTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${KLAYOUTTOP}
OPENLANETOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${OPENLANETOP}
XSCHEMTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${XSCHEMTOP}
XCIRCUITTOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${XCIRCUITTOP}
NGSPICETOP_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${NGSPICETOP}
MAGIC_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${MAGICPATH}
NETGEN_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${NETGENPATH}
IRSIM_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${IRSIMPATH}
QFLOW_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${QFLOWPATH}
KLAYOUT_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${KLAYOUTPATH}
OPENLANE_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${OPENLANEPATH}
XSCHEM_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${XSCHEMPATH}
XCIRCUIT_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${XCIRCUITPATH}
NGSPICE_STAGING_A = ${STAGING_PATH}/${GF180MCUA}/${NGSPICEPATH}
MAGICTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${MAGICTOP}
NETGENTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${NETGENTOP}
IRSIMTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${IRSIMTOP}
QFLOWTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${QFLOWTOP}
KLAYOUTTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${KLAYOUTTOP}
OPENLANETOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${OPENLANETOP}
XSCHEMTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${XSCHEMTOP}
XCIRCUITTOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${XCIRCUITTOP}
NGSPICETOP_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${NGSPICETOP}
MAGIC_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${MAGICPATH}
NETGEN_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${NETGENPATH}
IRSIM_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${IRSIMPATH}
QFLOW_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${QFLOWPATH}
KLAYOUT_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${KLAYOUTPATH}
OPENLANE_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${OPENLANEPATH}
XSCHEM_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${XSCHEMPATH}
XCIRCUIT_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${XCIRCUITPATH}
NGSPICE_STAGING_B = ${STAGING_PATH}/${GF180MCUB}/${NGSPICEPATH}
MAGICTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${MAGICTOP}
NETGENTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${NETGENTOP}
IRSIMTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${IRSIMTOP}
QFLOWTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${QFLOWTOP}
KLAYOUTTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${KLAYOUTTOP}
OPENLANETOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${OPENLANETOP}
XSCHEMTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${XSCHEMTOP}
XCIRCUITTOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${XCIRCUITTOP}
NGSPICETOP_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${NGSPICETOP}
MAGIC_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${MAGICPATH}
NETGEN_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${NETGENPATH}
IRSIM_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${IRSIMPATH}
QFLOW_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${QFLOWPATH}
KLAYOUT_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${KLAYOUTPATH}
OPENLANE_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${OPENLANEPATH}
XSCHEM_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${XSCHEMPATH}
XCIRCUIT_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${XCIRCUITPATH}
NGSPICE_STAGING_C = ${STAGING_PATH}/${GF180MCUC}/${NGSPICEPATH}
MAGICTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${MAGICTOP}
NETGENTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${NETGENTOP}
IRSIMTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${IRSIMTOP}
QFLOWTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${QFLOWTOP}
KLAYOUTTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${KLAYOUTTOP}
OPENLANETOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${OPENLANETOP}
XSCHEMTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${XSCHEMTOP}
XCIRCUITTOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${XCIRCUITTOP}
NGSPICETOP_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${NGSPICETOP}
MAGIC_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${MAGICPATH}
NETGEN_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${NETGENPATH}
IRSIM_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${IRSIMPATH}
QFLOW_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${QFLOWPATH}
KLAYOUT_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${KLAYOUTPATH}
OPENLANE_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${OPENLANEPATH}
XSCHEM_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${XSCHEMPATH}
XCIRCUIT_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${XCIRCUITPATH}
NGSPICE_STAGING_D = ${STAGING_PATH}/${GF180MCUD}/${NGSPICEPATH}
GF180MCUA_DEFS += -DMAGIC_CURRENT=${MAGIC_CURRENT}
GF180MCUB_DEFS += -DMAGIC_CURRENT=${MAGIC_CURRENT}
GF180MCUC_DEFS += -DMAGIC_CURRENT=${MAGIC_CURRENT}
GF180MCUD_DEFS += -DMAGIC_CURRENT=${MAGIC_CURRENT}
# These definitions are used by the build recipes
A_STACK = 3lm
B_STACK = 4lm
C_STACK = 5lm
D_STACK = 5lm
# These definitions are used by the build recipes for the tech LEF
A_FULLSTACK = 3LM_1TM_30K
B_FULLSTACK = 4LM_1TM_11K
C_FULLSTACK = 5LM_1TM_9K
D_FULLSTACK = 5LM_1TM_11K
# Openlane has a number of files that are common to all digital
# standard cell libraries, so these are collected in one definition
# here:
OPENLANE_COMMON = config.tcl tracks.info no_synth.cells drc_exclude.cells
# Where cpp syntax is followed, this is equivalent to cpp, but it does not
# mangle non-C source files under the belief that they are actually C code.
CPP = ${SCRIPTSDIR}/common/preproc.py
# The following script in the ${SCRIPTSDIR}/common directory does most of the work of
# copying or linking the foundry vendor files to the target directory.
STAGE = set -f ; ${SCRIPTSDIR}/common/foundry_install.py ${EF_FORMAT} ${TIMESTAMP_OPT}
ifneq ($(DESTDIR), )
INSTALL = ${SCRIPTSDIR}/common/staging_install.py -writeto $(DESTDIR) ${EF_FORMAT}
else
INSTALL = ${SCRIPTSDIR}/common/staging_install.py ${EF_FORMAT}
endif
# The script(s) below are used for custom changes to the vendor PDK files
PORTORDER = ../common/port_order.py ${EF_FORMAT}
ADDPROP = ../common/insert_property.py ${EF_FORMAT}
ADDLAYER = ../common/insert_layer.py ${EF_FORMAT}
REMOVELAB = ../common/remove_label.py ${EF_FORMAT}
# List the EDA tools to install local setup files for
TOOLS =
# KLAYOUT_DISABLED = 0 | 1
KLAYOUT_DISABLED = @KLAYOUT_DISABLED@
ifneq (${KLAYOUT_DISABLED}, 1)
TOOLS += klayout
endif
# OPENLANE_DISABLED = 0 | 1
OPENLANE_DISABLED = @OPENLANE_DISABLED@
ifneq (${OPENLANE_DISABLED}, 1)
TOOLS += openlane
endif
# QFLOW_DISABLED = 0 | 1
QFLOW_DISABLED = @QFLOW_DISABLED@
ifneq (${QFLOW_DISABLED}, 1)
TOOLS += qflow
endif
# MAGIC_DISABLED = 0 | 1
MAGIC_DISABLED = @MAGIC_DISABLED@
ifneq (${MAGIC_DISABLED}, 1)
TOOLS += magic
endif
# NETGEN_DISABLED = 0 | 1
NETGEN_DISABLED = @NETGEN_DISABLED@
ifneq (${NETGEN_DISABLED}, 1)
TOOLS += netgen
endif
# IRSIM_DISABLED = 0 | 1
IRSIM_DISABLED = @IRSIM_DISABLED@
ifneq (${IRSIM_DISABLED}, 1)
TOOLS += irsim
endif
# XSCHEM_DISABLED = 0 | 1
XSCHEM_DISABLED = @XSCHEM_DISABLED@
ifneq (${XSCHEM_DISABLED}, 1)
TOOLS += xschem
endif
# XCIRCUIT_DISABLED = 0 | 1
XCIRCUIT_DISABLED = @XCIRCUIT_DISABLED@
ifneq (${XCIRCUIT_DISABLED}, 1)
TOOLS += xcircuit
endif
# This definition depends on the setting of EF_STYLE
ifeq (${EF_STYLE}, 1)
IO_GDS = gds/gf180mcu_fd_io
else
IO_GDS = gf180mcu_fd_io/gds
endif
all: $(foreach var, ${VARIANTS}, all-$(var))
reference: ${TECH}.json
# Rewrite the ${TECH}.json file to change the commit values in
# "reference" to reflect the state of the system when "make
# reference" was run. This is then committed to the open_pdks
# repository to create a known reference configuration of all
# tools.
../common/save_commit_refs.py ${COMMIT_DEFS} ${TECH}.json
# Handle prerequisites
prerequisites: pr-repo pv-repo io-repo sc-7t-repo sc-9t-repo sram-repo osu-sc-repo
pr-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_PR_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_pr | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_PR_PATH}" != "x" ; then \
if test -d "${GF180MCU_PR_PATH}" ; then \
echo "Using existing installation of primitive library from ${GF180MCU_PR_PATH}" ; \
else \
echo "Downloading primitive library from ${GF180MCU_PR_PATH}" ; \
../scripts/download.sh ${PDK_LIB_PR} ${GF180MCU_PR_PATH} $${FD_PR_COMMIT}; \
fi ; \
fi
pv-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_PV_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_pv | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_PV_PATH}" != "x" ; then \
if test -d "${GF180MCU_PV_PATH}" ; then \
echo "Using existing installation of verification library from ${GF180MCU_PV_PATH}" ; \
else \
echo "Downloading verification library from ${GF180MCU_PV_PATH}" ; \
../scripts/download.sh ${PDK_LIB_PV} ${GF180MCU_PV_PATH} $${FD_PV_COMMIT}; \
fi ; \
fi
io-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_IO_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_io | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_IO_PATH}" != "x" ; then \
if test -d "${GF180MCU_IO_PATH}" ; then \
echo "Using existing installation of I/O library from ${GF180MCU_IO_PATH}" ; \
else \
echo "Downloading I/O library from ${GF180MCU_IO_PATH}" ; \
../scripts/download.sh ${PDK_LIB_IO} ${GF180MCU_IO_PATH} $${FD_IO_COMMIT}; \
fi ; \
fi
sc-7t-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_SC_MCU7T5V0_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_sc_mcu7t5v0 | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_SC_7T5V0_PATH}" != "x" ; then \
if test -d "${GF180MCU_SC_7T5V0_PATH}" ; then \
echo "Using existing installation of 7-track standard cell library from ${GF180MCU_SC_7T5V0_PATH}" ; \
else \
echo "Downloading 7-track standard cell library from ${GF180MCU_SC_7T5V0_PATH}" ; \
../scripts/download.sh ${PDK_LIB_SC_7T5V0} ${GF180MCU_SC_7T5V0_PATH} $${FD_SC_MCU7T5V0_COMMIT}; \
fi ; \
fi
sc-9t-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_SC_MCU9T5V0_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_sc_mcu9t5v0 | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_SC_9T5V0_PATH}" != "x" ; then \
if test -d "${GF180MCU_SC_9T5V0_PATH}" ; then \
echo "Using existing installation of 9-track standard cell library from ${GF180MCU_SC_9T5V0_PATH}" ; \
else \
echo "Downloading 9-track standard cell library from ${GF180MCU_SC_9T5V0_PATH}" ; \
../scripts/download.sh ${PDK_LIB_SC_9T5V0} ${GF180MCU_SC_9T5V0_PATH} $${FD_SC_MCU9T5V0_COMMIT}; \
fi ; \
fi
sram-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
FD_IP_SRAM_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_fd_ip_sram | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_SRAM_PATH}" != "x" ; then \
if test -d "${GF180MCU_SRAM_PATH}" ; then \
echo "Using existing installation of primitive library from ${GF180MCU_SRAM_PATH}" ; \
else \
echo "Downloading primitive library from ${GF180MCU_SRAM_PATH}" ; \
../scripts/download.sh ${PDK_LIB_SRAM} ${GF180MCU_SRAM_PATH} $${FD_IP_SRAM_COMMIT}; \
fi ; \
fi
osu-sc-repo:
if test "x${REFERENCE_JSON}" != "x"; then \
OSU_SC_COMMIT=`cat ${REFERENCE_JSON} | grep gf180mcu_osu_sc_gf12t3v3 | grep -v COMMIT | cut -d'"' -f4` ; \
fi ; \
if test "x${GF180MCU_OSU_SC_PATH}" != "x" ; then \
if test -d "${GF180MCU_OSU_SC_PATH}" ; then \
echo "Using existing installation of OSU 3.3V standard cell library from ${GF180MCU_OSU_SC_PATH}" ; \
else \
echo "Downloading OSU 3.3V standard cell library from ${GF180MCU_OSU_SC_PATH}" ; \
../scripts/download.sh ${PDK_LIB_OSU_SC} ${GF180MCU_OSU_SC_PATH} $${OSU_SC_COMMIT} ; \
fi ; \
fi
# Update prerequisites
update: update-pr-repo update-pv-repo update-io-repo update-sc-7t-repo update-sc-9t-repo update-sram-repo update-osu-sc-repo
update-pr-repo:
if test "x${GF180MCU_PR_PATH}" != "x" ; then \
echo "Updating GF180MCU primitive library from ${PDK_LIB_PR}" ; \
../scripts/update.sh ${GF180MCU_PR_PATH} ; \
fi
update-pv-repo:
if test "x${GF180MCU_PV_PATH}" != "x" ; then \
echo "Updating GF180MCU verification library from ${PDK_LIB_PV}" ; \
../scripts/update.sh ${GF180MCU_PV_PATH} ; \
fi
update-io-repo:
if test "x${GF180MCU_IO_PATH}" != "x" ; then \
echo "Updating GF180MCU I/O library from ${PDK_LIB_IO}" ; \
../scripts/update.sh ${GF180MCU_IO_PATH} ; \
fi
update-sc-7t-repo:
if test "x${GF180MCU_SC_7T5V0_PATH}" != "x" ; then \
echo "Updating GF180MCU 7-track standard cell library from ${PDK_LIB_SC_7T5V0}" ; \
../scripts/update.sh ${GF180MCU_SC_7T5V0_PATH} ; \
fi
update-sc-9t-repo:
if test "x${GF180MCU_SC_9T5V0_PATH}" != "x" ; then \
echo "Updating GF180MCU 9-track standard cell library from ${PDK_LIB_SC_9T5V0}" ; \
../scripts/update.sh ${GF180MCU_SC_9T5V0_PATH} ; \
fi
update-sram-repo:
if test "x${GF180MCU_SRAM_PATH}" != "x" ; then \
echo "Updating GF180MCU SRAM macro library from ${PDK_LIB_SRAM}" ; \
../scripts/update.sh ${GF180MCU_SRAM_PATH} ; \
fi
update-osu-sc-repo:
if test "x${GF180MCU_OSU_SC_PATH}" != "x" ; then \
echo "Updating GF180MCU OSU 3.3V standard cell library from ${PDK_LIB_OSU_SC}" ; \
../scripts/update.sh ${GF180MCU_OSU_SC_PATH} ; \
fi
all-%: prerequisites
echo "Starting gf180mcu$* PDK staging on "`date` > ${GF180MCU$*}_make.log
${MAKE} general-$*
${MAKE} tools-$*
${MAKE} vendor-$*
echo "Ended gf180mcu$* PDK staging on "`date` >> ${GF180MCU$*}_make.log
general-%: ${TECH}.json
mkdir -p ${STAGING_PATH}/${GF180MCU$*}/${CONFIG_DIR}
rm -f ${STAGING_PATH}/${GF180MCU$*}/${CONFIG_DIR}/nodeinfo.json
${CPP} ${GF180MCU$*_DEFS} ${COMMIT_DEFS} ${TECH}.json \
${STAGING_PATH}/${GF180MCU$*}/${CONFIG_DIR}/nodeinfo.json
tools-A: $(addsuffix -A, $(TOOLS))
tools-B: $(addsuffix -B, $(TOOLS))
tools-C: $(addsuffix -C, $(TOOLS))
tools-D: $(addsuffix -D, $(TOOLS))
magic-%: magic/${TECH}.tech magic/${TECH}gds.tech magic/${TECH}.magicrc magic/${TECH}.tcl
mkdir -p ${MAGICTOP_STAGING_$*}
mkdir -p ${MAGIC_STAGING_$*}
rm -f ${MAGICTOP_STAGING_$*}/current
rm -f ${MAGIC_STAGING_$*}/${GF180MCU$*}.tech
rm -f ${MAGIC_STAGING_$*}/${GF180MCU$*}-GDS.tech
rm -f ${MAGIC_STAGING_$*}/${GF180MCU$*}.tcl
rm -f ${MAGIC_STAGING_$*}/${GF180MCU$*}-BindKeys
rm -f ${MAGIC_STAGING_$*}/magicrc
if test "${EF_STYLE}" == "1" ; then \
(cd ${MAGICTOP_STAGING_$*} ; ln -f -s ${REV_DIR} current) ; \
fi
${CPP} ${GF180MCU$*_DEFS} magic/${TECH}.tech \
${MAGIC_STAGING_$*}/${GF180MCU$*}.tech
${CPP} ${GF180MCU$*_DEFS} magic/${TECH}gds.tech \
${MAGIC_STAGING_$*}/${GF180MCU$*}-GDS.tech
${CPP} ${GF180MCU$*_DEFS} magic/${TECH}.magicrc \
${MAGIC_STAGING_$*}/${GF180MCU$*}.magicrc
${CPP} ${GF180MCU$*_DEFS} ${SCRIPTSDIR}/common/pdk.bindkeys \
${MAGIC_STAGING_$*}/${GF180MCU$*}-BindKeys
${CPP} ${GF180MCU$*_DEFS} magic/${TECH}.tcl \
${MAGIC_STAGING_$*}/${GF180MCU$*}.tcl
${CPP} ${GF180MCU$*_DEFS} ${SCRIPTSDIR}/common/pdk.tcl >> \
${MAGIC_STAGING_$*}/${GF180MCU$*}.tcl
netgen-%: netgen/${TECH}_setup.tcl
mkdir -p ${NETGENTOP_STAGING_$*}
mkdir -p ${NETGEN_STAGING_$*}
rm -f ${NETGEN_STAGING_$*}/${GF180MCU$*}_setup.tcl
rm -f ${NETGEN_STAGING_$*}/setup.tcl
${CPP} ${GF180MCU$*_DEFS} netgen/${TECH}_setup.tcl \
${NETGEN_STAGING_$*}/${GF180MCU$*}_setup.tcl
(cd ${NETGEN_STAGING_$*} ; ln -f -s ${GF180MCU$*}_setup.tcl setup.tcl)
qflow-%: qflow/${TECH}.sh qflow/${TECH}.par
mkdir -p ${QFLOWTOP_STAGING_$*}
mkdir -p ${QFLOW_STAGING_$*}
rm -f ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0.sh
rm -f ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0.par
rm -f ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0.sh
rm -f ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0.par
${CPP} ${GF180MCU$*_DEFS} -DLIBRARY=gf180mcu_fd_sc_mcu7t5v0 \
qflow/${TECH}.sh ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0.sh
${CPP} ${GF180MCU$*_DEFS} -DLIBRARY=gf180mcu_fd_sc_mcu9t5v0 \
qflow/${TECH}.sh ${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0.sh
${CPP} ${GF180MCU$*_DEFS} qflow/${TECH}.par \
${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0.par
${CPP} ${GF180MCU$*_DEFS} qflow/${TECH}.par \
${QFLOW_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0.par
irsim-%:
mkdir -p ${IRSIMTOP_STAGING_$*}
mkdir -p ${IRSIM_STAGING_$*}
klayout-%: ${GF180MCU_PV_PATH} ${GF180MCU_PR_PATH}
mkdir -p ${KLAYOUTTOP_STAGING_$*}
mkdir -p ${KLAYOUT_STAGING_$*}
rm -rf ${KLAYOUT_STAGING_$*}/drc
rm -rf ${KLAYOUT_STAGING_$*}/lvs
rm -rf ${KLAYOUT_STAGING_$*}/tech
rm -rf ${KLAYOUT_STAGING_$*}/pymacros
mkdir ${KLAYOUT_STAGING_$*}/drc
mkdir ${KLAYOUT_STAGING_$*}/lvs
mkdir ${KLAYOUT_STAGING_$*}/tech
mkdir ${KLAYOUT_STAGING_$*}/pymacros
cp -rp ${GF180MCU_PV_PATH}/klayout/drc/* \
${KLAYOUT_STAGING_$*}/drc
cp -rp ${GF180MCU_PV_PATH}/klayout/lvs/* \
${KLAYOUT_STAGING_$*}/lvs
cp -rp ${GF180MCU_PR_PATH}/cells/klayout/pymacros/cells/* \
${KLAYOUT_STAGING_$*}/pymacros
cp -rp ${GF180MCU_PR_PATH}/tech/klayout/* \
${KLAYOUT_STAGING_$*}/tech
cp -rp ${GF180MCU_PR_PATH}/cells/klayout/pymacros/*.lym \
${KLAYOUT_STAGING_$*}/tech
xcircuit-%:
rm -rf ${XCIRCUIT_STAGING_$*}
mkdir -p ${XCIRCUITTOP_STAGING_$*}
mkdir -p ${XCIRCUIT_STAGING_$*}
xschem-%: ${GF180MCU_PR_PATH}
rm -rf ${XSCHEM_STAGING_$*}
mkdir -p ${XSCHEMTOP_STAGING_$*}
mkdir -p ${XSCHEM_STAGING_$*}
cp -rp ${GF180MCU_PR_PATH}/cells/xschem/symbols ${XSCHEM_STAGING_$*}
cp -rp ${GF180MCU_PR_PATH}/cells/xschem/tests ${XSCHEM_STAGING_$*}
cp -rp ${GF180MCU_PR_PATH}/cells/xschem/xschemrc ${XSCHEM_STAGING_$*}
cat ./custom/xschem/xschemrc_append >> ${XSCHEM_STAGING_$*}/xschemrc
openlane-%: openlane/config.tcl openlane/gf180mcu_fd_sc_mcu7t5v0/config.tcl openlane/gf180mcu_fd_sc_mcu9t5v0/config.tcl
mkdir -p ${OPENLANETOP_STAGING_$*}
mkdir -p ${OPENLANE_STAGING_$*}
rm -rf ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0
rm -rf ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0
mkdir ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0
mkdir ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0
for file in ${OPENLANE_COMMON} ; do \
rm -f ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0/$$file ; \
done
for file in ${OPENLANE_COMMON} ; do \
rm -f ${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0/$$file ; \
done
${CPP} ${GF180MCU$*_DEFS} openlane/config.tcl ${OPENLANE_STAGING_$*}/config.tcl
for file in ${OPENLANE_COMMON} ; do \
${CPP} -quiet ${GF180MCU$*_DEFS} openlane/gf180mcu_fd_sc_mcu7t5v0/$$file \
${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu7t5v0/$$file ; \
done
for file in ${OPENLANE_COMMON} ; do \
${CPP} -quiet ${GF180MCU$*_DEFS} openlane/gf180mcu_fd_sc_mcu9t5v0/$$file \
${OPENLANE_STAGING_$*}/gf180mcu_fd_sc_mcu9t5v0/$$file ; \
done
rm -f ${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.min.*
rm -f ${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.nom.*
rm -f ${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.max.*
if test -f openlane/rules.openrcx.gf180mcu$*.min.magic ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.min.magic \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.min.magic ;\
fi
if test -f openlane/rules.openrcx.gf180mcu$*.nom.magic ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.nom.magic \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.nom.magic ;\
fi
if test -f openlane/rules.openrcx.gf180mcu$*.max.magic ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.max.magic \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.max.magic ;\
fi
if test -f openlane/rules.openrcx.gf180mcu$*.min ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.min \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.min ;\
fi
if test -f openlane/rules.openrcx.gf180mcu$*.nom ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.nom \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.nom ;\
fi
if test -f openlane/rules.openrcx.gf180mcu$*.max ; then \
${CPP} ${GF180MCU$*_DEFS} openlane/rules.openrcx.gf180mcu$*.max \
${OPENLANE_STAGING_$*}/rules.openrcx.gf180mcu$*.max ;\
fi
vendor-A: primitive-build-A digital-7t5v0-build-A digital-9t5v0-build-A io-build-A sram-build-A digital-osu-build-A
vendor-B: primitive-build-B digital-7t5v0-build-B digital-9t5v0-build-B io-build-B sram-build-B digital-osu-build-B
vendor-C: primitive-build-C digital-7t5v0-build-C digital-9t5v0-build-C io-build-C sram-build-C digital-osu-build-C
vendor-D: primitive-build-D digital-7t5v0-build-D digital-9t5v0-build-D io-build-D sram-build-D digital-osu-build-D
primitive-build-%:
if test "x${GF180MCU_PR_PATH}" != "x" ; then \
if test -d ${GF180MCU_PR_PATH} ; then \
echo "Building primitives library and simulation models" ;\
make primitive-$* ;\
fi ;\
fi
io-build-%:
if test "x${GF180MCU_IO_PATH}" != "x" ; then \
if test -d ${GF180MCU_IO_PATH} ; then \
echo "Building padframe I/O libraries" ;\
make io-$* ;\
fi ;\
fi
digital-9t5v0-build-%:
if test "x${GF180MCU_SC_9T5V0_PATH}" != "x" ; then \
if test -d ${GF180MCU_SC_9T5V0_PATH} ; then \
echo "Building 5V 9-track digital standard cell libraries" ;\
make digital-9t5v0-$* ;\
fi ;\
fi
digital-7t5v0-build-%:
if test "x${GF180MCU_SC_7T5V0_PATH}" != "x" ; then \
if test -d ${GF180MCU_SC_7T5V0_PATH} ; then \
echo "Building 5V 7-track digital standard cell libraries" ;\
make digital-7t5v0-$* ;\
fi ;\
fi
sram-build-%:
if test "x${GF180MCU_SRAM_PATH}" != "x" ; then \
if test -d ${GF180MCU_SRAM_PATH} ; then \
echo "Building SRAM libraries" ;\
make sram-$* ;\
fi ;\
fi
digital-osu-build-%:
if test "x${GF180MCU_OSU_SC_PATH}" != "x" ; then \
if test -d ${GF180MCU_OSU_SC_PATH} ; then \
echo "Building OSU 3.3V digital standard cell libraries" ;\
make digital-osu-$* ;\
fi ;\
fi
primitive-%:
# Install tech LEF and primitive devices from vendor files
${STAGE} -source ${GF180MCU_PR_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-ngspice models/ngspice/*.ngspice \
-xyce models/xyce/*.xyce \
2>&1 | tee -a ${GF180MCU$*}_make.log
# Install primitive device fixed layout cells from GDS
${STAGE} -source ${GF180MCU_PR_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-gds cells/klayout/pymacros/cells/*/*.gds noextract \
-library primitive gf180mcu_fd_pr \
2>&1 | tee -a ${GF180MCU$*}_make.log
# The klayout GUI prefers that drc/ and lvs/ exist under tech/,
# so make symbolic links.
(cd ${STAGING_PATH}/${GF180MCU$*}/libs.tech/klayout/tech ; \
ln -f -s ../lvs ; ln -f -s ../drc)
# Add "device primitive" property to the bipolar devices and
# order the ports correctly to match the subcircuit model. This
# ensures that the bipolar layouts extract correctly.
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x02p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x02p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x04p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x04p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x08p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x08p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x16p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x16p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_05p00x05p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_05p00x05p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_10p00x10p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_10p00x10p00 I1_default_C I1_default_B I1_default_E I1_default_S
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x00p42 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x00p42 I1_default_C I1_default_B I1_default_E
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x05p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x05p00 I1_default_C I1_default_B I1_default_E
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_10p00x10p00 "device primitive"
${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_10p00x10p00 I1_default_C I1_default_B I1_default_E
# Cells which have a different cell name than the device name
# should replace the "gencell" property with the device name.
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
efuse_cell "gencell efuse"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x02p00_0 "gencell npn_00p54x02p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x04p00_0 "gencell npn_00p54x04p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x08p00_0 "gencell npn_00p54x08p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_00p54x16p00_0 "gencell npn_00p54x16p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_05p00x05p00_0 "gencell npn_05p00x05p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
npn_10p00x10p00_0 "gencell npn_10p00x10p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x00p42_0 "gencell pnp_05p00x00p42"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_05p00x05p00_0 "gencell pnp_05p00x05p00"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_10p00x00p42_0 "gencell pnp_10p00x00p42"
${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
pnp_10p00x10p00_0 "gencell pnp_10p00x10p00"
digital-9t5v0-%:
# Install 5V 9-track digital standard cells from vendor files
${STAGE} -source ${GF180MCU_SC_9T5V0_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-techlef tech/gf180mcu_${$*_FULLSTACK}_9t_tech.lef \
filter=custom/scripts/fix_techlef.py \
rename=gf180mcu_fd_sc_mcu9t5v0__nom.tlef \
-cdl cells/*/*.cdl compile-only noconvert \
-liberty cells/*/*_ff_125C_1v98.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_1v98.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_1v98 \
-liberty cells/*/*_ff_n40C_1v98.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_1v98.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_1v98 \
-liberty cells/*/*_ff_125C_3v60.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_3v60.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_3v60 \
-liberty cells/*/*_ff_n40C_3v60.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_3v60.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_3v60 \
-liberty cells/*/*_ff_125C_5v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_125C_5v50.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_125C_5v50 \
-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ff_n40C_5v50.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ff_n40C_5v50 \
-liberty cells/*/*_ss_125C_1v62.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_1v62.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_1v62 \
-liberty cells/*/*_ss_n40C_1v62.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_1v62.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_1v62 \
-liberty cells/*/*_ss_125C_3v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_3v00.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_3v00 \
-liberty cells/*/*_ss_n40C_3v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_3v00.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_3v00 \
-liberty cells/*/*_ss_125C_4v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_125C_4v50.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_125C_4v50 \
-liberty cells/*/*_ss_n40C_4v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__ss_n40C_4v50.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__ss_n40C_4v50 \
-liberty cells/*/*_tt_025C_1v80.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_1v80.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_1v80 \
-liberty cells/*/*_tt_025C_3v30.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_3v30.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_3v30 \
-liberty cells/*/*_tt_025C_5v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu9t5v0__tt_025C_5v00.lib \
rename=gf180mcu_fd_sc_mcu9t5v0__tt_025C_5v00 \
-spice cells/*/*.cdl compile-only \
filter=custom/scripts/convert_sc_cdl.py \
-gds cells/*/*.gds compile-only \
options=custom/scripts/gds_import_sc.tcl \
filter=custom/scripts/fix_stdcell_gds.py \
-lef cells/*/*.lef annotate compile-only \
filter=custom/scripts/fix_digital_lef.py \
-verilog models/*/*.v compile-only rename=primitives \
-verilog cells/*/*.v exclude=*.*.v,primitives.v \
compile-only filter=custom/scripts/inc_verilog.py \
-library digital gf180mcu_fd_sc_mcu9t5v0 2>&1 | \
tee -a ${GF180MCU$*}_make.log
# Create minimum/maximum technology LEF files
./custom/scripts/make_minmax_techlef.py ${EF_FORMAT} -variant=${GF180MCU$*} \
-library=9t5v0 2>&1 | tee -a ${GF180MCU$*}_make.log || true
digital-7t5v0-%:
# Install 5V 7-track digital standard cells from vendor files
${STAGE} -source ${GF180MCU_SC_7T5V0_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-techlef tech/gf180mcu_${$*_FULLSTACK}_7t_tech.lef \
filter=custom/scripts/fix_techlef.py \
rename=gf180mcu_fd_sc_mcu7t5v0__nom.tlef \
-cdl cells/*/*.cdl compile-only noconvert \
-liberty cells/*/*_ff_125C_1v98.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_1v98.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_1v98 \
-liberty cells/*/*_ff_n40C_1v98.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_1v98.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_1v98 \
-liberty cells/*/*_ff_125C_3v60.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_3v60.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_3v60 \
-liberty cells/*/*_ff_n40C_3v60.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_3v60.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_3v60 \
-liberty cells/*/*_ff_125C_5v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_125C_5v50.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_125C_5v50 \
-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ff_n40C_5v50 \
-liberty cells/*/*_ss_125C_1v62.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_1v62.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_1v62 \
-liberty cells/*/*_ss_n40C_1v62.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_1v62.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_1v62 \
-liberty cells/*/*_ss_125C_3v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_3v00.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_3v00 \
-liberty cells/*/*_ss_n40C_3v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_3v00.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_3v00 \
-liberty cells/*/*_ss_125C_4v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50 \
-liberty cells/*/*_ss_n40C_4v50.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__ss_n40C_4v50.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__ss_n40C_4v50 \
-liberty cells/*/*_tt_025C_1v80.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_1v80.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_1v80 \
-liberty cells/*/*_tt_025C_3v30.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_3v30.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_3v30 \
-liberty cells/*/*_tt_025C_5v00.lib compile-only \
filter=custom/scripts/fix_related_bias_pins.py \
header=liberty/gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00.lib \
rename=gf180mcu_fd_sc_mcu7t5v0__tt_025C_5v00 \
-spice cells/*/*.cdl compile-only \
filter=custom/scripts/convert_sc_cdl.py \
-gds cells/*/*.gds compile-only \
options=custom/scripts/gds_import_sc.tcl \
filter=custom/scripts/fix_stdcell_gds.py \
-lef cells/*/*.lef annotate compile-only \
filter=custom/scripts/fix_digital_lef.py \
-verilog models/*/*.v compile-only rename=primitives \
-verilog cells/*/*.v exclude=*.*.v,primitives.v \
compile-only filter=custom/scripts/inc_verilog.py \
-library digital gf180mcu_fd_sc_mcu7t5v0 2>&1 | \
tee -a ${GF180MCU$*}_make.log
# Create minimum/maximum technology LEF files
./custom/scripts/make_minmax_techlef.py ${EF_FORMAT} -variant=${GF180MCU$*} \
-library=7t5v0 2>&1 | tee -a ${GF180MCU$*}_make.log || true
digital-osu-%:
# Install OSU 3.3V digital standard cells from vendor files
# NOTE: Work in progress (to be completed)
${STAGE} -source ${GF180MCU_OSU_SC_PATH}/gf180mcu_osu_sc_gp9t3v3 \
-target ${STAGING_PATH}/${GF180MCU$*} \
-techlef ../tlef/gf180mcu_5LM_1TM_9K_9t.tlef \
rename=gf180mcu_fd_sc_mcu7t5v0__nom.tlef \
-liberty lib/gf180mcu_osu_sc_gp9t3v3_TT_3P3_25C.ccs.lib \
rename=gf180mcu_osu_sc_gp9t3v3__tt_025C_3v30 \
-verilog cells/*/*.v compile-only \
-lef cells/*/*.lef compile-only \
-gds cells/*/*.gds compile-only \
-spice cells/*/*.spice compile-only \
-xschem cells/*/*.sch \
-library digital gf180mcu_osu_sc_gp9t3v3 2>&1 | \
tee -a ${GF180MCU$*}_make.log
${STAGE} -source ${GF180MCU_OSU_SC_PATH}/gf180mcu_osu_sc_gp12t3v3 \
-target ${STAGING_PATH}/${GF180MCU$*} \
-techlef ../tlef/gf180mcu_5LM_1TM_9K_12t.tlef \
rename=gf180mcu_fd_sc_mcu7t5v0__nom.tlef \
-liberty lib/gf180mcu_osu_sc_gp12t3v3_TT_25C.ccs.lib \
rename=gf180mcu_osu_sc_gp12t3v3__tt_025C_3v30 \
-verilog cells/*/*.v compile-only \
-lef cells/*/*.lef compile-only \
-gds cells/*/*.gds compile-only \
-spice cells/*/*.spice compile-only \
-xschem cells/*/*.sch \
-library digital gf180mcu_osu_sc_gp12t3v3 2>&1 | \
tee -a ${GF180MCU$*}_make.log
io-%:
# Install I/O cells from vendor files
# Note: Do not use GF LEF views. Annotate only. LEF is being renamed
# back to the original, although eventually all files will be changed
# to canonical names.
${STAGE} -source ${GF180MCU_IO_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-cdl cells/*/*.cdl compile-only noconvert \
-liberty cells/*/*_ff_125C_2v75.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_125C_2v75.lib \
rename=gf180mcu_fd_io__ff_125C_2v75 \
-liberty cells/*/*_ff_n40C_2v75.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_n40C_2v75.lib \
rename=gf180mcu_fd_io__ff_n40C_2v75 \
-liberty cells/*/*_ff_125C_3v63.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_125C_3v63.lib \
rename=gf180mcu_fd_io__ff_125C_3v63 \
-liberty cells/*/*_ff_n40C_3v63.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_n40C_3v63.lib \
rename=gf180mcu_fd_io__ff_n40C_3v63 \
-liberty cells/*/*_ff_125C_5v50.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_125C_5v50.lib \
rename=gf180mcu_fd_io__ff_125C_5v50 \
-liberty cells/*/*_ff_n40C_5v50.lib compile-only \
header=liberty/gf180mcu_fd_io__ff_n40C_5v50.lib \
rename=gf180mcu_fd_io__ff_n40C_5v50 \
-liberty cells/*/*_ss_125C_2v25.lib compile-only \
header=liberty/gf180mcu_fd_io__ss_125C_2v25.lib \
rename=gf180mcu_fd_io__ss_125C_2v25 \
-liberty cells/*/*_ss_125C_2v97.lib compile-only \
header=liberty/gf180mcu_fd_io__ss_125C_2v97.lib \
rename=gf180mcu_fd_io__ss_125C_2v97 \
-liberty cells/*/*_ss_125C_4v50.lib compile-only \
header=liberty/gf180mcu_fd_io__ss_125C_4v50.lib \
rename=gf180mcu_fd_io__ss_125C_4v50 \
-liberty cells/*/*_tt_025C_2v50.lib compile-only \
header=liberty/gf180mcu_fd_io__tt_025C_2v50.lib \
rename=gf180mcu_fd_io__tt_025C_2v50 \
-liberty cells/*/*_tt_025C_3v30.lib compile-only \
header=liberty/gf180mcu_fd_io__tt_025C_3v30.lib \
rename=gf180mcu_fd_io__tt_025C_3v30 \
-liberty cells/*/*_tt_025C_5v00.lib compile-only \
header=liberty/gf180mcu_fd_io__tt_025C_5v00.lib \
rename=gf180mcu_fd_io__tt_025C_5v00 \
-spice cells/*/*.cdl compile-only \
filter=custom/scripts/convert_io_cdl.py \
-gds cells/*/*_${$*_STACK}.gds compile-only \
options=custom/scripts/gds_import_io.tcl \
-lef cells/*/*_${$*_STACK}.lef \
annotate lefopts=-hide compile-only \
filter=custom/scripts/fix_io_lef.py \
-verilog cells/*/*.v compile-only \
-library general gf180mcu_fd_io 2>&1 | tee -a ${GF180MCU$*}_make.log
# Quick solution to extraction issue---add the isolated substrate layer
# in the corner clamp cell that contains the devices being isolated.
${ADDLAYER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_io ESD_CLAMP_COR \
isosubstrate "-42 43458 56113 57130 40932 43016 57057 55812" -mag
# Permanent solution to the extraction issue---modify the GDS with the
# isolated substrate layer.
./custom/scripts/fix_io_cor_gds.py \
${STAGING_PATH}/${GF180MCU$*}/libs.ref/${IO_GDS}/gf180mcu_fd_io.gds
sram-%:
# Install SRAM macros from vendor files
${STAGE} -source ${GF180MCU_SRAM_PATH} \
-target ${STAGING_PATH}/${GF180MCU$*} \
-cdl cells/*/*.cdl noconvert \
-liberty cells/*/*.lib \
-spice cells/*/*.cdl \
filter=custom/scripts/convert_sram_cdl.py \
rename=*.spice \
-gds cells/*/*.gds \
options=custom/scripts/gds_import_sram.tcl \
filter=custom/scripts/fix_sram_gds.py \
-lef cells/*/*.lef \
-verilog cells/*/*.v \
-library general gf180mcu_fd_ip_sram 2>&1 | tee -a ${GF180MCU$*}_make.log
# Remove "BL" labels from the rarray4_* cells, otherwise extraction
# of the SRAMs without using "extract unique" will fail.
${REMOVELAB} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_ip_sram \
rarray4_\* BL\* -mag
install: $(foreach var, ${VARIANTS}, install-$(var))
install-A:
echo "Starting GF180MCU PDK migration on "`date` > ${GF180MCUA}_install.log
${INSTALL} \
-source ${STAGING_PATH}/${GF180MCUA} \
-finalpath ${SHARED_PDKS_PATH}/${GF180MCUA} \
-variable PDKPATH \
-link_from ${DIST_LINK_TARGETS_A} 2>&1 | tee -a ${GF180MCUA}_install.log
echo "Ended GF180MCU PDK migration on "`date` >> ${GF180MCUA}_install.log
install-B: install-A
echo "Starting GF180MCU PDK migration on "`date` > ${GF180MCUB}_install.log
${INSTALL} \
-source ${STAGING_PATH}/${GF180MCUB} \
-finalpath ${SHARED_PDKS_PATH}/${GF180MCUB} \
-variable PDKPATH \
-link_from ${DIST_LINK_TARGETS_B} 2>&1 | tee -a ${GF180MCUB}_install.log
echo "Ended GF180MCU PDK migration on "`date` >> ${GF180MCUB}_install.log
install-C: install-A
echo "Starting GF180MCU PDK migration on "`date` > ${GF180MCUC}_install.log
${INSTALL} \
-source ${STAGING_PATH}/${GF180MCUC} \
-finalpath ${SHARED_PDKS_PATH}/${GF180MCUC} \
-variable PDKPATH \
-link_from ${DIST_LINK_TARGETS_C} 2>&1 | tee -a ${GF180MCUC}_install.log
echo "Ended GF180MCU PDK migration on "`date` >> ${GF180MCUC}_install.log
install-D: install-A
echo "Starting GF180MCU PDK migration on "`date` > ${GF180MCUD}_install.log
${INSTALL} \
-source ${STAGING_PATH}/${GF180MCUD} \
-finalpath ${SHARED_PDKS_PATH}/${GF180MCUD} \
-variable PDKPATH \
-link_from ${DIST_LINK_TARGETS_C} 2>&1 | tee -a ${GF180MCUD}_install.log
echo "Ended GF180MCU PDK migration on "`date` >> ${GF180MCUD}_install.log
uninstall: $(foreach var, ${VARIANTS}, uninstall-$(var))
uninstall-A:
echo "Uninstalling GF180MCU PDK from ${SHARED_PDKS_PATH}"
if test "x${SHARED_PDKS_PATH}" != "x" ; then \
${RM} -rf ${SHARED_PDKS_PATH}/${GF180MCUA} ; \
fi
echo "Finished GF180MCU PDK uninstall"
uninstall-B:
echo "Uninstalling GF180MCU PDK from ${SHARED_PDKS_PATH}"
if test "x${SHARED_PDKS_PATH}" != "x" ; then \
${RM} -rf ${SHARED_PDKS_PATH}/${GF180MCUB} ; \
fi
echo "Finished GF180MCU PDK uninstall"
uninstall-C:
echo "Uninstalling GF180MCU PDK from ${SHARED_PDKS_PATH}"
if test "x${SHARED_PDKS_PATH}" != "x" ; then \
${RM} -rf ${SHARED_PDKS_PATH}/${GF180MCUC} ; \
fi
echo "Finished GF180MCU PDK uninstall"
uninstall-D:
echo "Uninstalling GF180MCU PDK from ${SHARED_PDKS_PATH}"
if test "x${SHARED_PDKS_PATH}" != "x" ; then \
${RM} -rf ${SHARED_PDKS_PATH}/${GF180MCUD} ; \
fi
echo "Finished GF180MCU PDK uninstall"
clean: $(foreach var, ${VARIANTS}, clean-$(var))
clean-A:
${STAGE} -target ${STAGING_PATH}/${GF180MCUA} -clean
clean-B:
${STAGE} -target ${STAGING_PATH}/${GF180MCUB} -clean
clean-C:
${STAGE} -target ${STAGING_PATH}/${GF180MCUC} -clean
clean-D:
${STAGE} -target ${STAGING_PATH}/${GF180MCUD} -clean
veryclean: $(foreach var, ${VARIANTS}, veryclean-$(var))
veryclean-A: clean-A
${RM} ${GF180MCUA}_make.log
${RM} ${GF180MCUA}_install.log
veryclean-B: clean-B
${RM} ${GF180MCUB}_make.log
${RM} ${GF180MCUB}_install.log
veryclean-C: clean-C
${RM} ${GF180MCUC}_make.log
${RM} ${GF180MCUC}_install.log
veryclean-D: clean-D
${RM} ${GF180MCUD}_make.log
${RM} ${GF180MCUD}_install.log