/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: AssuraDrcErrors.java * * Copyright (c) 2005 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.tool.drc; import com.sun.electric.database.geometry.EPoint; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.tool.Job; import com.sun.electric.tool.user.ErrorLogger; import java.awt.Shape; import java.awt.geom.Rectangle2D; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Class to read DRC errors from Assura. */ public class AssuraDrcErrors { private static class DrcRuleViolation { private final int number; private final String desc; private final List<DrcError> errors; // list of DrcErrors // private int realErrorCount; // private int flatErrorCount; private DrcRuleViolation(int number, String desc) { this.number = number; this.desc = desc; errors = new ArrayList<DrcError>(); } // private void addError(DrcError error) { // errors.add(error); // } public Iterator<DrcError> getErrors() { ArrayList<DrcError> copy = new ArrayList<DrcError>(errors); return copy.iterator(); } private void setErrorCounts(int real, int flat) { // realErrorCount = real; // flatErrorCount = flat; } } private static class DrcError { private final Cell cell; private final Shape marker; private DrcError(Cell cell, Shape marker) { this.cell = cell; this.marker = marker; } public Cell getCell() { return cell; } public Shape getMarker() { return marker; } } /** * Method to import Assura DRC errors from a file. * @param filename the file to read. */ public static void importErrors(String filename, Map<Cell,String> mangledNames, String type) { BufferedReader in; try { FileReader reader = new FileReader(filename); in = new BufferedReader(reader); } catch (IOException e) { System.out.println("Error importing "+type+" Errors: "+e.getMessage()); return; } String line; DrcRuleViolation rule = null; Cell cell = null; ErrorLogger logger = ErrorLogger.newInstance("Assura "+type+" Errors"); int count = 0; int num = 1; try { while ((line = in.readLine()) != null) { String [] strings = line.split("\\s+"); if (strings.length == 0) continue; if (strings[0].equals("Rule") && strings.length > 4) { int number = Integer.valueOf(strings[2]).intValue(); int remove = 9 + strings[2].length() + 3; rule = new DrcRuleViolation(number, line.substring(remove, line.length())); continue; } if (rule == null) continue; if (strings[0].equals("Real")) { int real = Integer.valueOf(strings[4].replaceAll(";", "")).intValue(); int flat = Integer.valueOf(strings[9]).intValue(); rule.setErrorCounts(real, flat); logger.setGroupName(rule.number, "("+real+") "+rule.desc); num = 1; continue; } if (strings[0].equals("Cell")) { cell = CalibreDrcErrors.getCell(strings[3], mangledNames); if (cell == null) { System.out.println("Couldn't find cell "+strings[3]+"{lay}"); } continue; } if (cell == null) continue; double scale = cell.getTechnology().getScale(); if (strings[0].equals("Shape")) { // get rid of next 3 lines line = in.readLine(); line = in.readLine(); line = in.readLine(); while (!line.startsWith("---") && !line.startsWith("===") ) { line = in.readLine(); if (line == null) break; strings = line.split("\\s+"); if (strings.length < 6) continue; // skip empty lines int last = strings.length-1; double x1 = Double.parseDouble(strings[last-3]) / scale * 1000; double y1 = Double.parseDouble(strings[last-2]) / scale * 1000; double x2 = Double.parseDouble(strings[last-1]) / scale * 1000; double y2 = Double.parseDouble(strings[last]) / scale * 1000; Rectangle2D rect = new Rectangle2D.Double(x1, y1, x2-x1, y2-y1); new DrcError(cell, rect); List<EPoint> ptList = new ArrayList<EPoint>(); ptList.add(new EPoint(x1, y1)); ptList.add(new EPoint(x2, y1)); ptList.add(new EPoint(x1, y1)); ptList.add(new EPoint(x1, y2)); ptList.add(new EPoint(x2, y2)); ptList.add(new EPoint(x2, y1)); ptList.add(new EPoint(x2, y2)); ptList.add(new EPoint(x1, y2)); ptList.add(new EPoint(x1, y1)); ptList.add(new EPoint(x2, y2)); ptList.add(new EPoint(x1, y2)); ptList.add(new EPoint(x2, y1)); logger.logMessage(num+". "+cell.getName()+": "+rule.desc, ptList, cell, rule.number, true); count++; num++; } } } } catch (IOException e) { System.out.println("Error importing "+type+" Errors: "+e.getMessage()); return; } System.out.println("Imported "+count+" errors from file "+filename); if (count == 0) { Job.getUserInterface().showInformationMessage("Imported Zero "+type+" Errors", type+" Import Complete"); } logger.termLogging(true); } }