Corrected the extraction method for devices with terminals on the

implicit global substrate, as a block of code meant to handle this
case was left unreachable by another recent code fix.
This commit is contained in:
Tim Edwards 2021-01-21 09:57:03 -05:00
parent cf54d146d1
commit 3c42c5a7f3
4 changed files with 31 additions and 500 deletions

1
.gitignore vendored
View File

@ -21,6 +21,7 @@ scmos/scmos-sub.tech
scmos/scmos-tm.tech
scmos/scmos.tech
scmos/scmosWR.tech
scmos/nmos.tech
tcltk/magic.sh
tcltk/magic.tcl
tcltk/magicdnull

View File

@ -1 +1 @@
8.3.119
8.3.120

View File

@ -1812,8 +1812,33 @@ extOutputDevices(def, transList, outFile)
|| (TTMaskHasType(tmask, TT_SPACE)))
{
node = NULL;
/* First try to find a region under the device */
extTransFindSubs(reg->treg_tile, t, tmask, def, &node, NULL);
if (node == NULL) {
if ((node == NULL) && (TTMaskHasType(tmask, TT_SPACE))) {
/* Device node is possibly the substrate. But: Note */
/* that TT_SPACE in the mask covers all planes, and it */
/* is not possible to specify TT_SPACE in a single */
/* plane. So it is necessary to check for any */
/* shielding types that block the substrate. */
if (!TTMaskIsZero(&ExtCurStyle->exts_globSubstrateShieldTypes))
{
extTransFindSubs(reg->treg_tile, t,
&ExtCurStyle->exts_globSubstrateShieldTypes,
def, &node, NULL);
}
if ((glob_subsnode == NULL) || (node != NULL)) {
/* See if there is another matching device record */
/* with a different terminal type, and try again. */
devptr = extDevFindMatch(devptr, t);
break;
}
else if ((node == NULL) && (glob_subsnode != NULL))
node = glob_subsnode;
}
else if (node == NULL) {
/* See if there is another matching device record */
/* with a different terminal type, and try again. */
devptr = extDevFindMatch(devptr, t);
@ -1822,29 +1847,6 @@ extOutputDevices(def, transList, outFile)
extTransRec.tr_devmatch |= (MATCH_TERM << termcount);
extTransRec.tr_termnode[termcount] = node;
}
else if (TTMaskHasType(tmask, TT_SPACE)) {
/* Device node is possibly the substrate. But: Note that */
/* TT_SPACE in the mask covers all planes, and it is not */
/* possible to specify TT_SPACE in a single plane. So it */
/* is necessary to check for any shielding types that */
/* block the substrate. */
node = NULL;
if (!TTMaskIsZero(&ExtCurStyle->exts_globSubstrateShieldTypes))
{
extTransFindSubs(reg->treg_tile, t,
&ExtCurStyle->exts_globSubstrateShieldTypes,
def, &node, NULL);
}
if ((glob_subsnode == NULL) || (node != NULL)) {
/* See if there is another matching device record */
/* with a different terminal type, and try again. */
devptr = extDevFindMatch(devptr, t);
break;
}
extTransRec.tr_devmatch |= (MATCH_TERM << termcount);
extTransRec.tr_termnode[termcount] = glob_subsnode;
}
else {
/* Determine if there is another matching device record */
/* that has fewer required terminals. */
@ -3173,8 +3175,9 @@ extSpecialPerimFunc(bp, sense)
break;
if (thisterm >= extTransRec.tr_nterm)
{
if (toutside == TT_SPACE)
TxError("Internal Error in Transistor Perimeter Boundary Search!\n");
/* This is not necessarily an error; e.g., happens for */
/* a device like a diode with TT_SPACE in the source/ */
/* drain list. */
return 1;
}
}

View File

@ -1,473 +0,0 @@
#
# nmos.tech --
#
# Defines the MOSIS 4.0 micron NMOS technology for Magic. Some
# of the characteristics of this technology are:
#
# 1. 1 level of metal.
# 2. Buried contacts.
# 3. No butting contacts.
#
# Copyright (C) 1985 Regents of the University of California
# All rights reserved.
#
# sccsid @(#)nmos.tech 3.73 MAGIC (Berkeley) 11/22/85
#
tech
format 35
nmos
end
version
version 0
description "MOSIS 4.0 micron NMOS"
requires magic-8.3.0
end
planes
active,diff,poly_diff
metal
end
types
active polysilicon,poly,red
active diffusion,diff,green
metal metal,blue
active poly_metal_contact,pmc
active diff_metal_contact,dmc
active enhancement_fet,efet
active depletion_fet,dfet
active depletion_capacitor,dcap
active buried_contact,bc
metal glass_contact,glass
end
styles
styletype mos
polysilicon 1
diffusion 2
metal 20
enhancement_fet 6
enhancement_fet 7
depletion_fet 6
depletion_fet 10
depletion_capacitor 6
depletion_capacitor 11
buried_contact 6
buried_contact 33
poly_metal_contact 1
poly_metal_contact 20
poly_metal_contact 32
diff_metal_contact 2
diff_metal_contact 20
diff_metal_contact 32
glass_contact 20
glass_contact 34
error_s 42
error_p 42
error_ps 42
# Hint layers
magnet 39
fence 38
rotate 37
end
contact
pmc poly metal
dmc diff metal
end
aliases
allDiff diff,dmc,bc,efet,dfet,dcap
allPoly poly,pmc,bc,efet,dfet,dcap
tran efet,dfet
allMetal metal,pmc,dmc,glass
spP (space,poly,pmc)/a
sdD (space,diff,dmc)/a
notDmc space,metal,pmc,glass
notPmc space,metal,dmc,glass
allButFet (space,diff,poly,dmc,pmc,bc)/a
allpdTypes (space,diff,poly,dmc,pmc,bc,dfet,dcap,efet)/a
end
compose
# The following rule allows transistors to be built up of poly and diff */
compose efet poly diff
# The following rules allow poly or diff to be erased from fets or bcs */
decompose dfet poly diff
decompose dcap poly diff
decompose bc poly diff
# The following lets us erase metal from a glass_contact to get space */
erase glass metal space
end
#
# Electrical connectivity. Each tile in the group on the left
# is considered to be connected to each tile in the group on
# the right. Tiles within the groups are not necessarily
# connected to each other.
#
connect
poly pmc,efet,dfet,dcap,bc
diff bc,dmc
efet pmc,dmc,bc,dfet,dcap
dfet pmc,dmc,bc,dcap
dcap pmc,dmc,bc
pmc dmc,bc
dmc bc
metal glass,pmc,dmc
glass pmc,dmc
end
# Information used to generate CIF files. The only tricky business
# is to merge necks between adjacent implants or buried windows.
# The grow-shrink does this. Also, note that labels on Magic layers
# get attached to the first CIF layer containing that Magic layer
# in an "or" or "bloat-or" statement. This makes order important
# (for example, we want transistor labels to attach to the poly gate).
#
cifoutput
style lambda=2
scalefactor 200 100
layer NP poly,pmc,efet,dfet,dcap,bc
labels poly,efet,dfet,dcap,bc
calma 1 1
layer ND diff,dmc,efet,dfet,dcap,bc
labels diff
calma 2 1
layer NM metal,pmc,dmc,glass
labels metal,pmc,dmc,glass
calma 3 1
layer NI
bloat-or dfet,dcap * 200 diff,bc 400
grow 100
shrink 100
calma 4 1
layer NC dmc
squares 400
calma 5 1
layer NC pmc
squares 400
calma 6 1
layer NG glass
calma 7 1
layer NB
bloat-or bc * 200 diff,dmc 400 dfet 0
grow 100
shrink 100
calma 8 1
end
# Information on how to read CIF files. Read in all the CIF layers,
# then perform geometric operations to get the Magic layers. The
# order in which the Magic layers are generated is important!
#
cifinput
style lambda=2
scalefactor 200
layer poly NP
labels NP
layer diff ND
labels ND
layer metal NM
labels NM
layer efet NP
and ND
layer dfet NI
and NP
and ND
layer pmc NC
grow 200
and NM
and NP
layer dmc NC
grow 200
and NM
and ND
# Buried contacts must be generated after transistors, since they
# override transistors.
#
layer bc NB
and NP
and ND
layer glass NG
end
mzrouter
style irouter
layer metal 32 32 256 1
layer poly 64 64 256 1
contact pmc metal poly 1024
end
#
# DRC information
# Width, spacing and edge rules are "compiled" into rules table entries.
#
# width: types in the mask, taken collectively, must have the given width
#
# spacing: types in mask1 must be separated by distance from types in mask2
#
# edge: explict entries for the rules table --
# LHS RHS distance types allowed on RHS corner mask reason
#
# All combinations of single elements of the LHS and RHS masks
# are used to form a rule.
#
drc
width allDiff 2 "Diffusion width must be at least 2"
width dmc 4 "Metal_diff contact width must be at least 4"
width allPoly 2 "Polysilicon width must be at least 2"
width pmc 4 "Metal_poly contact width must be at least 4"
width bc 2 "Buried contact width must be at least 2"
width efet 2 "Enhancement FET width must be at least 2"
width dfet 2 "Depletion FET width must be at least 2"
width dcap 2 "Depletion capacitor width must be at least 2"
width allMetal 3 "Metal width must be at least 3"
spacing allDiff allDiff 3 touching_ok \
"Diff-diff separation must be at least 3"
spacing allPoly allPoly 2 touching_ok \
"Poly-poly separation must be at least 2"
spacing tran pmc,dmc 1 touching_illegal \
"Transistor-contact separation must be at least 1"
spacing efet dfet,dcap 3 touching_illegal \
"Enhancement-depletion transistor separation must be at least 3"
spacing allMetal allMetal 3 touching_ok \
"Metal-metal separation must be at least 3"
#
# Diff and poly cannot be adjacent, except at corners where
# the intermediate material is "bc", "efet", "dfet", or "dcap".
# Thus, there is no need for rules with RHS equal to "Bef".
# But corner extension applies if the intermediate material is "s".
# For this reason, the first edge rule CANNOT be rewritten as
# "edge diff pP 1 0 pP 1".
#
edge diff spP 1 (space)/a spP 1 \
"Diff-poly separation must be at least 1"
edge poly sdD 1 (space)/a sdD 1 \
"Diff-poly separation must be at least 1"
#
# Allow dmc and pmc to be adjacent since they are electrically shorted.
#
edge dmc (space,poly)/a 1 (space)/a (space,poly)/a 1 \
"Diff-poly separation must be at least 1"
edge pmc (space,diff)/a 1 (space)/a (space,diff)/a 1 \
"Diff-poly separation must be at least 1"
#
# Don't let pmc and dmc have convex shapes, since this may interfere
# with the via-generation process. The corner check in the rules
# below does this. Also don't let contacts overlap between cells
# unless they do so exactly.
#
edge4way dmc notDmc 1 notDmc notDmc,dmc 1 \
"Diffusion-metal contacts must be rectangular"
edge4way pmc notPmc 1 notPmc notPmc,pmc 1 \
"Poly-metal contacts must be rectangular"
exact_overlap pmc,dmc
#
# Transistors cannot touch space, except in corners.
# The corner mask is set to 0 to prevent checking there.
#
edge tran (space)/a 1 0 0 0 \
"Transistor overhang is missing"
edge (space)/a tran 1 0 0 0 \
"Transistor overhang is missing"
#
# Buried contacts must be 3 lambda from efets in all cases,
# and 4 lambda in some. Depends on the orientation of the
# buried contact implant. The 4x3 corner checks ON BOTH
# SIDES solve the problem. Buried contacts may abut
# depletion transistors, but only if the transistors are
# fairly long (otherwise, a misalignment in the buried
# window mask may make a huge difference in the transistor's
# effective length).
#
spacing bc efet 3 touching_illegal \
"Buried contact-transistor separation must be at least 3"
spacing bc dfet 3 touching_ok \
"Buried contact-transistor separation must be at least 3"
edge4way bc diff,dmc 4 allButFet allpdTypes 3 \
"Buried contact-transistor separation must be at least 4 on diff side"
edge4way bc dfet 4 dfet 0 0 \
"Transistors next to buried contacts must be at least 4 long"
#
# WARNING: The above rules don't take care of poly approaching
# the buried contact on the diffusion side. Unfortunately, the
# only fix is a rule that is ridiculously conservative. So
# for now, buyer beware!
#
#
# 3 by 2 shape of buried contact next to dfet.
# No corner check.
#
edge4way dfet bc 3 bc 0 0 \
"Buried contact next to depletion transistor must be at least 3x2"
#
# Poly and diffusion must overhang transistors by 2.
#
# Corner checks are necessary for L or S shaped transistors.
#
# Don't worry about dfet -- buried_contact boundaries here.
#
edge4way tran poly 2 poly,pmc poly 2 \
"Polysilicon must overhang transistor by at least 2"
edge4way tran diff 2 diff,dmc diff 2 \
"Diffusion must overhang transistor by at least 2"
# Cannot change transistors as a result of cell overlaps */
no_overlap efet,dfet efet,dfet
end
#
# Parameters for circuit extraction.
# A type may appear both as a node and as a transistor. When it
# appears as a node, we are describing the gate, and when it appears
# as a transistor, we are describing the channel.
#
extract
style default
# scale factor: output units (centimicrons) per lambda */
lambda 200
# chunk size for hierarchical extraction, in lambda */
step 100
planeorder active 0
planeorder metal 1
# sheet resistivity milli-ohms per square */
resist poly,pmc/poly,efet,dfet,bc 30000
resist diff,dmc/poly 10000
resist metal,glass 30
# area capacitance atto-farads/lambda**2 */
areacap poly,efet,dfet 200
areacap metal,glass 120
areacap diff 400
areacap bc 600
areacap dmc/poly 520
areacap pmc/poly 320
# sidewall capacitance atto-farads/lambda */
perimc diff,dmc/poly,bc space,dfet,efet 200
# transistors terms #terms name substr gs-cap gc-cap */
fet efet diff 2 efet GND! 0 0
fet dfet diff,bc 2 dfet GND! 0 0
fet dcap diff,bc 1 dcap GND! 0 0
# End of style "default" */
end
# Information for the wiring interface */
wiring
contact pmc 4 metal 0 poly 0
contact dmc 4 metal 0 diff 0
contact bc 2 poly 0 diff 0
end
# Information to control the router */
router
layer1 metal 3 metal,pmc/metal,dmc/metal,glass 3
layer2 poly 2 poly,efet,dfet,dcap,pmc,bc 2 diff,dmc 1
contacts pmc 4
gridspacing 7
end
# Information for plowing */
plowing
fixed efet,dfet,dcap,bc,glass
covered efet,dfet,dcap,bc
drag efet,dfet,dcap,bc
end
plot
style versatec
# Same as Gremlin stipple 9: */
dfet,dcap \
07c0 0f80 1f00 3e00 \
7c00 f800 f001 e003 \
c007 800f 001f 003e \
00c7 00f8 01f0 03e0
# Same as Gremlin stipple 10: */
efet,dcap \
1f00 0f80 07c0 03e0 \
01f0 00f8 007c 003e \
001f 800f c007 e003 \
f001 f800 7c00 3e00
# Same as Gremlin stipple 11: */
bc \
c3c3 c3c3 0000 0000 \
0000 0000 c3c3 c3c3 \
c3c3 c3c3 0000 0000 \
0000 0000 c3c3 c3c3
# Same as Gremlin stipple 12: */
glass \
0040 0080 0100 0200 \
0400 0800 1000 2000 \
4000 8000 0001 0002 \
0004 0008 0010 0020
# Same as Gremlin stipple 17: */
diff,dmc/active,efet,dfet,dcap,bc \
0000 4242 6666 0000 \
0000 2424 6666 0000 \
0000 4242 6666 0000 \
0000 2424 6666 0000
# Same as Gremlin stipple 19: */
poly,pmc/active,efet,dfet,dcap,bc \
0808 0400 0202 0101 \
8080 4000 2020 1010 \
0808 0004 0202 0101 \
8080 0040 2020 1010
# Same as Gremlin stipple 22: */
metal,dmc/metal,pmc/metal,glass \
8080 0000 0000 0000 \
0808 0000 0000 0000 \
8080 0000 0000 0000 \
0808 0000 0000 0000
# Same as Gremlin stipple 23: */
glass \
0000 0000 1c1c 3e3e \
3636 3e3e 1c1c 0000 \
0000 0000 1c1c 3e3e \
3636 3e3e 1c1c 0000
pmc,dmc X
bc B
style gremlin
dfet,dcap 9
efet,dcap 10
bc 11
glass 12
diff,dmc/active,efet,dfet,dcap,bc 17
poly,pmc/active,efet,dfet,dcap,bc 19
metal,dmc,pmc,glass 22
pmc,dmc X
bc B
end