/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: NccGuiInfo.java * * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * * 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.user.ncc; import java.io.Serializable; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.database.variable.VarContext; import com.sun.electric.tool.ncc.result.EquivRecReport; import com.sun.electric.tool.ncc.result.NccResult; import com.sun.electric.tool.ncc.result.NccResult.CellSummary; import com.sun.electric.tool.ncc.result.SizeMismatch.Mismatch; import com.sun.electric.tool.ncc.strategy.StratCheckSizes; /** * This class is a container for all NCC mismatch data produced by * a comparison of two cells. This data is required by NCC GUI. */ public class NccGuiInfo implements Serializable { static final long serialVersionUID = 0; /** Results from Cell pair * comparison */ private NccResult nccResult; /** True if top-level cells are swapped. Schematic cell is always * attempted to be displayed on the laft and the layout cell - on the right. * This variable should only be used for data in EquivRecords and for size * data. Exports and hashcodes have to compare their cell names to the cell * names stored in their object of this class. Objects of this class have * cell names, cells, and contexts in the correct order. */ private boolean swapCells; /** Export mismatches */ private List<ExportMismatch> exportMismatches; /** Transistor size mismatches */ private List<Mismatch> sizeMismatches; /** Some export mismatches are duplicated when suggestions are added. * Suggestions are given only when topology match. * This variable holds the total number of mismatches without suggestions * which were duplicated by their corresponding suggestions */ private int numExportsValidOnlyWhenTopologyMismatch; /** Export Assertion Failures */ private List<ExportAssertionFailures> exportAssertionFailures; /** Network Export Conflicts */ private List<ExportConflict.NetworkConflict> networkExportConflicts; /** Charact Export Conflicts */ private List<ExportConflict.CharactConflict> charactExportConflicts; /** Unrecognized MOSes */ private List<UnrecognizedPart> unrecognizedParts; /** Mismatched EquivRecords */ private List<EquivRecReport> partRecReports, wireRecReports; public NccGuiInfo() { swapCells = false; numExportsValidOnlyWhenTopologyMismatch = 0; exportMismatches = new LinkedList<ExportMismatch>(); sizeMismatches = new LinkedList<Mismatch>(); exportAssertionFailures = new LinkedList<ExportAssertionFailures>(); networkExportConflicts = new LinkedList<ExportConflict.NetworkConflict>(); charactExportConflicts = new LinkedList<ExportConflict.CharactConflict>(); unrecognizedParts = new LinkedList<UnrecognizedPart>(); partRecReports = new ArrayList<EquivRecReport>(); wireRecReports = new ArrayList<EquivRecReport>(); } /** setNccResult should be called after NCC has returned a result */ public void setNccResult(NccResult r) {nccResult=r;} /** * This method returns the total number of valid mismatches stored in the object: * export mismatches + size mismatches + * local partitioning mismatches (or hascode mismaches) * @return the total number of valid mismatches stored in the object */ public int getTotalMismatchCount() { int eqvRecCount = partRecReports.size() + wireRecReports.size(); return getValidExportMismatchCount() + eqvRecCount + sizeMismatches.size() + exportAssertionFailures.size() + networkExportConflicts.size() + charactExportConflicts.size() + unrecognizedParts.size(); } /** * This method returns true if two cells stored in this object were * swapped and, therefore, all internal data (exports, partitions, sizes) * have to be swapped as well * @return true if two cells stored in this object were swapped */ public boolean isSwapCells() { return swapCells; } /** This method returns an array of two Strings representing the names of the * compared cells * @return an array of cell names*/ public String[] getNames() {return nccResult.getRootCellNames();} /** This method returns an array of two compared cells * @return an array of cell */ public Cell[] getCells() {return nccResult.getRootCells();} /** This method returns an array of two cell contexts * @return an array cell contexts */ public VarContext[] getContexts() {return nccResult.getRootContexts();} /** * This method returns a CellSummary object holding number of parts, * wires, and ports in each cell. * @return a CellSummary with summary of the compared cells */ public CellSummary getCellSummary() {return nccResult.getCellSummary();} /** * This method adds the provided ExportMismatch object to the list * of export mismatches * @param em export mismatch to add to the list of export mismatches */ public void addExportMismatch(ExportMismatch em) { exportMismatches.add(em); if (em.isValidOnlyWhenTopologyMismatch()) numExportsValidOnlyWhenTopologyMismatch++; } /** This method returns the list of export mismatches * @return list of export mismatches */ public List<ExportMismatch> getExportMismatches(){return exportMismatches;} public void setPartRecReports(List<EquivRecReport> badParts) { partRecReports = badParts; } public List<EquivRecReport> getPartRecReports() {return partRecReports;} public void setWireRecReports(List<EquivRecReport> badWires) { wireRecReports = badWires; } public List<EquivRecReport> getWireRecReports() {return wireRecReports;} /** has hash coding mismatches */ public boolean isHashFailuresPrinted() { // the reports, if any, are either all local partition or all // hash code partition if (partRecReports.size()!=0) return partRecReports.get(0).hashMismatch(); if (wireRecReports.size()!=0) return wireRecReports.get(0).hashMismatch(); // no partition errors at all return false; } public boolean hasLocalPartitionMismatches() { if (partRecReports.size()!=0) return !partRecReports.get(0).hashMismatch(); if (wireRecReports.size()!=0) return !wireRecReports.get(0).hashMismatch(); // no partition errors at all return false; } public boolean isExportMatch() {return nccResult.exportMatch();} public boolean isSizeMatch() {return nccResult.sizeMatch();} public boolean isTopologyMatch() {return nccResult.topologyMatch();} public boolean isSizeChecked() {return nccResult.getOptions().checkSizes;} public int getValidExportMismatchCount() { if (isTopologyMatch()) return exportMismatches.size() - numExportsValidOnlyWhenTopologyMismatch; return exportMismatches.size(); } public List<Mismatch> getSizeMismatches() { return sizeMismatches; } public void setSizeMismatches(List<Mismatch> sizeMismatches) { this.sizeMismatches = sizeMismatches; } public void addExportAssertionFailure(Cell cell, VarContext context, Object[][] items, String[][] names) { exportAssertionFailures.add( new ExportAssertionFailures(cell, context, items, names)); } public List<ExportAssertionFailures> getExportAssertionFailures() { return exportAssertionFailures; } public void addNetworkExportConflict(ExportConflict.NetworkConflict conf) { networkExportConflicts.add(conf); } public List<ExportConflict.NetworkConflict> getNetworkExportConflicts() { return networkExportConflicts; } public void addCharactExportConflict(ExportConflict.CharactConflict conf) { charactExportConflicts.add(conf); } public List<ExportConflict.CharactConflict> getCharactExportConflicts() { return charactExportConflicts; } public void addUnrecognizedPart(UnrecognizedPart mos) { unrecognizedParts.add(mos); } public List<UnrecognizedPart> getUnrecognizedParts() { return unrecognizedParts; } }