com.sun.electric.tool.generator.layout
Class StdCellParams

java.lang.Object
  extended by com.sun.electric.tool.generator.layout.StdCellParams

public class StdCellParams
extends java.lang.Object

The bottom of the PMOS well and the top of the NMOS well are at y=0. PMOS tracks are numbered from 1 to nbPmosTracks(). These numbers correspond to the lowest and highest, respectively, unblocked tracks in the PMOS region. NMOS tracks are numbered from -1 to -nbNmosTracks(). These numbers correspond to the highest and lowest, respectively, unblocked tracks in the NMOS region.


Nested Class Summary
static class StdCellParams.SelectFill
           
static interface StdCellParams.SelectSrcDrn
          This class allows the user to specify which source/drains wireVddGnd() should connect to power or ground.
 
Field Summary
static StdCellParams.SelectSrcDrn EVEN
           
static StdCellParams.SelectSrcDrn ODD
           
 
Constructor Summary
StdCellParams(TechType.TechTypeEnum techEnum)
           
 
Method Summary
 void addEssentialBounds(double loX, double hiX, Cell cell)
          essential bounds for cells with both NMOS and PMOS
static void addEssentialBoundsFromChildren(Cell cell, TechType tech)
           
 NodeInst addNmosWell(double loX, double hiX, Cell cell)
           
 void addNstackEssentialBounds(double loX, double hiX, Cell cell)
          essential bounds for NMOS only cells
 NodeInst addPmosWell(double loX, double hiX, Cell cell)
           
 void addPstackEssentialBounds(double loX, double hiX, Cell cell)
          essential bounds for PMOS only cells
 void addSelAroundDiff(NodeProto prot, java.awt.geom.Rectangle2D diffNodeBnd, double activeGateDiff, Cell cell)
          Add select node to ensure there is select surrounding the specified diffusion node
 boolean addWellCon(StdCellParams.SelectFill selFill, PortInst gndPort, PortInst vddPort, Cell cell)
          Note that nwellX denotes the X coord of the nwell contact cut, which goes in the Nwell (well that holds PMOS devices).
 void addWellsForRow(java.util.ArrayList<NodeInst> row, double minX, double maxX, Cell cell)
          Given an array of NodeInsts in a row, add wells to both ends of the row to bring the row to minX and maxX.
 FoldsAndWidth calcFoldsAndWidth(double spaceAvailWid, double totWid, int groupSz)
          Calculate the number of folds and the width of a MOS transistor.
 double checkMinStrength(double specified, double minAllowable, java.lang.String gateNm)
          Print a warning if strength is less than the minimum allowable.
 void doNCC(Cell layout, java.lang.String schemNm)
          Perform Network Consistency Check if the user has so requested
 void enableNCC(java.lang.String libName)
          Turn on Network Consistency Checking after each gate is generated.
 void fillDiffAndSelectNotches(FoldedMos[] moss, boolean fillDiffNotch)
          Fix notch errors between adjacent source/drain regions.
 StdCellParams.SelectFill fillSelect(Cell cell, boolean pSelect, boolean nSelect, boolean includePoly)
          This fills the cell with N/P select over current N/P select areas, and over poly.
 Cell findPart(java.lang.String partNm)
           
 Cell findPart(java.lang.String partNm, double sz)
          Look for parts in layoutLib
 double getCellBot()
           
 double getCellTop()
           
 boolean getDoubleStrapGate()
           
 double getDRCRingSpacing()
           
 double getEnableGateStrengthRatio()
           
 boolean getExhaustivePlace()
           
 double getFoldPitch(int nbSeries)
          Get the fold pitch for folded transistor, given the number of series transistors
 java.lang.String getGndExportName()
           
 PortCharacteristic getGndExportRole()
           
 double getGndWidth()
           
 double getGndY()
           
 double getGridResolution()
           
 double getM1TrackAboveVDD()
           
 double getM1TrackBelowGnd()
           
 double getM1TrackWidth()
           
 double getM2TrackWidth()
           
 int getNbPlacerPerms()
           
 double getNmosWellHeight()
           
 java.lang.String getNmosWellTieName()
           
 PortCharacteristic getNmosWellTieRole()
           
 double getNmosWellTieWidth()
           
 double getNmosWellTieY()
           
 double getPhysTrackY(int i)
          A physical track number enumerates all tracks regardless of whether the track is blocked.
 double getPmosWellHeight()
           
 java.lang.String getPmosWellTieName()
           
 PortCharacteristic getPmosWellTieRole()
           
 double getPmosWellTieWidth()
           
 double getPmosWellTieY()
           
