📄 mocmos.java
字号:
new Technology.ArcLayer(activeLayers[P_TYPE], /*3,*/ Poly.Type.FILLED, "2.1"), new Technology.ArcLayer(activeLayers[N_TYPE], /*3,*/ Poly.Type.FILLED, "2.1") ); active_arc.setFactoryFixedAngle(true); active_arc.setWipable(); active_arc.setFactoryAngleIncrement(90);// active_arc.setNotUsed(true); /** P-well arc */ wellArcs[P_TYPE] = newArcProto("P-Well", 0, 2.0, ArcProto.Function.WELL, // 2.0 similar to Poly pin new Technology.ArcLayer(wellLayers[P_TYPE], 2.0, Poly.Type.FILLED) ); wellArcs[P_TYPE].setFactoryFixedAngle(true); wellArcs[P_TYPE].setWipable(); wellArcs[P_TYPE].setFactoryAngleIncrement(90); wellArcs[P_TYPE].setArcInvisible(false); /** N-well arc */ wellArcs[N_TYPE] = newArcProto("N-Well", 0, 2.0, ArcProto.Function.WELL, new Technology.ArcLayer(wellLayers[N_TYPE], 2.0, Poly.Type.FILLED) ); wellArcs[N_TYPE].setFactoryFixedAngle(true); wellArcs[N_TYPE].setWipable(); wellArcs[N_TYPE].setFactoryAngleIncrement(90); //**************************************** NODES **************************************** for (int i = 0; i < metalArcs.length; i++) { ArcProto ap = metalArcs[i]; metalPinNodes[i] = ap.makeWipablePin("Metal-"+(i+1)+"-Pin", "metal-"+(i+1), 3.0); } polyPinNodes[0] = polyArcs[0].makeWipablePin("Polysilicon-1-Pin", "polysilicon-1", 2.0); polyPinNodes[1] = polyArcs[1].makeWipablePin("Polysilicon-2-Pin", "polysilicon-2", 3.0); activePinNodes[P_TYPE] = activeArcs[P_TYPE].makeWipablePin("P-Active-Pin", "p-active", 15.0); activePinNodes[N_TYPE] = activeArcs[N_TYPE].makeWipablePin("N-Active-Pin", "n-active", 15.0); wellPinNodes[P_TYPE] = wellArcs[P_TYPE].makeWipablePin("P-Well-Pin", "p-active", 3.0); wellPinNodes[N_TYPE] = wellArcs[N_TYPE].makeWipablePin("N-Well-Pin", "n-active", 3.0); PrimitiveNode activeGenPinNode = active_arc.makeWipablePin("Active-Pin", "active", 3.0, activeArcs[P_TYPE], activeArcs[N_TYPE]); /** metal-1-P-active-contact */ metalActiveContactNodes[P_TYPE] = PrimitiveNode.newInstance("Metal-1-P-Active-Con", this, 17.0, 17.0, "6.2, 7.3", new SizeOffset(6, 6, 6, 6), new Technology.NodeLayer [] { new Technology.NodeLayer(metalLayers[0], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6.5)), new Technology.NodeLayer(activeLayers[P_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6)), new Technology.NodeLayer(wellLayers[N_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX,Technology.TechPoint.makeFullBox()), new Technology.NodeLayer(selectLayers[P_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(4)), Technology.NodeLayer.makeMulticut(activeCutLayer, 0, Poly.Type.FILLED, TechPoint.makeIndented(8.5), /*2, 2, 3, 3,*/ "6.1", "6.3","6.3"// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5)) )// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5))// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5)) }); metalActiveContactNodes[P_TYPE].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, metalActiveContactNodes[P_TYPE], new ArcProto[] {activeArcs[P_TYPE], metalArcs[0]}, "metal-1-p-act", 0,180, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(8), EdgeV.fromBottom(8), EdgeH.fromRight(8), EdgeV.fromTop(8)) }); metalActiveContactNodes[P_TYPE].setFunction(PrimitiveNode.Function.CONTACT);// metalActiveContactNodes[P_TYPE].setSpecialType(PrimitiveNode.MULTICUT);// metalActiveContactNodes[P_TYPE].setSpecialValues(new double [] {2, 2, 1.5, 1.5, 3, 3});// metalActiveContactNodes[P_TYPE].setMinSize(17, 17, "6.2, 7.3"); /** metal-1-N-active-contact */ metalActiveContactNodes[N_TYPE] = PrimitiveNode.newInstance("Metal-1-N-Active-Con", this, 17.0, 17.0, "6.2, 7.3", new SizeOffset(6, 6, 6, 6), new Technology.NodeLayer [] { new Technology.NodeLayer(metalLayers[0], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6.5)), new Technology.NodeLayer(activeLayers[N_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6)), new Technology.NodeLayer(wellLayers[P_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeFullBox()), new Technology.NodeLayer(selectLayers[N_TYPE], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(4)), Technology.NodeLayer.makeMulticut(activeCutLayer, 0, Poly.Type.FILLED, TechPoint.makeIndented(8.5), /*2, 2, 3, 3,*/ "6.1", "6.3","6.3"// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5)) )// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5))// new Technology.NodeLayer(activeCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(7.5)) }); metalActiveContactNodes[N_TYPE].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, metalActiveContactNodes[N_TYPE], new ArcProto[] {activeArcs[N_TYPE], metalArcs[0]}, "metal-1-n-act", 0,180, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(8), EdgeV.fromBottom(8), EdgeH.fromRight(8), EdgeV.fromTop(8)) }); metalActiveContactNodes[N_TYPE].setFunction(PrimitiveNode.Function.CONTACT);// metalActiveContactNodes[N_TYPE].setSpecialType(PrimitiveNode.MULTICUT);// metalActiveContactNodes[N_TYPE].setSpecialValues(new double [] {2, 2, 1.5, 1.5, 3, 3});// metalActiveContactNodes[N_TYPE].setMinSize(17, 17, "6.2, 7.3"); /** metal-1-polysilicon-1-contact */ metal1PolyContactNodes[0] = PrimitiveNode.newInstance("Metal-1-Polysilicon-1-Con", this, 5.0, 5.0, "5.2, 7.3", null, new Technology.NodeLayer [] { new Technology.NodeLayer(metalLayers[0], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(0.5)), new Technology.NodeLayer(poly1Layer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeFullBox()), Technology.NodeLayer.makeMulticut(polyCutLayer, 0, Poly.Type.FILLED, TechPoint.makeIndented(2.5), /*2, 2, 3, 3,*/ "5.1", "5.3","5.3"// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(1.5)) )// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(1.5))// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(1.5)) }); metal1PolyContactNodes[0].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, metal1PolyContactNodes[0], new ArcProto[] {polyArcs[0], metalArcs[0]}, "metal-1-polysilicon-1", 0,180, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(2), EdgeV.fromBottom(2), EdgeH.fromRight(2), EdgeV.fromTop(2)) }); metal1PolyContactNodes[0].setFunction(PrimitiveNode.Function.CONTACT);// metal1PolyContactNodes[0].setSpecialType(PrimitiveNode.MULTICUT);// metal1PolyContactNodes[0].setSpecialValues(new double [] {2, 2, 1.5, 1.5, 3, 3});// metal1PolyContactNodes[0].setMinSize(5, 5, "5.2, 7.3"); /** metal-1-polysilicon-2-contact */ metal1PolyContactNodes[1] = PrimitiveNode.newInstance("Metal-1-Polysilicon-2-Con", this, 10.0, 10.0, "?", null, new Technology.NodeLayer [] { new Technology.NodeLayer(metalLayers[0], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(3)), new Technology.NodeLayer(poly2_lay, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeFullBox()), Technology.NodeLayer.makeMulticut(polyCutLayer, 0, Poly.Type.FILLED, TechPoint.makeIndented(5), /*2, 2, 3, 3,*/ "5.1", "5.3","5.3"// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(4)) )// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(4))// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(4)) }); metal1PolyContactNodes[1].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, metal1PolyContactNodes[1], new ArcProto[] {polyArcs[1], metalArcs[0]}, "metal-1-polysilicon-2", 0,180, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(4.5), EdgeV.fromBottom(4.5), EdgeH.fromRight(4.5), EdgeV.fromTop(4.5)) }); metal1PolyContactNodes[1].setFunction(PrimitiveNode.Function.CONTACT);// metal1PolyContactNodes[1].setSpecialType(PrimitiveNode.MULTICUT);// metal1PolyContactNodes[1].setSpecialValues(new double [] {2, 2, 4, 4, 3, 3});// metal1PolyContactNodes[1].setNotUsed(true);// metal1PolyContactNodes[1].setMinSize(10, 10, "?"); /** metal-1-polysilicon-1-2-contact */ metal1PolyContactNodes[2] = PrimitiveNode.newInstance("Metal-1-Polysilicon-1-2-Con", this, 15.0, 15.0, "?", null, new Technology.NodeLayer [] { new Technology.NodeLayer(metalLayers[0], 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(5.5)), new Technology.NodeLayer(poly1Layer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(5)), new Technology.NodeLayer(poly2_lay, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeFullBox()), Technology.NodeLayer.makeMulticut(polyCutLayer, 0, Poly.Type.FILLED, TechPoint.makeIndented(7.5), /*2, 2, 3, 3,*/ "5.1", "5.3","5.3"// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6.5)) )// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6.5))// new Technology.NodeLayer(polyCutLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, Technology.TechPoint.makeIndented(6.5)) }); metal1PolyContactNodes[2].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, metal1PolyContactNodes[2], new ArcProto[] {polyArcs[0], polyArcs[1], metalArcs[0]}, "metal-1-polysilicon-1-2", 0,180, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(7), EdgeV.fromBottom(7), EdgeH.fromRight(7), EdgeV.fromTop(7)) }); metal1PolyContactNodes[2].setFunction(PrimitiveNode.Function.CONTACT);// metal1PolyContactNodes[2].setSpecialType(PrimitiveNode.MULTICUT);// metal1PolyContactNodes[2].setSpecialValues(new double [] {2, 2, 6.5, 6.5, 3, 3});// metal1PolyContactNodes[2].setNotUsed(true);// metal1PolyContactNodes[2].setMinSize(15, 15, "?"); /** P-Transistor */ /** N-Transistor */ String[] stdNames = {"p", "n"}; for (int i = 0; i < 2; i++) { transistorPolyLayers[i] = new Technology.NodeLayer(transistorPolyLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(4), EdgeV.fromBottom(10)), new Technology.TechPoint(EdgeH.fromRight(4), EdgeV.fromTop(10))}, 1, 1, 2, 2); transistorPolyLLayers[i] = new Technology.NodeLayer(poly1Layer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(4), EdgeV.fromBottom(10)), new Technology.TechPoint(EdgeH.fromLeft(6), EdgeV.fromTop(10))}, 1, 1, 0 /*Was 2 SMR*/, 2); transistorPolyRLayers[i] = new Technology.NodeLayer(poly1Layer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromRight(6), EdgeV.fromBottom(10)), new Technology.TechPoint(EdgeH.fromRight(4), EdgeV.fromTop(10))}, 1, 1, 2, 0 /*Was 2 SMR*/); transistorPolyCLayers[i] = new Technology.NodeLayer(transistorPolyLayer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(6), EdgeV.fromBottom(10)), new Technology.TechPoint(EdgeH.fromRight(6), EdgeV.fromTop(10))}, 1, 1, 2, 2); transistorActiveLayers[i] = new Technology.NodeLayer(activeLayers[i], 1, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(6), EdgeV.fromBottom(7)), new Technology.TechPoint(EdgeH.fromRight(6), EdgeV.fromTop(7))}, 4, 4, 0, 0); transistorActiveTLayers[i] = new Technology.NodeLayer(activeLayers[i], 1, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(6), EdgeV.fromTop(10)), new Technology.TechPoint(EdgeH.fromRight(6), EdgeV.fromTop(7))}, 4, 0 /*Was 4 SMR*/, 0, 0); transistorActiveBLayers[i] = new Technology.NodeLayer(activeLayers[i], 3, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(6), EdgeV.fromBottom(7)), new Technology.TechPoint(EdgeH.fromRight(6), EdgeV.fromBottom(10))}, 0 /*Was 4 SMR*/, 4, 0, 0); transistorWellLayers[i] = new Technology.NodeLayer(wellLayers[(i+1)%transistorNodes.length], -1, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.makeLeftEdge(), EdgeV.fromBottom(1)), new Technology.TechPoint(EdgeH.makeRightEdge(), EdgeV.fromTop(1))}, 10, 10, 6, 6); transistorSelectLayers[i] = new Technology.NodeLayer(selectLayers[i], -1, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.fromLeft(4), EdgeV.fromBottom(5)), new Technology.TechPoint(EdgeH.fromRight(4), EdgeV.fromTop(5))}, 6, 6, 2, 2); transistorNodes[i] = PrimitiveNode.newInstance(stdNames[i].toUpperCase()+"-Transistor", this, 15.0, 22.0, "2.1, 3.1", new SizeOffset(6, 6, 10, 10), new Technology.NodeLayer [] {transistorActiveLayers[i], transistorPolyLayers[i], transistorWellLayers[i], transistorSelectLayers[i]}); transistorNodes[i].setElectricalLayers(new Technology.NodeLayer [] {transistorActiveTLayers[i], transistorActiveBLayers[i], transistorPolyCLayers[i], transistorPolyLLayers[i], transistorPolyRLayers[i], transistorWellLayers[i], transistorSelectLayers[i]}); transistorNodes[i].addPrimitivePorts(new PrimitivePort [] { PrimitivePort.newInstance(this, transistorNodes[i], new ArcProto[] {polyArcs[0]}, stdNames[i]+"-trans-poly-left", 180,90, 0, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(4), EdgeV.fromBottom(11), EdgeH.fromLeft(4), EdgeV.fromTop(11)), PrimitivePort.newInstance(this, transistorNodes[i], new ArcProto[] {activeArcs[i]}, stdNames[i]+"-trans-diff-top", 90,90, 1, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(7.5), EdgeV.fromTop(7.5), EdgeH.fromRight(7.5), EdgeV.fromTop(7)), PrimitivePort.newInstance(this, transistorNodes[i], new ArcProto[] {polyArcs[0]}, stdNames[i]+"-trans-poly-right", 0,90, 0, PortCharacteristic.UNKNOWN, EdgeH.fromRight(4), EdgeV.fromBottom(11), EdgeH.fromRight(4), EdgeV.fromTop(11)), PrimitivePort.newInstance(this, transistorNodes[i], new ArcProto[] {activeArcs[i]}, stdNames[i]+"-trans-diff-bottom", 270,90, 2, PortCharacteristic.UNKNOWN, EdgeH.fromLeft(7.5), EdgeV.fromBottom(7), EdgeH.fromRight(7.5), EdgeV.fromBottom(7.5)), PrimitivePort.newInstance(this, transistorNodes[i], new ArcProto[] {wellArcs[(i+1)%transistorNodes.length]}, stdNames[i]+"-trans-well", 0,360, 3, PortCharacteristic.UNKNOWN, EdgeH.fromCenter(0), EdgeV.fromCenter(0), EdgeH.fromCenter(0), EdgeV.fromCenter(0)) }); transistorNodes[i].setFunction((i==P_TYPE) ? PrimitiveNode.Function.TRAPMOS : PrimitiveNode.Function.TRANMOS); transistorNodes[i].setHoldsOutline(); transistorNodes[i].setCanShrink(); transistorNodes[i].setSpecialType(PrimitiveNode.SERPTRANS); transistorNodes[i].setSpecialValues(new double [] {7, 1.5, 2.5, 2, 1, 2});// transistorNodes[i].setMinSize(15, 22, "2.1, 3.1"); } /** Thick oxide transistors */ String[] thickNames = {"Thick-P", "Thick-N"}; Technology.NodeLayer[] thickActiveLayers = new Technology.NodeLayer[] {transistorActiveLayers[P_TYPE], transistorActiveLayers[N_TYPE]}; Technology.NodeLayer[] thickPolyLayers = new Technology.NodeLayer[] {transistorPolyLayers[P_TYPE], transistorPolyLayers[N_TYPE]}; Technology.NodeLayer[] thickWellLayers = new Technology.NodeLayer[] {transistorWellLayers[P_TYPE], transistorWellLayers[N_TYPE]}; Technology.NodeLayer[] thickSelectLayers = new Technology.NodeLayer[] {transistorSelectLayers[P_TYPE], transistorSelectLayers[N_TYPE]}; Technology.NodeLayer[] thickActiveTLayers = new Technology.NodeLayer[] {transistorActiveTLayers[P_TYPE], transistorActiveTLayers[N_TYPE]}; Technology.NodeLayer[] thickActiveBLayers = new Technology.NodeLayer[] {transistorActiveBLayers[P_TYPE], transistorActiveBLayers[N_TYPE]}; Technology.NodeLayer[] thickPolyCLayers = new Technology.NodeLayer[] {transistorPolyCLayers[P_TYPE], transistorPolyCLayers[N_TYPE]}; Technology.NodeLayer[] thickPolyLLayers = new Technology.NodeLayer[] {transistorPolyLLayers[P_TYPE], transistorPolyLLayers[N_TYPE]}; Technology.NodeLayer[] thickPolyRLayers = new Technology.NodeLayer[] {transistorPolyRLayers[P_TYPE], transistorPolyRLayers[N_TYPE]}; Technology.NodeLayer[] thickLayers = new Technology.NodeLayer[2]; for (int i = 0; i < thickLayers.length; i++) { thickLayers[i] = new Technology.NodeLayer(thickActiveLayer, -1, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint [] { new Technology.TechPoint(EdgeH.makeLeftEdge(), EdgeV.fromBottom(1)), new Technology.TechPoint(EdgeH.makeRightEdge(), EdgeV.fromTop(1))}, 10, 10, 6, 6); } for (int i = 0; i < thickTransistorNodes.leng
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -