⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 librarystatistics.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: LibraryStatistics.java * Input/output tool: Statistics over a set of libraries. * Written by Steven M. Rubin, Sun Microsystems. * * Copyright (c) 2004 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 2 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.tool.io.input;import com.sun.electric.database.geometry.GenMath;import com.sun.electric.database.id.CellId;import com.sun.electric.database.id.IdManager;import com.sun.electric.database.id.LibId;import com.sun.electric.database.text.CellName;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.text.Version;import com.sun.electric.database.variable.Variable;import com.sun.electric.tool.io.ELIBConstants;import com.sun.electric.tool.io.FileType;import com.sun.electric.tool.io.input.JelibParser;import com.sun.electric.tool.io.output.Output;import com.sun.electric.tool.ncc.basic.NccCellAnnotations;import com.sun.electric.tool.user.ErrorLogger;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.FilenameFilter;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.PrintWriter;import java.io.Serializable;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.zip.CRC32;import java.util.zip.CheckedInputStream;/** * This class keeps contents of disk library file. */public class LibraryStatistics implements Serializable{    private static final long serialVersionUID = -361650802811567400L;    private transient IdManager idManager;	private final TreeMap<String,Directory> directories = new TreeMap<String,Directory>();	private final TreeMap<String,LibraryName> libraryNames = new TreeMap<String,LibraryName>();//	transient LibraryContents totalLibraryContents;	private LibraryStatistics(IdManager idManager) {        this.idManager = idManager;    }    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {        idManager = new IdManager();        in.defaultReadObject();    }	Directory getDirectory(String dirName)	{		Directory dir = directories.get(dirName);		if (dir == null) dir = new Directory(this, dirName);		return dir;	}	LibraryName getLibraryName(String name)	{		LibraryName libraryName = libraryNames.get(name);		if (libraryName == null) libraryName = new LibraryName(this, name);		return libraryName;	}	Iterator<Directory> getDirectories() { return directories.values().iterator(); }	Iterator<LibraryName> getLibraryNames() { return libraryNames.values().iterator(); }	public static void scanProjectDirs(String[] dirNames, String[] excludeDirs, File projListDir) {		HashSet<String> canonicalDirs = new HashSet<String>();        TreeSet<String> projectDirs = new TreeSet<String>();		for (int i = 0; i < dirNames.length; i++)			scanProjectDir(new File(dirNames[i]), excludeDirs, canonicalDirs, projectDirs);        File projListFile = new File(projListDir, "proj.list");        try {            PrintWriter out = new PrintWriter(projListFile);            for (Iterator it = projectDirs.iterator(); it.hasNext(); )                out.println((String)it.next());            out.close();        } catch (IOException e) {            System.out.println("Error writing " + projListFile);            e.printStackTrace();        }    }	private static void scanProjectDir(File dir, String[] excludeDirs, Set<String> canonicalDirs, TreeSet<String> projectDirs) {		try {			String canonicalDir = dir.getCanonicalPath();			if (canonicalDirs.contains(canonicalDir)) return;			canonicalDirs.add(canonicalDir);            if (!canonicalDir.equals(dir.getPath()))                System.out.println(dir + " -> " + canonicalDir);			dir = new File(canonicalDir);            assert dir.getPath().equals(canonicalDir);		} catch (IOException e) {			System.out.println(dir + " CANONICAL FAILED");			return;		}        for (String excludeDir: excludeDirs) {            if (dir.getPath().equals(excludeDir)) {    			System.out.println(dir + " EXCLUDED");                return;            }        }		File[] files = dir.listFiles();		if (files == null) {			System.out.println(dir + " ACCESS DENIED");			return;		}        boolean libdirs = false;        int xmls = 0;        int txts = 0;        int elibs = 0;        int jelibs = 0;		int delibs = 0;		for (File file: files) {			String name = file.getName();			if (name.startsWith("._")) continue;			int extensionPos = name.lastIndexOf('.');			if (extensionPos < 0) continue;			String extension = name.substring(extensionPos);			name = name.substring(0, extensionPos);            if (file.isDirectory()) {                if (extension.equals(".delib"))                    delibs++;            } else {                if (name.equals("LIBDIRS"))                    libdirs = true;                if (extension.equals(".xml"))                    xmls++;                if (extension.equals(".txt"))                    txts++;                if (extension.equals(".elib"))                    elibs++;                if (extension.equals(".jelib"))                    jelibs++;            }        }		if (delibs > 0 || elibs > 0 || jelibs > 0) {            String projectDir = dir.getPath();            System.out.print(projectDir + " :");            if (libdirs)                System.out.print(" LIBDIRS");            if (xmls > 0)                System.out.print(" " + xmls + " xmls");            if (txts > 0)                System.out.print(" " + txts + " txts");            if (elibs > 0)                System.out.print(" " + elibs + " elibs");            if (jelibs > 0)                System.out.print(" " + jelibs + " jelibs");            if (delibs > 0)                System.out.print(" " + delibs + " delibs");            System.out.println();            assert canonicalDirs.contains(projectDir);            boolean added = projectDirs.add(projectDir);            assert added;		}		for (File file: files) {			if (!file.isDirectory()) continue;            if (file.getName().equals("CVS")) continue;			scanProjectDir(file, excludeDirs, canonicalDirs, projectDirs);		}	}    public static TreeSet<String> readProjList(File wrkDir) {        File projListFile = new File(wrkDir, "proj.list");        try {            TreeSet<String> dirs = new TreeSet<String>();            BufferedReader in = new BufferedReader(new FileReader(projListFile));            String line;            while ((line = in.readLine()) != null) {                if (line.length() == 0) continue;                boolean added = dirs.add(line);                assert added;            }            in.close();            return dirs;        } catch (IOException e) {            System.out.println("Error reading " + projListFile + " : " + e);            return null;        }    }    public static Map<String,File[]> readProjectDirs(File wrkDir, boolean allDirs) {        final String projectsExt = ".projects";        FilenameFilter filter = new FilenameFilter() {            public boolean accept(File dir, String name) { return name.endsWith(projectsExt); }        };        Map<String,File[]> projectDirs = new TreeMap<String,File[]>();        for (File file: wrkDir.listFiles(filter)) {            String projectName = file.getName();            assert projectName.endsWith(projectsExt);            projectName = projectName.substring(0, projectName.length() - projectsExt.length());            try {                BufferedReader in = new BufferedReader(new FileReader(file));                ArrayList<File> dirs = new ArrayList<File>();                String line;                while ((line = in.readLine()) != null) {                    if (line.length() == 0) continue;                    char firstChar = line.charAt(0);                    if (firstChar == '-') {                        if (!allDirs) continue;                    } else if (firstChar != '+') {                        continue;                    }                    String fileName = line.substring(1);                    dirs.add(new File(fileName));                }                in.close();                projectDirs.put(projectName, dirs.toArray(new File[dirs.size()]));            } catch (IOException e) {                System.out.println("Error reading " + file);                e.printStackTrace();            }        }        return projectDirs;    }	public static LibraryStatistics scanDirectories(IdManager idManager, File[] dirs)	{		LibraryStatistics stat = new LibraryStatistics(idManager);		Set<String> canonicalDirs = new HashSet<String>();		Map<String,Set<FileInstance>> preLibraries = new HashMap<String,Set<FileInstance>>();		for (File dir: dirs)			stat.scanDir(dir, canonicalDirs, preLibraries, null);		byte[] buf = new byte[Input.READ_BUFFER_SIZE];		for (Iterator lit = preLibraries.entrySet().iterator(); lit.hasNext(); )		{			Map.Entry entry = (Map.Entry)lit.next();			String libName = (String)entry.getKey();			TreeSet files = (TreeSet)entry.getValue();			LibraryName libraryName = new LibraryName(stat, libName);			while (!files.isEmpty())			{				FileInstance f = (FileInstance)files.iterator().next();				files.remove(f);				FileContents fc = new FileContents(libraryName, f);				byte[] bytes = null;				int len = (int)f.fileLength;			fileLoop:				for (Iterator it = files.iterator(); it.hasNext(); )				{					FileInstance f1 = (FileInstance)it.next();					if (f1.fileLength != len || f1.crc != f.crc) continue;					if (!f.canonicalPath.equals(f1.canonicalPath))					{						if (bytes == null)						{							Input in = new Input();							if (in.openBinaryInput(f1.getUrl())) continue;							try {								bytes = new byte[len];								try {									in.dataInputStream.readFully(bytes);								} catch (IOException e)								{									continue;								}							} finally							{								in.closeInput();							}						}						Input in = new Input();						if (in.openBinaryInput(f1.getUrl())) continue;						try						{							int n = 0;							while (n < len) {								int count = -1;								try {									count = in.dataInputStream.read(buf, 0, Math.min(len - n, buf.length));								} catch (IOException ex)								{								}								if (count < 0) continue fileLoop;								for (int i=0; i<count; i++)									if (buf[i] != bytes[n + i])										{											in.closeInput();											continue fileLoop;										}								n += count;							}						} finally						{							in.closeInput();						}					}					it.remove();					fc.add(f1);				}			}		}		return stat;	}	private void scanDir(File dir, Set<String> canonicalDirs,						 Map<String,Set<FileInstance>> preLibraries, String parentLibName)	{		try		{			String canonicalDir = dir.getCanonicalPath();			if (canonicalDirs.contains(canonicalDir)) return;			canonicalDirs.add(canonicalDir);			dir = new File(canonicalDir);		} catch (IOException e)		{			System.out.println(dir + " CANONICAL FAILED");			return;		}        if (dir.getPath().equals("/import/async/archive/2005/tic/gilda/TreasureIsland/electric-old/projectManagement") ||            dir.getPath().equals("/import/async/archive/2005/tic/jkg/projectTest") ||            dir.getPath().equals("/import/async/cad/cvs")) {            System.out.println(dir + " IGNORED");            return;        }		File[] files = dir.listFiles();		if (files == null)		{			System.out.println(dir + " ACCESS DENIED");			return;		}        boolean isDelib = dir.getName().endsWith(".delib");        String libName = null;        if (isDelib) {			libName = dir.getName();			int extPos = libName.lastIndexOf('.');			if (extPos >= 0)    			libName = libName.substring(0, extPos);        }		boolean libFound = false;		for (int i = 0; i < files.length; i++)		{            if (files[i].isDirectory()) continue;			String name = files[i].getName();			if (name.startsWith("._")) continue;			int extensionPos = name.lastIndexOf('.');			if (extensionPos < 0) continue;			String extension = name.substring(extensionPos);			name = name.substring(0, extensionPos);			if (extension.equals(".elib") || extension.equals(".jelib") ||                    isDelib && !extension.equals(".bak") && !extension.equals(".log") ||                    parentLibName != null)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -