📄 mocmos.java
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: MoCMOS.java * * Copyright (c) 2003 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */package com.sun.electric.technology.technologies;import com.sun.electric.database.geometry.EGraphics;import com.sun.electric.database.geometry.Poly;import com.sun.electric.database.geometry.DBMath;import com.sun.electric.database.hierarchy.EDatabase;import com.sun.electric.database.prototype.NodeProto;import com.sun.electric.database.prototype.PortCharacteristic;import com.sun.electric.database.text.Setting;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.text.Version;import com.sun.electric.database.topology.NodeInst;import com.sun.electric.database.variable.VarContext;import com.sun.electric.database.variable.Variable;import com.sun.electric.technology.ArcProto;import com.sun.electric.technology.DRCRules;import com.sun.electric.technology.DRCTemplate;import com.sun.electric.technology.EdgeH;import com.sun.electric.technology.EdgeV;import com.sun.electric.technology.Foundry;import com.sun.electric.technology.Layer;import com.sun.electric.technology.PrimitiveNode;import com.sun.electric.technology.PrimitivePort;import com.sun.electric.technology.SizeOffset;import com.sun.electric.technology.Technology;import com.sun.electric.technology.XMLRules;import com.sun.electric.technology.Xml;import com.sun.electric.technology.xml.XmlParam;import com.sun.electric.tool.user.User;import java.awt.Color;import java.io.PrintWriter;import java.util.List;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Map;/** * This is the MOSIS CMOS technology. */public class MoCMOS extends Technology{ /** Value for standard SCMOS rules. */ public static final int SCMOSRULES = 0; /** Value for submicron rules. */ public static final int SUBMRULES = 1; /** Value for deep rules. */ public static final int DEEPRULES = 2; /** key of Variable for saving technology state. */ public static final Variable.Key TECH_LAST_STATE = Variable.newKey("TECH_last_state"); public static final Version changeOfMetal6 =Version.parseVersion("8.02o"); // Fix of bug #357 // layers to share with subclasses private Layer[] viaLayers = new Layer[5]; private Layer poly1Layer, poly2_lay, transistorPolyLayer; private Layer silicideBlockLayer; private Layer[] selectLayers; private Layer[] metalLayers = new Layer[6]; // 1 -> 6 private Layer polyCutLayer; private Layer pActiveWellLayer; private Layer[] activeLayers = new Layer[2]; private Layer[] pseudoActiveLayers = new Layer[2]; private Layer[] pseudoSelectLayers = new Layer[2]; private Layer[] pseudoWellLayers = new Layer[2]; private Layer[] wellLayers = new Layer[2]; private Layer activeCutLayer; private Layer thickActiveLayer; private Layer passivationLayer; private Layer polyCapLayer; private Layer padFrameLayer; private Layer pBaseLayer; // arcs /** metal 1->6 arcs */ private ArcProto[] metalArcs = new ArcProto[6]; /** polysilicon 1/2 arc */ private ArcProto[] polyArcs = new ArcProto[2]; /** P/N-active arcs */ private ArcProto[] activeArcs = new ArcProto[2]; /** P/N-well arcs */ private ArcProto[] wellArcs = new ArcProto[2]; /** General active arc */ private ArcProto active_arc; // nodes. Storing nodes only whe they are need in outside the constructor /** metal-1->6-pin */ private PrimitiveNode[] metalPinNodes = new PrimitiveNode[6]; /** active pins */ private PrimitiveNode[] activePinNodes = new PrimitiveNode[2]; /** well pins */ private PrimitiveNode[] wellPinNodes = new PrimitiveNode[2]; /** polysilicon-1-pin/2-pin */ private PrimitiveNode[] polyPinNodes = new PrimitiveNode[2]; /** metal-1-P/N-active-contacts */ private PrimitiveNode[] metalActiveContactNodes = new PrimitiveNode[2]; /** metal-1-polysilicon-1/2/1-2/-contact */ private PrimitiveNode[] metal1PolyContactNodes = new PrimitiveNode[3]; /** P/N-Transistors */ private PrimitiveNode[] transistorNodes = new PrimitiveNode[2]; /** ThickOxide Transistors */ private PrimitiveNode[] thickTransistorNodes = new PrimitiveNode[2]; /** Scalable Transistors */ private PrimitiveNode[] scalableTransistorNodes; /** NPN Transistor */ private PrimitiveNode npnTransistorNode; /** M1M2 -> M5M6 contacts */ private PrimitiveNode[] metalContactNodes = new PrimitiveNode[5]; /** metal-1-P/N-Well-contacts */ private PrimitiveNode[] metalWellContactNodes = new PrimitiveNode[2]; // for dynamically modifying the transistor geometry private Technology.NodeLayer[] transistorPolyLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorActiveLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorActiveTLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorActiveBLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorPolyLLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorPolyRLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorPolyCLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorWellLayers = new Technology.NodeLayer[2]; private Technology.NodeLayer[] transistorSelectLayers = new Technology.NodeLayer[2]; // design rule constants// /** wide rules apply to geometry larger than this */ private static final double WIDELIMIT = 100; // -------------------- private and protected methods ------------------------ public MoCMOS(Generic generic, Xml.Technology t) { super(generic, t); setNoNegatedArcs(); setStaticTechnology(); setFactoryResolution(0.01); // value in lambdas 0.005um -> 0.05 lambdas // Logical Effort Tech-dependent settings setFactoryLESettings(0.167, 0.16, 0.7); //**************************************** LAYERS **************************************** metalLayers[0] = findLayer("Metal-1"); metalLayers[1] = findLayer("Metal-2"); metalLayers[2] = findLayer("Metal-3"); metalLayers[3] = findLayer("Metal-4"); metalLayers[4] = findLayer("Metal-5"); metalLayers[5] = findLayer("Metal-6"); poly1Layer = findLayer("Polysilicon-1"); poly2_lay = findLayer("Polysilicon-2"); activeLayers[P_TYPE] = findLayer("P-Active"); activeLayers[N_TYPE] = findLayer("N-Active"); selectLayers = new Layer[2]; selectLayers[P_TYPE] = findLayer("P-Select"); selectLayers[N_TYPE] = findLayer("N-Select"); wellLayers[P_TYPE] = findLayer("P-Well"); wellLayers[N_TYPE] = findLayer("N-Well"); polyCutLayer = findLayer("Poly-Cut"); activeCutLayer = findLayer("Active-Cut"); for (int i = 0; i < viaLayers.length; i++) viaLayers[i] = findLayer("Via"); passivationLayer = findLayer("Passivation"); transistorPolyLayer = findLayer("Transistor-Poly"); polyCapLayer = findLayer("Poly-Cap"); pActiveWellLayer = findLayer("P-Active-Well"); silicideBlockLayer = findLayer("Silicide-Block"); thickActiveLayer = findLayer("Thick-Active"); padFrameLayer = findLayer("Pad-Frame"); /***************************************/ // createExtraLayers pBaseLayer = findLayer("P-Base"); /***************************************/ Layer pseudoMetal1_lay = metalLayers[0].getPseudoLayer(); // Pseudo-Metal-1 Layer pseudoMetal2_lay = metalLayers[1].getPseudoLayer(); // Pseudo-Metal-2 Layer pseudoMetal3_lay = metalLayers[2].getPseudoLayer(); // Pseudo-Metal-3 Layer pseudoMetal4_lay = metalLayers[3].getPseudoLayer(); // Pseudo-Metal-4 Layer pseudoMetal5_lay = metalLayers[4].getPseudoLayer(); // Pseudo-Metal-5 Layer pseudoMetal6_lay = metalLayers[5].getPseudoLayer(); // Pseudo-Metal-6 Layer pseudoPoly1_lay = poly1Layer.getPseudoLayer(); // Pseudo-Polysilicon-1 Layer pseudoPoly2_lay = poly2_lay.getPseudoLayer(); // Pseudo-Polysilicon-2 pseudoActiveLayers[P_TYPE] = activeLayers[P_TYPE].getPseudoLayer(); // Pseudo-P-Active pseudoActiveLayers[N_TYPE] = activeLayers[N_TYPE].getPseudoLayer(); // Pseudo-N-Active pseudoSelectLayers[P_TYPE] = selectLayers[P_TYPE].getPseudoLayer(); // Pseudo-P-Select pseudoSelectLayers[N_TYPE] = selectLayers[N_TYPE].getPseudoLayer(); // Pseudo-N-Select pseudoWellLayers[P_TYPE] = wellLayers[P_TYPE].getPseudoLayer(); // Pseudo-P-Well pseudoWellLayers[N_TYPE] = wellLayers[N_TYPE].getPseudoLayer(); // Pseudo-N-Well //**************************************** ARCS **************************************** metalArcs[0] = findArcProto("Metal-1"); metalArcs[1] = findArcProto("Metal-2"); metalArcs[2] = findArcProto("Metal-3"); metalArcs[3] = findArcProto("Metal-4"); metalArcs[4] = findArcProto("Metal-5"); metalArcs[5] = findArcProto("Metal-6"); polyArcs[0] = findArcProto("Polysilicon-1"); polyArcs[1] = findArcProto("Polysilicon-2"); activeArcs[P_TYPE] = findArcProto("P-Active"); activeArcs[N_TYPE] = findArcProto("N-Active"); wellArcs[P_TYPE] = findArcProto("P-Well"); wellArcs[N_TYPE] = findArcProto("N-Well"); active_arc = findArcProto("Active"); //**************************************** NODES **************************************** metalPinNodes[0] = findNodeProto("Metal-1-Pin"); metalPinNodes[1] = findNodeProto("Metal-2-Pin"); metalPinNodes[2] = findNodeProto("Metal-3-Pin"); metalPinNodes[3] = findNodeProto("Metal-4-Pin"); metalPinNodes[4] = findNodeProto("Metal-5-Pin"); metalPinNodes[5] = findNodeProto("Metal-6-Pin"); polyPinNodes[0] = findNodeProto("Polysilicon-1-Pin"); polyPinNodes[1] = findNodeProto("Polysilicon-2-Pin"); activePinNodes[P_TYPE] = findNodeProto("P-Active-Pin"); activePinNodes[N_TYPE] = findNodeProto("N-Active-Pin"); PrimitiveNode activeGenPinNode = findNodeProto("Active-Pin"); wellPinNodes[P_TYPE] = findNodeProto("P-Well-Pin"); wellPinNodes[N_TYPE] = findNodeProto("N-Well-Pin"); metalActiveContactNodes[P_TYPE] = findNodeProto("Metal-1-P-Active-Con"); metalActiveContactNodes[N_TYPE] = findNodeProto("Metal-1-N-Active-Con"); metal1PolyContactNodes[0] = findNodeProto("Metal-1-Polysilicon-1-Con"); metal1PolyContactNodes[1] = findNodeProto("Metal-1-Polysilicon-2-Con"); metal1PolyContactNodes[2] = findNodeProto("Metal-1-Polysilicon-1-2-Con"); String[] stdNames = {"p", "n"}; for (int i = 0; i < 2; i++) transistorNodes[i] = findNodeProto(stdNames[i].toUpperCase()+"-Transistor"); /** Thick oxide transistors */ String[] thickNames = {"Thick-P", "Thick-N"}; for (int i = 0; i < thickTransistorNodes.length; i++) thickTransistorNodes[i] = findNodeProto(thickNames[i] + "-Transistor"); scalableTransistorNodes = new PrimitiveNode[2]; scalableTransistorNodes[P_TYPE] = findNodeProto("P-Transistor-Scalable"); scalableTransistorNodes[N_TYPE] = findNodeProto("N-Transistor-Scalable"); npnTransistorNode = findNodeProto("NPN-Transistor"); metalContactNodes[0] = findNodeProto("Metal-1-Metal-2-Con"); metalContactNodes[1] = findNodeProto("Metal-2-Metal-3-Con"); metalContactNodes[2] = findNodeProto("Metal-3-Metal-4-Con"); metalContactNodes[3] = findNodeProto("Metal-4-Metal-5-Con"); metalContactNodes[4] = findNodeProto("Metal-5-Metal-6-Con"); for (int i = 0; i < metalWellContactNodes.length; i++) metalWellContactNodes[i] = findNodeProto(metalLayers[0].getName()+"-"+wellLayers[i].getName()+"-Con"); } /** * Constructs MOCMOS technology without TSMC180 foundry. */ public MoCMOS(Generic generic) { this(generic, "mocmos", "MOSIS CMOS", "MOSIS CMOS", Foundry.Type.MOSIS, 200, true); // in nanometers: really 0.2 micron initFoundryMOSIS(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -