package com.sun.electric.tool.generator.layout;
import com.sun.electric.technology.Technology;
public class TechTypeMoCMOS extends TechType {
private static final long serialVersionUID = 0;
private static boolean singletonCreated = false;
public TechTypeMoCMOS() {
super(Technology.getMocmosTechnology());
// Make sure that not more than one instance of this class gets created
if (singletonCreated)
throw new RuntimeException("Only one instance of TechTypeMoCMOS is allowed");
singletonCreated = true;
assert getNumMetals() == 6;
assert getTechnology() == Technology.getMocmosTechnology();
/** arcs */
assert pdiff().getName().equals("P-Active");
assert ndiff().getName().equals("N-Active");
assert p1().getName().equals("Polysilicon-1");
assert m1().getName().equals("Metal-1");
assert m2().getName().equals("Metal-2");
assert m3().getName().equals("Metal-3");
assert m4().getName().equals("Metal-4");
assert m5().getName().equals("Metal-5");
assert m6().getName().equals("Metal-6");
assert m7() == null;
assert m8() == null;
assert m9() == null;
assert ndiff18() == null;
assert pdiff18() == null;
assert ndiff25() == null;
assert pdiff25() == null;
assert ndiff33() == null;
assert pdiff33() == null;
/** pins */
assert ndpin().getName().equals("N-Active-Pin");
assert pdpin().getName().equals("P-Active-Pin");
assert p1pin().getName().equals("Polysilicon-1-Pin");
assert m1pin().getName().equals("Metal-1-Pin");
assert m2pin().getName().equals("Metal-2-Pin");
assert m3pin().getName().equals("Metal-3-Pin");
assert m4pin().getName().equals("Metal-4-Pin");
assert m5pin().getName().equals("Metal-5-Pin");
assert m6pin().getName().equals("Metal-6-Pin");
assert m7pin() == null;
assert m8pin() == null;
assert m9pin() == null;
/** vias */
assert nwm1().getName().equals("Metal-1-N-Well-Con");
assert pwm1().getName().equals("Metal-1-P-Well-Con");
assert nwm1Y() == null;
assert pwm1Y() == null;
assert ndm1().getName().equals("Metal-1-N-Active-Con");
assert pdm1().getName().equals("Metal-1-P-Active-Con");
assert p1m1().getName().equals("Metal-1-Polysilicon-1-Con");
assert m1m2().getName().equals("Metal-1-Metal-2-Con");
assert m2m3().getName().equals("Metal-2-Metal-3-Con");
assert m3m4().getName().equals("Metal-3-Metal-4-Con");
assert m4m5().getName().equals("Metal-4-Metal-5-Con");
assert m5m6().getName().equals("Metal-5-Metal-6-Con");
assert m6m7() == null;
assert m7m8() == null;
assert m8m9() == null;
/** Transistors */
assert nmos().getName().equals("N-Transistor");
assert pmos().getName().equals("P-Transistor");
assert nmos18().getName().equals("Thick-N-Transistor");
assert pmos18().getName().equals("Thick-P-Transistor");
assert nmos25() == null;
assert pmos25() == null;
assert nmos33() == null;
assert pmos33() == null;
/** special threshold transistor contacts */
assert nmos18contact() == null;
assert pmos18contact() == null;
assert nmos25contact() == null;
assert pmos25contact() == null;
assert nmos33contact() == null;
assert pmos33contact() == null;
/** Well */
assert nwell().getName().equals("N-Well-Node");
assert pwell().getName().equals("P-Well-Node");
/** Layer nodes are sometimes used to patch notches */
assert m1Node().getName().equals("Metal-1-Node");
assert m2Node().getName().equals("Metal-2-Node");
assert m3Node().getName().equals("Metal-3-Node");
assert m4Node().getName().equals("Metal-4-Node");
assert m5Node().getName().equals("Metal-5-Node");
assert m6Node().getName().equals("Metal-6-Node");
assert m7Node() == null;
assert m8Node() == null;
assert m9Node() == null;
assert p1Node().getName().equals("Polysilicon-1-Node");
assert pdNode().getName().equals("P-Active-Node");
assert ndNode().getName().equals("N-Active-Node");
assert pselNode().getName().equals("P-Select-Node");
assert nselNode().getName().equals("N-Select-Node");
/** Transistor layer nodes */
assert od18() == null;
assert od25() == null;
assert od33() == null;
assert vth() == null;
assert vtl() == null;
assert name().equals("MOCMOS");
// wellSurroundDiff = 3;
// gateExtendPastMOS = 2;
// p1Width = 2;
// p1ToP1Space = 3;
// gateToGateSpace = 3;
// gateToDiffContSpace = .5;
gateToDiffContSpaceDogBone = 1;
// gateLength = 2;
// offsetLShapePolyContact = 2.5 /* half poly contact height */ - 1 /*half poly arc width*/;
// offsetTShapePolyContact = 2.5 /* half poly contact height */ + 1 /*half poly arc width*/;
// selectSpace = 2;
// selectSurroundDiffInTrans = 2;
// selectSurround = -Double.NaN; // no valid value
// selectSurroundDiffInActiveContact = 2;
// selectSurroundDiffAlongGateInTrans = 2;
// m1MinArea = 0;
// diffCont_m1Width = 4;
// diffContIncr = 5;
assert getWellWidth() == 17;
assert getWellSurroundDiffInWellContact() == 3;
assert getGateExtendPastMOS() == 2;
assert getP1Width() == 2;
assert getP1ToP1Space() == 3;
assert getGateToGateSpace() == 3;
assert getGateToDiffContSpace() == .5;
assert getGateToDiffContSpaceDogBone() == 1;
assert getWellContWidth() == 5;
assert getDiffContWidth() == 5;
assert getP1M1Width() == 5;
assert getGateLength() == 2;
assert selectSurroundDiffInWellContact() == 2;
assert selectSurroundDiffInDiffContact() == 2;
assert selectSurroundDiffAlongGateInTrans() == 2;
assert getPolyLShapeOffset() == 2.5 /* half poly contact height */ - 1 /*half poly arc width*/;
assert getPolyTShapeOffset() == 2.5 /* half poly contact height */ + 1 /*half poly arc width*/;
assert getSelectSpacingRule() == 2;
assert getSelectSurroundDiffInTrans() == 2;
assert Double.isNaN(getSelectSurroundOverPoly()); // no valid value
assert getM1MinArea() == 0;
assert getDiffCont_m1Width() == 4;
assert getDiffContIncr() == 5;
}
@Override
public double roundToGrid(double x) {return Math.rint(x * 2) / 2;}
@Override
public String name() {return "MOCMOS";}
// for fill generator
@Override
public double reservedToLambda(int layer, double nbTracks)
{
double m1via = 4;
double m1sp = 3;
double m1SP = 6;
double m6via = 5;
double m6sp = 4;
double m6SP = 8;
if (layer!=6) return 2*m1SP - m1sp + nbTracks*(m1via+m1sp);
return 2*m6SP - m6sp + nbTracks*(m6via+m6sp);
}
}