亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产欧美一二三区| 麻豆成人综合网| 亚洲免费观看视频| 亚洲欧美一区二区三区久本道91| 欧美国产精品一区二区三区| 国产拍欧美日韩视频二区| 国产人久久人人人人爽| 日本一区二区不卡视频| 99精品黄色片免费大全| 免费成人av在线播放| 久久精品999| 国模一区二区三区白浆| 国产成人自拍高清视频在线免费播放| 国产一区免费电影| 成人天堂资源www在线| 91香蕉国产在线观看软件| 色网站国产精品| 在线亚洲精品福利网址导航| 欧美色图激情小说| 精品久久五月天| 国产免费观看久久| 一区二区三区在线看| 午夜精品福利一区二区蜜股av| 日韩激情视频网站| 国产一区二区三区黄视频| 9人人澡人人爽人人精品| 色香色香欲天天天影视综合网| 精品视频在线免费观看| 日韩欧美123| 国产精品青草久久| 午夜视黄欧洲亚洲| 韩国毛片一区二区三区| 97久久精品人人爽人人爽蜜臀| 欧美三区在线视频| 久久久国际精品| 亚洲国产一区二区视频| 欧美最猛黑人xxxxx猛交| 欧美日韩一区二区在线观看视频| 日韩三级视频在线观看| 中文字幕欧美日韩一区| 亚洲国产日韩a在线播放| 久久成人av少妇免费| 成人午夜免费av| 欧美精品三级在线观看| 国产欧美在线观看一区| 亚洲va欧美va人人爽午夜| 激情图区综合网| 在线免费观看日韩欧美| 久久久噜噜噜久久人人看| 亚洲综合图片区| 国产老女人精品毛片久久| 日本韩国精品在线| 久久久亚洲精品一区二区三区 | 久久青草欧美一区二区三区| 亚洲色图制服诱惑 | 91视频91自| 香蕉影视欧美成人| 国产精一品亚洲二区在线视频| 日本高清免费不卡视频| 精品粉嫩aⅴ一区二区三区四区| 亚洲人成网站影音先锋播放| 国内外精品视频| 欧美老人xxxx18| 国产精品免费aⅴ片在线观看| 免费日本视频一区| 色噜噜狠狠色综合欧洲selulu| 精品国产91久久久久久久妲己| 亚洲精品国产精品乱码不99| 国产精品69毛片高清亚洲| 欧美欧美欧美欧美| 亚洲综合色自拍一区| 成人精品gif动图一区| 欧美成人一区二区三区在线观看| 一区二区三区在线观看欧美| 丁香婷婷深情五月亚洲| 欧美变态tickling挠脚心| 亚洲不卡一区二区三区| 色av成人天堂桃色av| 国产精品国产三级国产aⅴ入口 | 欧美日韩成人激情| 亚洲精品少妇30p| 国产成人精品午夜视频免费| 精品播放一区二区| 日本在线观看不卡视频| 欧美性大战久久| 亚洲欧美一区二区久久| 97aⅴ精品视频一二三区| 国产精品全国免费观看高清 | 欧美一级午夜免费电影| 亚洲一级在线观看| 在线影视一区二区三区| 亚洲欧美韩国综合色| 91原创在线视频| 国产精品嫩草久久久久| 北条麻妃一区二区三区| 国产精品人妖ts系列视频| 国产精品456露脸| 国产欧美一区二区精品忘忧草| 青青草精品视频| 欧美日韩一区三区| 午夜精品久久久| 91精品国产综合久久精品麻豆| 日韩精品一级中文字幕精品视频免费观看 | 一本久道久久综合中文字幕| 亚洲欧洲国产专区| 色婷婷久久综合| 亚洲精品一二三区| 在线观看国产精品网站| 亚洲高清视频中文字幕| 777久久久精品| 蜜臀av一区二区三区| 欧美videos中文字幕| 久久99热狠狠色一区二区| 久久综合九色综合欧美亚洲| 国产成人亚洲综合a∨婷婷| 国产精品视频一二三区| 99国产精品久久久久久久久久| 亚洲天堂免费在线观看视频| 91国产福利在线| 日韩av午夜在线观看| 国产欧美日韩视频在线观看| 久久国产精品一区二区| 亚洲精品在线一区二区| 国产精品亚洲一区二区三区妖精| 中文字幕免费不卡在线| 色噜噜狠狠成人中文综合| 午夜精品福利久久久| www国产成人| aa级大片欧美| 日韩激情av在线| 国产日韩欧美高清| 欧美综合一区二区| 久久成人免费网| 亚洲视频精选在线| 制服视频三区第一页精品| 国产在线不卡一区| 亚洲女人的天堂| 日韩视频免费直播| caoporn国产一区二区| 无吗不卡中文字幕| 国产亚洲欧美激情| 欧美日韩一级二级| 国产精品一区二区久激情瑜伽| 亚洲欧美区自拍先锋| 日韩欧美国产一区二区三区| 99久久精品99国产精品| 日本vs亚洲vs韩国一区三区二区 | 国产乱码精品一品二品| 一区二区三区不卡视频| 精品国产乱码久久久久久浪潮| 91免费版pro下载短视频| 免费成人av在线| 亚洲免费在线看| 中文字幕精品—区二区四季| 91免费在线播放| 精品午夜久久福利影院| 亚洲免费大片在线观看| 久久久另类综合| 欧美人xxxx| caoporm超碰国产精品| 美国毛片一区二区| 中文字幕一区二区三区在线播放| 欧美一区二区视频在线观看2020| 成人动漫一区二区三区| 激情图片小说一区| 三级精品在线观看| 亚洲激情男女视频| 久久久久99精品一区| 91麻豆精品国产综合久久久久久| 不卡视频在线看| 国产在线不卡视频| 免费久久精品视频| 亚洲欧美韩国综合色| 国产电影精品久久禁18| 婷婷一区二区三区| 国产精品久久久久久久午夜片| 日韩精品中文字幕在线不卡尤物| 色8久久人人97超碰香蕉987| 成人一级片网址| 久久国产欧美日韩精品| 日韩专区一卡二卡| 亚洲一区二区在线播放相泽| 国产精品国产三级国产aⅴ入口 | 欧美日韩一区久久| 成人av网在线| 国产精品69毛片高清亚洲| 天堂蜜桃一区二区三区| 亚洲国产精品一区二区www | 成人动漫精品一区二区| 国产成a人亚洲| 国产乱妇无码大片在线观看| 精品中文av资源站在线观看| 视频一区二区欧美| 亚洲综合激情小说| 亚洲欧美aⅴ...| 亚洲男女毛片无遮挡| 亚洲欧美日韩人成在线播放| 亚洲品质自拍视频网站| 亚洲日本青草视频在线怡红院 | 成人av免费在线观看|