亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gds.java

?? The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
?? JAVA
?? 第 1 頁 / 共 5 頁
字號(hào):
				if (annotations.size() > 0)				{					String [] anArr = new String[annotations.size()];					for(int i=0; i<annotations.size(); i++) anArr[i] = annotations.get(i);					TextDescriptor td = TextDescriptor.getCellTextDescriptor().withInterior(true).withDispPart(TextDescriptor.DispPos.NAMEVALUE);					this.cell.newVar(NccCellAnnotations.NCC_ANNOTATION_KEY, anArr, td);				}			}            if (IOTool.isGDSInSimplifyCells())                simplifyNodes(this.cell);			builtCells.add(this.cell);		}        /** Method to see if existing primitive nodes could be merged and define more complex nodes         * such as contacts         */        private void simplifyNodes(Cell cell)        {            Map<Layer, List<NodeInst>> map = new HashMap<Layer, List<NodeInst>>();            for (Iterator<NodeInst> itNi = cell.getNodes(); itNi.hasNext();)            {                NodeInst ni = itNi.next();                if (!(ni.getProto() instanceof PrimitiveNode)) continue; // not primitive                PrimitiveNode pn = (PrimitiveNode)ni.getProto();                if (pn.getFunction() != PrimitiveNode.Function.NODE) continue; // not pure layer node.                Layer layer = pn.getLayerIterator().next(); // they are supposed to have only 1                List<NodeInst> list = map.get(layer);                if (list == null) // first time                {                    list = new ArrayList<NodeInst>();                    map.put(layer, list);                }                list.add(ni);            }            Technology tech = cell.getTechnology();            Set<NodeInst> toDelete = new HashSet<NodeInst>();            Set<NodeInst> viaToDelete = new HashSet<NodeInst>();            List<Geometric> geomList = new ArrayList<Geometric>();            for (Iterator<PrimitiveNode> itPn = tech.getNodes(); itPn.hasNext();)            {                PrimitiveNode pn = itPn.next();                boolean allFound = true;                if (pn.getFunction() != PrimitiveNode.Function.CONTACT) continue; // only dealing with metal contacts for now.                Layer m1Layer = null, m2Layer = null;                Layer viaLayer = null;                SizeOffset so = pn.getProtoSizeOffset();                for (Iterator<Layer> itLa = pn.getLayerIterator(); itLa.hasNext();)                {                    Layer l = itLa.next();                    if (map.get(l) == null)                    {                        allFound = false;                        break;                    }                    if (l.getFunction().isMetal())                    {                        if (m1Layer == null)                            m1Layer = l;                        else                            m2Layer = l;                    }                    else if (l.getFunction().isContact())                        viaLayer = l;                }                if (!allFound) continue; // not all layers for this particular node found                if (viaLayer == null) continue; // not metal contact                assert(m1Layer != null);                List<NodeInst> list = map.get(m1Layer);                assert(list != null);                Layer.Function.Set thisLayer = new Layer.Function.Set(viaLayer.getFunction());                List<NodeInst> viasList = map.get(viaLayer);                for (NodeInst ni : list)                {                    Poly[] polys = tech.getShapeOfNode(ni, true, false, null);                    assert(polys.length == 1); // it must be only 1                    Poly m1P = polys[0];                    List<NodeInst> nList = map.get(m2Layer);                    if (nList == null) continue; // nothing found in m2Layer                    for (NodeInst n : nList)                    {                        Poly[] otherPolys = tech.getShapeOfNode(n, true, false, null);                        assert(otherPolys.length == 1); // it must be only 1                        Poly m2P = otherPolys[0];                        if (!m2P.getBounds2D().equals(m1P.getBounds2D())) continue; // no match                        ImmutableNodeInst d = ni.getD();                        String name = ni.getName();                        int atIndex = name.indexOf('@');                        if (atIndex < 0) name += "tmp"; else                        	name = name.substring(0, atIndex) + "tmp" + name.substring(atIndex);                        NodeInst newNi = NodeInst.makeInstance(pn, d.anchor,                                m2P.getBounds2D().getWidth() + so.getLowXOffset() + so.getHighXOffset(),                                m2P.getBounds2D().getHeight() + so.getLowYOffset() + so.getHighYOffset(),                                ni.getParent(), ni.getOrient(), name, 0);                        if (newNi == null) continue;                        // Searching for vias to delete                        assert(viasList != null);                        Poly[] viaPolys = tech.getShapeOfNode(newNi, true, false, thisLayer);                        boolean found = false;                        // Can be more than 1 due to MxN cuts                        viaToDelete.clear();                        for (int i = 0; i < viaPolys.length; i++)                        {                            Poly poly = viaPolys[i];                            Rectangle2D bb = poly.getBounds2D();                            bb.setRect(ERectangle.fromLambda(bb));                            found = false;                            for (NodeInst viaNi : viasList)                            {                                Poly[] thisViaList = tech.getShapeOfNode(viaNi, true, false, thisLayer);                                assert(thisViaList.length == 1);                                // hack to get rid of the resolution issue                                Poly p = thisViaList[0];                                Rectangle2D b = p.getBounds2D();                                b.setRect(ERectangle.fromLambda(b));                                if (thisViaList[0].polySame(poly))                                {                                    viaToDelete.add(viaNi);                                    assert(!found);                                    found = true;                                }                            }                            if (!found)                            {                                break; // fail to find all nodes                            }                        }                        if (!found) // rolling back new node                        {                            newNi.kill();                        }                        else                        {                            if (SHOWPROGRESS)                                System.out.println("Adding " + newNi.getName());                            toDelete.clear();                            geomList.clear();                            toDelete.add(ni);                            toDelete.add(n);                            toDelete.addAll(viaToDelete);                            String message = toDelete.size() + " nodes were replaced for more complex primitives in cell '" + cell.getName() + "'";                            geomList.add(newNi);                            errorLogger.logWarning(message, geomList, null, null, null, null, cell, -1);                            // Deleting now replaced pure primitives                            cell.killNodes(toDelete);                        }                    }                }            }        }        private void nameInstances(boolean countOff) {            Map<String,GenMath.MutableInteger> maxSuffixes = new HashMap<String,GenMath.MutableInteger>();            Set<String> userNames = new HashSet<String>();            int count = 0;            for (MakeInstance mi: insts)            {				if (countOff && ((++count % 2000) == 0))					System.out.println("        Named " + count + " instances");                if (mi.nodeName != null) {                    if (!validGdsNodeName(mi.nodeName)) {                        System.out.println("  Warning: Node name '" + mi.nodeName + "' in cell " + cell.describe(false) +                                " is bad (" + Name.checkName(mi.nodeName.toString()) + ")...ignoring the name");                    } else if (!userNames.contains(mi.nodeName.toString())) {                        userNames.add(mi.nodeName.toString());                        continue;                    }                }                Name baseName;                if (mi.proto instanceof Cell) {                    baseName = ((Cell)mi.proto).getBasename();                } else {                    PrimitiveNode np = (PrimitiveNode)mi.proto;                    baseName = np.getTechnology().getPrimitiveFunction(np, 0).getBasename();                }                String basenameString = baseName.toString();                GenMath.MutableInteger maxSuffix = maxSuffixes.get(basenameString);                if (maxSuffix == null) {                    maxSuffix = new GenMath.MutableInteger(-1);                    maxSuffixes.put(basenameString, maxSuffix);                }                maxSuffix.increment();                mi.nodeName = baseName.findSuffixed(maxSuffix.intValue());            }        }        private boolean validGdsNodeName(Name name) {            return name.isValid() && !name.hasEmptySubnames() && !name.isBus() || !name.isTempname();        }		private static void buildInstances()		{			Set<Cell> builtCells = new HashSet<Cell>();			for(CellBuilder cellBuilder : allBuilders.values())				cellBuilder.makeInstances(builtCells);		}    }    /**     * Class to save instance array information.     */    private static class MakeInstanceArray    {    	private NodeProto proto;    	private int nCols, nRows;    	private Orientation orient;    	private Point2D startLoc, rowOffset, colOffset;    	private MakeInstanceArray(NodeProto proto, int nCols, int nRows, Orientation orient, Point2D startLoc, Point2D rowOffset, Point2D colOffset)    	{    		this.proto = proto;    		this.nCols = nCols;    		this.nRows = nRows;    		this.orient = orient;    		this.startLoc = startLoc;    		this.rowOffset = rowOffset;    		this.colOffset = colOffset;    	}    	/**         * Method to instantiate an array of cell instances.         * @param parent the Cell in which to create the geometry.         */        private void instantiate(CellBuilder theCell, Cell parent, Map<NodeProto,List<EPoint>> massiveMerge)        {        	int arraySimplification = IOTool.getGDSArraySimplification();    		if (Technology.HANDLEBROKENOUTLINES)    		{	    		NodeInst subNi = null;	    		Cell subCell = (Cell)proto;	    		int numArcs = subCell.getNumArcs();	    		int numNodes = subCell.getNumNodes();	    		int numExports = subCell.getNumPorts();	    		if (numArcs == 0 && numExports == 0 && numNodes == 1)    			{    				subNi = subCell.getNode(0);    				if (subNi.getProto().getFunction() != PrimitiveNode.Function.NODE)    					subNi = null;    			}	    		if (subNi != null && subNi.getTrace() != null) subNi = null;	    		if (subNi != null)	    		{	    			if (arraySimplification > 0)	    			{		    			List<EPoint> points = buildArray();		    			if (arraySimplification == 2)		    			{		    				// add the array's geometry the layer's outline		    				List<EPoint> soFar = massiveMerge.get(subNi.getProto());		    				if (soFar == null)		    				{		    					soFar = new ArrayList<EPoint>();		    					massiveMerge.put(subNi.getProto(), soFar);		    				}		    				if (soFar.size() > 0) soFar.add(null);		    				for(EPoint ep : points) soFar.add(ep);		    			} else		    			{			    			// place a pure-layer node that embodies the array		    				buildComplexNode(points, subNi.getProto(), parent);		    			}		        		return;		    		} else		    		{		    			// remember that array simplification would have helped		    			arraySimplificationUseful = true;		    		}    			}    		}    		// generate an array    		double ptcX = startLoc.getX();    		double ptcY = startLoc.getY();    		for (int ic = 0; ic < nCols; ic++)    		{    			double ptX = ptcX;    			double ptY = ptcY;    			for (int ir = 0; ir < nRows; ir++)    			{    				// create the node    				if (IOTool.isGDSInInstantiatesArrays() ||    					(ir == 0 && ic == 0) ||    						(ir == (nRows-1) && ic == (nCols-1)))    				{    					Point2D loc = new Point2D.Double(ptX, ptY);    		            NodeInst ni = NodeInst.makeInstance(proto, loc, proto.getDefWidth(), proto.getDefHeight(), parent, orient, null, 0);    		            if (ni != null)    		            {	    		            if (IOTool.isGDSInExpandsCells() && ni.isCellInstance())	    		                ni.setExpanded();    		            }    				}    				// add the row displacement    				ptX += rowOffset.getX();   ptY += rowOffset.getY();    			}    			// add displacement    			ptcX += colOffset.getX();   ptcY += colOffset.getY();    		}        }        private List<EPoint> buildArray()        {			List<EPoint> points = new ArrayList<EPoint>();			Rectangle2D bounds = ((Cell)proto).getBounds();			Rectangle2D boundCopy = new Rectangle2D.Double(bounds.getMinX(), bounds.getMinY(), bounds.getWidth(), bounds.getHeight());			DBMath.transformRect(boundCopy, orient.pureRotate());    		double ptcX = startLoc.getX();    		double ptcY = startLoc.getY();    		for (int ic = 0; ic < nCols; ic++)    		{    			double ptX = ptcX;    			double ptY = ptcY;    			for (int ir = 0; ir < nRows; ir++)    			{    	    		points.add(new EPoint(ptX+boundCopy.getMinX(), ptY+boundCopy.getMinY()));    	    		points.add(new EPoint(ptX+boundCopy.getMaxX(), ptY+boundCopy.getMinY()));    	    		points.add(new EPoint(ptX+boundCopy.getMaxX(), ptY+boundCopy.getMaxY()));    	    		points.add(new EPoint(ptX+boundCopy.getMinX(), ptY+boundCopy.getMaxY()));    	    		// insert a "break" marker to start a new polygon    	    		if (ic < nCols-1 || ir < nRows-1) points.add(null);    				// add the row displacement    				ptX += rowOffset.getX();   ptY += rowOffset.getY();    			}    			// add displacement    			ptcX += colOffset.getX();   ptcY += colOffset.getY();    		}			return points;        }    }    private static class MakeInstance implements Comparable<MakeInstance>	{		private NodeProto proto;		private Point2D loc;		private Orientation orient;        private double wid, hei;        private EPoint[] points; // trace        private String exportName; // export        private Name nodeName; // text        private String origNodeName; // original text with invalid name        private MakeInstance(NodeProto proto, Point2D loc, Orientation orient, double wid, double hei, EPoint[] points, String exportName, Name nodeName)		{			this.proto = proto;			this.loc = loc;            this.orient = orient;            this.wid = DBMath.round(wid);            this.hei = DBMath.round(hei);            this.points = points;            this.exportName = exportName;            if (nodeName != null && NodeInst.checkNameKey(nodeName, null))            {                // If name is not valid, a new one will be automatically created.                origNodeName = nodeName.toString();  // remember the name for error reporting                nodeName = null;            }            this.nodeName = nodeName;		}        public int compareTo(MakeInstance that) {            return TextUtils.STRING_NUMBER_ORDER.compare(this.nodeName.toString(), that.nodeName.toString());        }        /**         * Method to instantiate a node/export in a Cell.         * @param parent the Cell in which to create the geometry.         * @param exportUnify a map that shows how renamed exports connect.         * @return true if the export had to be renamed.         */        private boolean instantiate(Cell parent, Map<String,String> exportUnify) {        	String name = nodeName.toString();            NodeInst ni = NodeInst.makeInstance(proto, loc, wid, hei, parent, orient, name, 0);            String errorMsg = null;            if (ni == null) return false;            if (ni.getNameKey() != nodeName)            {                errorMsg = "GDS name '" + name + "' renamed to '" + ni.getName() + "'";

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
这里只有精品99re| 亚洲成人午夜影院| 国产成人av一区| 欧美韩国日本不卡| 不卡av免费在线观看| 在线观看免费成人| 青青草一区二区三区| 7777精品伊人久久久大香线蕉| 日本成人在线不卡视频| 久久久久久久久久久电影| 精品久久五月天| 日韩精品一二三四| 欧洲人成人精品| 一区二区三区在线播| 欧美视频你懂的| 国产一区二区三区国产| 国产一区二区91| 92国产精品观看| 欧美日韩一级大片网址| 777久久久精品| 中文字幕一区二区三区在线不卡| 亚洲欧美一区二区三区国产精品| 国产一区二区三区美女| 26uuu精品一区二区在线观看| 奇米精品一区二区三区在线观看一 | 国产日韩一级二级三级| 国产98色在线|日韩| 中文字幕一区二区在线观看| 91久久精品一区二区| 日韩精品高清不卡| 国产精品三级久久久久三级| 久久狠狠亚洲综合| 国产精品免费免费| 欧美一卡二卡在线观看| 国产91精品欧美| 午夜欧美电影在线观看| 国产亚洲综合性久久久影院| 不卡高清视频专区| 国产精品羞羞答答xxdd| 久久青草欧美一区二区三区| 亚洲人精品一区| 免费久久精品视频| 成人av综合在线| 日韩视频免费观看高清完整版| 国产片一区二区三区| 91免费看视频| 美女视频黄免费的久久| 一区二区三区欧美日| 97久久超碰精品国产| 欧美激情一区二区在线| 久久福利视频一区二区| 久久亚洲免费视频| 91福利精品第一导航| 国产一区二区三区蝌蚪| 中文字幕不卡在线播放| 欧美va天堂va视频va在线| 欧美人与禽zozo性伦| 波多野结衣中文字幕一区 | 日韩欧美专区在线| 91首页免费视频| 色婷婷精品大在线视频| 成人午夜又粗又硬又大| 国产一区二区在线电影| 蜜臀av性久久久久蜜臀aⅴ四虎 | 精品奇米国产一区二区三区| 欧美日韩在线免费视频| 在线视频一区二区三区| 欧美日韩中文精品| 欧美精品色综合| 欧美一区永久视频免费观看| 这里只有精品99re| wwwwxxxxx欧美| 久久久久久久免费视频了| 亚洲精品一区在线观看| 欧美老年两性高潮| 538在线一区二区精品国产| 欧美日韩一区不卡| 欧美一级二级在线观看| 91麻豆精品国产91久久久资源速度| 7777精品久久久大香线蕉| 精品免费一区二区三区| 日韩视频在线观看一区二区| 久久久久久久性| 亚洲午夜久久久久久久久电影网 | 国产精品99久久久久久久vr | 亚洲欧美在线aaa| 亚洲高清免费观看 | 国产一区二区三区最好精华液| 美女视频一区二区| 成人小视频在线观看| 精品对白一区国产伦| 亚洲一级二级三级| 色综合久久久久综合| 欧美精品一区二区蜜臀亚洲| 午夜激情综合网| 欧美视频在线一区| 亚洲永久精品国产| 在线观看视频一区| 一区二区三区精品在线| 在线视频欧美区| 亚洲高清视频中文字幕| 欧美伊人久久久久久久久影院| 亚洲欧美日韩中文字幕一区二区三区| 极品尤物av久久免费看| 精品999久久久| 国产大片一区二区| 国产精品进线69影院| 欧美主播一区二区三区美女| 亚洲国产aⅴ天堂久久| 欧美日韩国产高清一区二区三区| 视频一区视频二区在线观看| 欧美挠脚心视频网站| 日本v片在线高清不卡在线观看| 日韩一区二区麻豆国产| 极品少妇xxxx偷拍精品少妇| 精品乱人伦小说| 91看片淫黄大片一级在线观看| 亚洲综合在线免费观看| 欧美精品久久天天躁| 国产精品456| 天天综合色天天| 日本一区二区动态图| 欧美日韩国产经典色站一区二区三区| 蜜臀va亚洲va欧美va天堂| 亚洲欧洲三级电影| 欧美电视剧免费观看| 成人美女视频在线看| 伊人色综合久久天天| 91精品国产欧美日韩| av一区二区三区在线| 久久99精品久久久| 亚洲精品日韩一| 国产精品久久久久久久久免费桃花 | 一区二区三区成人| 久久综合色8888| 日韩一区二区免费视频| 欧美性色黄大片| 99国产欧美另类久久久精品| 国产在线视频精品一区| 丝袜诱惑亚洲看片| 亚洲国产欧美在线| 一区二区三区精品在线观看| 中文字幕在线观看不卡视频| 国产日本欧美一区二区| 精品少妇一区二区三区| 欧美大白屁股肥臀xxxxxx| 欧美精品久久99久久在免费线 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产99一区视频免费| 国产一区二区成人久久免费影院 | 91福利视频网站| 色综合久久综合| 欧美三级在线看| 欧美久久一二三四区| 在线综合视频播放| 日韩欧美视频一区| 2023国产精品视频| 久久精品欧美日韩| 中文字幕一区二区三区乱码在线| 国产三级久久久| 一区二区三区色| 五月天中文字幕一区二区| 亚洲综合一区二区| 午夜av电影一区| 国产九九视频一区二区三区| 成人福利在线看| 欧美日韩一区二区在线视频| 91精品国产91久久久久久最新毛片 | 亚洲成人综合视频| 久久成人免费日本黄色| voyeur盗摄精品| 日韩欧美另类在线| 亚洲三级在线观看| 久久国产精品色婷婷| 欧美综合一区二区| 久久久久久亚洲综合影院红桃| 亚洲色图制服丝袜| 不卡的av在线播放| 精品少妇一区二区三区日产乱码 | 日韩你懂的在线观看| 亚洲人被黑人高潮完整版| 日本亚洲欧美天堂免费| 一本一道综合狠狠老| 日本一区二区成人在线| 视频一区免费在线观看| 91福利在线观看| 日韩美女啊v在线免费观看| 国产精品一区久久久久| 日韩限制级电影在线观看| 亚洲国产日韩精品| 在线观看中文字幕不卡| 一区二区久久久| 在线观看国产一区二区| 亚洲黄色av一区| 色婷婷综合久久久久中文| 自拍视频在线观看一区二区| 色综合一区二区三区| 亚洲精品国产第一综合99久久| 日本国产一区二区| 亚洲一区在线观看免费|