static double getRightDiffX(FoldedMos m)
           
static double getRightDiffX(FoldedMos[] moss)
           
static double getRightDiffX(java.lang.Object a, java.lang.Object b)
          Find the X coordinate of the right most diffusion.
 java.util.HashMap<java.lang.String,java.lang.Object> getSchemTrackAssign(Cell schem)
           
 boolean getSeparateWellTies()
           
 boolean getSimpleName()
           
static double getSize(NodeInst iconInst, VarContext context)
           
 TechType getTechType()
           
 double getTrackPitch()
           
 double getTrackY(int i)
          Gets the Y coordinate of the ith available track.
 java.lang.String getVddExportName()
           
 PortCharacteristic getVddExportRole()
           
 double getVddWidth()
           
 double getVddY()
           
 double getWellOverhangDiff()
           
 double getWellTiePitch()
           
 int nbNmosTracks()
          Get the number of NMOS tracks.
 int nbPmosTracks()
          Get the number of PMOS tracks.
 boolean nccEnabled()
           
 Cell newPart(java.lang.String partNm)
           
 Cell newPart(java.lang.String partNm, double sz)
           
 java.lang.String parameterizedName(java.lang.String nm)
          Add qualifiers to Cell name to reflect StdCell parameters "_NH70" for NMOS region height of 70 lambda "_PH70" for PMOS region height of 70 lambda "_MW70" for maximum transistor width of 70 lambda
 double quantizeSize(double desiredSize)
           
 double roundGateWidth(double w)
          round to nearest multiple of 1/2 lambda for MoCMOS, nearest multiple of 0.2 for CMOS90
 double roundSize(double s)
          quantize size.
 double roundToGrid(double s)
           
 void setDoubleStrapGate(boolean val)
          Attach the well ties to special busses rather than to Vdd and Gnd.
 void setExhaustivePlace(boolean val)
          GasP generators use exhaustive search for gate placement
 void setGndExportName(java.lang.String gndNm)
           
 void setGndExportRole(PortCharacteristic gndRole)
           
 void setGndWidth(double width)
          Set the width of the Gnd track
 void setGndY(double y)
           
 void setM1TrackWidth(double width)
           
 void setM2TrackWidth(double width)
           
 void setMaxMosWidth(double wid)
          Set the maximum width of a each MOS finger.
 void setNbPlacerPerms(int i)
          Set number of permuations GasP placer should try before giving up.
 void setNmosTrackOffset(double offset)
          Set the starting offset from 0 of the nmos tracks
 void setNmosWellHeight(double h)
          Units of lambda
 void setPmosTrackOffset(double offset)
          Set the starting offset from 0 of the pmos tracks
 void setPmosWellHeight(double h)
          Units of lambda
 void setSeparateWellTies(boolean b)
          Connect well ties to separate exports rather than vdd and gnd
 void setSimpleName(boolean b)
           
 void setSizeQuantizationError(double err)
           
 void setTrackWidth(double width)
          Set the track width
 void setVddExportName(java.lang.String vddNm)
           
 void setVddExportRole(PortCharacteristic vddRole)
           
 void setVddWidth(double width)
          Set the width of the Vdd track
 void setVddY(double y)
           
 java.lang.String sizedName(java.lang.String nm, double sz)
          Add qualifiers to Cell name to reflect StdCell parameters and part strength "_NH70" for NMOS region height of 70 lambda "_PH70" for PMOS region height of 70 lambda "_MW70" for maximum transistor width of 70 lambda "_X12.5" for strength of 12.5 "{lay}" to indicate this is a layout Cell
 void validateTrackAssign(java.util.HashMap<java.lang.String,java.lang.Object> asgn, Cell s)
           
 void wireVddGnd(FoldedMos[] moss, StdCellParams.SelectSrcDrn select, Cell p)
          Wire pmos or nmos to vdd or gnd, respectively.
 void wireVddGnd(FoldedMos mos, StdCellParams.SelectSrcDrn select, Cell p)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

EVEN

public static final StdCellParams.SelectSrcDrn EVEN

ODD

public static final StdCellParams.SelectSrcDrn ODD
Constructor Detail

StdCellParams

public StdCellParams(TechType.TechTypeEnum techEnum)
Method Detail

setDoubleStrapGate

public void setDoubleStrapGate(boolean val)
Attach the well ties to special busses rather than to Vdd and Gnd.


setExhaustivePlace

public void setExhaustivePlace(boolean val)
GasP generators use exhaustive search for gate placement


setNbPlacerPerms

public void setNbPlacerPerms(int i)
Set number of permuations GasP placer should try before giving up.


setNmosWellHeight

public void setNmosWellHeight(double h)
Units of lambda


setPmosWellHeight

public void setPmosWellHeight(double h)
Units of lambda


setMaxMosWidth

public void setMaxMosWidth(double wid)
Set the maximum width of a each MOS finger. Units of lambda


setPmosTrackOffset

public void setPmosTrackOffset(double offset)
Set the starting offset from 0 of the pmos tracks


setNmosTrackOffset

public void setNmosTrackOffset(double offset)
Set the starting offset from 0 of the nmos tracks


setTrackWidth

public void setTrackWidth(double width)
Set the track width


setVddWidth

public void setVddWidth(double width)
Set the width of the Vdd track


setGndWidth

public void setGndWidth(double width)
Set the width of the Gnd track


setM1TrackWidth

public void setM1TrackWidth(double width)

getM1TrackWidth

public double getM1TrackWidth()

setM2TrackWidth

public void setM2TrackWidth(double width)

getM2TrackWidth

public double getM2TrackWidth()

getDRCRingSpacing

public double getDRCRingSpacing()

getM1TrackAboveVDD

public double getM1TrackAboveVDD()

getM1TrackBelowGnd

public double getM1TrackBelowGnd()

getWellOverhangDiff

public double getWellOverhangDiff()

getGridResolution

public double getGridResolution()

getFoldPitch

public double getFoldPitch(int nbSeries)
Get the fold pitch for folded transistor, given the number of series transistors


enableNCC

public void enableNCC(java.lang.String libName)
Turn on Network Consistency Checking after each gate is generated.

This just checks topology and ignores sizes.


setVddExportName

public void setVddExportName(java.lang.String vddNm)

getVddExportName

public java.lang.String getVddExportName()

setGndExportName

public void setGndExportName(java.lang.String gndNm)

getGndExportName

public java.lang.String getGndExportName()

setVddExportRole

public void setVddExportRole(PortCharacteristic vddRole)

getVddExportRole

public PortCharacteristic getVddExportRole()

setGndExportRole

public void setGndExportRole(PortCharacteristic gndRole)

getGndExportRole

public PortCharacteristic getGndExportRole()

getTechType

public TechType getTechType()

getNmosWellHeight

public double getNmosWellHeight()

getPmosWellHeight

public double getPmosWellHeight()

getDoubleStrapGate

public boolean getDoubleStrapGate()

getExhaustivePlace

public boolean getExhaustivePlace()

getNbPlacerPerms

public int getNbPlacerPerms()

getCellBot

public double getCellBot()

getCellTop

public double getCellTop()

getGndY

public double getGndY()

setGndY

public void setGndY(double y)

getVddY

public double getVddY()

setVddY

public void setVddY(double y)

getGndWidth

public double getGndWidth()

getVddWidth

public double getVddWidth()

getTrackY

public double getTrackY(int i)
Gets the Y coordinate of the ith available track. Available tracks exclude Vdd, Gnd, and reserved tracks.


getPhysTrackY

public double getPhysTrackY(int i)
A physical track number enumerates all tracks regardless of whether the track is blocked. The value 0 is illegal. Tracks 1 and higher are PMOS tracks. Tracks -1 and lower are NMOS tracks


getTrackPitch

public double getTrackPitch()

nbNmosTracks

public int nbNmosTracks()
Get the number of NMOS tracks. The indices of NMOS tracks range from -1 to -nbNmosTracks(). The value 0 is an illegal index.


nbPmosTracks

public int nbPmosTracks()
Get the number of PMOS tracks. The indices of PMOS tracks range from 1 to nbPmosTracks(). The value 0 is an illegal index.


getSeparateWellTies

public boolean getSeparateWellTies()

setSeparateWellTies

public void setSeparateWellTies(boolean b)
Connect well ties to separate exports rather than vdd and gnd


getNmosWellTieY

public double getNmosWellTieY()

getPmosWellTieY

public double getPmosWellTieY()

getNmosWellTieWidth

public double getNmosWellTieWidth()

getPmosWellTieWidth

public double getPmosWellTieWidth()

getNmosWellTieName

public java.lang.String getNmosWellTieName()

getPmosWellTieName

public java.lang.String getPmosWellTieName()

getNmosWellTieRole

public PortCharacteristic getNmosWellTieRole()

getPmosWellTieRole

public PortCharacteristic getPmosWellTieRole()

setSimpleName

public void setSimpleName(boolean b)

getSimpleName

public boolean getSimpleName()

getWellTiePitch

public double getWellTiePitch()

getEnableGateStrengthRatio

public double getEnableGateStrengthRatio()

roundGateWidth

public double roundGateWidth(double w)
round to nearest multiple of 1/2 lambda for MoCMOS, nearest multiple of 0.2 for CMOS90


roundSize

public double roundSize(double s)
quantize size. Temporary hack because it doesn't control errors precisely


roundToGrid

public double roundToGrid(double s)

setSizeQuantizationError

public void setSizeQuantizationError(double err)

quantizeSize

public double quantizeSize(double desiredSize)

parameterizedName

public java.lang.String parameterizedName(java.lang.String nm)
Add qualifiers to Cell name to reflect StdCell parameters "_NH70" for NMOS region height of 70 lambda "_PH70" for PMOS region height of 70 lambda "_MW70" for maximum transistor width of 70 lambda


sizedName

public java.lang.String sizedName(java.lang.String nm,
                                  double sz)
Add qualifiers to Cell name to reflect StdCell parameters and part strength "_NH70" for NMOS region height of 70 lambda "_PH70" for PMOS region height of 70 lambda "_MW70" for maximum transistor width of 70 lambda "_X12.5" for strength of 12.5 "{lay}" to indicate this is a layout Cell


addNmosWell

public NodeInst addNmosWell(double loX,
                            double hiX,
                            Cell cell)

addPmosWell

public NodeInst addPmosWell(double loX,
                            double hiX,
                            Cell cell)

addWellsForRow

public void addWellsForRow(java.util.ArrayList<NodeInst> row,
                           double minX,
                           double maxX,
                           Cell cell)
Given an array of NodeInsts in a row, add wells to both ends of the row to bring the row to minX and maxX.


addPstackEssentialBounds

public void addPstackEssentialBounds(double loX,
                                     double hiX,
                                     Cell cell)
essential bounds for PMOS only cells


addNstackEssentialBounds

public void addNstackEssentialBounds(double loX,
                                     double hiX,
                                     Cell cell)
essential bounds for NMOS only cells


addEssentialBounds

public void addEssentialBounds(double loX,
                               double hiX,
                               Cell cell)
essential bounds for cells with both NMOS and PMOS


checkMinStrength

public double checkMinStrength(double specified,
                               double minAllowable,
                               java.lang.String gateNm)
Print a warning if strength is less than the minimum allowable. Always return at least the minimum allowable strength.


calcFoldsAndWidth

public FoldsAndWidth calcFoldsAndWidth(double spaceAvailWid,
                                       double totWid,
                                       int groupSz)
Calculate the number of folds and the width of a MOS transistor. Given that there is a limited physical height into which a MOS transistor must fit, divide the total required width: totWid into fingers. Each finger must have width less than or equal to spaceAvailWid.

If it is possible, allocate an even number of fingers so that the left most and right most diffusion contacts may be connected to power or ground to reducing the capacitance of the inner switching diffusion contacts.

Parameters:
spaceAvailWid - the height in the standard cell that is available for the diffusion of the MOS transistor.
totWid - the total electrical width required.
groupSz - This method creates fingers in multiples of groupSz. For example, if groupSz is 2, then only even numbers of fingers are created. This is needed when one FoldedMos is actually going to be wired up as 2 identical, independent transistors, for example the 2 PMOS pullups for a 2-input NAND gate.

fillDiffAndSelectNotches

public void fillDiffAndSelectNotches(FoldedMos[] moss,
                                     boolean fillDiffNotch)
Fix notch errors between adjacent source/drain regions.

Mos transistors with source/drain regions that are too close to each other result in notch errors for diffusion, metal1, and/or select. Fix these notch errors by running diffusion, and/or metal1 between the adjacent diffusion regions.

Parameters:
moss - An array of adjacent FoldedMos transistors arranged
fillDiffNotch -

wireVddGnd

public void wireVddGnd(FoldedMos[] moss,
                       StdCellParams.SelectSrcDrn select,
                       Cell p)
Wire pmos or nmos to vdd or gnd, respectively. Add an export if there is none.


wireVddGnd

public void wireVddGnd(FoldedMos mos,
                       StdCellParams.SelectSrcDrn select,
                       Cell p)

nccEnabled

public boolean nccEnabled()

doNCC

public void doNCC(Cell layout,
                  java.lang.String schemNm)
Perform Network Consistency Check if the user has so requested


getSize

public static double getSize(NodeInst iconInst,
                             VarContext context)

findPart

public Cell findPart(java.lang.String partNm,
                     double sz)
Look for parts in layoutLib


findPart

public Cell findPart(java.lang.String partNm)

newPart

public Cell newPart(java.lang.String partNm,
                    double sz)

newPart

public Cell newPart(java.lang.String partNm)

getRightDiffX

public static double getRightDiffX(FoldedMos m)

getRightDiffX

public static double getRightDiffX(FoldedMos[] moss)

getRightDiffX

public static double getRightDiffX(java.lang.Object a,
                                   java.lang.Object b)
Find the X coordinate of the right most diffusion. Objects a and b may be either a FoldedMos or an array of FoldedMos'es


addEssentialBoundsFromChildren

public static void addEssentialBoundsFromChildren(Cell cell,
                                                  TechType tech)

getSchemTrackAssign

public java.util.HashMap<java.lang.String,java.lang.Object> getSchemTrackAssign(Cell schem)

validateTrackAssign

public void validateTrackAssign(java.util.HashMap<java.lang.String,java.lang.Object> asgn,
                                Cell s)

addSelAroundDiff

public void addSelAroundDiff(NodeProto prot,
                             java.awt.geom.Rectangle2D diffNodeBnd,
                             double activeGateDiff,
                             Cell cell)
Add select node to ensure there is select surrounding the specified diffusion node


fillSelect

public StdCellParams.SelectFill fillSelect(Cell cell,
                                           boolean pSelect,
                                           boolean nSelect,
                                           boolean includePoly)
This fills the cell with N/P select over current N/P select areas, and over poly. This assumes that all Pmos devices and PWell is at y > 0, and all Nmos devices and NWell is at y < 0.

Parameters:
cell - the cell to fill
pSelect -
nSelect -
includePoly -

addWellCon

public boolean addWellCon(StdCellParams.SelectFill selFill,
                          PortInst gndPort,
                          PortInst vddPort,
                          Cell cell)
Note that nwellX denotes the X coord of the nwell contact cut, which goes in the Nwell (well that holds PMOS devices).